From c7454e556d79afeade6c284a76ddafef202f354d Mon Sep 17 00:00:00 2001 From: amazingguni <amazingguni@gmail.com> Date: Wed, 19 May 2021 08:42:27 +0900 Subject: [PATCH 001/156] Support mongoengine.DateField sorting --- flask_admin/contrib/mongoengine/view.py | 1 + 1 file changed, 1 insertion(+) diff --git a/flask_admin/contrib/mongoengine/view.py b/flask_admin/contrib/mongoengine/view.py index 10663164a..1f6b4b64f 100644 --- a/flask_admin/contrib/mongoengine/view.py +++ b/flask_admin/contrib/mongoengine/view.py @@ -31,6 +31,7 @@ mongoengine.IntField, mongoengine.FloatField, mongoengine.BooleanField, + mongoengine.DateField, mongoengine.DateTimeField, mongoengine.ComplexDateTimeField, mongoengine.ObjectIdField, From 9cd42866b6154c5f1ce3e27c7938b9e2b295be88 Mon Sep 17 00:00:00 2001 From: amazingguni <amazingguni@gmail.com> Date: Wed, 19 May 2021 08:46:13 +0900 Subject: [PATCH 002/156] Update test_basic.py --- flask_admin/tests/mongoengine/test_basic.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/flask_admin/tests/mongoengine/test_basic.py b/flask_admin/tests/mongoengine/test_basic.py index d25cfc65a..d2e27432f 100644 --- a/flask_admin/tests/mongoengine/test_basic.py +++ b/flask_admin/tests/mongoengine/test_basic.py @@ -29,6 +29,7 @@ class Model1(db.Document): test2 = db.StringField(max_length=20) test3 = db.StringField() test4 = db.StringField() + date_field = db.DateField() datetime_field = db.DateTimeField() def __str__(self): @@ -90,6 +91,7 @@ def test_model(): ok_('test2' in view._sortable_columns) ok_('test3' in view._sortable_columns) ok_('test4' in view._sortable_columns) + ok_('date_field' in view._sortable_columns) ok_(view._create_form_class is not None) ok_(view._edit_form_class is not None) From ec0d3361c202a0313f45c0f1a716764df21bdbb0 Mon Sep 17 00:00:00 2001 From: shouldsee <shouldsee.gem@gmail.com> Date: Tue, 30 May 2023 19:24:17 +0800 Subject: [PATCH 003/156] Update app.py fix syntax error --- examples/sqla-custom-inline-forms/app.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/sqla-custom-inline-forms/app.py b/examples/sqla-custom-inline-forms/app.py index 04e4ad383..55eb3365d 100644 --- a/examples/sqla-custom-inline-forms/app.py +++ b/examples/sqla-custom-inline-forms/app.py @@ -180,5 +180,5 @@ def first_time_setup(): # Create DB first_time_setup() - # Start app - app.run(debug=True) +# Start app +app.run(debug=True) From cf84127a97d9136ddb718544b2752cb79fe3d363 Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Mon, 23 Oct 2023 19:25:54 +0100 Subject: [PATCH 004/156] Replace inspect.getargspec() that was removed in Python 3.11 --- flask_admin/contrib/sqla/view.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flask_admin/contrib/sqla/view.py b/flask_admin/contrib/sqla/view.py index d8f2043f7..6886e0702 100755 --- a/flask_admin/contrib/sqla/view.py +++ b/flask_admin/contrib/sqla/view.py @@ -999,7 +999,7 @@ def _apply_filters(self, query, count_query, joins, count_joins, filters): try: query = flt.apply(query, clean_value, alias) except TypeError: - spec = inspect.getargspec(flt.apply) + spec = inspect.getfullargspec(flt.apply) if len(spec.args) == 3: warnings.warn('Please update your custom filter %s to ' From 6d749efb9a81760e8b78af3f85aba667939fb870 Mon Sep 17 00:00:00 2001 From: Michael Reid <michael_reid@email.com> Date: Tue, 2 Jan 2024 21:12:25 -0400 Subject: [PATCH 005/156] geo_alchemy: make application context available to db function Similar to #2308, this fix is needed for the app to launch --- examples/geo_alchemy/app.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/geo_alchemy/app.py b/examples/geo_alchemy/app.py index d91c48afc..ea4a3bb72 100644 --- a/examples/geo_alchemy/app.py +++ b/examples/geo_alchemy/app.py @@ -66,7 +66,8 @@ def index(): if __name__ == '__main__': - db.create_all() + with app.app_context(): + db.create_all() # Start app app.run(debug=True) From 7f18761ff4f3cd5e4df2c808d7611d589a549086 Mon Sep 17 00:00:00 2001 From: Simon <65854503+OpenSourceSimon@users.noreply.github.com> Date: Fri, 1 Mar 2024 10:41:51 +0100 Subject: [PATCH 006/156] Use correct file in examples/bootstrap4 --- examples/bootstrap4/README.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/bootstrap4/README.rst b/examples/bootstrap4/README.rst index 9dbc43fcf..f4b3e7396 100644 --- a/examples/bootstrap4/README.rst +++ b/examples/bootstrap4/README.rst @@ -14,11 +14,11 @@ To run this example: 3. Install requirements:: - pip install -r 'examples/bootstrap4/requirements.txt' + pip install -r examples/bootstrap4/requirements.txt 4. Run the application:: - python examples/custom-layout/app.py + python examples/bootstrap4/app.py The first time you run this example, a sample sqlite database gets populated automatically. To suppress this behaviour, comment the following lines in app.py::: From 4ef0876a20b077c2e2b29765c32e21007f5b508f Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Tue, 25 Jun 2024 21:12:02 +0100 Subject: [PATCH 007/156] Convert README from .rst to .md This will allow us to add a consistency 'alert' panel for the Pallets Ecosystem Notice. --- README.md | 145 +++++++++++++++++++++++++++++++++++++++++++++++++++++ README.rst | 136 ------------------------------------------------- 2 files changed, 145 insertions(+), 136 deletions(-) create mode 100644 README.md delete mode 100644 README.rst diff --git a/README.md b/README.md new file mode 100644 index 000000000..271845078 --- /dev/null +++ b/README.md @@ -0,0 +1,145 @@ +# Flask-Admin + +The project was recently moved into its own organization. Please update +your references to *git@github.com:flask-admin/flask-admin.git*. + +[![image](https://d322cqt584bo4o.cloudfront.net/flask-admin/localized.svg)](https://crowdin.com/project/flask-admin) + +[![image](https://github.com/flask-admin/flask-admin/actions/workflows/test.yaml/badge.svg)](https://github.com/flask-admin/flask-admin/actions/workflows/test.yaml) + +## Introduction + +Flask-Admin is a batteries-included, simple-to-use +[Flask](http://flask.pocoo.org/) extension that lets you add admin +interfaces to Flask applications. It is inspired by the *django-admin* +package, but implemented in such a way that the developer has total +control of the look, feel and functionality of the resulting +application. + +Out-of-the-box, Flask-Admin plays nicely with various ORM\'s, including + +- [SQLAlchemy](http://www.sqlalchemy.org/), +- [MongoEngine](http://mongoengine.org/), +- [pymongo](http://api.mongodb.org/python/current/) and +- [Peewee](https://github.com/coleifer/peewee). + +It also boasts a simple file management interface and a [redis +client](http://redis.io/) console. + +The biggest feature of Flask-Admin is flexibility. It aims to provide a +set of simple tools that can be used for building admin interfaces of +any complexity. So, to start off with you can create a very simple +application in no time, with auto-generated CRUD-views for each of your +models. But then you can go further and customize those views & forms as +the need arises. + +Flask-Admin is an active project, well-tested and production ready. + +## Examples + +Several usage examples are included in the */examples* folder. Please +add your own, or improve on the existing examples, and submit a +*pull-request*. + +To run the examples in your local environment: + + 1. Clone the repository:: + + git clone https://github.com/flask-admin/flask-admin.git + cd flask-admin + + 2. Create and activate a virtual environment:: + + virtualenv env -p python3 + source env/Scripts/activate + + 3. Install requirements:: + + pip install -r examples/sqla/requirements.txt + + 4. Run the application:: + + python examples/sqla/run_server.py + +## Documentation + +Flask-Admin is extensively documented, you can find all of the +documentation at <https://flask-admin.readthedocs.io/en/latest/>. + +The docs are auto-generated from the *.rst* files in the */doc* folder. +So if you come across any errors, or if you think of anything else that +should be included, then please make the changes and submit them as a +*pull-request*. + +To build the docs in your local environment, from the project directory: + + tox -e docs-html + +And if you want to preview any *.rst* snippets that you may want to +contribute, go to <http://rst.ninjs.org/>. + +## Installation + +To install Flask-Admin, simply: + + pip install flask-admin + +Or alternatively, you can download the repository and install manually +by doing: + + git clone git@github.com:flask-admin/flask-admin.git + cd flask-admin + python setup.py install + +## Tests + +Test are run with *pytest*. If you are not familiar with this package +you can get some more info from [their website](https://pytest.org/). + +To run the tests, from the project directory, simply: + + pip install -r requirements-dev.txt + pytest + +You should see output similar to: + + ............................................. + ---------------------------------------------------------------------- + Ran 102 tests in 13.132s + + OK + +For all the tests to pass successfully, you\'ll need Postgres & MongoDB +to be running locally. For Postgres: + + > psql postgres + CREATE DATABASE flask_admin_test; + \q + + > psql flask_admin_test + CREATE EXTENSION postgis; + CREATE EXTENSION hstore; + +If you\'re using Homebrew on MacOS, you might need this: + + # install postgis + > brew install postgis + + # set up postgresql user + > createuser -s postgresql + > brew services restart postgresql + +You can also run the tests on multiple environments using *tox*. + +## 3rd Party Stuff + +Flask-Admin is built with the help of +[Bootstrap](http://getbootstrap.com/), +[Select2](https://github.com/ivaynberg/select2) and +[Bootswatch](http://bootswatch.com/). + +If you want to localize your application, install the +[Flask-BabelEx](https://pypi.python.org/pypi/Flask-BabelEx) package. + +You can help improve Flask-Admin\'s translations through Crowdin: +<https://crowdin.com/project/flask-admin> diff --git a/README.rst b/README.rst deleted file mode 100644 index fbe6b5f5b..000000000 --- a/README.rst +++ /dev/null @@ -1,136 +0,0 @@ -Flask-Admin -=========== - -The project was recently moved into its own organization. Please update your -references to *git@github.com:flask-admin/flask-admin.git*. - -.. image:: https://d322cqt584bo4o.cloudfront.net/flask-admin/localized.svg - :target: https://crowdin.com/project/flask-admin - -.. image:: https://github.com/flask-admin/flask-admin/actions/workflows/test.yaml/badge.svg - :target: https://github.com/flask-admin/flask-admin/actions/workflows/test.yaml - - -Introduction ------------- - -Flask-Admin is a batteries-included, simple-to-use `Flask <http://flask.pocoo.org/>`_ extension that lets you -add admin interfaces to Flask applications. It is inspired by the *django-admin* package, but implemented in such -a way that the developer has total control of the look, feel and functionality of the resulting application. - -Out-of-the-box, Flask-Admin plays nicely with various ORM's, including - -- `SQLAlchemy <http://www.sqlalchemy.org/>`_, - -- `MongoEngine <http://mongoengine.org/>`_, - -- `pymongo <http://api.mongodb.org/python/current/>`_ and - -- `Peewee <https://github.com/coleifer/peewee>`_. - -It also boasts a simple file management interface and a `redis client <http://redis.io/>`_ console. - -The biggest feature of Flask-Admin is flexibility. It aims to provide a set of simple tools that can be used for -building admin interfaces of any complexity. So, to start off with you can create a very simple application in no time, -with auto-generated CRUD-views for each of your models. But then you can go further and customize those views & forms -as the need arises. - -Flask-Admin is an active project, well-tested and production ready. - -Examples --------- -Several usage examples are included in the */examples* folder. Please add your own, or improve -on the existing examples, and submit a *pull-request*. - -To run the examples in your local environment:: - - 1. Clone the repository:: - - git clone https://github.com/flask-admin/flask-admin.git - cd flask-admin - - 2. Create and activate a virtual environment:: - - virtualenv env -p python3 - source env/Scripts/activate - - 3. Install requirements:: - - pip install -r examples/sqla/requirements.txt - - 4. Run the application:: - - python examples/sqla/run_server.py - -Documentation -------------- -Flask-Admin is extensively documented, you can find all of the documentation at `https://flask-admin.readthedocs.io/en/latest/ <https://flask-admin.readthedocs.io/en/latest/>`_. - -The docs are auto-generated from the *.rst* files in the */doc* folder. So if you come across any errors, or -if you think of anything else that should be included, then please make the changes and submit them as a *pull-request*. - -To build the docs in your local environment, from the project directory:: - - tox -e docs-html - -And if you want to preview any *.rst* snippets that you may want to contribute, go to `http://rst.ninjs.org/ <http://rst.ninjs.org/>`_. - -Installation ------------- -To install Flask-Admin, simply:: - - pip install flask-admin - -Or alternatively, you can download the repository and install manually by doing:: - - git clone git@github.com:flask-admin/flask-admin.git - cd flask-admin - python setup.py install - -Tests ------ -Test are run with *pytest*. If you are not familiar with this package you can get some more info from `their website <https://pytest.org/>`_. - -To run the tests, from the project directory, simply:: - - pip install -r requirements-dev.txt - pytest - -You should see output similar to:: - - ............................................. - ---------------------------------------------------------------------- - Ran 102 tests in 13.132s - - OK - -For all the tests to pass successfully, you'll need Postgres & MongoDB to be running locally. For Postgres:: - - > psql postgres - CREATE DATABASE flask_admin_test; - \q - - > psql flask_admin_test - CREATE EXTENSION postgis; - CREATE EXTENSION hstore; - -If you're using Homebrew on MacOS, you might need this:: - - # install postgis - > brew install postgis - - # set up postgresql user - > createuser -s postgresql - > brew services restart postgresql - -You can also run the tests on multiple environments using *tox*. - -3rd Party Stuff ---------------- - -Flask-Admin is built with the help of `Bootstrap <http://getbootstrap.com/>`_, `Select2 <https://github.com/ivaynberg/select2>`_ -and `Bootswatch <http://bootswatch.com/>`_. - -If you want to localize your application, install the `Flask-BabelEx <https://pypi.python.org/pypi/Flask-BabelEx>`_ package. - -You can help improve Flask-Admin's translations through Crowdin: https://crowdin.com/project/flask-admin From 8cc5ec28872bbffc23b4098eb4cd8f90b21addac Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Tue, 25 Jun 2024 21:13:42 +0100 Subject: [PATCH 008/156] Update README after transfer to Pallets Ecosystem Closes #2433 --- MANIFEST.in | 2 +- README.md | 18 +++++++++++++----- setup.py | 3 ++- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/MANIFEST.in b/MANIFEST.in index 2e4bf21db..7be8f6c7a 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,5 +1,5 @@ include LICENSE -include README.rst +include README.md recursive-include flask_admin/static * recursive-include flask_admin/templates * recursive-include flask_admin/translations * diff --git a/README.md b/README.md index 271845078..ac26d4a7c 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,19 @@ # Flask-Admin The project was recently moved into its own organization. Please update -your references to *git@github.com:flask-admin/flask-admin.git*. +your references to `git@github.com:pallets-eco/flask-admin.git`. -[![image](https://d322cqt584bo4o.cloudfront.net/flask-admin/localized.svg)](https://crowdin.com/project/flask-admin) +[![image](https://d322cqt584bo4o.cloudfront.net/flask-admin/localized.svg)](https://crowdin.com/project/flask-admin) [![image](https://github.com/pallets-eco/flask-admin/actions/workflows/test.yaml/badge.svg)](https://github.com/pallets-eco/flask-admin/actions/workflows/test.yaml) -[![image](https://github.com/flask-admin/flask-admin/actions/workflows/test.yaml/badge.svg)](https://github.com/flask-admin/flask-admin/actions/workflows/test.yaml) +## Pallets Community Ecosystem + +> [!IMPORTANT]\ +> This project is part of the Pallets Community Ecosystem. Pallets is the open +> source organization that maintains Flask; Pallets-Eco enables community +> maintenance of related projects. If you are interested in helping maintain +> this project, please reach out on [the Pallets Discord server][discord]. + +[discord]: https://discord.gg/pallets ## Introduction @@ -45,7 +53,7 @@ To run the examples in your local environment: 1. Clone the repository:: - git clone https://github.com/flask-admin/flask-admin.git + git clone https://github.com/pallets-eco/flask-admin.git cd flask-admin 2. Create and activate a virtual environment:: @@ -87,7 +95,7 @@ To install Flask-Admin, simply: Or alternatively, you can download the repository and install manually by doing: - git clone git@github.com:flask-admin/flask-admin.git + git clone git@github.com:pallets-eco/flask-admin.git cd flask-admin python setup.py install diff --git a/setup.py b/setup.py index 88a07eafe..97c26a250 100644 --- a/setup.py +++ b/setup.py @@ -14,7 +14,7 @@ def read(fname): def desc(): - info = read('README.rst') + info = read('README.md') try: return info + '\n\n' + read('doc/changelog.rst') except IOError: @@ -53,6 +53,7 @@ def grep(attrname): author_email=grep('__email__'), description='Simple and extensible admin interface framework for Flask', long_description=desc(), + long_description_content_type='text/markdown', packages=find_packages(), include_package_data=True, zip_safe=False, From c9776c0859db5afe3a6ee3fb39d6aee601a0cdad Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Thu, 4 Jul 2024 22:38:02 +0100 Subject: [PATCH 009/156] Copy structure and files from flask-debugtoolbar --- .editorconfig | 13 +++ .github/ISSUE_TEMPLATE/bug-report.md | 29 ++++++ .github/ISSUE_TEMPLATE/config.yml | 8 ++ .github/ISSUE_TEMPLATE/feature-request.md | 15 +++ .github/dependabot.yml | 18 ++++ .github/pull_request_template.md | 25 +++++ .github/workflows/lock.yaml | 23 +++++ .github/workflows/publish.yaml | 73 +++++++++++++++ .github/workflows/tests.yaml | 55 +++++++++++ .pre-commit-config.yaml | 21 +++++ .readthedocs.yaml | 13 +++ LICENSE.txt | 24 +++++ pyproject.toml | 84 +++++++++++++++++ requirements/build.in | 0 requirements/build.txt | 0 requirements/dev.in | 0 requirements/dev.txt | 0 requirements/docs.in | 0 requirements/docs.txt | 0 requirements/tests.in | 0 requirements/tests.txt | 0 requirements/typing.in | 0 requirements/typing.txt | 0 tox.ini | 107 +++++++++++++++++----- 24 files changed, 483 insertions(+), 25 deletions(-) create mode 100644 .editorconfig create mode 100644 .github/ISSUE_TEMPLATE/bug-report.md create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature-request.md create mode 100644 .github/dependabot.yml create mode 100644 .github/pull_request_template.md create mode 100644 .github/workflows/lock.yaml create mode 100644 .github/workflows/publish.yaml create mode 100644 .github/workflows/tests.yaml create mode 100644 .pre-commit-config.yaml create mode 100644 .readthedocs.yaml create mode 100644 LICENSE.txt create mode 100644 pyproject.toml create mode 100644 requirements/build.in create mode 100644 requirements/build.txt create mode 100644 requirements/dev.in create mode 100644 requirements/dev.txt create mode 100644 requirements/docs.in create mode 100644 requirements/docs.txt create mode 100644 requirements/tests.in create mode 100644 requirements/tests.txt create mode 100644 requirements/typing.in create mode 100644 requirements/typing.txt diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..2ff985a67 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,13 @@ +root = true + +[*] +indent_style = space +indent_size = 4 +insert_final_newline = true +trim_trailing_whitespace = true +end_of_line = lf +charset = utf-8 +max_line_length = 88 + +[*.{css,html,js,json,jsx,scss,ts,tsx,yaml,yml}] +indent_size = 2 diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md new file mode 100644 index 000000000..1d9c50793 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -0,0 +1,29 @@ +--- +name: Bug report +about: Report a bug in Flask-DebugToolbar (not other projects which depend on Flask-DebugToolbar) +--- + +<!-- +This issue tracker is a tool to address bugs in Flask-DebugToolbar itself. +Please use GitHub Discussions or the Pallets Discord for questions about your +own code. + +Replace this comment with a clear outline of what the bug is. +--> + +<!-- +Describe how to replicate the bug. + +Include a minimal reproducible example that demonstrates the bug. +Include the full traceback if there was an exception. +--> + +<!-- +Describe the expected behavior that should have happened but didn't. +--> + +Environment: + +- Python version: +- Flask-DebugToolbar version: +- Flask version: diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 000000000..b4fd5a250 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,8 @@ +blank_issues_enabled: false +contact_links: + - name: Questions on Discussions + url: https://github.com/pallets-eco/flask-debugtoolbar/discussions/ + about: Ask questions about your own code on the Discussions tab. + - name: Questions on Chat + url: https://discord.gg/pallets + about: Ask questions about your own code on our Discord chat. diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md new file mode 100644 index 000000000..305422579 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.md @@ -0,0 +1,15 @@ +--- +name: Feature request +about: Suggest a new feature for Flask-DebugToolbar +--- + +<!-- +Replace this comment with a description of what the feature should do. +Include details such as links to relevant specs or previous discussions. +--> + +<!-- +Replace this comment with an example of the problem which this feature +would resolve. Is this problem solvable without changes to Flask-DebugToolbar, +such as by subclassing or using an extension? +--> diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..1f47f125e --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,18 @@ +version: 2 +updates: + - package-ecosystem: github-actions + directory: / + schedule: + interval: monthly + groups: + github-actions: + patterns: + - '*' + - package-ecosystem: pip + directory: /requirements/ + schedule: + interval: monthly + groups: + python-requirements: + patterns: + - '*' diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 000000000..dbb67e35f --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,25 @@ +<!-- +Before opening a PR, open a ticket describing the issue or feature the +PR will address. An issue is not required for fixing typos in +documentation, or other simple non-code changes. + +Replace this comment with a description of the change. Describe how it +addresses the linked ticket. +--> + +<!-- +Link to relevant issues or previous PRs, one per line. Use "fixes" to +automatically close an issue. + +fixes #<issue number> +--> + +<!-- +Ensure each step in the contributing guide is complete, especially the following: + +- Add tests that demonstrate the correct behavior of the change. Tests + should fail without the change. +- Add or update relevant docs, in the docs folder and in code. +- Add an entry in CHANGES.rst summarizing the change and linking to the issue. +- Add `.. versionchanged::` entries in any relevant code docs. +--> diff --git a/.github/workflows/lock.yaml b/.github/workflows/lock.yaml new file mode 100644 index 000000000..22228a1cd --- /dev/null +++ b/.github/workflows/lock.yaml @@ -0,0 +1,23 @@ +name: Lock inactive closed issues +# Lock closed issues that have not received any further activity for two weeks. +# This does not close open issues, only humans may do that. It is easier to +# respond to new issues with fresh examples rather than continuing discussions +# on old issues. + +on: + schedule: + - cron: '0 0 * * *' +permissions: + issues: write + pull-requests: write +concurrency: + group: lock +jobs: + lock: + runs-on: ubuntu-latest + steps: + - uses: dessant/lock-threads@1bf7ec25051fe7c00bdd17e6a7cf3d7bfb7dc771 # v5.0.1 + with: + issue-inactive-days: 14 + pr-inactive-days: 14 + discussion-inactive-days: 14 diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml new file mode 100644 index 000000000..24a5b04e8 --- /dev/null +++ b/.github/workflows/publish.yaml @@ -0,0 +1,73 @@ +name: Publish +on: + push: + tags: + - '*' +jobs: + build: + runs-on: ubuntu-latest + outputs: + hash: ${{ steps.hash.outputs.hash }} + steps: + - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 + with: + python-version: '3.x' + cache: pip + cache-dependency-path: requirements*/*.txt + - run: pip install -r requirements/build.txt + # Use the commit date instead of the current date during the build. + - run: echo "SOURCE_DATE_EPOCH=$(git log -1 --pretty=%ct)" >> $GITHUB_ENV + - run: python -m build + # Generate hashes used for provenance. + - name: generate hash + id: hash + run: cd dist && echo "hash=$(sha256sum * | base64 -w0)" >> $GITHUB_OUTPUT + - uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 + with: + path: ./dist + provenance: + needs: [build] + permissions: + actions: read + id-token: write + contents: write + # Can't pin with hash due to how this workflow works. + uses: slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v2.0.0 + with: + base64-subjects: ${{ needs.build.outputs.hash }} + create-release: + # Upload the sdist, wheels, and provenance to a GitHub release. They remain + # available as build artifacts for a while as well. + needs: [provenance] + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7 + - name: create release + run: > + gh release create --draft --repo ${{ github.repository }} + ${{ github.ref_name }} + *.intoto.jsonl/* artifact/* + env: + GH_TOKEN: ${{ github.token }} + publish-pypi: + needs: [provenance] + # Wait for approval before attempting to upload to PyPI. This allows reviewing the + # files in the draft release. + environment: + name: publish + url: https://pypi.org/project/Flask-DebugToolbar/${{ github.ref_name }} + runs-on: ubuntu-latest + permissions: + id-token: write + steps: + - uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7 + - uses: pypa/gh-action-pypi-publish@81e9d935c883d0b210363ab89cf05f3894778450 # v1.8.14 + with: + repository-url: https://test.pypi.org/legacy/ + packages-dir: artifact/ + - uses: pypa/gh-action-pypi-publish@81e9d935c883d0b210363ab89cf05f3894778450 # v1.8.14 + with: + packages-dir: artifact/ diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml new file mode 100644 index 000000000..00b8e9539 --- /dev/null +++ b/.github/workflows/tests.yaml @@ -0,0 +1,55 @@ +name: Tests +on: + push: + branches: + - main + - '*.x' + paths-ignore: + - 'docs/**' + - '*.md' + - '*.rst' + pull_request: + paths-ignore: + - 'docs/**' + - '*.md' + - '*.rst' +jobs: + tests: + name: ${{ matrix.name || matrix.python }} + runs-on: ${{ matrix.os || 'ubuntu-latest' }} + strategy: + fail-fast: false + matrix: + include: + - {python: '3.12'} + - {python: '3.11'} + - {python: '3.10'} + - {python: '3.9'} + - {python: '3.8'} + - {name: Minimal, python: '3.12', tox: minimal} + steps: + - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 + with: + python-version: ${{ matrix.python }} + allow-prereleases: true + cache: pip + cache-dependency-path: requirements*/*.txt + - run: pip install tox + - run: tox run -e ${{ matrix.tox || format('py{0}', matrix.python) }} + typing: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 + with: + python-version: '3.x' + cache: pip + cache-dependency-path: requirements*/*.txt + - name: cache mypy + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 + with: + path: ./.mypy_cache + key: mypy|${{ hashFiles('pyproject.toml') }} + - run: pip install tox + - run: tox run -e typing diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 000000000..158d90751 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,21 @@ +ci: + autoupdate_schedule: monthly +repos: + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.4.7 + hooks: + - id: ruff + - id: ruff-format + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.6.0 + hooks: + - id: check-merge-conflict + exclude: "(codemirror|jquery)" + - id: debug-statements + exclude: "(codemirror|jquery)" + - id: fix-byte-order-marker + exclude: "(codemirror|jquery)" + - id: trailing-whitespace + exclude: "(codemirror|jquery)" + - id: end-of-file-fixer + exclude: "(codemirror|jquery)" diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 000000000..865c68597 --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,13 @@ +version: 2 +build: + os: ubuntu-22.04 + tools: + python: '3.12' +python: + install: + - requirements: requirements/docs.txt + - method: pip + path: . +sphinx: + builder: dirhtml + fail_on_warning: true diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 000000000..c76f9036c --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,24 @@ +Copyright 2011 Pallets Community Ecosystem + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 000000000..053c5682d --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,84 @@ +[project] +name = "Flask-DebugToolbar" +version = "0.16.0.dev" +description = "A toolbar overlay for debugging Flask applications." +readme = "README.md" +license = { file = "LICENSE.txt" } +author = [{ name = "Michael van Tellingen" }] +maintainers = [{ name = "Pallets Ecosystem", email = "contact@palletsprojects.com" }] +classifiers = [ + "Development Status :: 4 - Beta", + "Framework :: Flask", + "License :: OSI Approved :: BSD License", + "Programming Language :: Python", + "Typing :: Typed", +] +requires-python = ">=3.8" +dependencies = [ + "flask>=2.3.0", +] + +[project.urls] +Documentation = "https://flask-debugtoolbar.readthedocs.io" +Changes = "https://github.com/pallets-eco/flask-debugtoolbar/releases/" +Source = "https://github.com/pallets-eco/flask-debugtoolbar/" +Chat = "https://discord.gg/pallets" + +[build-system] +requires = ["flit_core<4"] +build-backend = "flit_core.buildapi" + +[tool.flit.module] +name = "flask_debugtoolbar" + +[tool.pytest.ini_options] +testpaths = ["tests"] +filterwarnings = [ + "error", +] + +[tool.coverage.run] +branch = true +source = ["flask_debugtoolbar", "tests"] + +[tool.coverage.paths] +source = ["src", "*/site-packages"] + +[tool.mypy] +python_version = "3.8" +files = ["src/flask_debugtoolbar", "tests"] +show_error_codes = true +pretty = true +strict = true + +[[tool.mypy.overrides]] +module = [ + "sqlparse.*" +] +ignore_missing_imports = true + +[tool.pyright] +pythonVersion = "3.8" +include = ["src/flask_debugtoolbar", "tests"] +typeCheckingMode = "basic" + +[tool.ruff] +src = ["src"] +fix = true +show-fixes = true +output-format = "full" + +[tool.ruff.lint] +select = [ + "B", # flake8-bugbear + "E", # pycodestyle error + "F", # pyflakes + "I", # isort + "UP", # pyupgrade + "W", # pycodestyle warning +] +ignore-init-module-imports = true + +[tool.ruff.lint.isort] +force-single-line = true +order-by-type = false diff --git a/requirements/build.in b/requirements/build.in new file mode 100644 index 000000000..e69de29bb diff --git a/requirements/build.txt b/requirements/build.txt new file mode 100644 index 000000000..e69de29bb diff --git a/requirements/dev.in b/requirements/dev.in new file mode 100644 index 000000000..e69de29bb diff --git a/requirements/dev.txt b/requirements/dev.txt new file mode 100644 index 000000000..e69de29bb diff --git a/requirements/docs.in b/requirements/docs.in new file mode 100644 index 000000000..e69de29bb diff --git a/requirements/docs.txt b/requirements/docs.txt new file mode 100644 index 000000000..e69de29bb diff --git a/requirements/tests.in b/requirements/tests.in new file mode 100644 index 000000000..e69de29bb diff --git a/requirements/tests.txt b/requirements/tests.txt new file mode 100644 index 000000000..e69de29bb diff --git a/requirements/typing.in b/requirements/typing.in new file mode 100644 index 000000000..e69de29bb diff --git a/requirements/typing.txt b/requirements/typing.txt new file mode 100644 index 000000000..e69de29bb diff --git a/tox.ini b/tox.ini index 2580f9ed1..12920064c 100644 --- a/tox.ini +++ b/tox.ini @@ -1,34 +1,91 @@ [tox] envlist = - WTForms{1,2} - py38-WTForms2 - flake8 - docs-html -skipsdist = true + py3{12,11,10,9,8} + minimal + style + typing + docs skip_missing_interpreters = true -[flake8] -max_line_length = 120 -ignore = E402,E722,W504 - [testenv] -setenv = - AZURE_STORAGE_CONNECTION_STRING = DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1; -usedevelop = true +package = wheel +wheel_build_env = .pkg +constrain_package_deps = true +use_frozen_constraints = true +deps = -r requirements/tests.txt +commands = pytest -v --tb=short --basetemp={envtmpdir} {posargs} + +[testenv:minimal] deps = - WTForms1: WTForms==1.0.5 - WTForms2: WTForms>=2.0 - -r requirements-dev.txt +commands = python -c "from flask_debugtoolbar import DebugToolbarExtension" + +[testenv:style] +deps = pre-commit +skip_install = true +commands = pre-commit run --all-files + +[testenv:typing] +deps = -r requirements/typing.txt commands = - pytest -v flask_admin/tests --cov=flask_admin --cov-report=html + mypy + pyright + pyright --verifytypes flask_debugtoolbar --ignoreexternal -[testenv:flake8] -deps = flake8 -commands = flake8 flask_admin +[testenv:docs] +deps = -r requirements/docs.txt +commands = sphinx-build -E -W -b dirhtml docs docs/_build/dirhtml -[testenv:docs-html] -deps = - sphinx - sphinx-intl - -r requirements-dev.txt -commands = sphinx-build -b html -d build/doctrees doc build/html +[testenv:update-pre_commit] +labels = update +deps = pre-commit +skip_install = true +commands = pre-commit autoupdate -j4 + +[testenv:update-requirements] +base_python = 3.8 +labels = update +deps = pip-tools +skip_install = true +change_dir = requirements +commands = + pip-compile build.in -q {posargs:-U} + pip-compile docs.in -q {posargs:-U} + pip-compile tests.in -q {posargs:-U} + pip-compile typing.in -q {posargs:-U} + pip-compile dev.in -q {posargs:-U} + +; --- +; [tox] +; envlist = +; WTForms{1,2} +; py38-WTForms2 +; flake8 +; docs-html +; skipsdist = true +; skip_missing_interpreters = true +; +; [flake8] +; max_line_length = 120 +; ignore = E402,E722,W504 +; +; [testenv] +; setenv = +; AZURE_STORAGE_CONNECTION_STRING = DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1; +; usedevelop = true +; deps = +; WTForms1: WTForms==1.0.5 +; WTForms2: WTForms>=2.0 +; -r requirements-dev.txt +; commands = +; pytest -v flask_admin/tests --cov=flask_admin --cov-report=html +; +; [testenv:flake8] +; deps = flake8 +; commands = flake8 flask_admin +; +; [testenv:docs-html] +; deps = +; sphinx +; sphinx-intl +; -r requirements-dev.txt +; commands = sphinx-build -b html -d build/doctrees doc build/html From ad69c87f2e86498a60c0a2fec9f0705b2003f286 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Fri, 5 Jul 2024 07:37:24 +0100 Subject: [PATCH 010/156] Customise templates from FDT for Flask-Admin --- .github/ISSUE_TEMPLATE/bug-report.md | 6 +- .github/ISSUE_TEMPLATE/config.yml | 2 +- .github/ISSUE_TEMPLATE/feature-request.md | 4 +- .github/workflows/publish.yaml | 2 +- .github/workflows/test.yaml | 67 ---- .github/workflows/tests.yaml | 61 +++- .pre-commit-config.yaml | 5 - .readthedocs.yaml | 2 +- README.md | 13 +- flask_admin/__init__.py | 2 +- pyproject.toml | 53 ++-- requirements-dev.txt | 30 -- requirements/build.in | 1 + requirements/build.txt | 20 ++ requirements/dev.in | 5 + requirements/dev.txt | 354 ++++++++++++++++++++++ requirements/docs.in | 5 + requirements/docs.txt | 73 +++++ requirements/tests.in | 29 ++ requirements/tests.txt | 0 requirements/typing.in | 5 + requirements/typing.txt | 43 +++ setup.py | 93 ------ tox.ini | 67 ++-- 24 files changed, 651 insertions(+), 291 deletions(-) delete mode 100644 .github/workflows/test.yaml delete mode 100644 requirements-dev.txt delete mode 100644 requirements/tests.txt delete mode 100644 setup.py diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md index 1d9c50793..f1377a89c 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -1,10 +1,10 @@ --- name: Bug report -about: Report a bug in Flask-DebugToolbar (not other projects which depend on Flask-DebugToolbar) +about: Report a bug in Flask-Admin (not other projects which depend on Flask-Admin) --- <!-- -This issue tracker is a tool to address bugs in Flask-DebugToolbar itself. +This issue tracker is a tool to address bugs in Flask-Admin itself. Please use GitHub Discussions or the Pallets Discord for questions about your own code. @@ -25,5 +25,5 @@ Describe the expected behavior that should have happened but didn't. Environment: - Python version: -- Flask-DebugToolbar version: - Flask version: +- Flask-Admin version: diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index b4fd5a250..4e64f3d22 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,7 +1,7 @@ blank_issues_enabled: false contact_links: - name: Questions on Discussions - url: https://github.com/pallets-eco/flask-debugtoolbar/discussions/ + url: https://github.com/pallets-eco/flask-admin/discussions/ about: Ask questions about your own code on the Discussions tab. - name: Questions on Chat url: https://discord.gg/pallets diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md index 305422579..39c8f0875 100644 --- a/.github/ISSUE_TEMPLATE/feature-request.md +++ b/.github/ISSUE_TEMPLATE/feature-request.md @@ -1,6 +1,6 @@ --- name: Feature request -about: Suggest a new feature for Flask-DebugToolbar +about: Suggest a new feature for Flask-Admin --- <!-- @@ -10,6 +10,6 @@ Include details such as links to relevant specs or previous discussions. <!-- Replace this comment with an example of the problem which this feature -would resolve. Is this problem solvable without changes to Flask-DebugToolbar, +would resolve. Is this problem solvable without changes to Flask-Admin, such as by subclassing or using an extension? --> diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 24a5b04e8..6d496bf65 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -58,7 +58,7 @@ jobs: # files in the draft release. environment: name: publish - url: https://pypi.org/project/Flask-DebugToolbar/${{ github.ref_name }} + url: https://pypi.org/project/Flask-Admin/${{ github.ref_name }} runs-on: ubuntu-latest permissions: id-token: write diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml deleted file mode 100644 index 0545bd528..000000000 --- a/.github/workflows/test.yaml +++ /dev/null @@ -1,67 +0,0 @@ -name: Run tests -on: - push: - branches: - - master - pull_request: - branches: - - master - -jobs: - test-job: - runs-on: ubuntu-latest - strategy: - matrix: - python-version: ['3.7', '3.8', '3.9', '3.10', '3.11'] - tox-version: [ 'WTForms2' ] - include: - - python-version: 3.11 - tox-version: flake8 - - python-version: 3.11 - tox-version: docs-html - services: - # Label used to access the service container - postgres: - # Docker Hub image - image: postgis/postgis:12-master # postgres with postgis installed - # Provide the password for postgres - env: - POSTGRES_PASSWORD: postgres - POSTGRES_DB: flask_admin_test - ports: - - 5432:5432 - # Set health checks to wait until postgres has started - options: >- - --health-cmd pg_isready - --health-interval 10s - --health-timeout 5s - --health-retries 5 - mongo: - image: mongo:5.0.14-focal - ports: - - 27017:27017 - azurite: - image: arafato/azurite:2.6.5 - env: - executable: blob - ports: - - 10000:10000 - steps: - - name: Install Ubuntu packages - run: | - sudo apt-get update - sudo apt-get install -y libgeos-c1v5 - - name: Check out repository code - uses: actions/checkout@v3 - - name: Set up PostgreSQL hstore module - env: - PGPASSWORD: postgres - run: psql -U postgres -h localhost -c 'CREATE EXTENSION hstore;' flask_admin_test - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: ${{ matrix.python-version }} - - name: Install tox - run: pip install tox - - name: Run tests - run: tox -e ${{ matrix.tox-version }} diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 00b8e9539..5c5bf7515 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -2,7 +2,7 @@ name: Tests on: push: branches: - - main + - master - '*.x' paths-ignore: - 'docs/**' @@ -15,18 +15,40 @@ on: - '*.rst' jobs: tests: - name: ${{ matrix.name || matrix.python }} + name: ${{ format('py{0}-wtforms{1}', matrix.python, matrix.wtforms) }} runs-on: ${{ matrix.os || 'ubuntu-latest' }} strategy: fail-fast: false matrix: - include: - - {python: '3.12'} - - {python: '3.11'} - - {python: '3.10'} - - {python: '3.9'} - - {python: '3.8'} - - {name: Minimal, python: '3.12', tox: minimal} + python: ['3.7', '3.8', '3.9', '3.10', '3.11'] + wtforms: ['2'] + services: + # Label used to access the service container + postgres: + # Docker Hub image + image: postgis/postgis:12-master # postgres with postgis installed + # Provide the password for postgres + env: + POSTGRES_PASSWORD: postgres + POSTGRES_DB: flask_admin_test + ports: + - 5432:5432 + # Set health checks to wait until postgres has started + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + mongo: + image: mongo:5.0.14-focal + ports: + - 27017:27017 + azurite: + image: arafato/azurite:2.6.5 + env: + executable: blob + ports: + - 10000:10000 steps: - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 @@ -35,10 +57,25 @@ jobs: allow-prereleases: true cache: pip cache-dependency-path: requirements*/*.txt + - name: Install Ubuntu packages + run: | + sudo apt-get update + sudo apt-get install -y libgeos-c1v5 + - name: Check out repository code + uses: actions/checkout@v3 + - name: Set up PostgreSQL hstore module + env: + PGPASSWORD: postgres + run: psql -U postgres -h localhost -c 'CREATE EXTENSION hstore;' flask_admin_test - run: pip install tox - - run: tox run -e ${{ matrix.tox || format('py{0}', matrix.python) }} - typing: + - run: tox run -e ${{ matrix.tox || format('py{0}-wtforms{1}', matrix.python, matrix.wtforms) }} + not_tests: + name: ${{ matrix.tox }} runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + tox: ['docs', 'typing'] steps: - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 @@ -52,4 +89,4 @@ jobs: path: ./.mypy_cache key: mypy|${{ hashFiles('pyproject.toml') }} - run: pip install tox - - run: tox run -e typing + - run: tox run -e ${{ matrix.tox }} diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 158d90751..0b0bdf927 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -10,12 +10,7 @@ repos: rev: v4.6.0 hooks: - id: check-merge-conflict - exclude: "(codemirror|jquery)" - id: debug-statements - exclude: "(codemirror|jquery)" - id: fix-byte-order-marker - exclude: "(codemirror|jquery)" - id: trailing-whitespace - exclude: "(codemirror|jquery)" - id: end-of-file-fixer - exclude: "(codemirror|jquery)" diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 865c68597..49c6e5e2f 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -2,7 +2,7 @@ version: 2 build: os: ubuntu-22.04 tools: - python: '3.12' + python: '3.11' python: install: - requirements: requirements/docs.txt diff --git a/README.md b/README.md index ac26d4a7c..bf93b342a 100644 --- a/README.md +++ b/README.md @@ -97,7 +97,7 @@ by doing: git clone git@github.com:pallets-eco/flask-admin.git cd flask-admin - python setup.py install + pip install . ## Tests @@ -117,8 +117,11 @@ You should see output similar to: OK -For all the tests to pass successfully, you\'ll need Postgres & MongoDB -to be running locally. For Postgres: +*NOTE*: For all the tests to pass successfully, you\'ll need Postgres (with +the postgis and hstore extension) & MongoDB to be running locally. You'll +also need libgeos available. + +For Postgres: > psql postgres CREATE DATABASE flask_admin_test; @@ -130,8 +133,10 @@ to be running locally. For Postgres: If you\'re using Homebrew on MacOS, you might need this: - # install postgis + # install postgis and geos > brew install postgis + > brew install geos + > export DYLD_LIBRARY_PATH=/opt/homebrew/opt/geos/lib/ # set up postgresql user > createuser -s postgresql diff --git a/flask_admin/__init__.py b/flask_admin/__init__.py index ee6b8767f..a074a308c 100644 --- a/flask_admin/__init__.py +++ b/flask_admin/__init__.py @@ -1,6 +1,6 @@ __version__ = '1.6.1' __author__ = 'Flask-Admin team' -__email__ = 'serge.koval+github@gmail.com' +__email__ = 'contact@palletsproject.com' from .base import expose, expose_plugview, Admin, BaseView, AdminIndexView # noqa: F401 diff --git a/pyproject.toml b/pyproject.toml index 053c5682d..c1909e1b0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,27 +1,36 @@ [project] -name = "Flask-DebugToolbar" -version = "0.16.0.dev" -description = "A toolbar overlay for debugging Flask applications." +name = "Flask-Admin" +version = "1.6.1" +description = "Simple and extensible admin interface framework for Flask" readme = "README.md" license = { file = "LICENSE.txt" } -author = [{ name = "Michael van Tellingen" }] +author = [{ name = "Flask-Admin team" }] maintainers = [{ name = "Pallets Ecosystem", email = "contact@palletsprojects.com" }] classifiers = [ - "Development Status :: 4 - Beta", - "Framework :: Flask", - "License :: OSI Approved :: BSD License", - "Programming Language :: Python", - "Typing :: Typed", + 'Development Status :: 4 - Beta', + 'Environment :: Web Environment', + 'Intended Audience :: Developers', + 'License :: OSI Approved :: BSD License', + 'Operating System :: OS Independent', + 'Programming Language :: Python', + 'Topic :: Software Development :: Libraries :: Python Modules', + 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', + 'Programming Language :: Python :: 3.9', + 'Programming Language :: Python :: 3.10', + 'Programming Language :: Python :: 3.11', ] -requires-python = ">=3.8" +requires-python = ">=3.6" dependencies = [ - "flask>=2.3.0", + "flask>=0.7", + "wtforms" ] [project.urls] -Documentation = "https://flask-debugtoolbar.readthedocs.io" -Changes = "https://github.com/pallets-eco/flask-debugtoolbar/releases/" -Source = "https://github.com/pallets-eco/flask-debugtoolbar/" +Documentation = "https://flask-admin.readthedocs.io" +Changes = "https://github.com/pallets-eco/flask-admin/releases/" +Source = "https://github.com/pallets-eco/flask-admin/" Chat = "https://discord.gg/pallets" [build-system] @@ -29,7 +38,7 @@ requires = ["flit_core<4"] build-backend = "flit_core.buildapi" [tool.flit.module] -name = "flask_debugtoolbar" +name = "flask_admin" [tool.pytest.ini_options] testpaths = ["tests"] @@ -39,14 +48,14 @@ filterwarnings = [ [tool.coverage.run] branch = true -source = ["flask_debugtoolbar", "tests"] +source = ["flask_admin", "tests"] [tool.coverage.paths] -source = ["src", "*/site-packages"] +source = ["flask_admin", "*/site-packages"] [tool.mypy] -python_version = "3.8" -files = ["src/flask_debugtoolbar", "tests"] +python_version = "3.6" +files = ["flask_admin", "tests"] show_error_codes = true pretty = true strict = true @@ -58,12 +67,12 @@ module = [ ignore_missing_imports = true [tool.pyright] -pythonVersion = "3.8" -include = ["src/flask_debugtoolbar", "tests"] +pythonVersion = "3.6" +include = ["flask_admin", "tests"] typeCheckingMode = "basic" [tool.ruff] -src = ["src"] +src = ["flask_admin"] fix = true show-fixes = true output-format = "full" diff --git a/requirements-dev.txt b/requirements-dev.txt deleted file mode 100644 index 5b48f73c8..000000000 --- a/requirements-dev.txt +++ /dev/null @@ -1,30 +0,0 @@ -flake8 -Flask<2.0.0 -werkzeug<2.0.0 -sqlalchemy<2.0 -itsdangerous<2.1.0 -MarkupSafe<2.1.0 -jinja2<=3.0.0 -Flask-SQLAlchemy<3.0.0 -peewee -wtf-peewee -mongoengine<=0.21.0 -pymongo>=3.7.0 -flask-mongoengine==0.8.2 -pillow>=3.3.2 -Babel<=2.9.1 -flask-babelex -shapely==1.5.9 -geoalchemy2 -psycopg2 -pytest -pytest-cov -coveralls -pylint -sqlalchemy-citext -sqlalchemy-utils>=0.36.6 -azure-storage-blob -arrow<0.14.0 -colour -email-validator -wtforms==2.3.3 diff --git a/requirements/build.in b/requirements/build.in index e69de29bb..378eac25d 100644 --- a/requirements/build.in +++ b/requirements/build.in @@ -0,0 +1 @@ +build diff --git a/requirements/build.txt b/requirements/build.txt index e69de29bb..c21dafe4e 100644 --- a/requirements/build.txt +++ b/requirements/build.txt @@ -0,0 +1,20 @@ +# +# This file is autogenerated by pip-compile with Python 3.7 +# by the following command: +# +# pip-compile build.in +# +build==1.1.1 + # via -r build.in +importlib-metadata==6.7.0 + # via build +packaging==24.0 + # via build +pyproject-hooks==1.1.0 + # via build +tomli==2.0.1 + # via build +typing-extensions==4.7.1 + # via importlib-metadata +zipp==3.15.0 + # via importlib-metadata diff --git a/requirements/dev.in b/requirements/dev.in index e69de29bb..6d176eff4 100644 --- a/requirements/dev.in +++ b/requirements/dev.in @@ -0,0 +1,5 @@ +-r docs.txt +-r tests.in +-r typing.txt +pre-commit +tox diff --git a/requirements/dev.txt b/requirements/dev.txt index e69de29bb..c86237c95 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -0,0 +1,354 @@ +# +# This file is autogenerated by pip-compile with Python 3.7 +# by the following command: +# +# pip-compile --resolver=backtracking dev.in +# +alabaster==0.7.13 + # via + # -r docs.txt + # sphinx +arrow==0.13.2 + # via -r tests.in +astroid==2.15.8 + # via pylint +azure-core==1.30.1 + # via azure-storage-blob +azure-storage-blob==12.19.1 + # via -r tests.in +babel==2.9.1 + # via + # -r docs.txt + # -r tests.in + # flask-babelex + # sphinx +cachetools==5.3.3 + # via tox +certifi==2024.7.4 + # via + # -r docs.txt + # requests +cffi==1.15.1 + # via cryptography +cfgv==3.3.1 + # via pre-commit +chardet==5.2.0 + # via tox +charset-normalizer==3.3.2 + # via + # -r docs.txt + # requests +click==8.1.7 + # via flask +colorama==0.4.6 + # via tox +colour==0.1.5 + # via -r tests.in +coverage[toml]==6.5.0 + # via + # coverage + # coveralls + # pytest-cov +coveralls==3.3.1 + # via -r tests.in +cryptography==42.0.8 + # via azure-storage-blob +dill==0.3.7 + # via pylint +distlib==0.3.8 + # via virtualenv +dnspython==2.3.0 + # via email-validator +docopt==0.6.2 + # via coveralls +docutils==0.19 + # via + # -r docs.txt + # sphinx +email-validator==2.0.0.post2 + # via -r tests.in +exceptiongroup==1.2.1 + # via + # -r typing.txt + # pytest +filelock==3.12.2 + # via + # tox + # virtualenv +flake8==3.9.2 + # via -r tests.in +flask==1.1.2 + # via + # flask-babelex + # flask-mongoengine + # flask-sqlalchemy + # flask-wtf +flask-babelex==0.9.4 + # via -r tests.in +flask-mongoengine==0.8.2 + # via -r tests.in +flask-sqlalchemy==2.5.1 + # via -r tests.in +flask-wtf==1.1.1 + # via flask-mongoengine +geoalchemy2==0.15.1 + # via -r tests.in +identify==2.5.24 + # via pre-commit +idna==3.7 + # via + # -r docs.txt + # email-validator + # requests +imagesize==1.4.1 + # via + # -r docs.txt + # sphinx +importlib-metadata==6.7.0 + # via + # -r docs.txt + # -r typing.txt + # click + # flake8 + # pallets-sphinx-themes + # pluggy + # pre-commit + # pytest + # sphinx + # sqlalchemy + # sqlalchemy-utils + # tox + # virtualenv +iniconfig==2.0.0 + # via + # -r typing.txt + # pytest +isodate==0.6.1 + # via azure-storage-blob +isort==5.11.5 + # via pylint +itsdangerous==2.0.1 + # via + # -r tests.in + # flask + # flask-wtf +jinja2==3.0.0 + # via + # -r docs.txt + # -r tests.in + # flask + # flask-babelex + # sphinx +lazy-object-proxy==1.9.0 + # via astroid +markupsafe==2.0.1 + # via + # -r docs.txt + # -r tests.in + # jinja2 + # wtforms +mccabe==0.6.1 + # via + # flake8 + # pylint +mongoengine==0.21.0 + # via + # -r tests.in + # flask-mongoengine +mypy==1.4.1 + # via -r typing.txt +mypy-extensions==1.0.0 + # via + # -r typing.txt + # mypy +nodeenv==1.9.1 + # via + # -r typing.txt + # pre-commit + # pyright +packaging==24.0 + # via + # -r docs.txt + # -r typing.txt + # geoalchemy2 + # pallets-sphinx-themes + # pyproject-api + # pytest + # sphinx + # tox +pallets-sphinx-themes==2.0.3 + # via -r docs.txt +peewee==3.17.5 + # via + # -r tests.in + # wtf-peewee +pillow==9.5.0 + # via -r tests.in +platformdirs==4.0.0 + # via + # pylint + # tox + # virtualenv +pluggy==1.2.0 + # via + # -r typing.txt + # pytest + # tox +pre-commit==2.21.0 + # via -r dev.in +psycopg2==2.9.9 + # via -r tests.in +pycodestyle==2.7.0 + # via flake8 +pycparser==2.21 + # via cffi +pyflakes==2.3.1 + # via flake8 +pygments==2.17.2 + # via + # -r docs.txt + # sphinx +pylint==2.17.7 + # via -r tests.in +pymongo==3.13.0 + # via + # -r tests.in + # mongoengine +pyproject-api==1.5.3 + # via tox +pyright==1.1.370 + # via -r typing.txt +pytest==7.4.4 + # via + # -r tests.in + # -r typing.txt + # pytest-cov +pytest-cov==4.1.0 + # via -r tests.in +python-dateutil==2.9.0.post0 + # via arrow +pytz==2024.1 + # via + # -r docs.txt + # babel +pyyaml==6.0.1 + # via pre-commit +requests==2.31.0 + # via + # -r docs.txt + # azure-core + # coveralls + # sphinx +shapely==1.5.9 + # via -r tests.in +six==1.16.0 + # via + # azure-core + # flask-mongoengine + # isodate + # python-dateutil +snowballstemmer==2.2.0 + # via + # -r docs.txt + # sphinx +speaklater==1.3 + # via flask-babelex +sphinx==5.3.0 + # via + # -r docs.txt + # pallets-sphinx-themes + # sphinxcontrib-log-cabinet +sphinxcontrib-applehelp==1.0.2 + # via + # -r docs.txt + # sphinx +sphinxcontrib-devhelp==1.0.2 + # via + # -r docs.txt + # sphinx +sphinxcontrib-htmlhelp==2.0.0 + # via + # -r docs.txt + # sphinx +sphinxcontrib-jsmath==1.0.1 + # via + # -r docs.txt + # sphinx +sphinxcontrib-log-cabinet==1.0.1 + # via -r docs.txt +sphinxcontrib-qthelp==1.0.3 + # via + # -r docs.txt + # sphinx +sphinxcontrib-serializinghtml==1.1.5 + # via + # -r docs.txt + # sphinx +sqlalchemy==1.4.52 + # via + # -r tests.in + # flask-sqlalchemy + # geoalchemy2 + # sqlalchemy-citext + # sqlalchemy-utils +sqlalchemy-citext==1.8.0 + # via -r tests.in +sqlalchemy-utils==0.41.2 + # via -r tests.in +tomli==2.0.1 + # via + # -r typing.txt + # coverage + # mypy + # pylint + # pyproject-api + # pytest + # tox +tomlkit==0.12.5 + # via pylint +tox==4.8.0 + # via -r dev.in +typed-ast==1.5.5 + # via + # -r typing.txt + # astroid + # mypy +typing-extensions==4.7.1 + # via + # -r docs.txt + # -r typing.txt + # astroid + # azure-core + # azure-storage-blob + # importlib-metadata + # mypy + # platformdirs + # pylint + # pyright + # tox +urllib3==2.0.7 + # via + # -r docs.txt + # requests +virtualenv==20.26.3 + # via + # pre-commit + # tox +werkzeug==1.0.1 + # via + # -r tests.in + # flask +wrapt==1.16.0 + # via astroid +wtf-peewee==3.0.5 + # via -r tests.in +wtforms==3.0.1 + # via + # -r tests.in + # flask-wtf + # wtf-peewee +zipp==3.15.0 + # via + # -r docs.txt + # -r typing.txt + # importlib-metadata diff --git a/requirements/docs.in b/requirements/docs.in index e69de29bb..8fa5a39c6 100644 --- a/requirements/docs.in +++ b/requirements/docs.in @@ -0,0 +1,5 @@ +-c tests.in + +pallets-sphinx-themes +sphinx +sphinxcontrib-log-cabinet diff --git a/requirements/docs.txt b/requirements/docs.txt index e69de29bb..ac2e81e5b 100644 --- a/requirements/docs.txt +++ b/requirements/docs.txt @@ -0,0 +1,73 @@ +# +# This file is autogenerated by pip-compile with Python 3.7 +# by the following command: +# +# pip-compile docs.in +# +alabaster==0.7.13 + # via sphinx +babel==2.9.1 + # via + # -c tests.in + # sphinx +certifi==2024.7.4 + # via requests +charset-normalizer==3.3.2 + # via requests +docutils==0.19 + # via sphinx +idna==3.7 + # via requests +imagesize==1.4.1 + # via sphinx +importlib-metadata==6.7.0 + # via + # pallets-sphinx-themes + # sphinx +jinja2==3.0.0 + # via + # -c tests.in + # sphinx +markupsafe==2.0.1 + # via + # -c tests.in + # jinja2 +packaging==24.0 + # via + # pallets-sphinx-themes + # sphinx +pallets-sphinx-themes==2.0.3 + # via -r docs.in +pygments==2.17.2 + # via sphinx +pytz==2024.1 + # via babel +requests==2.31.0 + # via sphinx +snowballstemmer==2.2.0 + # via sphinx +sphinx==5.3.0 + # via + # -r docs.in + # pallets-sphinx-themes + # sphinxcontrib-log-cabinet +sphinxcontrib-applehelp==1.0.2 + # via sphinx +sphinxcontrib-devhelp==1.0.2 + # via sphinx +sphinxcontrib-htmlhelp==2.0.0 + # via sphinx +sphinxcontrib-jsmath==1.0.1 + # via sphinx +sphinxcontrib-log-cabinet==1.0.1 + # via -r docs.in +sphinxcontrib-qthelp==1.0.3 + # via sphinx +sphinxcontrib-serializinghtml==1.1.5 + # via sphinx +typing-extensions==4.7.1 + # via importlib-metadata +urllib3==2.0.7 + # via requests +zipp==3.15.0 + # via importlib-metadata diff --git a/requirements/tests.in b/requirements/tests.in index e69de29bb..12523ed13 100644 --- a/requirements/tests.in +++ b/requirements/tests.in @@ -0,0 +1,29 @@ +flake8 +werkzeug<2.0.0 +sqlalchemy<2.0 +itsdangerous<2.1.0 +MarkupSafe<2.1.0 +jinja2<=3.0.0 +Flask-SQLAlchemy<3.0.0 +peewee +wtf-peewee +mongoengine<=0.21.0 +pymongo>=3.7.0 +flask-mongoengine==0.8.2 +pillow>=3.3.2 +Babel<=2.9.1 +flask-babelex +shapely==1.5.9 +geoalchemy2 +psycopg2 +pytest +pytest-cov +coveralls +pylint +sqlalchemy-citext +sqlalchemy-utils>=0.36.6 +azure-storage-blob +arrow<0.14.0 +colour +email-validator +wtforms diff --git a/requirements/tests.txt b/requirements/tests.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/requirements/typing.in b/requirements/typing.in index e69de29bb..30febfdb8 100644 --- a/requirements/typing.in +++ b/requirements/typing.in @@ -0,0 +1,5 @@ +-c tests.in + +mypy +pyright +pytest diff --git a/requirements/typing.txt b/requirements/typing.txt index e69de29bb..02f370e38 100644 --- a/requirements/typing.txt +++ b/requirements/typing.txt @@ -0,0 +1,43 @@ +# +# This file is autogenerated by pip-compile with Python 3.7 +# by the following command: +# +# pip-compile typing.in +# +exceptiongroup==1.2.1 + # via pytest +importlib-metadata==6.7.0 + # via + # pluggy + # pytest +iniconfig==2.0.0 + # via pytest +mypy==1.4.1 + # via -r typing.in +mypy-extensions==1.0.0 + # via mypy +nodeenv==1.9.1 + # via pyright +packaging==24.0 + # via pytest +pluggy==1.2.0 + # via pytest +pyright==1.1.370 + # via -r typing.in +pytest==7.4.4 + # via + # -c tests.in + # -r typing.in +tomli==2.0.1 + # via + # mypy + # pytest +typed-ast==1.5.5 + # via mypy +typing-extensions==4.7.1 + # via + # importlib-metadata + # mypy + # pyright +zipp==3.15.0 + # via importlib-metadata diff --git a/setup.py b/setup.py deleted file mode 100644 index 97c26a250..000000000 --- a/setup.py +++ /dev/null @@ -1,93 +0,0 @@ -# Fix for older setuptools -import re -import os - -from setuptools import setup, find_packages - - -def fpath(name): - return os.path.join(os.path.dirname(__file__), name) - - -def read(fname): - return open(fpath(fname)).read() - - -def desc(): - info = read('README.md') - try: - return info + '\n\n' + read('doc/changelog.rst') - except IOError: - return info - - -# grep flask_admin/__init__.py since python 3.x cannot import it before using 2to3 -file_text = read(fpath('flask_admin/__init__.py')) - - -def grep(attrname): - pattern = r"{0}\W*=\W*'([^']+)'".format(attrname) - strval, = re.findall(pattern, file_text) - return strval - - -extras_require = { - 'aws': ['boto'], - 'azure': ['azure-storage-blob'] -} - - -install_requires = [ - 'Flask>=0.7', - 'wtforms' -] - - -setup( - name='Flask-Admin', - version=grep('__version__'), - url='https://github.com/flask-admin/flask-admin/', - license='BSD', - python_requires='>=3.6', - author=grep('__author__'), - author_email=grep('__email__'), - description='Simple and extensible admin interface framework for Flask', - long_description=desc(), - long_description_content_type='text/markdown', - packages=find_packages(), - include_package_data=True, - zip_safe=False, - platforms='any', - extras_require=extras_require, - install_requires=install_requires, - tests_require=[ - 'pytest', - 'pillow>=9.1.0', - 'mongoengine', - 'pymongo', - 'wtf-peewee', - 'sqlalchemy', - 'flask-mongoengine<=0.21.0', - 'flask-sqlalchemy', - 'flask-babelex', - 'shapely', - 'geoalchemy2', - 'psycopg2', - ], - classifiers=[ - 'Development Status :: 4 - Beta', - 'Environment :: Web Environment', - 'Intended Audience :: Developers', - 'License :: OSI Approved :: BSD License', - 'Operating System :: OS Independent', - 'Programming Language :: Python', - 'Topic :: Software Development :: Libraries :: Python Modules', - 'Programming Language :: Python :: 3.6', - 'Programming Language :: Python :: 3.7', - 'Programming Language :: Python :: 3.8', - 'Programming Language :: Python :: 3.9', - 'Programming Language :: Python :: 3.10', - 'Programming Language :: Python :: 3.11', - ], - test_suite='flask_admin.tests' -) diff --git a/tox.ini b/tox.ini index 12920064c..e2e576c53 100644 --- a/tox.ini +++ b/tox.ini @@ -1,7 +1,7 @@ [tox] envlist = - py3{12,11,10,9,8} - minimal + py3{11,10,9,8,7}-wtforms{1,2} + py311-min style typing docs @@ -12,12 +12,14 @@ package = wheel wheel_build_env = .pkg constrain_package_deps = true use_frozen_constraints = true -deps = -r requirements/tests.txt -commands = pytest -v --tb=short --basetemp={envtmpdir} {posargs} - -[testenv:minimal] +passenv = DYLD_LIBRARY_PATH +setenv = + AZURE_STORAGE_CONNECTION_STRING = DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1; deps = -commands = python -c "from flask_debugtoolbar import DebugToolbarExtension" + -r requirements/tests.in + wtforms1: WTForms==1.0.5 + wtforms2: WTForms>=2.0 +commands = pytest -v --tb=short --basetemp={envtmpdir} flask_admin/tests {posargs} [testenv:style] deps = pre-commit @@ -27,13 +29,14 @@ commands = pre-commit run --all-files [testenv:typing] deps = -r requirements/typing.txt commands = - mypy - pyright - pyright --verifytypes flask_debugtoolbar --ignoreexternal + mypy --python-version 3.7 + mypy --python-version 3.11 [testenv:docs] deps = -r requirements/docs.txt -commands = sphinx-build -E -W -b dirhtml docs docs/_build/dirhtml +# commands = sphinx-build -E -W -b dirhtml doc doc/_build/dirhtml +# TODO: Switch to the above command when docs have been migrated to use the Pallets theme. +commands = sphinx-build -b html -d build/doctrees doc build/html [testenv:update-pre_commit] labels = update @@ -42,7 +45,6 @@ skip_install = true commands = pre-commit autoupdate -j4 [testenv:update-requirements] -base_python = 3.8 labels = update deps = pip-tools skip_install = true @@ -50,42 +52,9 @@ change_dir = requirements commands = pip-compile build.in -q {posargs:-U} pip-compile docs.in -q {posargs:-U} - pip-compile tests.in -q {posargs:-U} +; pip-compile tests.in -q {posargs:-U} +; # TODO: remove? There are a lot of test +; dependencies; unsure if we can compile these in a way that would work for all +; python versions supported? pip-compile typing.in -q {posargs:-U} pip-compile dev.in -q {posargs:-U} - -; --- -; [tox] -; envlist = -; WTForms{1,2} -; py38-WTForms2 -; flake8 -; docs-html -; skipsdist = true -; skip_missing_interpreters = true -; -; [flake8] -; max_line_length = 120 -; ignore = E402,E722,W504 -; -; [testenv] -; setenv = -; AZURE_STORAGE_CONNECTION_STRING = DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1; -; usedevelop = true -; deps = -; WTForms1: WTForms==1.0.5 -; WTForms2: WTForms>=2.0 -; -r requirements-dev.txt -; commands = -; pytest -v flask_admin/tests --cov=flask_admin --cov-report=html -; -; [testenv:flake8] -; deps = flake8 -; commands = flake8 flask_admin -; -; [testenv:docs-html] -; deps = -; sphinx -; sphinx-intl -; -r requirements-dev.txt -; commands = sphinx-build -b html -d build/doctrees doc build/html From 386d60a92799bb42d90a5828b282c84788556444 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Fri, 5 Jul 2024 09:32:21 +0100 Subject: [PATCH 011/156] Address test suite failures/warnings --- README.md | 3 +-- flask_admin/contrib/__init__.py | 2 +- flask_admin/tests/geoa/test_basic.py | 2 ++ flask_admin/tests/mongoengine/test_basic.py | 1 + flask_admin/tests/peeweemodel/test_basic.py | 3 +++ flask_admin/tests/sqla/test_basic.py | 6 ++++++ flask_admin/tests/sqla/test_form_rules.py | 8 ++++++++ flask_admin/tests/test_base.py | 3 +++ pyproject.toml | 7 ++++++- requirements/tests.in | 2 +- tox.ini | 8 +++++--- 11 files changed, 37 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index bf93b342a..4f1b839e6 100644 --- a/README.md +++ b/README.md @@ -105,8 +105,7 @@ Test are run with *pytest*. If you are not familiar with this package you can get some more info from [their website](https://pytest.org/). To run the tests, from the project directory, simply: - - pip install -r requirements-dev.txt + pip install --use-pep517 -r requirements/dev.txt pytest You should see output similar to: diff --git a/flask_admin/contrib/__init__.py b/flask_admin/contrib/__init__.py index 42e33a76c..24608e116 100644 --- a/flask_admin/contrib/__init__.py +++ b/flask_admin/contrib/__init__.py @@ -1,4 +1,4 @@ try: - __import__('pkg_resources').declare_namespace(__name__) + __path__ = __import__('pkgutil').extend_path(__path__, __name__) except ImportError: pass diff --git a/flask_admin/tests/geoa/test_basic.py b/flask_admin/tests/geoa/test_basic.py index 11c7fa602..7009107b2 100644 --- a/flask_admin/tests/geoa/test_basic.py +++ b/flask_admin/tests/geoa/test_basic.py @@ -2,6 +2,7 @@ import json import re +import pytest from flask_admin.contrib.geoa import ModelView from flask_admin.contrib.geoa.fields import GeoJSONField @@ -26,6 +27,7 @@ def __unicode__(self): return GeoModel +@pytest.mark.filterwarnings("ignore:Please update your type formatter:UserWarning") def test_model(): app, db, admin = setup() GeoModel = create_models(db) diff --git a/flask_admin/tests/mongoengine/test_basic.py b/flask_admin/tests/mongoengine/test_basic.py index b977d23b5..20fbb61ab 100644 --- a/flask_admin/tests/mongoengine/test_basic.py +++ b/flask_admin/tests/mongoengine/test_basic.py @@ -1,3 +1,4 @@ +import pytest from wtforms import fields, validators from flask_admin import form diff --git a/flask_admin/tests/peeweemodel/test_basic.py b/flask_admin/tests/peeweemodel/test_basic.py index fa7f97645..ea1ce8253 100644 --- a/flask_admin/tests/peeweemodel/test_basic.py +++ b/flask_admin/tests/peeweemodel/test_basic.py @@ -1,3 +1,5 @@ +import pytest + from flask_admin._compat import as_unicode import peewee @@ -174,6 +176,7 @@ def test_model(): assert Model1.select().count() == 0 +# @pytest.mark.filterwarnings("ignore:Please update your type formatter:UserWarning") def test_column_editable_list(): app, db, admin = setup() diff --git a/flask_admin/tests/sqla/test_basic.py b/flask_admin/tests/sqla/test_basic.py index 981903f4a..65bd3d0cf 100644 --- a/flask_admin/tests/sqla/test_basic.py +++ b/flask_admin/tests/sqla/test_basic.py @@ -155,6 +155,7 @@ def fill_db(db, Model1, Model2): db.session.commit() +@pytest.mark.filterwarnings("ignore:Please update your type formatter:UserWarning") def test_model(): app, db, admin = setup() @@ -485,6 +486,7 @@ def test_extra_args_filter(): assert '<input type="hidden" name="foo" value="bar">' in data +@pytest.mark.filterwarnings("ignore:Please update your type formatter:UserWarning") def test_complex_searchable_list(): app, db, admin = setup() @@ -521,6 +523,7 @@ def test_complex_searchable_list(): assert 'model1-test2-val' not in data +@pytest.mark.filterwarnings("ignore:Please update your type formatter:UserWarning") def test_complex_searchable_list_missing_children(): app, db, admin = setup() @@ -542,6 +545,7 @@ def test_complex_searchable_list_missing_children(): assert 'magic string' in data +@pytest.mark.filterwarnings("ignore:Please update your type formatter:UserWarning") def test_column_editable_list(): app, db, admin = setup() @@ -705,6 +709,7 @@ def __init__(self, id=None, val1=None): assert 'change-success-1' in data +@pytest.mark.filterwarnings("ignore:Please update your type formatter:UserWarning") def test_column_filters(): app, db, admin = setup() @@ -1698,6 +1703,7 @@ class Model2(db.Model): assert 'Jim Smith' in data +@pytest.mark.filterwarnings("ignore:Please update your type formatter:UserWarning") def test_url_args(): app, db, admin = setup() diff --git a/flask_admin/tests/sqla/test_form_rules.py b/flask_admin/tests/sqla/test_form_rules.py index 86959ee0a..faae6521b 100644 --- a/flask_admin/tests/sqla/test_form_rules.py +++ b/flask_admin/tests/sqla/test_form_rules.py @@ -1,9 +1,12 @@ +import pytest + from . import setup from .test_basic import CustomModelView, create_models from flask_admin.form import rules +@pytest.mark.filterwarnings("ignore:Fields missing:UserWarning") def test_form_rules(): app, db, admin = setup() @@ -30,6 +33,7 @@ def test_form_rules(): assert pos3 == -1 +@pytest.mark.filterwarnings("ignore:Fields missing:UserWarning") def test_rule_macro(): app, db, admin = setup() @@ -53,6 +57,7 @@ def test_rule_macro(): assert 'Hello another_test' in data +@pytest.mark.filterwarnings("ignore:Fields missing:UserWarning") def test_rule_container(): app, db, admin = setup() @@ -80,6 +85,7 @@ def test_rule_container(): assert pos1 < pos2 < pos3 +@pytest.mark.filterwarnings("ignore:Fields missing:UserWarning") def test_rule_header(): app, db, admin = setup() with app.app_context(): @@ -99,6 +105,7 @@ def test_rule_header(): assert '<h3>hello</h3>' in data +@pytest.mark.filterwarnings("ignore:Fields missing:UserWarning") def test_rule_field_set(): app, db, admin = setup() with app.app_context(): @@ -125,6 +132,7 @@ def test_rule_field_set(): assert pos3 == -1 +@pytest.mark.filterwarnings("ignore:Fields missing:UserWarning") def test_rule_inlinefieldlist(): app, db, admin = setup() with app.app_context(): diff --git a/flask_admin/tests/test_base.py b/flask_admin/tests/test_base.py index ea0d69d2e..60b309528 100644 --- a/flask_admin/tests/test_base.py +++ b/flask_admin/tests/test_base.py @@ -217,6 +217,8 @@ def test_baseview_urls(): assert len(view._urls) == 2 +# +@pytest.mark.filterwarnings("ignore:unclosed file:ResourceWarning") def test_add_views(): app = Flask(__name__) admin = base.Admin(app) @@ -426,6 +428,7 @@ def test_root_mount(): # test static files when url='/' with app.test_request_context('/'): rv = client.get(url_for('admin.static', filename='bootstrap/bootstrap2/css/bootstrap.css')) + rv.close() assert rv.status_code == 200 diff --git a/pyproject.toml b/pyproject.toml index c1909e1b0..9d9f0a8a7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,6 +44,11 @@ name = "flask_admin" testpaths = ["tests"] filterwarnings = [ "error", + # TODO: remove the ignored deprecation warning when support for WTForms 3 has been added. + "ignore:Flags should be stored in dicts and not in tuples. The next version of WTForms will abandon support for flags in tuples.:DeprecationWarning", + "ignore:'HTMLString' will be removed in WTForms 3.0. Use 'markupsafe.Markup' instead.:DeprecationWarning", + # TODO: remove when we drop Python 3.7 support + "ignore:pkg_resources is deprecated as an API:DeprecationWarning", ] [tool.coverage.run] @@ -55,7 +60,7 @@ source = ["flask_admin", "*/site-packages"] [tool.mypy] python_version = "3.6" -files = ["flask_admin", "tests"] +files = ["flask_admin"] show_error_codes = true pretty = true strict = true diff --git a/requirements/tests.in b/requirements/tests.in index 12523ed13..b908912a5 100644 --- a/requirements/tests.in +++ b/requirements/tests.in @@ -1,5 +1,5 @@ flake8 -werkzeug<2.0.0 +werkzeug sqlalchemy<2.0 itsdangerous<2.1.0 MarkupSafe<2.1.0 diff --git a/tox.ini b/tox.ini index e2e576c53..fd5cfd08b 100644 --- a/tox.ini +++ b/tox.ini @@ -1,7 +1,6 @@ [tox] envlist = - py3{11,10,9,8,7}-wtforms{1,2} - py311-min + py3{7,8,9,10,11}-flask{2}-wtforms{2} style typing docs @@ -13,12 +12,15 @@ wheel_build_env = .pkg constrain_package_deps = true use_frozen_constraints = true passenv = DYLD_LIBRARY_PATH +# TODO: Remove SQLALCHEMY_SILENCE_UBER_WARNINGwhen Flask-Admin is compatible with SQLAlchemy>=2.0.0 setenv = + SQLALCHEMY_SILENCE_UBER_WARNING = 1 AZURE_STORAGE_CONNECTION_STRING = DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1; deps = -r requirements/tests.in + flask2: Flask>=2.0.0,<3 wtforms1: WTForms==1.0.5 - wtforms2: WTForms>=2.0 + wtforms2: WTForms>=2.0,<3 commands = pytest -v --tb=short --basetemp={envtmpdir} flask_admin/tests {posargs} [testenv:style] From aa4c076663954b87f5e351f43d1dcd24fc7c7c02 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Mon, 8 Jul 2024 22:35:13 +0100 Subject: [PATCH 012/156] Disable typing tests until we've typed the project --- .github/workflows/tests.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 5c5bf7515..9fffb86cf 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -75,7 +75,8 @@ jobs: strategy: fail-fast: false matrix: - tox: ['docs', 'typing'] + # tox: ['docs', 'typing'] + tox: ['docs'] # disable typing tests until we have typed the project correctly steps: - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 From e22a180bc0614e0b232f4b93075ef4adabd78121 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 13 Jul 2024 14:24:13 +0000 Subject: [PATCH 013/156] Bump the github-actions group across 1 directory with 5 updates Bumps the github-actions group with 5 updates in the / directory: | Package | From | To | | --- | --- | --- | | [actions/checkout](https://github.com/actions/checkout) | `3` | `4` | | [actions/setup-python](https://github.com/actions/setup-python) | `5.1.0` | `5.1.1` | | [actions/upload-artifact](https://github.com/actions/upload-artifact) | `4.3.3` | `4.3.4` | | [actions/download-artifact](https://github.com/actions/download-artifact) | `4.1.7` | `4.1.8` | | [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish) | `1.8.14` | `1.9.0` | Updates `actions/checkout` from 3 to 4 - [Release notes](https://github.com/actions/checkout/releases) - [Commits](https://github.com/actions/checkout/compare/v3...v4) Updates `actions/setup-python` from 5.1.0 to 5.1.1 - [Release notes](https://github.com/actions/setup-python/releases) - [Commits](https://github.com/actions/setup-python/compare/82c7e631bb3cdc910f68e0081d67478d79c6982d...39cd14951b08e74b54015e9e001cdefcf80e669f) Updates `actions/upload-artifact` from 4.3.3 to 4.3.4 - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/65462800fd760344b1a7b4382951275a0abb4808...0b2256b8c012f0828dc542b3febcab082c67f72b) Updates `actions/download-artifact` from 4.1.7 to 4.1.8 - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/65a9edc5881444af0b9093a5e628f2fe47ea3b2e...fa0a91b85d4f404e444e00e005971372dc801d16) Updates `pypa/gh-action-pypi-publish` from 1.8.14 to 1.9.0 - [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases) - [Commits](https://github.com/pypa/gh-action-pypi-publish/compare/81e9d935c883d0b210363ab89cf05f3894778450...ec4db0b4ddc65acdf4bff5fa45ac92d78b56bdf0) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions - dependency-name: actions/setup-python dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions - dependency-name: actions/download-artifact dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions - dependency-name: pypa/gh-action-pypi-publish dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-actions ... Signed-off-by: dependabot[bot] <support@github.com> --- .github/workflows/publish.yaml | 14 +++++++------- .github/workflows/tests.yaml | 10 +++++----- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 6d496bf65..ae7950395 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -9,8 +9,8 @@ jobs: outputs: hash: ${{ steps.hash.outputs.hash }} steps: - - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 - - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 with: python-version: '3.x' cache: pip @@ -23,7 +23,7 @@ jobs: - name: generate hash id: hash run: cd dist && echo "hash=$(sha256sum * | base64 -w0)" >> $GITHUB_OUTPUT - - uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 + - uses: actions/upload-artifact@0b2256b8c012f0828dc542b3febcab082c67f72b # v4.3.4 with: path: ./dist provenance: @@ -44,7 +44,7 @@ jobs: permissions: contents: write steps: - - uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7 + - uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 - name: create release run: > gh release create --draft --repo ${{ github.repository }} @@ -63,11 +63,11 @@ jobs: permissions: id-token: write steps: - - uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7 - - uses: pypa/gh-action-pypi-publish@81e9d935c883d0b210363ab89cf05f3894778450 # v1.8.14 + - uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 + - uses: pypa/gh-action-pypi-publish@ec4db0b4ddc65acdf4bff5fa45ac92d78b56bdf0 # v1.9.0 with: repository-url: https://test.pypi.org/legacy/ packages-dir: artifact/ - - uses: pypa/gh-action-pypi-publish@81e9d935c883d0b210363ab89cf05f3894778450 # v1.8.14 + - uses: pypa/gh-action-pypi-publish@ec4db0b4ddc65acdf4bff5fa45ac92d78b56bdf0 # v1.9.0 with: packages-dir: artifact/ diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 9fffb86cf..3e15e30a9 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -50,8 +50,8 @@ jobs: ports: - 10000:10000 steps: - - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 - - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 with: python-version: ${{ matrix.python }} allow-prereleases: true @@ -62,7 +62,7 @@ jobs: sudo apt-get update sudo apt-get install -y libgeos-c1v5 - name: Check out repository code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up PostgreSQL hstore module env: PGPASSWORD: postgres @@ -78,8 +78,8 @@ jobs: # tox: ['docs', 'typing'] tox: ['docs'] # disable typing tests until we have typed the project correctly steps: - - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 - - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 with: python-version: '3.x' cache: pip From a9c3b11df43b412b4ad7294a748b5e87d9b7409f Mon Sep 17 00:00:00 2001 From: Ian Bushong <ibushong@gmail.com> Date: Sat, 25 Jun 2022 19:04:05 -0700 Subject: [PATCH 014/156] Fix value of `desc` param in filter form (`1` instead of `"True"`) Fixes #1761 --- flask_admin/templates/bootstrap2/admin/model/layout.html | 4 ++-- flask_admin/templates/bootstrap3/admin/model/layout.html | 4 ++-- flask_admin/templates/bootstrap4/admin/model/layout.html | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/flask_admin/templates/bootstrap2/admin/model/layout.html b/flask_admin/templates/bootstrap2/admin/model/layout.html index 396313988..44086dac7 100644 --- a/flask_admin/templates/bootstrap2/admin/model/layout.html +++ b/flask_admin/templates/bootstrap2/admin/model/layout.html @@ -41,7 +41,7 @@ <input type="hidden" name="sort" value="{{ sort_column }}"> {% endif %} {% if sort_desc %} - <input type="hidden" name="desc" value="{{ sort_desc }}"> + <input type="hidden" name="desc" value="1"> {% endif %} {% if search %} <input type="hidden" name="search" value="{{ search }}"> @@ -76,7 +76,7 @@ <input type="hidden" name="sort" value="{{ sort_column }}"> {% endif %} {% if sort_desc %} - <input type="hidden" name="desc" value="{{ sort_desc }}"> + <input type="hidden" name="desc" value="1"> {% endif %} {%- set full_search_placeholder = _gettext('Search') %} {%- if search_placeholder %}{% set full_search_placeholder = [full_search_placeholder, search_placeholder] | join(": ") %}{% endif %} diff --git a/flask_admin/templates/bootstrap3/admin/model/layout.html b/flask_admin/templates/bootstrap3/admin/model/layout.html index 792eb5b83..d31a39c74 100644 --- a/flask_admin/templates/bootstrap3/admin/model/layout.html +++ b/flask_admin/templates/bootstrap3/admin/model/layout.html @@ -41,7 +41,7 @@ <input type="hidden" name="sort" value="{{ sort_column }}"> {% endif %} {% if sort_desc %} - <input type="hidden" name="desc" value="{{ sort_desc }}"> + <input type="hidden" name="desc" value="1"> {% endif %} {% if search %} <input type="hidden" name="search" value="{{ search }}"> @@ -76,7 +76,7 @@ <input type="hidden" name="sort" value="{{ sort_column }}"> {% endif %} {% if sort_desc %} - <input type="hidden" name="desc" value="{{ sort_desc }}"> + <input type="hidden" name="desc" value="1"> {% endif %} {%- set full_search_placeholder = _gettext('Search') %} {%- set max_size = config.get('FLASK_ADMIN_SEARCH_SIZE_MAX', 100) %} diff --git a/flask_admin/templates/bootstrap4/admin/model/layout.html b/flask_admin/templates/bootstrap4/admin/model/layout.html index 37667010a..7917dd1a0 100644 --- a/flask_admin/templates/bootstrap4/admin/model/layout.html +++ b/flask_admin/templates/bootstrap4/admin/model/layout.html @@ -34,7 +34,7 @@ <input type="hidden" name="sort" value="{{ sort_column }}"> {% endif %} {% if sort_desc %} - <input type="hidden" name="desc" value="{{ sort_desc }}"> + <input type="hidden" name="desc" value="1"> {% endif %} {% if search %} <input type="hidden" name="search" value="{{ search }}"> @@ -69,7 +69,7 @@ <input type="hidden" name="sort" value="{{ sort_column }}"> {% endif %} {% if sort_desc %} - <input type="hidden" name="desc" value="{{ sort_desc }}"> + <input type="hidden" name="desc" value="1"> {% endif %} {% if search %} <div class="form-inline input-group"> From 498afbcbecaf456c9e7957c72799b0e6aea8ad0d Mon Sep 17 00:00:00 2001 From: Martyn Klassen <lmklassen@gmail.com> Date: Tue, 17 Jan 2023 11:56:16 -0500 Subject: [PATCH 015/156] Tuple field_flags are deprecated --- flask_admin/contrib/sqla/validators.py | 2 +- flask_admin/form/validators.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/flask_admin/contrib/sqla/validators.py b/flask_admin/contrib/sqla/validators.py index f43b4eb4b..7f9809cdd 100644 --- a/flask_admin/contrib/sqla/validators.py +++ b/flask_admin/contrib/sqla/validators.py @@ -18,7 +18,7 @@ class Unique(object): :param message: The error message. """ - field_flags = ('unique', ) + field_flags = {'unique': True} def __init__(self, db_session, model, column, message=None): self.db_session = db_session diff --git a/flask_admin/form/validators.py b/flask_admin/form/validators.py index db856c368..3d7693f8b 100644 --- a/flask_admin/form/validators.py +++ b/flask_admin/form/validators.py @@ -8,7 +8,7 @@ class FieldListInputRequired(object): Validates that at least one item was provided for a FieldList """ - field_flags = ('required',) + field_flags = {'required': True} def __call__(self, form, field): if len(field.entries) == 0: From be113fc75112b54d65dfaa147655cc814c84d913 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Sat, 13 Jul 2024 12:45:28 +0100 Subject: [PATCH 016/156] Re-enable typing check github action --- .github/workflows/tests.yaml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 3e15e30a9..9d8e446e1 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -75,13 +75,12 @@ jobs: strategy: fail-fast: false matrix: - # tox: ['docs', 'typing'] - tox: ['docs'] # disable typing tests until we have typed the project correctly + tox: ['docs', 'typing'] steps: - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 with: - python-version: '3.x' + python-version: 3.11 cache: pip cache-dependency-path: requirements*/*.txt - name: cache mypy From ee85290b7d566d875aea8b358a25c44a9fab0838 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Tue, 9 Jul 2024 19:03:03 +0100 Subject: [PATCH 017/156] Disable strict checks temporarily Disables all of the flags that `--strict` adds, so that we can gradually pick away at them more easily over time. --- pyproject.toml | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 9d9f0a8a7..cb4d45e60 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -65,6 +65,35 @@ show_error_codes = true pretty = true strict = true +# Start off with these +warn_unused_configs = false +warn_redundant_casts = false +warn_unused_ignores = false + +# Getting these passing should be easy +strict_equality = false +strict_concatenate = false + +# Strongly recommend enabling this one as soon as you can +check_untyped_defs = false + +# These shouldn't be too much additional work, but may be tricky to +# get passing if you use a lot of untyped libraries +disallow_subclassing_any = false +disallow_untyped_decorators = false +disallow_any_generics = false + +# These next few are various gradations of forcing use of type annotations +disallow_untyped_calls = false +disallow_incomplete_defs = false +disallow_untyped_defs = false + +# This one isn't too hard to get passing, but return on investment is lower +no_implicit_reexport = false + +# This one can be tricky to get passing if you use a lot of untyped libraries +warn_return_any = false + [[tool.mypy.overrides]] module = [ "sqlparse.*" From e577a2e8009b53c56c1bfd15f75c7d28099ac344 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Tue, 9 Jul 2024 19:03:15 +0100 Subject: [PATCH 018/156] Update requirements files for dev/test * Install missing types for mypy * Use shapely>=1.8, which has the correct resolution for libgeos on darwin. * Use '-r tests.in' in `typing.in`, so that all packages are installed to aid in type resolution. --- README.md | 1 - requirements/dev.txt | 227 ++++++++++++++++++++++++++++++---------- requirements/tests.in | 4 +- requirements/tests.txt | 206 ++++++++++++++++++++++++++++++++++++ requirements/typing.in | 11 +- requirements/typing.txt | 208 +++++++++++++++++++++++++++++++++++- 6 files changed, 596 insertions(+), 61 deletions(-) create mode 100644 requirements/tests.txt diff --git a/README.md b/README.md index 4f1b839e6..b4529a87e 100644 --- a/README.md +++ b/README.md @@ -135,7 +135,6 @@ If you\'re using Homebrew on MacOS, you might need this: # install postgis and geos > brew install postgis > brew install geos - > export DYLD_LIBRARY_PATH=/opt/homebrew/opt/geos/lib/ # set up postgresql user > createuser -s postgresql diff --git a/requirements/dev.txt b/requirements/dev.txt index c86237c95..ad7c9747d 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -9,17 +9,30 @@ alabaster==0.7.13 # -r docs.txt # sphinx arrow==0.13.2 - # via -r tests.in + # via + # -r tests.in + # -r typing.txt astroid==2.15.8 - # via pylint -azure-core==1.30.1 - # via azure-storage-blob -azure-storage-blob==12.19.1 - # via -r tests.in + # via + # -r typing.txt + # pylint +azure-common==1.1.28 + # via + # -r typing.txt + # azure-storage-blob + # azure-storage-common +azure-storage-blob==2.1.0 + # via + # -r tests.in + # -r typing.txt +azure-storage-common==2.1.0 + # via + # -r typing.txt + # azure-storage-blob babel==2.9.1 # via # -r docs.txt - # -r tests.in + # -r typing.txt # flask-babelex # sphinx cachetools==5.3.3 @@ -27,9 +40,12 @@ cachetools==5.3.3 certifi==2024.7.4 # via # -r docs.txt + # -r typing.txt # requests cffi==1.15.1 - # via cryptography + # via + # -r typing.txt + # cryptography cfgv==3.3.1 # via pre-commit chardet==5.2.0 @@ -37,36 +53,54 @@ chardet==5.2.0 charset-normalizer==3.3.2 # via # -r docs.txt + # -r typing.txt # requests click==8.1.7 - # via flask + # via + # -r typing.txt + # flask colorama==0.4.6 # via tox colour==0.1.5 - # via -r tests.in + # via + # -r tests.in + # -r typing.txt coverage[toml]==6.5.0 # via + # -r typing.txt # coverage # coveralls # pytest-cov coveralls==3.3.1 - # via -r tests.in + # via + # -r tests.in + # -r typing.txt cryptography==42.0.8 - # via azure-storage-blob + # via + # -r typing.txt + # azure-storage-common dill==0.3.7 - # via pylint + # via + # -r typing.txt + # pylint distlib==0.3.8 # via virtualenv dnspython==2.3.0 - # via email-validator + # via + # -r typing.txt + # email-validator docopt==0.6.2 - # via coveralls + # via + # -r typing.txt + # coveralls docutils==0.19 # via # -r docs.txt # sphinx email-validator==2.0.0.post2 - # via -r tests.in + # via + # -r tests.in + # -r typing.txt exceptiongroup==1.2.1 # via # -r typing.txt @@ -76,28 +110,42 @@ filelock==3.12.2 # tox # virtualenv flake8==3.9.2 - # via -r tests.in -flask==1.1.2 # via + # -r tests.in + # -r typing.txt +flask==2.1.3 + # via + # -r typing.txt # flask-babelex # flask-mongoengine # flask-sqlalchemy # flask-wtf flask-babelex==0.9.4 - # via -r tests.in + # via + # -r tests.in + # -r typing.txt flask-mongoengine==0.8.2 - # via -r tests.in + # via + # -r tests.in + # -r typing.txt flask-sqlalchemy==2.5.1 - # via -r tests.in + # via + # -r tests.in + # -r typing.txt flask-wtf==1.1.1 - # via flask-mongoengine -geoalchemy2==0.15.1 - # via -r tests.in + # via + # -r typing.txt + # flask-mongoengine +geoalchemy2==0.15.2 + # via + # -r tests.in + # -r typing.txt identify==2.5.24 # via pre-commit idna==3.7 # via # -r docs.txt + # -r typing.txt # email-validator # requests imagesize==1.4.1 @@ -110,6 +158,7 @@ importlib-metadata==6.7.0 # -r typing.txt # click # flake8 + # flask # pallets-sphinx-themes # pluggy # pre-commit @@ -123,37 +172,42 @@ iniconfig==2.0.0 # via # -r typing.txt # pytest -isodate==0.6.1 - # via azure-storage-blob isort==5.11.5 - # via pylint + # via + # -r typing.txt + # pylint itsdangerous==2.0.1 # via # -r tests.in + # -r typing.txt # flask # flask-wtf jinja2==3.0.0 # via # -r docs.txt - # -r tests.in + # -r typing.txt # flask # flask-babelex # sphinx lazy-object-proxy==1.9.0 - # via astroid + # via + # -r typing.txt + # astroid markupsafe==2.0.1 # via # -r docs.txt - # -r tests.in + # -r typing.txt # jinja2 # wtforms mccabe==0.6.1 # via + # -r typing.txt # flake8 # pylint mongoengine==0.21.0 # via # -r tests.in + # -r typing.txt # flask-mongoengine mypy==1.4.1 # via -r typing.txt @@ -178,14 +232,18 @@ packaging==24.0 # tox pallets-sphinx-themes==2.0.3 # via -r docs.txt -peewee==3.17.5 +peewee==3.17.6 # via # -r tests.in + # -r typing.txt # wtf-peewee pillow==9.5.0 - # via -r tests.in + # via + # -r tests.in + # -r typing.txt platformdirs==4.0.0 # via + # -r typing.txt # pylint # tox # virtualenv @@ -197,22 +255,33 @@ pluggy==1.2.0 pre-commit==2.21.0 # via -r dev.in psycopg2==2.9.9 - # via -r tests.in + # via + # -r tests.in + # -r typing.txt pycodestyle==2.7.0 - # via flake8 + # via + # -r typing.txt + # flake8 pycparser==2.21 - # via cffi + # via + # -r typing.txt + # cffi pyflakes==2.3.1 - # via flake8 + # via + # -r typing.txt + # flake8 pygments==2.17.2 # via # -r docs.txt # sphinx pylint==2.17.7 - # via -r tests.in + # via + # -r tests.in + # -r typing.txt pymongo==3.13.0 # via # -r tests.in + # -r typing.txt # mongoengine pyproject-api==1.5.3 # via tox @@ -224,35 +293,45 @@ pytest==7.4.4 # -r typing.txt # pytest-cov pytest-cov==4.1.0 - # via -r tests.in + # via + # -r tests.in + # -r typing.txt python-dateutil==2.9.0.post0 - # via arrow + # via + # -r typing.txt + # arrow + # azure-storage-common pytz==2024.1 # via # -r docs.txt + # -r typing.txt # babel pyyaml==6.0.1 # via pre-commit requests==2.31.0 # via # -r docs.txt - # azure-core + # -r typing.txt + # azure-storage-common # coveralls # sphinx -shapely==1.5.9 - # via -r tests.in +shapely==1.8.5.post1 + # via + # -r tests.in + # -r typing.txt six==1.16.0 # via - # azure-core + # -r typing.txt # flask-mongoengine - # isodate # python-dateutil snowballstemmer==2.2.0 # via # -r docs.txt # sphinx speaklater==1.3 - # via flask-babelex + # via + # -r typing.txt + # flask-babelex sphinx==5.3.0 # via # -r docs.txt @@ -287,14 +366,19 @@ sphinxcontrib-serializinghtml==1.1.5 sqlalchemy==1.4.52 # via # -r tests.in + # -r typing.txt # flask-sqlalchemy # geoalchemy2 # sqlalchemy-citext # sqlalchemy-utils sqlalchemy-citext==1.8.0 - # via -r tests.in + # via + # -r tests.in + # -r typing.txt sqlalchemy-utils==0.41.2 - # via -r tests.in + # via + # -r tests.in + # -r typing.txt tomli==2.0.1 # via # -r typing.txt @@ -305,7 +389,9 @@ tomli==2.0.1 # pytest # tox tomlkit==0.12.5 - # via pylint + # via + # -r typing.txt + # pylint tox==4.8.0 # via -r dev.in typed-ast==1.5.5 @@ -313,13 +399,41 @@ typed-ast==1.5.5 # -r typing.txt # astroid # mypy +types-boto==2.49.18.9 + # via -r typing.txt +types-click==7.1.8 + # via + # -r typing.txt + # types-flask +types-flask==1.1.6 + # via -r typing.txt +types-flask-sqlalchemy==2.5.9.4 + # via -r typing.txt +types-jinja2==2.11.9 + # via + # -r typing.txt + # types-flask +types-markupsafe==1.1.10 + # via + # -r typing.txt + # types-jinja2 +types-peewee==3.17.0.0 + # via -r typing.txt +types-pillow==10.1.0.2 + # via -r typing.txt +types-sqlalchemy==1.4.53.38 + # via + # -r typing.txt + # types-flask-sqlalchemy +types-werkzeug==1.0.9 + # via + # -r typing.txt + # types-flask typing-extensions==4.7.1 # via # -r docs.txt # -r typing.txt # astroid - # azure-core - # azure-storage-blob # importlib-metadata # mypy # platformdirs @@ -329,22 +443,29 @@ typing-extensions==4.7.1 urllib3==2.0.7 # via # -r docs.txt + # -r typing.txt # requests virtualenv==20.26.3 # via # pre-commit # tox -werkzeug==1.0.1 +werkzeug==2.1.2 # via # -r tests.in + # -r typing.txt # flask wrapt==1.16.0 - # via astroid + # via + # -r typing.txt + # astroid wtf-peewee==3.0.5 - # via -r tests.in + # via + # -r tests.in + # -r typing.txt wtforms==3.0.1 # via # -r tests.in + # -r typing.txt # flask-wtf # wtf-peewee zipp==3.15.0 diff --git a/requirements/tests.in b/requirements/tests.in index b908912a5..a2a4256f2 100644 --- a/requirements/tests.in +++ b/requirements/tests.in @@ -13,7 +13,7 @@ flask-mongoengine==0.8.2 pillow>=3.3.2 Babel<=2.9.1 flask-babelex -shapely==1.5.9 +shapely>=1.8,<2 geoalchemy2 psycopg2 pytest @@ -22,7 +22,7 @@ coveralls pylint sqlalchemy-citext sqlalchemy-utils>=0.36.6 -azure-storage-blob +azure-storage-blob<=3 arrow<0.14.0 colour email-validator diff --git a/requirements/tests.txt b/requirements/tests.txt new file mode 100644 index 000000000..af35a37f5 --- /dev/null +++ b/requirements/tests.txt @@ -0,0 +1,206 @@ +# +# This file is autogenerated by pip-compile with Python 3.7 +# by the following command: +# +# pip-compile --resolver=backtracking tests.in +# +arrow==0.13.2 + # via -r tests.in +astroid==2.15.8 + # via pylint +azure-common==1.1.28 + # via + # azure-storage-blob + # azure-storage-common +azure-storage-blob==2.1.0 + # via -r tests.in +azure-storage-common==2.1.0 + # via azure-storage-blob +babel==2.9.1 + # via + # -r tests.in + # flask-babelex +certifi==2024.7.4 + # via requests +cffi==1.15.1 + # via cryptography +charset-normalizer==3.3.2 + # via requests +click==8.1.7 + # via flask +colour==0.1.5 + # via -r tests.in +coverage[toml]==6.5.0 + # via + # coverage + # coveralls + # pytest-cov +coveralls==3.3.1 + # via -r tests.in +cryptography==42.0.8 + # via azure-storage-common +dill==0.3.7 + # via pylint +dnspython==2.3.0 + # via email-validator +docopt==0.6.2 + # via coveralls +email-validator==2.0.0.post2 + # via -r tests.in +exceptiongroup==1.2.2 + # via pytest +flake8==5.0.4 + # via -r tests.in +flask==2.1.3 + # via + # flask-babelex + # flask-mongoengine + # flask-sqlalchemy + # flask-wtf +flask-babelex==0.9.4 + # via -r tests.in +flask-mongoengine==0.8.2 + # via -r tests.in +flask-sqlalchemy==2.5.1 + # via -r tests.in +flask-wtf==1.1.1 + # via flask-mongoengine +geoalchemy2==0.15.2 + # via -r tests.in +idna==3.7 + # via + # email-validator + # requests +importlib-metadata==4.2.0 + # via + # click + # flake8 + # flask + # pluggy + # pytest + # sqlalchemy + # sqlalchemy-utils +iniconfig==2.0.0 + # via pytest +isort==5.11.5 + # via pylint +itsdangerous==2.0.1 + # via + # -r tests.in + # flask + # flask-wtf +jinja2==3.0.0 + # via + # -r tests.in + # flask + # flask-babelex +lazy-object-proxy==1.9.0 + # via astroid +markupsafe==2.0.1 + # via + # -r tests.in + # jinja2 + # wtforms +mccabe==0.7.0 + # via + # flake8 + # pylint +mongoengine==0.21.0 + # via + # -r tests.in + # flask-mongoengine +packaging==24.0 + # via + # geoalchemy2 + # pytest +peewee==3.17.6 + # via + # -r tests.in + # wtf-peewee +pillow==9.5.0 + # via -r tests.in +platformdirs==4.0.0 + # via pylint +pluggy==1.2.0 + # via pytest +psycopg2==2.9.9 + # via -r tests.in +pycodestyle==2.9.1 + # via flake8 +pycparser==2.21 + # via cffi +pyflakes==2.5.0 + # via flake8 +pylint==2.17.7 + # via -r tests.in +pymongo==3.13.0 + # via + # -r tests.in + # mongoengine +pytest==7.4.4 + # via + # -r tests.in + # pytest-cov +pytest-cov==4.1.0 + # via -r tests.in +python-dateutil==2.9.0.post0 + # via + # arrow + # azure-storage-common +pytz==2024.1 + # via babel +requests==2.31.0 + # via + # azure-storage-common + # coveralls +shapely==1.8.5.post1 + # via -r tests.in +six==1.16.0 + # via + # flask-mongoengine + # python-dateutil +speaklater==1.3 + # via flask-babelex +sqlalchemy==1.4.52 + # via + # -r tests.in + # flask-sqlalchemy + # geoalchemy2 + # sqlalchemy-citext + # sqlalchemy-utils +sqlalchemy-citext==1.8.0 + # via -r tests.in +sqlalchemy-utils==0.41.2 + # via -r tests.in +tomli==2.0.1 + # via + # coverage + # pylint + # pytest +tomlkit==0.12.5 + # via pylint +typed-ast==1.5.5 + # via astroid +typing-extensions==4.7.1 + # via + # astroid + # importlib-metadata + # platformdirs + # pylint +urllib3==2.0.7 + # via requests +werkzeug==2.1.2 + # via + # -r tests.in + # flask +wrapt==1.16.0 + # via astroid +wtf-peewee==3.0.5 + # via -r tests.in +wtforms==3.0.1 + # via + # -r tests.in + # flask-wtf + # wtf-peewee +zipp==3.15.0 + # via importlib-metadata diff --git a/requirements/typing.in b/requirements/typing.in index 30febfdb8..f37d61b92 100644 --- a/requirements/typing.in +++ b/requirements/typing.in @@ -1,5 +1,14 @@ --c tests.in +-r tests.in mypy pyright pytest +types-Flask-SQLAlchemy +types-Pillow +types-boto +types-peewee +types-Flask +types-WTForms + +# Requires Python 3.8+ +# types-shapely diff --git a/requirements/typing.txt b/requirements/typing.txt index 02f370e38..ac9400fc1 100644 --- a/requirements/typing.txt +++ b/requirements/typing.txt @@ -2,16 +2,114 @@ # This file is autogenerated by pip-compile with Python 3.7 # by the following command: # -# pip-compile typing.in +# pip-compile --resolver=backtracking typing.in # +arrow==0.13.2 + # via -r tests.in +astroid==2.15.8 + # via pylint +azure-common==1.1.28 + # via + # azure-storage-blob + # azure-storage-common +azure-storage-blob==2.1.0 + # via -r tests.in +azure-storage-common==2.1.0 + # via azure-storage-blob +babel==2.9.1 + # via + # -r tests.in + # flask-babelex +certifi==2024.7.4 + # via requests +cffi==1.15.1 + # via cryptography +charset-normalizer==3.3.2 + # via requests +click==8.1.7 + # via flask +colour==0.1.5 + # via -r tests.in +coverage[toml]==6.5.0 + # via + # coverage + # coveralls + # pytest-cov +coveralls==3.3.1 + # via -r tests.in +cryptography==42.0.8 + # via azure-storage-common +dill==0.3.7 + # via pylint +dnspython==2.3.0 + # via email-validator +docopt==0.6.2 + # via coveralls +email-validator==2.0.0.post2 + # via -r tests.in exceptiongroup==1.2.1 # via pytest +flake8==3.9.2 + # via -r tests.in +flask==2.1.3 + # via + # flask-babelex + # flask-mongoengine + # flask-sqlalchemy + # flask-wtf +flask-babelex==0.9.4 + # via -r tests.in +flask-mongoengine==0.8.2 + # via -r tests.in +flask-sqlalchemy==2.5.1 + # via -r tests.in +flask-wtf==1.1.1 + # via flask-mongoengine +geoalchemy2==0.15.2 + # via -r tests.in +idna==3.7 + # via + # email-validator + # requests importlib-metadata==6.7.0 # via + # click + # flake8 + # flask # pluggy # pytest + # sqlalchemy + # sqlalchemy-utils iniconfig==2.0.0 # via pytest +isort==5.11.5 + # via pylint +itsdangerous==2.0.1 + # via + # -r tests.in + # flask + # flask-wtf +jinja2==3.0.0 + # via + # -r tests.in + # flask + # flask-babelex +lazy-object-proxy==1.9.0 + # via astroid +markupsafe==2.0.1 + # via + # -r tests.in + # jinja2 + # types-wtforms + # wtforms +mccabe==0.6.1 + # via + # flake8 + # pylint +mongoengine==0.21.0 + # via + # -r tests.in + # flask-mongoengine mypy==1.4.1 # via -r typing.in mypy-extensions==1.0.0 @@ -19,25 +117,127 @@ mypy-extensions==1.0.0 nodeenv==1.9.1 # via pyright packaging==24.0 - # via pytest + # via + # geoalchemy2 + # pytest +peewee==3.17.6 + # via + # -r tests.in + # wtf-peewee +pillow==9.5.0 + # via -r tests.in +platformdirs==4.0.0 + # via pylint pluggy==1.2.0 # via pytest +psycopg2==2.9.9 + # via -r tests.in +pycodestyle==2.7.0 + # via flake8 +pycparser==2.21 + # via cffi +pyflakes==2.3.1 + # via flake8 +pylint==2.17.7 + # via -r tests.in +pymongo==3.13.0 + # via + # -r tests.in + # mongoengine pyright==1.1.370 # via -r typing.in pytest==7.4.4 # via - # -c tests.in + # -r tests.in # -r typing.in + # pytest-cov +pytest-cov==4.1.0 + # via -r tests.in +python-dateutil==2.9.0.post0 + # via + # arrow + # azure-storage-common +pytz==2024.1 + # via babel +requests==2.31.0 + # via + # azure-storage-common + # coveralls +shapely==1.8.5.post1 + # via -r tests.in +six==1.16.0 + # via + # flask-mongoengine + # python-dateutil +speaklater==1.3 + # via flask-babelex +sqlalchemy==1.4.52 + # via + # -r tests.in + # flask-sqlalchemy + # geoalchemy2 + # sqlalchemy-citext + # sqlalchemy-utils +sqlalchemy-citext==1.8.0 + # via -r tests.in +sqlalchemy-utils==0.41.2 + # via -r tests.in tomli==2.0.1 # via + # coverage # mypy + # pylint # pytest +tomlkit==0.12.5 + # via pylint typed-ast==1.5.5 - # via mypy + # via + # astroid + # mypy +types-boto==2.49.18.9 + # via -r typing.in +types-click==7.1.8 + # via types-flask +types-flask==1.1.6 + # via -r typing.in +types-flask-sqlalchemy==2.5.9.4 + # via -r typing.in +types-jinja2==2.11.9 + # via types-flask +types-markupsafe==1.1.10 + # via types-jinja2 +types-peewee==3.17.0.0 + # via -r typing.in +types-pillow==10.1.0.2 + # via -r typing.in +types-sqlalchemy==1.4.53.38 + # via types-flask-sqlalchemy +types-werkzeug==1.0.9 + # via types-flask +types-wtforms==3.1.0.2 + # via -r typing.in typing-extensions==4.7.1 # via + # astroid # importlib-metadata # mypy + # platformdirs + # pylint # pyright +urllib3==2.0.7 + # via requests +werkzeug==2.1.2 + # via + # -r tests.in + # flask +wrapt==1.16.0 + # via astroid +wtf-peewee==3.0.5 + # via -r tests.in +wtforms==3.0.1 + # via + # -r tests.in + # flask-wtf + # wtf-peewee zipp==3.15.0 # via importlib-metadata From 29090c9a852f44a77dd14d93d20e382c2e7bacdb Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Sat, 13 Jul 2024 13:30:25 +0100 Subject: [PATCH 019/156] Add type hints to pass basic checking --- flask_admin/_backwards.py | 2 +- flask_admin/_compat.py | 39 ++++++++--------------- flask_admin/_types.py | 6 ++++ flask_admin/babel.py | 2 +- flask_admin/base.py | 4 +-- flask_admin/contrib/fileadmin/__init__.py | 2 +- flask_admin/contrib/fileadmin/s3.py | 4 +++ flask_admin/contrib/geoa/typefmt.py | 2 +- flask_admin/contrib/mongoengine/fields.py | 2 +- flask_admin/contrib/peewee/form.py | 2 +- flask_admin/contrib/sqla/fields.py | 2 +- flask_admin/contrib/sqla/form.py | 2 +- flask_admin/contrib/sqla/tools.py | 6 ++-- flask_admin/contrib/sqla/typefmt.py | 6 ++-- flask_admin/contrib/sqla/view.py | 20 +++++++----- flask_admin/contrib/sqla/widgets.py | 2 +- flask_admin/form/upload.py | 9 ++++-- flask_admin/model/base.py | 37 ++++++++++++++------- pyproject.toml | 24 +++++++++++++- 19 files changed, 109 insertions(+), 64 deletions(-) create mode 100644 flask_admin/_types.py diff --git a/flask_admin/_backwards.py b/flask_admin/_backwards.py index 6a6c9e8d9..03929e02e 100644 --- a/flask_admin/_backwards.py +++ b/flask_admin/_backwards.py @@ -9,7 +9,7 @@ import warnings try: - from wtforms.widgets import HTMLString as Markup + from wtforms.widgets import HTMLString as Markup # type: ignore[attr-defined] except ImportError: # WTForms 2.3.0 from markupsafe import Markup # noqa: F401 diff --git a/flask_admin/_compat.py b/flask_admin/_compat.py index 5b8fa27bf..934ace4f9 100644 --- a/flask_admin/_compat.py +++ b/flask_admin/_compat.py @@ -10,13 +10,23 @@ :copyright: (c) 2013 by Armin Ronacher. :license: BSD, see LICENSE for more details. """ +from typing import Callable text_type = str string_types = (str,) -itervalues = lambda d: iter(d.values()) -iteritems = lambda d: iter(d.items()) -filter_list = lambda f, l: list(filter(f, l)) + +def itervalues(d: dict): + return iter(d.values()) + + +def iteritems(d: dict): + return iter(d.items()) + + +def filter_list(f: Callable, l: list): + return list(filter(f, l)) + def as_unicode(s): if isinstance(s, bytes): @@ -29,29 +39,8 @@ def csv_encode(s): return as_unicode(s) -def with_metaclass(meta, *bases): - # This requires a bit of explanation: the basic idea is to make a - # dummy metaclass for one level of class instantiation that replaces - # itself with the actual metaclass. Because of internal type checks - # we also need to make sure that we downgrade the custom metaclass - # for one level to something closer to type (that's why __call__ and - # __init__ comes back from type etc.). - # - # This has the advantage over six.with_metaclass in that it does not - # introduce dummy classes into the final MRO. - class metaclass(meta): - __call__ = type.__call__ - __init__ = type.__init__ - - def __new__(cls, name, this_bases, d): - if this_bases is None: - return type.__new__(cls, name, (), d) - return meta(name, bases, d) - return metaclass('temporary_class', None, {}) - - try: # jinja2 3.0.0 - from jinja2 import pass_context + from jinja2 import pass_context # type: ignore[attr-defined] except ImportError: from jinja2 import contextfunction as pass_context diff --git a/flask_admin/_types.py b/flask_admin/_types.py new file mode 100644 index 000000000..ac30fab6a --- /dev/null +++ b/flask_admin/_types.py @@ -0,0 +1,6 @@ +from typing import Union, Sequence, Dict, Callable + +import sqlalchemy + +T_COLUMN_LIST = Sequence[Union[str, sqlalchemy.Column]] +T_FORMATTERS = Dict[type, Callable] # todo: Make this tighter diff --git a/flask_admin/babel.py b/flask_admin/babel.py index 41dcae548..cb5ff1641 100644 --- a/flask_admin/babel.py +++ b/flask_admin/babel.py @@ -49,7 +49,7 @@ def get_translations_path(self, ctx): wtforms_domain = Domain(messages_path(), domain='wtforms') - class Translations(object): + class Translations(object): # type: ignore[no-redef] ''' Fixes WTForms translation support and uses wtforms translations ''' def gettext(self, string): t = wtforms_domain.get_translations() diff --git a/flask_admin/base.py b/flask_admin/base.py index 39c8654b3..1c913da8d 100644 --- a/flask_admin/base.py +++ b/flask_admin/base.py @@ -5,7 +5,7 @@ from flask import Blueprint, current_app, render_template, abort, g, url_for from flask_admin import babel -from flask_admin._compat import with_metaclass, as_unicode +from flask_admin._compat import as_unicode from flask_admin import helpers as h # For compatibility reasons import MenuLink @@ -106,7 +106,7 @@ class BaseViewClass(object): pass -class BaseView(with_metaclass(AdminViewMeta, BaseViewClass)): +class BaseView(BaseViewClass, metaclass=AdminViewMeta): """ Base administrative view. diff --git a/flask_admin/contrib/fileadmin/__init__.py b/flask_admin/contrib/fileadmin/__init__.py index 95c42d95c..887ad5f7a 100644 --- a/flask_admin/contrib/fileadmin/__init__.py +++ b/flask_admin/contrib/fileadmin/__init__.py @@ -176,7 +176,7 @@ class MyAdmin(FileAdmin): allowed_extensions = ('swf', 'jpg', 'gif', 'png') """ - editable_extensions = tuple() + editable_extensions: tuple = tuple() """ List of editable extensions, in lower case. diff --git a/flask_admin/contrib/fileadmin/s3.py b/flask_admin/contrib/fileadmin/s3.py index 1c9bdc719..55340167a 100644 --- a/flask_admin/contrib/fileadmin/s3.py +++ b/flask_admin/contrib/fileadmin/s3.py @@ -1,4 +1,8 @@ import time +from types import ModuleType +from typing import Optional + +s3: Optional[ModuleType] try: from boto import s3 diff --git a/flask_admin/contrib/geoa/typefmt.py b/flask_admin/contrib/geoa/typefmt.py index 339997b56..276d4743c 100644 --- a/flask_admin/contrib/geoa/typefmt.py +++ b/flask_admin/contrib/geoa/typefmt.py @@ -33,4 +33,4 @@ def geom_formatter(view, value): DEFAULT_FORMATTERS = BASE_FORMATTERS.copy() -DEFAULT_FORMATTERS[WKBElement] = geom_formatter +DEFAULT_FORMATTERS[WKBElement] = geom_formatter # type: ignore[assignment] diff --git a/flask_admin/contrib/mongoengine/fields.py b/flask_admin/contrib/mongoengine/fields.py index 3dcbed00b..23a0287fe 100644 --- a/flask_admin/contrib/mongoengine/fields.py +++ b/flask_admin/contrib/mongoengine/fields.py @@ -85,4 +85,4 @@ class MongoImageField(MongoFileField): GridFS image field. """ - widget = widgets.MongoImageInput() + widget = widgets.MongoImageInput() # type: ignore[assignment] diff --git a/flask_admin/contrib/peewee/form.py b/flask_admin/contrib/peewee/form.py index e48390ffd..be27e9a4b 100644 --- a/flask_admin/contrib/peewee/form.py +++ b/flask_admin/contrib/peewee/form.py @@ -4,7 +4,7 @@ PrimaryKeyField, ForeignKeyField) try: - from peewee import BaseModel + from peewee import BaseModel # type: ignore[attr-defined] except ImportError: from peewee import ModelBase as BaseModel diff --git a/flask_admin/contrib/sqla/fields.py b/flask_admin/contrib/sqla/fields.py index 02bfcca8e..441af0312 100644 --- a/flask_admin/contrib/sqla/fields.py +++ b/flask_admin/contrib/sqla/fields.py @@ -193,7 +193,7 @@ class MyView(ModelView): 'languages': CheckboxListField, } """ - widget = CheckboxListInput() + widget = CheckboxListInput() # type: ignore[assignment] class HstoreForm(BaseForm): diff --git a/flask_admin/contrib/sqla/form.py b/flask_admin/contrib/sqla/form.py index 5f15287c2..6bc42f7e7 100644 --- a/flask_admin/contrib/sqla/form.py +++ b/flask_admin/contrib/sqla/form.py @@ -780,7 +780,7 @@ def contribute(self, model, form_class, inline_model): class InlineOneToOneModelConverter(InlineModelConverter): - inline_field_list_type = InlineModelOneToOneField + inline_field_list_type = InlineModelOneToOneField # type: ignore[assignment] def _calculate_mapping_key_pair(self, model, info): diff --git a/flask_admin/contrib/sqla/tools.py b/flask_admin/contrib/sqla/tools.py index aa4e4b5ec..4149d5214 100644 --- a/flask_admin/contrib/sqla/tools.py +++ b/flask_admin/contrib/sqla/tools.py @@ -6,15 +6,15 @@ from sqlalchemy.orm.clsregistry import _class_resolver except ImportError: # If 1.4/2.0 module import fails, fall back to <1.3.x architecture. - from sqlalchemy.ext.declarative.clsregistry import _class_resolver + from sqlalchemy.ext.declarative.clsregistry import _class_resolver # type: ignore[no-redef] from sqlalchemy.ext.hybrid import hybrid_property try: # Attempt ASSOCATION_PROXY import from pre-2.0 release from sqlalchemy.ext.associationproxy import ASSOCIATION_PROXY except ImportError: - from sqlalchemy.ext.associationproxy import AssociationProxyExtensionType + from sqlalchemy.ext.associationproxy import AssociationProxyExtensionType # type: ignore[attr-defined] ASSOCIATION_PROXY = AssociationProxyExtensionType.ASSOCIATION_PROXY -from sqlalchemy.sql.operators import eq +from sqlalchemy.sql.operators import eq # type: ignore[attr-defined] from sqlalchemy.exc import DBAPIError from sqlalchemy.orm.attributes import InstrumentedAttribute diff --git a/flask_admin/contrib/sqla/typefmt.py b/flask_admin/contrib/sqla/typefmt.py index 596b19921..1a4614595 100644 --- a/flask_admin/contrib/sqla/typefmt.py +++ b/flask_admin/contrib/sqla/typefmt.py @@ -47,13 +47,13 @@ def arrow_export_formatter(view, arrow_time): }) try: from sqlalchemy_utils import Choice - DEFAULT_FORMATTERS[Choice] = choice_formatter + DEFAULT_FORMATTERS[Choice] = choice_formatter # type: ignore[assignment] except ImportError: pass try: from arrow import Arrow - DEFAULT_FORMATTERS[Arrow] = arrow_formatter - EXPORT_FORMATTERS[Arrow] = arrow_export_formatter + DEFAULT_FORMATTERS[Arrow] = arrow_formatter # type: ignore[assignment] + EXPORT_FORMATTERS[Arrow] = arrow_export_formatter # type: ignore[assignment] except ImportError: pass diff --git a/flask_admin/contrib/sqla/view.py b/flask_admin/contrib/sqla/view.py index 6886e0702..9b4622d5b 100755 --- a/flask_admin/contrib/sqla/view.py +++ b/flask_admin/contrib/sqla/view.py @@ -1,6 +1,7 @@ import logging import warnings import inspect +from typing import Optional, Dict, List, Tuple, cast as t_cast from sqlalchemy.orm.attributes import InstrumentedAttribute from sqlalchemy.orm.base import manager_of_class, instance_state @@ -72,16 +73,19 @@ class PostAdmin(ModelView): Please refer to the `subqueryload` on list of possible values. """ - column_display_all_relations = ObsoleteAttr('column_display_all_relations', - 'list_display_all_relations', - False) + column_display_all_relations = ObsoleteAttr( + 'column_display_all_relations', + 'list_display_all_relations', + False + ) """ Controls if list view should display all relations, not only many-to-one. """ - column_searchable_list = ObsoleteAttr('column_searchable_list', - 'searchable_columns', - None) + column_searchable_list = t_cast( + None, + ObsoleteAttr('column_searchable_list', 'searchable_columns', None), + ) """ Collection of the searchable columns. @@ -264,9 +268,9 @@ class MyModelView(ModelView): inline_models = (MyInlineModelForm(MyInlineModel),) """ - column_type_formatters = DEFAULT_FORMATTERS + column_type_formatters = DEFAULT_FORMATTERS # type: ignore[assignment] - form_choices = None + form_choices: Optional[Dict[str, List[Tuple[str, str]]]] = None """ Map choices to form fields diff --git a/flask_admin/contrib/sqla/widgets.py b/flask_admin/contrib/sqla/widgets.py index ecf9d65bd..8bf760a99 100644 --- a/flask_admin/contrib/sqla/widgets.py +++ b/flask_admin/contrib/sqla/widgets.py @@ -1,4 +1,4 @@ -from wtforms.widgets.core import escape +from wtforms.widgets.core import escape # type: ignore[attr-defined] from flask_admin._backwards import Markup diff --git a/flask_admin/form/upload.py b/flask_admin/form/upload.py index 1afc42f4e..7c702c64c 100644 --- a/flask_admin/form/upload.py +++ b/flask_admin/form/upload.py @@ -1,11 +1,13 @@ import os import os.path as op +from types import ModuleType +from typing import Optional from urllib.parse import urljoin from werkzeug.utils import secure_filename from werkzeug.datastructures import FileStorage -from wtforms import ValidationError, fields, __version__ as wtforms_version +from wtforms import ValidationError, fields, __version__ as wtforms_version # type: ignore[attr-defined] from wtforms.utils import unset_value from wtforms.widgets import html_params @@ -15,6 +17,9 @@ from flask_admin._backwards import Markup from flask_admin._compat import string_types +Image: Optional[ModuleType] +ImageOps: Optional[ModuleType] + try: from PIL import Image, ImageOps @@ -299,7 +304,7 @@ class ImageUploadField(FileUploadField): Requires PIL (or Pillow) to be installed. """ - widget = ImageUploadInput() + widget = ImageUploadInput() # type: ignore[assignment] keep_image_formats = ('PNG',) """ diff --git a/flask_admin/model/base.py b/flask_admin/model/base.py index a9fe94694..f4452453c 100755 --- a/flask_admin/model/base.py +++ b/flask_admin/model/base.py @@ -3,6 +3,8 @@ import csv import mimetypes import time +from typing import Optional, cast, Type + from math import ceil import inspect from collections import OrderedDict @@ -11,10 +13,14 @@ from flask import (current_app, request, redirect, flash, abort, json, Response, get_flashed_messages, stream_with_context) + +from .._types import T_COLUMN_LIST, T_FORMATTERS + try: import tablib except ImportError: tablib = None +from wtforms.form import Form from wtforms.fields import HiddenField from wtforms.fields.core import UnboundField from wtforms.validators import ValidationError, InputRequired @@ -169,7 +175,10 @@ class BaseModelView(BaseView, ActionsMixin): """Setting this to true will display the details_view as a modal dialog.""" # Customizations - column_list = ObsoleteAttr('column_list', 'list_columns', None) + column_list: Optional[T_COLUMN_LIST] = cast( + None, + ObsoleteAttr('column_list', 'list_columns', None) + ) """ Collection of the model field names for the list view. If set to `None`, will get them from the model. @@ -189,8 +198,9 @@ class MyModelView(BaseModelView): column_list = ('<relationship>.<related column name>',) """ - column_exclude_list = ObsoleteAttr('column_exclude_list', - 'excluded_list_columns', None) + column_exclude_list: Optional[T_COLUMN_LIST] = cast( + None, + ObsoleteAttr('column_exclude_list', 'excluded_list_columns', None)) """ Collection of excluded list column names. @@ -274,7 +284,10 @@ def formatter(view, context, model, name): that macros are not supported. """ - column_type_formatters = ObsoleteAttr('column_type_formatters', 'list_type_formatters', None) + column_type_formatters: Optional[T_FORMATTERS] = cast( + None, + ObsoleteAttr('column_type_formatters', 'list_type_formatters', None) + ) """ Dictionary of value type formatters to be used in the list view. @@ -365,9 +378,10 @@ class MyModelView(BaseModelView): ) """ - column_sortable_list = ObsoleteAttr('column_sortable_list', - 'sortable_columns', - None) + column_sortable_list: Optional[T_COLUMN_LIST] = cast( + None, + ObsoleteAttr('column_sortable_list', 'sortable_columns', None), + ) """ Collection of the sortable columns for the list view. If set to `None`, will get them from the model. @@ -418,9 +432,10 @@ class MyModelView(BaseModelView): column_default_sort = [('name', True), ('last_name', True)] """ - column_searchable_list = ObsoleteAttr('column_searchable_list', - 'searchable_columns', - None) + column_searchable_list: Optional[T_COLUMN_LIST] = cast( + None, + ObsoleteAttr('column_searchable_list', 'searchable_columns', None), + ) """ A collection of the searchable columns. It is assumed that only text-only fields are searchable, but it is up to the model @@ -522,7 +537,7 @@ class MyModelView(BaseModelView): If enabled, model interface would not run count query and will only show prev/next pager buttons. """ - form = None + form: Optional[Type[Form]] = None """ Form class. Override if you want to use custom form for your model. Will completely disable form scaffolding functionality. diff --git a/pyproject.toml b/pyproject.toml index cb4d45e60..035fd27ef 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -96,7 +96,29 @@ warn_return_any = false [[tool.mypy.overrides]] module = [ - "sqlparse.*" + "arrow", + "azure.*", + "bson.*", + "citext", + "colour", + "flask_babel", + "flask_babelex", + "flask_mongoengine.*", + "flask_wtf", + "google.appengine.ext", + "gridfs", + "marker", + "mongoengine.*", + "playhouse.*", + "pymongo", + "shapely.*", # types-shapely requires python 3.8+ + "sqlalchemy.*", + "sqlalchemy_enum34", + "sqlalchemy_utils", + "tablib", + "wtforms.*", + "wtforms_appengine.*", + "wtfpeewee.*", ] ignore_missing_imports = true From 25ac435e0749126e2d49b2d2aa709a166ce3ff89 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Mon, 15 Jul 2024 23:29:46 +0100 Subject: [PATCH 020/156] Update formatter function signatures According to our own warnings, formatter functions should all take three arguments: view, value, and name. It looks like these formatter functions weren't updated to take the name argument. --- flask_admin/contrib/geoa/typefmt.py | 2 +- flask_admin/contrib/mongoengine/typefmt.py | 4 ++-- flask_admin/contrib/sqla/typefmt.py | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/flask_admin/contrib/geoa/typefmt.py b/flask_admin/contrib/geoa/typefmt.py index 276d4743c..cc4ef360c 100644 --- a/flask_admin/contrib/geoa/typefmt.py +++ b/flask_admin/contrib/geoa/typefmt.py @@ -6,7 +6,7 @@ from sqlalchemy import func -def geom_formatter(view, value): +def geom_formatter(view, value, name): kwargs = { "data-role": "leaflet", "disabled": "disabled", diff --git a/flask_admin/contrib/mongoengine/typefmt.py b/flask_admin/contrib/mongoengine/typefmt.py index 840526de3..b445d7d28 100644 --- a/flask_admin/contrib/mongoengine/typefmt.py +++ b/flask_admin/contrib/mongoengine/typefmt.py @@ -8,7 +8,7 @@ from . import helpers -def grid_formatter(view, value): +def grid_formatter(view, value, name): if not value.grid_id: return '' @@ -26,7 +26,7 @@ def grid_formatter(view, value): }) -def grid_image_formatter(view, value): +def grid_image_formatter(view, value, name): if not value.grid_id: return '' diff --git a/flask_admin/contrib/sqla/typefmt.py b/flask_admin/contrib/sqla/typefmt.py index 1a4614595..8ad2ccb3b 100644 --- a/flask_admin/contrib/sqla/typefmt.py +++ b/flask_admin/contrib/sqla/typefmt.py @@ -5,7 +5,7 @@ from sqlalchemy.orm.collections import InstrumentedList -def choice_formatter(view, choice): +def choice_formatter(view, choice, name): """ Return label of selected choice see https://sqlalchemy-utils.readthedocs.io/ @@ -16,7 +16,7 @@ def choice_formatter(view, choice): return choice.value -def arrow_formatter(view, arrow_time): +def arrow_formatter(view, arrow_time, name): """ Return human-friendly string of the time relative to now. see https://arrow.readthedocs.io/ @@ -27,7 +27,7 @@ def arrow_formatter(view, arrow_time): return arrow_time.humanize() -def arrow_export_formatter(view, arrow_time): +def arrow_export_formatter(view, arrow_time, name): """ Return string representation of Arrow object see https://arrow.readthedocs.io/ From c034c98fa27c426b40cd46617d26754ecdd7e8c2 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Tue, 16 Jul 2024 07:23:43 +0100 Subject: [PATCH 021/156] Update type hints for formatter functions --- flask_admin/_types.py | 5 +++-- flask_admin/contrib/geoa/typefmt.py | 2 +- flask_admin/contrib/mongoengine/typefmt.py | 6 ++++-- flask_admin/contrib/sqla/typefmt.py | 12 ++++++------ flask_admin/model/typefmt.py | 13 +++++++------ 5 files changed, 21 insertions(+), 17 deletions(-) diff --git a/flask_admin/_types.py b/flask_admin/_types.py index ac30fab6a..57d221d22 100644 --- a/flask_admin/_types.py +++ b/flask_admin/_types.py @@ -1,6 +1,7 @@ -from typing import Union, Sequence, Dict, Callable +from typing import Union, Sequence, Dict, Callable, Any import sqlalchemy T_COLUMN_LIST = Sequence[Union[str, sqlalchemy.Column]] -T_FORMATTERS = Dict[type, Callable] # todo: Make this tighter +T_FORMATTER = Callable[[Any, Any, Any], Any] +T_FORMATTERS = Dict[type, T_FORMATTER] diff --git a/flask_admin/contrib/geoa/typefmt.py b/flask_admin/contrib/geoa/typefmt.py index cc4ef360c..e11314808 100644 --- a/flask_admin/contrib/geoa/typefmt.py +++ b/flask_admin/contrib/geoa/typefmt.py @@ -6,7 +6,7 @@ from sqlalchemy import func -def geom_formatter(view, value, name): +def geom_formatter(view, value, name) -> str: kwargs = { "data-role": "leaflet", "disabled": "disabled", diff --git a/flask_admin/contrib/mongoengine/typefmt.py b/flask_admin/contrib/mongoengine/typefmt.py index b445d7d28..a6b597329 100644 --- a/flask_admin/contrib/mongoengine/typefmt.py +++ b/flask_admin/contrib/mongoengine/typefmt.py @@ -1,3 +1,5 @@ +from typing import Union + from markupsafe import Markup, escape from mongoengine.base import BaseList @@ -8,7 +10,7 @@ from . import helpers -def grid_formatter(view, value, name): +def grid_formatter(view, value, name) -> Union[str, Markup]: if not value.grid_id: return '' @@ -26,7 +28,7 @@ def grid_formatter(view, value, name): }) -def grid_image_formatter(view, value, name): +def grid_image_formatter(view, value, name) -> Union[str, Markup]: if not value.grid_id: return '' diff --git a/flask_admin/contrib/sqla/typefmt.py b/flask_admin/contrib/sqla/typefmt.py index 8ad2ccb3b..6d0480c2e 100644 --- a/flask_admin/contrib/sqla/typefmt.py +++ b/flask_admin/contrib/sqla/typefmt.py @@ -5,7 +5,7 @@ from sqlalchemy.orm.collections import InstrumentedList -def choice_formatter(view, choice, name): +def choice_formatter(view, choice, name) -> str: """ Return label of selected choice see https://sqlalchemy-utils.readthedocs.io/ @@ -16,7 +16,7 @@ def choice_formatter(view, choice, name): return choice.value -def arrow_formatter(view, arrow_time, name): +def arrow_formatter(view, arrow_time, name) -> str: """ Return human-friendly string of the time relative to now. see https://arrow.readthedocs.io/ @@ -27,7 +27,7 @@ def arrow_formatter(view, arrow_time, name): return arrow_time.humanize() -def arrow_export_formatter(view, arrow_time, name): +def arrow_export_formatter(view, arrow_time, name) -> str: """ Return string representation of Arrow object see https://arrow.readthedocs.io/ @@ -47,13 +47,13 @@ def arrow_export_formatter(view, arrow_time, name): }) try: from sqlalchemy_utils import Choice - DEFAULT_FORMATTERS[Choice] = choice_formatter # type: ignore[assignment] + DEFAULT_FORMATTERS[Choice] = choice_formatter except ImportError: pass try: from arrow import Arrow - DEFAULT_FORMATTERS[Arrow] = arrow_formatter # type: ignore[assignment] - EXPORT_FORMATTERS[Arrow] = arrow_export_formatter # type: ignore[assignment] + DEFAULT_FORMATTERS[Arrow] = arrow_formatter + EXPORT_FORMATTERS[Arrow] = arrow_export_formatter except ImportError: pass diff --git a/flask_admin/model/typefmt.py b/flask_admin/model/typefmt.py index fc8142c26..d59dfed85 100755 --- a/flask_admin/model/typefmt.py +++ b/flask_admin/model/typefmt.py @@ -3,6 +3,7 @@ from markupsafe import Markup from flask_admin._compat import text_type +from flask_admin._types import T_FORMATTERS def null_formatter(view, value, name): @@ -38,7 +39,7 @@ def bool_formatter(view, value, name): return Markup('<span class="fa %s glyphicon glyphicon-%s icon-%s" title="%s"></span>' % (fa, glyph, glyph, label)) -def list_formatter(view, values, name): +def list_formatter(view, values, name) -> str: """ Return string with comma separated values @@ -48,7 +49,7 @@ def list_formatter(view, values, name): return u', '.join(text_type(v) for v in values) -def enum_formatter(view, value, name): +def enum_formatter(view, value, name) -> str: """ Return the name of the enumerated member. @@ -58,7 +59,7 @@ def enum_formatter(view, value, name): return value.name -def dict_formatter(view, value, name): +def dict_formatter(view, value, name) -> str: """ Removes unicode entities when displaying dict as string. Also unescapes non-ASCII characters stored in the JSON. @@ -69,20 +70,20 @@ def dict_formatter(view, value, name): return json.dumps(value, ensure_ascii=False) -BASE_FORMATTERS = { +BASE_FORMATTERS: T_FORMATTERS = { type(None): empty_formatter, bool: bool_formatter, list: list_formatter, dict: dict_formatter, } -EXPORT_FORMATTERS = { +EXPORT_FORMATTERS: T_FORMATTERS = { type(None): empty_formatter, list: list_formatter, dict: dict_formatter, } -DETAIL_FORMATTERS = { +DETAIL_FORMATTERS: T_FORMATTERS = { type(None): empty_formatter, list: list_formatter, dict: dict_formatter, From 3da262ff14e697c431710f8fdec255e0a1f1a291 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Mon, 15 Jul 2024 22:03:55 +0100 Subject: [PATCH 022/156] Remove python 3.7 compatibility; add python 3.12 - Remove deprecated function call for python 3.12 (datetime.utcfromtimestamp) - Remove mongoengine restriction; resolves some DeprecationWarnings - Don't error on some DeprecationWarnings from dependencies about Python 3.14 - Pull in types-shapely and stop ignoring that module for mypy. --- .github/workflows/tests.yaml | 2 +- flask_admin/contrib/fileadmin/__init__.py | 11 +- pyproject.toml | 23 ++- requirements/build.txt | 4 +- requirements/dev.txt | 40 ++--- requirements/docs.txt | 8 +- requirements/tests.in | 4 +- requirements/tests.txt | 206 ---------------------- requirements/typing.in | 4 +- requirements/typing.txt | 29 ++- tox.ini | 8 +- 11 files changed, 63 insertions(+), 276 deletions(-) delete mode 100644 requirements/tests.txt diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 9d8e446e1..19087e593 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -20,7 +20,7 @@ jobs: strategy: fail-fast: false matrix: - python: ['3.7', '3.8', '3.9', '3.10', '3.11'] + python: ['3.8', '3.9', '3.10', '3.11', '3.12'] wtforms: ['2'] services: # Label used to access the service container diff --git a/flask_admin/contrib/fileadmin/__init__.py b/flask_admin/contrib/fileadmin/__init__.py index 887ad5f7a..2bc9344a8 100644 --- a/flask_admin/contrib/fileadmin/__init__.py +++ b/flask_admin/contrib/fileadmin/__init__.py @@ -1,3 +1,4 @@ +import sys import warnings from datetime import datetime import os @@ -5,6 +6,7 @@ import platform import re import shutil +from functools import partial from operator import itemgetter from urllib.parse import urljoin, quote @@ -19,6 +21,13 @@ from flask_admin.babel import gettext, lazy_gettext +if sys.version_info >= (3, 11): + from datetime import UTC + utc_fromtimestamp = partial(datetime.fromtimestamp, tz=UTC) +else: + utc_fromtimestamp = datetime.utcfromtimestamp + + class LocalFileStorage(object): def __init__(self, base_path): """ @@ -857,7 +866,7 @@ def index_view(self, path=None): items.sort(key=itemgetter(2), reverse=True) if not self._on_windows: # Sort by modified date - items.sort(key=lambda x: (x[0], x[1], x[2], x[3], datetime.utcfromtimestamp(x[4])), reverse=True) + items.sort(key=lambda x: (x[0], x[1], x[2], x[3], utc_fromtimestamp(x[4])), reverse=True) else: items.sort(key=itemgetter(column_index), reverse=sort_desc) diff --git a/pyproject.toml b/pyproject.toml index 035fd27ef..479a5e21e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,12 +14,11 @@ classifiers = [ 'Operating System :: OS Independent', 'Programming Language :: Python', 'Topic :: Software Development :: Libraries :: Python Modules', - 'Programming Language :: Python :: 3.6', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.11', + 'Programming Language :: Python :: 3.12', ] requires-python = ">=3.6" dependencies = [ @@ -47,8 +46,19 @@ filterwarnings = [ # TODO: remove the ignored deprecation warning when support for WTForms 3 has been added. "ignore:Flags should be stored in dicts and not in tuples. The next version of WTForms will abandon support for flags in tuples.:DeprecationWarning", "ignore:'HTMLString' will be removed in WTForms 3.0. Use 'markupsafe.Markup' instead.:DeprecationWarning", - # TODO: remove when we drop Python 3.7 support - "ignore:pkg_resources is deprecated as an API:DeprecationWarning", + + # flask-mongoengine is responsible for the below deprecation warning, and hasn't been updated recently + "default:No uuidRepresentation is specified:DeprecationWarning", + + # Werkzeug is responsible for the below deprecation warning; remove when they have updated their code. + "default:ast\\.Str is deprecated and will be removed in Python 3\\.14:DeprecationWarning", + "default:Attribute s is deprecated and will be removed in Python 3\\.14:DeprecationWarning", + + # Flask is responsible for the below deprecation warning; remove when they have updated their code. + "default:'pkgutil\\.get_loader' is deprecated and slated for removal in Python 3\\.14:DeprecationWarning", + "default:'pkgutil\\.find_loader' is deprecated and slated for removal in Python 3\\.14:DeprecationWarning", + + "default:datetime\\.datetime\\.utcnow\\(\\) is deprecated and scheduled for removal in a future version:DeprecationWarning" ] [tool.coverage.run] @@ -59,7 +69,7 @@ source = ["flask_admin", "tests"] source = ["flask_admin", "*/site-packages"] [tool.mypy] -python_version = "3.6" +python_version = "3.8" files = ["flask_admin"] show_error_codes = true pretty = true @@ -111,7 +121,6 @@ module = [ "mongoengine.*", "playhouse.*", "pymongo", - "shapely.*", # types-shapely requires python 3.8+ "sqlalchemy.*", "sqlalchemy_enum34", "sqlalchemy_utils", @@ -123,7 +132,7 @@ module = [ ignore_missing_imports = true [tool.pyright] -pythonVersion = "3.6" +pythonVersion = "3.8" include = ["flask_admin", "tests"] typeCheckingMode = "basic" diff --git a/requirements/build.txt b/requirements/build.txt index c21dafe4e..d3db1d5f6 100644 --- a/requirements/build.txt +++ b/requirements/build.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.7 +# This file is autogenerated by pip-compile with Python 3.8 # by the following command: # # pip-compile build.in @@ -14,7 +14,5 @@ pyproject-hooks==1.1.0 # via build tomli==2.0.1 # via build -typing-extensions==4.7.1 - # via importlib-metadata zipp==3.15.0 # via importlib-metadata diff --git a/requirements/dev.txt b/requirements/dev.txt index ad7c9747d..310486d77 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -1,8 +1,8 @@ # -# This file is autogenerated by pip-compile with Python 3.7 +# This file is autogenerated by pip-compile with Python 3.8 # by the following command: # -# pip-compile --resolver=backtracking dev.in +# pip-compile dev.in # alabaster==0.7.13 # via @@ -32,6 +32,7 @@ azure-storage-common==2.1.0 babel==2.9.1 # via # -r docs.txt + # -r tests.in # -r typing.txt # flask-babelex # sphinx @@ -68,7 +69,6 @@ colour==0.1.5 coverage[toml]==6.5.0 # via # -r typing.txt - # coverage # coveralls # pytest-cov coveralls==3.3.1 @@ -156,18 +156,8 @@ importlib-metadata==6.7.0 # via # -r docs.txt # -r typing.txt - # click - # flake8 # flask - # pallets-sphinx-themes - # pluggy - # pre-commit - # pytest # sphinx - # sqlalchemy - # sqlalchemy-utils - # tox - # virtualenv iniconfig==2.0.0 # via # -r typing.txt @@ -185,6 +175,7 @@ itsdangerous==2.0.1 jinja2==3.0.0 # via # -r docs.txt + # -r tests.in # -r typing.txt # flask # flask-babelex @@ -196,8 +187,10 @@ lazy-object-proxy==1.9.0 markupsafe==2.0.1 # via # -r docs.txt + # -r tests.in # -r typing.txt # jinja2 + # types-wtforms # wtforms mccabe==0.6.1 # via @@ -220,6 +213,11 @@ nodeenv==1.9.1 # -r typing.txt # pre-commit # pyright +numpy==1.24.4 + # via + # -r typing.txt + # shapely + # types-shapely packaging==24.0 # via # -r docs.txt @@ -315,7 +313,7 @@ requests==2.31.0 # azure-storage-common # coveralls # sphinx -shapely==1.8.5.post1 +shapely==2.0.5 # via # -r tests.in # -r typing.txt @@ -394,11 +392,6 @@ tomlkit==0.12.5 # pylint tox==4.8.0 # via -r dev.in -typed-ast==1.5.5 - # via - # -r typing.txt - # astroid - # mypy types-boto==2.49.18.9 # via -r typing.txt types-click==7.1.8 @@ -421,6 +414,8 @@ types-peewee==3.17.0.0 # via -r typing.txt types-pillow==10.1.0.2 # via -r typing.txt +types-shapely==2.0.0.20240714 + # via -r typing.txt types-sqlalchemy==1.4.53.38 # via # -r typing.txt @@ -429,17 +424,14 @@ types-werkzeug==1.0.9 # via # -r typing.txt # types-flask +types-wtforms==3.1.0.2 + # via -r typing.txt typing-extensions==4.7.1 # via - # -r docs.txt # -r typing.txt # astroid - # importlib-metadata # mypy - # platformdirs # pylint - # pyright - # tox urllib3==2.0.7 # via # -r docs.txt diff --git a/requirements/docs.txt b/requirements/docs.txt index ac2e81e5b..32366b0e5 100644 --- a/requirements/docs.txt +++ b/requirements/docs.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.7 +# This file is autogenerated by pip-compile with Python 3.8 # by the following command: # # pip-compile docs.in @@ -21,9 +21,7 @@ idna==3.7 imagesize==1.4.1 # via sphinx importlib-metadata==6.7.0 - # via - # pallets-sphinx-themes - # sphinx + # via sphinx jinja2==3.0.0 # via # -c tests.in @@ -65,8 +63,6 @@ sphinxcontrib-qthelp==1.0.3 # via sphinx sphinxcontrib-serializinghtml==1.1.5 # via sphinx -typing-extensions==4.7.1 - # via importlib-metadata urllib3==2.0.7 # via requests zipp==3.15.0 diff --git a/requirements/tests.in b/requirements/tests.in index a2a4256f2..280a693a3 100644 --- a/requirements/tests.in +++ b/requirements/tests.in @@ -7,13 +7,13 @@ jinja2<=3.0.0 Flask-SQLAlchemy<3.0.0 peewee wtf-peewee -mongoengine<=0.21.0 +mongoengine pymongo>=3.7.0 flask-mongoengine==0.8.2 pillow>=3.3.2 Babel<=2.9.1 flask-babelex -shapely>=1.8,<2 +shapely>=2 geoalchemy2 psycopg2 pytest diff --git a/requirements/tests.txt b/requirements/tests.txt deleted file mode 100644 index af35a37f5..000000000 --- a/requirements/tests.txt +++ /dev/null @@ -1,206 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.7 -# by the following command: -# -# pip-compile --resolver=backtracking tests.in -# -arrow==0.13.2 - # via -r tests.in -astroid==2.15.8 - # via pylint -azure-common==1.1.28 - # via - # azure-storage-blob - # azure-storage-common -azure-storage-blob==2.1.0 - # via -r tests.in -azure-storage-common==2.1.0 - # via azure-storage-blob -babel==2.9.1 - # via - # -r tests.in - # flask-babelex -certifi==2024.7.4 - # via requests -cffi==1.15.1 - # via cryptography -charset-normalizer==3.3.2 - # via requests -click==8.1.7 - # via flask -colour==0.1.5 - # via -r tests.in -coverage[toml]==6.5.0 - # via - # coverage - # coveralls - # pytest-cov -coveralls==3.3.1 - # via -r tests.in -cryptography==42.0.8 - # via azure-storage-common -dill==0.3.7 - # via pylint -dnspython==2.3.0 - # via email-validator -docopt==0.6.2 - # via coveralls -email-validator==2.0.0.post2 - # via -r tests.in -exceptiongroup==1.2.2 - # via pytest -flake8==5.0.4 - # via -r tests.in -flask==2.1.3 - # via - # flask-babelex - # flask-mongoengine - # flask-sqlalchemy - # flask-wtf -flask-babelex==0.9.4 - # via -r tests.in -flask-mongoengine==0.8.2 - # via -r tests.in -flask-sqlalchemy==2.5.1 - # via -r tests.in -flask-wtf==1.1.1 - # via flask-mongoengine -geoalchemy2==0.15.2 - # via -r tests.in -idna==3.7 - # via - # email-validator - # requests -importlib-metadata==4.2.0 - # via - # click - # flake8 - # flask - # pluggy - # pytest - # sqlalchemy - # sqlalchemy-utils -iniconfig==2.0.0 - # via pytest -isort==5.11.5 - # via pylint -itsdangerous==2.0.1 - # via - # -r tests.in - # flask - # flask-wtf -jinja2==3.0.0 - # via - # -r tests.in - # flask - # flask-babelex -lazy-object-proxy==1.9.0 - # via astroid -markupsafe==2.0.1 - # via - # -r tests.in - # jinja2 - # wtforms -mccabe==0.7.0 - # via - # flake8 - # pylint -mongoengine==0.21.0 - # via - # -r tests.in - # flask-mongoengine -packaging==24.0 - # via - # geoalchemy2 - # pytest -peewee==3.17.6 - # via - # -r tests.in - # wtf-peewee -pillow==9.5.0 - # via -r tests.in -platformdirs==4.0.0 - # via pylint -pluggy==1.2.0 - # via pytest -psycopg2==2.9.9 - # via -r tests.in -pycodestyle==2.9.1 - # via flake8 -pycparser==2.21 - # via cffi -pyflakes==2.5.0 - # via flake8 -pylint==2.17.7 - # via -r tests.in -pymongo==3.13.0 - # via - # -r tests.in - # mongoengine -pytest==7.4.4 - # via - # -r tests.in - # pytest-cov -pytest-cov==4.1.0 - # via -r tests.in -python-dateutil==2.9.0.post0 - # via - # arrow - # azure-storage-common -pytz==2024.1 - # via babel -requests==2.31.0 - # via - # azure-storage-common - # coveralls -shapely==1.8.5.post1 - # via -r tests.in -six==1.16.0 - # via - # flask-mongoengine - # python-dateutil -speaklater==1.3 - # via flask-babelex -sqlalchemy==1.4.52 - # via - # -r tests.in - # flask-sqlalchemy - # geoalchemy2 - # sqlalchemy-citext - # sqlalchemy-utils -sqlalchemy-citext==1.8.0 - # via -r tests.in -sqlalchemy-utils==0.41.2 - # via -r tests.in -tomli==2.0.1 - # via - # coverage - # pylint - # pytest -tomlkit==0.12.5 - # via pylint -typed-ast==1.5.5 - # via astroid -typing-extensions==4.7.1 - # via - # astroid - # importlib-metadata - # platformdirs - # pylint -urllib3==2.0.7 - # via requests -werkzeug==2.1.2 - # via - # -r tests.in - # flask -wrapt==1.16.0 - # via astroid -wtf-peewee==3.0.5 - # via -r tests.in -wtforms==3.0.1 - # via - # -r tests.in - # flask-wtf - # wtf-peewee -zipp==3.15.0 - # via importlib-metadata diff --git a/requirements/typing.in b/requirements/typing.in index f37d61b92..982982adf 100644 --- a/requirements/typing.in +++ b/requirements/typing.in @@ -9,6 +9,4 @@ types-boto types-peewee types-Flask types-WTForms - -# Requires Python 3.8+ -# types-shapely +types-shapely diff --git a/requirements/typing.txt b/requirements/typing.txt index ac9400fc1..5f2df6dcb 100644 --- a/requirements/typing.txt +++ b/requirements/typing.txt @@ -1,8 +1,8 @@ # -# This file is autogenerated by pip-compile with Python 3.7 +# This file is autogenerated by pip-compile with Python 3.8 # by the following command: # -# pip-compile --resolver=backtracking typing.in +# pip-compile typing.in # arrow==0.13.2 # via -r tests.in @@ -32,7 +32,6 @@ colour==0.1.5 # via -r tests.in coverage[toml]==6.5.0 # via - # coverage # coveralls # pytest-cov coveralls==3.3.1 @@ -72,14 +71,7 @@ idna==3.7 # email-validator # requests importlib-metadata==6.7.0 - # via - # click - # flake8 - # flask - # pluggy - # pytest - # sqlalchemy - # sqlalchemy-utils + # via flask iniconfig==2.0.0 # via pytest isort==5.11.5 @@ -116,6 +108,10 @@ mypy-extensions==1.0.0 # via mypy nodeenv==1.9.1 # via pyright +numpy==1.24.4 + # via + # shapely + # types-shapely packaging==24.0 # via # geoalchemy2 @@ -163,7 +159,7 @@ requests==2.31.0 # via # azure-storage-common # coveralls -shapely==1.8.5.post1 +shapely==2.0.5 # via -r tests.in six==1.16.0 # via @@ -190,10 +186,6 @@ tomli==2.0.1 # pytest tomlkit==0.12.5 # via pylint -typed-ast==1.5.5 - # via - # astroid - # mypy types-boto==2.49.18.9 # via -r typing.in types-click==7.1.8 @@ -210,6 +202,8 @@ types-peewee==3.17.0.0 # via -r typing.in types-pillow==10.1.0.2 # via -r typing.in +types-shapely==2.0.0.20240714 + # via -r typing.in types-sqlalchemy==1.4.53.38 # via types-flask-sqlalchemy types-werkzeug==1.0.9 @@ -219,11 +213,8 @@ types-wtforms==3.1.0.2 typing-extensions==4.7.1 # via # astroid - # importlib-metadata # mypy - # platformdirs # pylint - # pyright urllib3==2.0.7 # via requests werkzeug==2.1.2 diff --git a/tox.ini b/tox.ini index fd5cfd08b..377218a31 100644 --- a/tox.ini +++ b/tox.ini @@ -1,7 +1,7 @@ [tox] envlist = - py3{7,8,9,10,11}-flask{2}-wtforms{2} - style + py3{8,9,10,11,12}-flask{2}-wtforms{2} +# style typing docs skip_missing_interpreters = true @@ -31,8 +31,8 @@ commands = pre-commit run --all-files [testenv:typing] deps = -r requirements/typing.txt commands = - mypy --python-version 3.7 - mypy --python-version 3.11 + mypy --python-version 3.8 + mypy --python-version 3.12 [testenv:docs] deps = -r requirements/docs.txt From 7b3b61c40e1eb77d326f46f4effb562766e73bcc Mon Sep 17 00:00:00 2001 From: PrIncERb <77580222+princerb@users.noreply.github.com> Date: Tue, 16 Jul 2024 18:15:57 +0500 Subject: [PATCH 023/156] Little README fixes (better grammar, syntax and style) (#2450) --- README.md | 116 +++++++++++++++++++++++++++++------------------------- 1 file changed, 63 insertions(+), 53 deletions(-) diff --git a/README.md b/README.md index b4529a87e..2590c1e29 100644 --- a/README.md +++ b/README.md @@ -21,27 +21,27 @@ Flask-Admin is a batteries-included, simple-to-use [Flask](http://flask.pocoo.org/) extension that lets you add admin interfaces to Flask applications. It is inspired by the *django-admin* package, but implemented in such a way that the developer has total -control of the look, feel and functionality of the resulting +control over the look, feel, functionality and user experience of the resulting application. Out-of-the-box, Flask-Admin plays nicely with various ORM\'s, including -- [SQLAlchemy](http://www.sqlalchemy.org/), -- [MongoEngine](http://mongoengine.org/), -- [pymongo](http://api.mongodb.org/python/current/) and -- [Peewee](https://github.com/coleifer/peewee). +- [SQLAlchemy](http://www.sqlalchemy.org/) +- [MongoEngine](http://mongoengine.org/) +- [pymongo](http://api.mongodb.org/python/current/) +- and [Peewee](https://github.com/coleifer/peewee). -It also boasts a simple file management interface and a [redis +It also boasts a simple file management interface and a [Redis client](http://redis.io/) console. -The biggest feature of Flask-Admin is flexibility. It aims to provide a -set of simple tools that can be used for building admin interfaces of -any complexity. So, to start off with you can create a very simple +The biggest feature of Flask-Admin is its flexibility. It aims to provide a +set of simple tools that can be used to build admin interfaces of +any complexity. To start off, you can create a very simple application in no time, with auto-generated CRUD-views for each of your -models. But then you can go further and customize those views & forms as +models. Then you can further customize those views and forms as the need arises. -Flask-Admin is an active project, well-tested and production ready. +Flask-Admin is an active project, well-tested and production-ready. ## Examples @@ -50,24 +50,34 @@ add your own, or improve on the existing examples, and submit a *pull-request*. To run the examples in your local environment: - - 1. Clone the repository:: - - git clone https://github.com/pallets-eco/flask-admin.git - cd flask-admin - - 2. Create and activate a virtual environment:: - - virtualenv env -p python3 - source env/Scripts/activate - - 3. Install requirements:: - - pip install -r examples/sqla/requirements.txt - - 4. Run the application:: - - python examples/sqla/run_server.py +1. Clone the repository: + + ```bash + git clone https://github.com/pallets-eco/flask-admin.git + cd flask-admin + ``` +2. Create and activate a virtual environment: + + ```bash + # Windows: + python -m venv .venv + .venv\Scripts\activate + + # Linux: + python3 -m venv .venv + source .venv/bin/activate + ``` +3. Install requirements: + + ```bash + pip install -r examples/sqla/requirements.txt + ``` +4. Run the application: + + ```bash + python examples/sqla/run_server.py + ``` +5. Check the Flask app running on <http://localhost:5000>. ## Documentation @@ -75,16 +85,15 @@ Flask-Admin is extensively documented, you can find all of the documentation at <https://flask-admin.readthedocs.io/en/latest/>. The docs are auto-generated from the *.rst* files in the */doc* folder. -So if you come across any errors, or if you think of anything else that -should be included, then please make the changes and submit them as a -*pull-request*. +If you come across any errors or if you think of anything else that +should be included, feel free to make the changes and submit a *pull-request*. To build the docs in your local environment, from the project directory: tox -e docs-html And if you want to preview any *.rst* snippets that you may want to -contribute, go to <http://rst.ninjs.org/>. +contribute, please go to <http://rst.ninjs.org/>. ## Installation @@ -101,10 +110,10 @@ by doing: ## Tests -Test are run with *pytest*. If you are not familiar with this package -you can get some more info from [their website](https://pytest.org/). +Tests are run with *pytest*. If you are not familiar with this package, you can find out more on [their website](https://pytest.org/). + +To run the tests, from the project directory, simply run: -To run the tests, from the project directory, simply: pip install --use-pep517 -r requirements/dev.txt pytest @@ -116,29 +125,30 @@ You should see output similar to: OK -*NOTE*: For all the tests to pass successfully, you\'ll need Postgres (with +**NOTE!** For all the tests to pass successfully, you\'ll need Postgres (with the postgis and hstore extension) & MongoDB to be running locally. You'll -also need libgeos available. +also need *libgeos* available. For Postgres: - - > psql postgres - CREATE DATABASE flask_admin_test; - \q - - > psql flask_admin_test - CREATE EXTENSION postgis; - CREATE EXTENSION hstore; - +```bash +psql postgres +> CREATE DATABASE flask_admin_test; +> # Connect to database "flask_admin_test": +> \c flask_admin_test; +> CREATE EXTENSION postgis; +> CREATE EXTENSION hstore; +``` If you\'re using Homebrew on MacOS, you might need this: - # install postgis and geos - > brew install postgis - > brew install geos +```bash +# Install postgis and geos +brew install postgis +brew install geos - # set up postgresql user - > createuser -s postgresql - > brew services restart postgresql +# Set up a PostgreSQL user +createuser -s postgresql +brew services restart postgresql +``` You can also run the tests on multiple environments using *tox*. From 15e36393b7b084522c91732a6b169c34ba5a8d0b Mon Sep 17 00:00:00 2001 From: Ilias Timir-Bulatov <irtimirbulatov@gmail.com> Date: Wed, 17 Jul 2024 18:19:49 +0300 Subject: [PATCH 024/156] Prevent duplicate requests for bs4_modal.js when using modals (#2407) --- .../templates/bootstrap4/admin/model/modals/create.html | 4 ---- .../templates/bootstrap4/admin/model/modals/details.html | 3 +-- flask_admin/templates/bootstrap4/admin/model/modals/edit.html | 4 ---- 3 files changed, 1 insertion(+), 10 deletions(-) diff --git a/flask_admin/templates/bootstrap4/admin/model/modals/create.html b/flask_admin/templates/bootstrap4/admin/model/modals/create.html index 3f5097fd8..8c5aee463 100644 --- a/flask_admin/templates/bootstrap4/admin/model/modals/create.html +++ b/flask_admin/templates/bootstrap4/admin/model/modals/create.html @@ -30,7 +30,3 @@ {% endblock %} - -{% block tail %} - <script src="{{ admin_static.url(filename='admin/js/bs4_modal.js', v='1.0.0') }}"></script> -{% endblock %} diff --git a/flask_admin/templates/bootstrap4/admin/model/modals/details.html b/flask_admin/templates/bootstrap4/admin/model/modals/details.html index 793b4d00e..0e8a52cdf 100755 --- a/flask_admin/templates/bootstrap4/admin/model/modals/details.html +++ b/flask_admin/templates/bootstrap4/admin/model/modals/details.html @@ -36,5 +36,4 @@ <h3>{{ _gettext('View Record') + ' #' + request.args.get('id') }}</h3> {% block tail %} <script src="{{ admin_static.url(filename='admin/js/details_filter.js', v='1.0.0') }}"></script> - <script src="{{ admin_static.url(filename='admin/js/bs4_modal.js', v='1.0.0') }}"></script> -{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/flask_admin/templates/bootstrap4/admin/model/modals/edit.html b/flask_admin/templates/bootstrap4/admin/model/modals/edit.html index dd9e777a4..a39f7e8b2 100644 --- a/flask_admin/templates/bootstrap4/admin/model/modals/edit.html +++ b/flask_admin/templates/bootstrap4/admin/model/modals/edit.html @@ -25,7 +25,3 @@ <h5 class="modal-title">{{ _gettext('Edit Record') + ' #' + request.args.get('id {% endcall %} {% endblock %} - -{% block tail %} - <script src="{{ admin_static.url(filename='admin/js/bs4_modal.js', v='1.0.0') }}"></script> -{% endblock %} From 97aa9716fb9fee48641e47b3d41962386cd99cec Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Tue, 16 Jul 2024 12:42:41 +0100 Subject: [PATCH 025/156] Replace Flask-BabelEx with Flask-Babel --- README.md | 2 +- doc/advanced.rst | 28 +++++++++---------- examples/babel/README.rst | 2 +- examples/babel/app.py | 9 +++--- examples/babel/requirements.txt | 2 +- examples/sqla/admin/__init__.py | 2 +- examples/sqla/requirements.txt | 2 +- flask_admin/babel.py | 5 +--- flask_admin/tests/sqla/test_basic.py | 2 +- flask_admin/tests/sqla/test_translation.py | 2 +- flask_admin/tests/test_base.py | 1 + .../zh_Hans_CN/LC_MESSAGES/advanced.po | 25 ++++++++--------- pyproject.toml | 1 - requirements/dev.txt | 13 ++++----- requirements/tests.in | 2 +- requirements/typing.txt | 14 +++++----- 16 files changed, 50 insertions(+), 62 deletions(-) diff --git a/README.md b/README.md index 2590c1e29..5f43d6f7c 100644 --- a/README.md +++ b/README.md @@ -160,7 +160,7 @@ Flask-Admin is built with the help of [Bootswatch](http://bootswatch.com/). If you want to localize your application, install the -[Flask-BabelEx](https://pypi.python.org/pypi/Flask-BabelEx) package. +[Flask-Babel](https://pypi.python.org/pypi/Flask-Babel) package. You can help improve Flask-Admin\'s translations through Crowdin: <https://crowdin.com/project/flask-admin> diff --git a/doc/advanced.rst b/doc/advanced.rst index 032a205fb..c01eeb555 100644 --- a/doc/advanced.rst +++ b/doc/advanced.rst @@ -31,7 +31,7 @@ To add custom JavaScript or CSS in your *ModelView* use *extra_js* or *extra_css extra_js = ['https://example.com/custom.js'] extra_css = ['https://example.com/custom.css'] -Localization With Flask-Babelex +Localization With Flask-Babel ------------------------------- **** @@ -39,35 +39,33 @@ Localization With Flask-Babelex Flask-Admin comes with translations for several languages. Enabling localization is simple: -#. Install `Flask-BabelEx <http://github.com/mrjoes/flask-babelex/>`_ to do the heavy - lifting. It's a fork of the - `Flask-Babel <http://github.com/mitshuhiko/flask-babel/>`_ package:: +#. Install `Flask-Babel <https://github.com/python-babel/flask-babel/>`_ to do the heavy + lifting. - pip install flask-babelex - -#. Initialize Flask-BabelEx by creating instance of `Babel` class:: - - from flask import Flask - from flask_babelex import Babel - - app = Flask(__name__) - babel = Babel(app) + pip install flask-babel #. Create a locale selector function:: - @babel.localeselector def get_locale(): if request.args.get('lang'): session['lang'] = request.args.get('lang') return session.get('lang', 'en') +#. Initialize Flask-Babel by creating instance of `Babel` class:: + + from flask import Flask + from flask_babel import Babel + + app = Flask(__name__) + babel = Babel(app, locale_selector=get_locale) + Now, you could try a French version of the application at: `http://localhost:5000/admin/?lang=fr <http://localhost:5000/admin/?lang=fr>`_. Go ahead and add your own logic to the locale selector function. The application can store locale in a user profile, cookie, session, etc. It can also use the `Accept-Language` header to make the selection automatically. -If the built-in translations are not enough, look at the `Flask-BabelEx documentation <https://pythonhosted.org/Flask-BabelEx/>`_ +If the built-in translations are not enough, look at the `Flask-Babel documentation <https://pythonhosted.org/Flask-Babel/>`_ to see how you can add your own. .. _file-admin: diff --git a/examples/babel/README.rst b/examples/babel/README.rst index 6363b61f5..6fb933cd1 100644 --- a/examples/babel/README.rst +++ b/examples/babel/README.rst @@ -1,4 +1,4 @@ -This example show how to translate Flask-Admin into different language using customized version of the `Flask-Babel <https://github.com/mrjoes/flask-babelex>` +This example show how to translate Flask-Admin into different language using customized version of the `Flask-Babel <https://github.com/mrjoes/flask-babel>` To run this example: diff --git a/examples/babel/app.py b/examples/babel/app.py index 2149f47b1..b7b36abba 100644 --- a/examples/babel/app.py +++ b/examples/babel/app.py @@ -2,7 +2,7 @@ from flask_sqlalchemy import SQLAlchemy import flask_admin as admin -from flask_babelex import Babel +from flask_babel import Babel from flask_admin.contrib import sqla @@ -17,11 +17,7 @@ app.config['SQLALCHEMY_ECHO'] = True db = SQLAlchemy(app) -# Initialize babel -babel = Babel(app) - -@babel.localeselector def get_locale(): override = request.args.get('lang') @@ -30,6 +26,9 @@ def get_locale(): return session.get('lang', 'en') +# Initialize babel +babel = Babel(app, locale_selector=get_locale) + # Create models class User(db.Model): diff --git a/examples/babel/requirements.txt b/examples/babel/requirements.txt index f4bfb6542..f0e72f2b4 100644 --- a/examples/babel/requirements.txt +++ b/examples/babel/requirements.txt @@ -1,4 +1,4 @@ Flask Flask-Admin Flask-SQLAlchemy -Flask-BabelEx +Flask-Babel diff --git a/examples/sqla/admin/__init__.py b/examples/sqla/admin/__init__.py index 99c979b39..6a44f298c 100644 --- a/examples/sqla/admin/__init__.py +++ b/examples/sqla/admin/__init__.py @@ -1,6 +1,6 @@ from flask import Flask, request, session from flask_sqlalchemy import SQLAlchemy -from flask_babelex import Babel +from flask_babel import Babel app = Flask(__name__) diff --git a/examples/sqla/requirements.txt b/examples/sqla/requirements.txt index f010af00b..efaafbd20 100644 --- a/examples/sqla/requirements.txt +++ b/examples/sqla/requirements.txt @@ -1,6 +1,6 @@ Flask Flask-Admin -Flask-BabelEx +Flask-Babel Flask-SQLAlchemy tablib enum34; python_version < '3.0' diff --git a/flask_admin/babel.py b/flask_admin/babel.py index cb5ff1641..762ccb2ee 100644 --- a/flask_admin/babel.py +++ b/flask_admin/babel.py @@ -1,8 +1,5 @@ try: - try: - from flask_babelex import Domain - except ImportError: - from flask_babel import Domain + from flask_babel import Domain except ImportError: def gettext(string, **variables): diff --git a/flask_admin/tests/sqla/test_basic.py b/flask_admin/tests/sqla/test_basic.py index 65bd3d0cf..97dd6bb7f 100644 --- a/flask_admin/tests/sqla/test_basic.py +++ b/flask_admin/tests/sqla/test_basic.py @@ -7,7 +7,7 @@ from flask_admin._compat import as_unicode from flask_admin._compat import iteritems from flask_admin.contrib.sqla import ModelView, filters, tools -from flask_babelex import Babel +from flask_babel import Babel from sqlalchemy.ext.hybrid import hybrid_property from sqlalchemy import cast diff --git a/flask_admin/tests/sqla/test_translation.py b/flask_admin/tests/sqla/test_translation.py index bc4fe257c..ed1bc54ab 100644 --- a/flask_admin/tests/sqla/test_translation.py +++ b/flask_admin/tests/sqla/test_translation.py @@ -1,5 +1,5 @@ from flask_admin.babel import lazy_gettext -from flask_babelex import Babel +from flask_babel import Babel from . import setup from .test_basic import CustomModelView, create_models diff --git a/flask_admin/tests/test_base.py b/flask_admin/tests/test_base.py index 60b309528..5ca3efb70 100644 --- a/flask_admin/tests/test_base.py +++ b/flask_admin/tests/test_base.py @@ -207,6 +207,7 @@ def test_baseview_registration(): assert view.blueprint.static_url_path == '/static/my/test' +@pytest.mark.filterwarnings("ignore:unclosed file:ResourceWarning") def test_baseview_urls(): app = Flask(__name__) admin = base.Admin(app) diff --git a/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/advanced.po b/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/advanced.po index 455b4e22e..f34b45fe9 100644 --- a/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/advanced.po +++ b/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/advanced.po @@ -44,8 +44,8 @@ msgid "" msgstr "SecureForm 需要 WTForms 2+。当表单提交时,它使用 WTForms SessionCSRF 类来生成和验证令牌。" #: ../../doc/advanced.rst:22 -msgid "Localization With Flask-Babelex" -msgstr "使用 Flask-Babelex 本地化" +msgid "Localization With Flask-Babel" +msgstr "使用 Flask-Babel 本地化" #: ../../doc/advanced.rst:26 msgid "" @@ -55,16 +55,14 @@ msgstr "Flask-Admin 提供多种语言的翻译。启用本地化非常简单:" #: ../../doc/advanced.rst:29 msgid "" -"Install `Flask-BabelEx <http://github.com/mrjoes/flask-babelex/>`_ to do " -"the heavy lifting. It's a fork of the `Flask-Babel " -"<http://github.com/mitshuhiko/flask-babel/>`_ package::" +"Install `Flask-Babel <https://github.com/python-babel/flask-babel>`_ to do " +"the heavy lifting." msgstr "" -"安装 `Flask-BabelEx <http://github.com/mrjoes/flask-babelex/>`_ 扩展,它是 " -"`Flask-Babel <http://github.com/mitshuhiko/flask-babel/>`_ 的分支::" +"安装 `Flask-Babel <https://github.com/python-babel/flask-babel>`_ 扩展" #: ../../doc/advanced.rst:35 -msgid "Initialize Flask-BabelEx by creating instance of `Babel` class::" -msgstr "通过创建 `Babel` 类实例,初始化 Flask-BabelEx 扩展::" +msgid "Initialize Flask-Babel by creating instance of `Babel` class::" +msgstr "通过创建 `Babel` 类实例,初始化 Flask-Babel 扩展::" #: ../../doc/advanced.rst:43 msgid "Create a locale selector function::" @@ -91,12 +89,12 @@ msgstr "" #: ../../doc/advanced.rst:57 msgid "" -"If the built-in translations are not enough, look at the `Flask-BabelEx " -"documentation <https://pythonhosted.org/Flask-BabelEx/>`_ to see how you " +"If the built-in translations are not enough, look at the `Flask-Babel " +"documentation <https://pythonhosted.org/Flask-Babel/>`_ to see how you " "can add your own." msgstr "" -"如果内置的翻译不够,请查看 `Flask-BabelEx 文档 <https://pythonhosted.org/Flask-" -"BabelEx/>`_ 了解如何添加翻译。" +"如果内置的翻译不够,请查看 `Flask-Babel 文档 <https://pythonhosted.org/Flask-" +"Babel/>`_ 了解如何添加翻译。" #: ../../doc/advanced.rst:63 msgid "Managing Files & Folders" @@ -996,4 +994,3 @@ msgstr "" #~ "为了使其工作,还需要创建一个模板,通过在 `create` 和 `edit` 页面包含必要的" #~ " CKEditor javascript 来扩展默认功能。将其保存在 " #~ "`templates/ckeditor.html` 中::" - diff --git a/pyproject.toml b/pyproject.toml index 479a5e21e..44b0bbcc1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -112,7 +112,6 @@ module = [ "citext", "colour", "flask_babel", - "flask_babelex", "flask_mongoengine.*", "flask_wtf", "google.appengine.ext", diff --git a/requirements/dev.txt b/requirements/dev.txt index 310486d77..696b821d6 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -34,7 +34,7 @@ babel==2.9.1 # -r docs.txt # -r tests.in # -r typing.txt - # flask-babelex + # flask-babel # sphinx cachetools==5.3.3 # via tox @@ -116,11 +116,11 @@ flake8==3.9.2 flask==2.1.3 # via # -r typing.txt - # flask-babelex + # flask-babel # flask-mongoengine # flask-sqlalchemy # flask-wtf -flask-babelex==0.9.4 +flask-babel==2.0.0 # via # -r tests.in # -r typing.txt @@ -178,7 +178,7 @@ jinja2==3.0.0 # -r tests.in # -r typing.txt # flask - # flask-babelex + # flask-babel # sphinx lazy-object-proxy==1.9.0 # via @@ -304,6 +304,7 @@ pytz==2024.1 # -r docs.txt # -r typing.txt # babel + # flask-babel pyyaml==6.0.1 # via pre-commit requests==2.31.0 @@ -326,10 +327,6 @@ snowballstemmer==2.2.0 # via # -r docs.txt # sphinx -speaklater==1.3 - # via - # -r typing.txt - # flask-babelex sphinx==5.3.0 # via # -r docs.txt diff --git a/requirements/tests.in b/requirements/tests.in index 280a693a3..f6df5de83 100644 --- a/requirements/tests.in +++ b/requirements/tests.in @@ -12,7 +12,7 @@ pymongo>=3.7.0 flask-mongoengine==0.8.2 pillow>=3.3.2 Babel<=2.9.1 -flask-babelex +flask-babel shapely>=2 geoalchemy2 psycopg2 diff --git a/requirements/typing.txt b/requirements/typing.txt index 5f2df6dcb..7d6448173 100644 --- a/requirements/typing.txt +++ b/requirements/typing.txt @@ -19,7 +19,7 @@ azure-storage-common==2.1.0 babel==2.9.1 # via # -r tests.in - # flask-babelex + # flask-babel certifi==2024.7.4 # via requests cffi==1.15.1 @@ -52,11 +52,11 @@ flake8==3.9.2 # via -r tests.in flask==2.1.3 # via - # flask-babelex + # flask-babel # flask-mongoengine # flask-sqlalchemy # flask-wtf -flask-babelex==0.9.4 +flask-babel==2.0.0 # via -r tests.in flask-mongoengine==0.8.2 # via -r tests.in @@ -85,7 +85,7 @@ jinja2==3.0.0 # via # -r tests.in # flask - # flask-babelex + # flask-babel lazy-object-proxy==1.9.0 # via astroid markupsafe==2.0.1 @@ -154,7 +154,9 @@ python-dateutil==2.9.0.post0 # arrow # azure-storage-common pytz==2024.1 - # via babel + # via + # babel + # flask-babel requests==2.31.0 # via # azure-storage-common @@ -165,8 +167,6 @@ six==1.16.0 # via # flask-mongoengine # python-dateutil -speaklater==1.3 - # via flask-babelex sqlalchemy==1.4.52 # via # -r tests.in From d9a929fde929575555e29733e2bf5f439a0e11b6 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Wed, 17 Jul 2024 20:26:34 +0100 Subject: [PATCH 026/156] Stop using unittest for fileadmin tests --- flask_admin/tests/fileadmin/test_fileadmin.py | 7 ++----- flask_admin/tests/fileadmin/test_fileadmin_azure.py | 10 +++++++--- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/flask_admin/tests/fileadmin/test_fileadmin.py b/flask_admin/tests/fileadmin/test_fileadmin.py index 298590ead..41a419609 100644 --- a/flask_admin/tests/fileadmin/test_fileadmin.py +++ b/flask_admin/tests/fileadmin/test_fileadmin.py @@ -1,17 +1,14 @@ from io import StringIO import os import os.path as op -import unittest from flask_admin.contrib import fileadmin from flask_admin import Admin from flask import Flask -from . import setup - class Base: - class FileAdminTests(unittest.TestCase): + class FileAdminTests: _test_files_root = op.join(op.dirname(__file__), 'files') def fileadmin_class(self): @@ -197,7 +194,7 @@ class EditModalOff(fileadmin_class): assert 'fa_modal_window' not in data -class LocalFileAdminTests(Base.FileAdminTests): +class TestLocalFileAdmin(Base.FileAdminTests): def fileadmin_class(self): return fileadmin.FileAdmin diff --git a/flask_admin/tests/fileadmin/test_fileadmin_azure.py b/flask_admin/tests/fileadmin/test_fileadmin_azure.py index 31a5be066..51330bb58 100644 --- a/flask_admin/tests/fileadmin/test_fileadmin_azure.py +++ b/flask_admin/tests/fileadmin/test_fileadmin_azure.py @@ -4,15 +4,18 @@ from unittest import SkipTest +import pytest + from flask_admin.contrib.fileadmin import azure from .test_fileadmin import Base -class AzureFileAdminTests(Base.FileAdminTests): +class TestAzureFileAdmin(Base.FileAdminTests): _test_storage = getenv('AZURE_STORAGE_CONNECTION_STRING') - def setUp(self): + @pytest.fixture(autouse=True) + def setup_and_teardown(self): if not azure.BlockBlobService: raise SkipTest('AzureFileAdmin dependencies not installed') @@ -26,7 +29,8 @@ def setUp(self): dummy = op.join(self._test_files_root, 'dummy.txt') client.create_blob_from_path(self._container_name, 'dummy.txt', dummy) - def tearDown(self): + yield + client = azure.BlockBlobService(connection_string=self._test_storage) client.delete_container(self._container_name) From 4c723b2bb48bbcf534652b2e7cbdf8a562c27bfc Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Wed, 17 Jul 2024 17:52:48 +0100 Subject: [PATCH 027/156] Use pytest fixtures instead of setup functions This allows us to have (almost) a single place where we have to think about Babel (in the `babel`) fixture. This should make it easier for us to, in the future, run tests without babel or flask-babel installed, to validate flask-admin for users without that package. This is important because the `flask_admin.babel` module has two clearly different codepaths depending on whether the package is installed. Importantly, because of the fixture chaining (`admin` requires `babel`), it also means that `babel` (if available) is always configured for every flask app instance for every test. --- flask_admin/tests/conftest.py | 30 +++ flask_admin/tests/fileadmin/__init__.py | 11 - flask_admin/tests/fileadmin/test_fileadmin.py | 41 ++- flask_admin/tests/geoa/__init__.py | 20 -- flask_admin/tests/geoa/conftest.py | 24 ++ flask_admin/tests/geoa/test_basic.py | 8 +- flask_admin/tests/mongoengine/__init__.py | 17 -- flask_admin/tests/mongoengine/conftest.py | 20 ++ flask_admin/tests/mongoengine/test_basic.py | 88 ++----- flask_admin/tests/peeweemodel/__init__.py | 15 -- flask_admin/tests/peeweemodel/conftest.py | 18 ++ flask_admin/tests/peeweemodel/test_basic.py | 40 +-- flask_admin/tests/pymongo/__init__.py | 17 -- flask_admin/tests/pymongo/conftest.py | 17 ++ flask_admin/tests/pymongo/test_basic.py | 6 +- flask_admin/tests/sqla/__init__.py | 33 --- flask_admin/tests/sqla/conftest.py | 48 ++++ flask_admin/tests/sqla/test_basic.py | 241 +++++++----------- flask_admin/tests/sqla/test_form_rules.py | 25 +- flask_admin/tests/sqla/test_inlineform.py | 21 +- flask_admin/tests/sqla/test_multi_pk.py | 21 +- flask_admin/tests/sqla/test_postgres.py | 50 ++-- flask_admin/tests/sqla/test_translation.py | 15 +- flask_admin/tests/test_base.py | 94 +++---- flask_admin/tests/test_form_upload.py | 5 +- flask_admin/tests/test_model.py | 91 ++----- 26 files changed, 414 insertions(+), 602 deletions(-) create mode 100644 flask_admin/tests/conftest.py create mode 100644 flask_admin/tests/geoa/conftest.py create mode 100644 flask_admin/tests/mongoengine/conftest.py create mode 100644 flask_admin/tests/peeweemodel/conftest.py create mode 100644 flask_admin/tests/pymongo/conftest.py create mode 100644 flask_admin/tests/sqla/conftest.py diff --git a/flask_admin/tests/conftest.py b/flask_admin/tests/conftest.py new file mode 100644 index 000000000..674c21919 --- /dev/null +++ b/flask_admin/tests/conftest.py @@ -0,0 +1,30 @@ +import pytest +from flask import Flask + +from flask_admin import Admin + + +@pytest.fixture(scope='function') +def app(): + app = Flask(__name__) + app.config['SECRET_KEY'] = '1' + app.config['WTF_CSRF_ENABLED'] = False + + yield app + + +@pytest.fixture +def babel(app): + try: + from flask_babel import Babel + _ = Babel(app) + except ImportError: + pass + + yield babel + + +@pytest.fixture +def admin(app, babel): + admin = Admin(app) + yield admin diff --git a/flask_admin/tests/fileadmin/__init__.py b/flask_admin/tests/fileadmin/__init__.py index 3f34de3b5..e69de29bb 100644 --- a/flask_admin/tests/fileadmin/__init__.py +++ b/flask_admin/tests/fileadmin/__init__.py @@ -1,11 +0,0 @@ -from flask import Flask -from flask_admin import Admin - - -def setup(): - app = Flask(__name__) - app.config['SECRET_KEY'] = '1' - app.config['CSRF_ENABLED'] = False - - admin = Admin(app) - return app, admin diff --git a/flask_admin/tests/fileadmin/test_fileadmin.py b/flask_admin/tests/fileadmin/test_fileadmin.py index 41a419609..0b01e1589 100644 --- a/flask_admin/tests/fileadmin/test_fileadmin.py +++ b/flask_admin/tests/fileadmin/test_fileadmin.py @@ -17,12 +17,10 @@ def fileadmin_class(self): def fileadmin_args(self): raise NotImplementedError - def test_file_admin(self): + def test_file_admin(self, app, admin): fileadmin_class = self.fileadmin_class() fileadmin_args, fileadmin_kwargs = self.fileadmin_args() - app, admin = setup() - class MyFileAdmin(fileadmin_class): editable_extensions = ('txt',) @@ -129,10 +127,8 @@ class MyFileAdmin(fileadmin_class): assert 'path=dummy_renamed_dir' not in rv.data.decode('utf-8') assert 'path=dummy.txt' in rv.data.decode('utf-8') - def test_modal_edit(self): - # bootstrap 2 - test edit_modal - app_bs2 = Flask(__name__) - admin_bs2 = Admin(app_bs2, template_mode="bootstrap2") + def test_modal_edit_bs2(self, app, babel): + admin_bs2 = Admin(app, template_mode="bootstrap2") fileadmin_class = self.fileadmin_class() fileadmin_args, fileadmin_kwargs = self.fileadmin_args() @@ -156,7 +152,7 @@ class EditModalOff(fileadmin_class): admin_bs2.add_view(edit_modal_on) admin_bs2.add_view(edit_modal_off) - client_bs2 = app_bs2.test_client() + client_bs2 = app.test_client() # bootstrap 2 - ensure modal window is added when edit_modal is # enabled @@ -171,14 +167,32 @@ class EditModalOff(fileadmin_class): data = rv.data.decode('utf-8') assert 'fa_modal_window' not in data - # bootstrap 3 - app_bs3 = Flask(__name__) - admin_bs3 = Admin(app_bs3, template_mode="bootstrap3") + def test_modal_edit_bs3(self, app, babel): + admin_bs3 = Admin(app, template_mode="bootstrap3") + + fileadmin_class = self.fileadmin_class() + fileadmin_args, fileadmin_kwargs = self.fileadmin_args() + + class EditModalOn(fileadmin_class): + edit_modal = True + editable_extensions = ('txt',) + + class EditModalOff(fileadmin_class): + edit_modal = False + editable_extensions = ('txt',) + + on_view_kwargs = dict(fileadmin_kwargs) + on_view_kwargs.setdefault('endpoint', 'edit_modal_on') + edit_modal_on = EditModalOn(*fileadmin_args, **on_view_kwargs) + + off_view_kwargs = dict(fileadmin_kwargs) + off_view_kwargs.setdefault('endpoint', 'edit_modal_off') + edit_modal_off = EditModalOff(*fileadmin_args, **off_view_kwargs) admin_bs3.add_view(edit_modal_on) admin_bs3.add_view(edit_modal_off) - client_bs3 = app_bs3.test_client() + client_bs3 = app.test_client() # bootstrap 3 - ensure modal window is added when edit_modal is # enabled @@ -201,10 +215,9 @@ def fileadmin_class(self): def fileadmin_args(self): return (self._test_files_root, '/files'), {} - def test_fileadmin_sort_bogus_url_param(self): + def test_fileadmin_sort_bogus_url_param(self, app, admin): fileadmin_class = self.fileadmin_class() fileadmin_args, fileadmin_kwargs = self.fileadmin_args() - app, admin = setup() class MyFileAdmin(fileadmin_class): editable_extensions = ('txt',) diff --git a/flask_admin/tests/geoa/__init__.py b/flask_admin/tests/geoa/__init__.py index 2d754d8a3..e69de29bb 100644 --- a/flask_admin/tests/geoa/__init__.py +++ b/flask_admin/tests/geoa/__init__.py @@ -1,20 +0,0 @@ -from flask import Flask -from flask_admin import Admin -from flask_sqlalchemy import SQLAlchemy - - -def setup(): - app = Flask(__name__) - app.config['SECRET_KEY'] = '1' - app.config['CSRF_ENABLED'] = False - app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://postgres:postgres@localhost/flask_admin_test' - app.config['SQLALCHEMY_ECHO'] = True - app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False - - db = SQLAlchemy() - db.init_app(app) - admin = Admin(app) - - app.app_context().push() - - return app, db, admin diff --git a/flask_admin/tests/geoa/conftest.py b/flask_admin/tests/geoa/conftest.py new file mode 100644 index 000000000..f0ed17354 --- /dev/null +++ b/flask_admin/tests/geoa/conftest.py @@ -0,0 +1,24 @@ +import pytest + +from flask_admin import Admin +from flask_sqlalchemy import SQLAlchemy + + +@pytest.fixture +def db(): + db = SQLAlchemy() + yield db + + +@pytest.fixture +def admin(app, babel, db): + app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://postgres:postgres@localhost/flask_admin_test' + app.config['SQLALCHEMY_ECHO'] = True + app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False + + db.init_app(app) + + app.app_context().push() + + admin = Admin(app) + yield admin diff --git a/flask_admin/tests/geoa/test_basic.py b/flask_admin/tests/geoa/test_basic.py index 7009107b2..650d71660 100644 --- a/flask_admin/tests/geoa/test_basic.py +++ b/flask_admin/tests/geoa/test_basic.py @@ -9,8 +9,6 @@ from geoalchemy2 import Geometry from geoalchemy2.shape import to_shape -from . import setup - def create_models(db): class GeoModel(db.Model): @@ -28,8 +26,7 @@ def __unicode__(self): @pytest.mark.filterwarnings("ignore:Please update your type formatter:UserWarning") -def test_model(): - app, db, admin = setup() +def test_model(app, db, admin): GeoModel = create_models(db) with app.app_context(): db.create_all() @@ -128,8 +125,7 @@ def test_model(): assert db.session.query(GeoModel).count() == 0 -def test_none(): - app, db, admin = setup() +def test_none(app, db, admin): GeoModel = create_models(db) with app.app_context(): db.create_all() diff --git a/flask_admin/tests/mongoengine/__init__.py b/flask_admin/tests/mongoengine/__init__.py index 8a8bb9432..e69de29bb 100644 --- a/flask_admin/tests/mongoengine/__init__.py +++ b/flask_admin/tests/mongoengine/__init__.py @@ -1,17 +0,0 @@ -from flask import Flask -from flask_admin import Admin -from flask_mongoengine import MongoEngine - - -def setup(): - app = Flask(__name__) - app.config['SECRET_KEY'] = '1' - app.config['CSRF_ENABLED'] = False - app.config['MONGODB_SETTINGS'] = {'DB': 'tests'} - - db = MongoEngine() - db.init_app(app) - - admin = Admin(app) - - return app, db, admin diff --git a/flask_admin/tests/mongoengine/conftest.py b/flask_admin/tests/mongoengine/conftest.py new file mode 100644 index 000000000..5a504e7f8 --- /dev/null +++ b/flask_admin/tests/mongoengine/conftest.py @@ -0,0 +1,20 @@ +import pytest + +from flask_admin import Admin +from flask_mongoengine import MongoEngine + + +@pytest.fixture +def db(): + db = MongoEngine() + yield db + + +@pytest.fixture +def admin(app, babel, db): + app.config['MONGODB_SETTINGS'] = {'DB': 'tests'} + + db.init_app(app) + + admin = Admin(app) + yield admin diff --git a/flask_admin/tests/mongoengine/test_basic.py b/flask_admin/tests/mongoengine/test_basic.py index 4bc5e1ed4..98b10d328 100644 --- a/flask_admin/tests/mongoengine/test_basic.py +++ b/flask_admin/tests/mongoengine/test_basic.py @@ -1,12 +1,9 @@ -import pytest from wtforms import fields, validators from flask_admin import form from flask_admin._compat import as_unicode from flask_admin.contrib.mongoengine import ModelView -from . import setup - from datetime import datetime @@ -72,9 +69,7 @@ def fill_db(Model1, Model2): datetime_field=datetime(2013, 3, 2, 0, 8, 0)).save() -def test_model(): - app, db, admin = setup() - +def test_model(app, db, admin): Model1, Model2 = create_models(db) view = CustomModelView(Model1) @@ -146,9 +141,7 @@ def test_model(): assert Model1.objects.count() == 0 -def test_column_editable_list(): - app, db, admin = setup() - +def test_column_editable_list(app, db, admin): Model1, Model2 = create_models(db) view = CustomModelView(Model1, @@ -220,9 +213,7 @@ def test_column_editable_list(): assert 'test1_val_1' in data -def test_details_view(): - app, db, admin = setup() - +def test_details_view(app, db, admin): Model1, Model2 = create_models(db) view_no_details = CustomModelView(Model1) @@ -277,9 +268,7 @@ def test_details_view(): assert 'Int Field' not in data -def test_column_filters(): - app, db, admin = setup() - +def test_column_filters(app, db, admin): Model1, Model2 = create_models(db) # fill DB with values @@ -684,8 +673,7 @@ def test_column_filters(): assert 'datetime_obj2' in data -def test_default_sort(): - app, db, admin = setup() +def test_default_sort(app, db, admin): M1, _ = create_models(db) M1(test1='c', test2='x').save() @@ -716,9 +704,7 @@ def test_default_sort(): assert data[2].test1 == 'a' -def test_extra_fields(): - app, db, admin = setup() - +def test_extra_fields(app, db, admin): Model1, _ = create_models(db) view = CustomModelView( @@ -742,9 +728,7 @@ def test_extra_fields(): assert pos2 < pos1 -def test_extra_field_order(): - app, db, admin = setup() - +def test_extra_field_order(app, db, admin): Model1, _ = create_models(db) view = CustomModelView( @@ -768,9 +752,7 @@ def test_extra_field_order(): assert pos2 < pos1 -def test_custom_form_base(): - app, db, admin = setup() - +def test_custom_form_base(app, db, admin): class TestForm(form.BaseForm): pass @@ -788,9 +770,7 @@ class TestForm(form.BaseForm): assert isinstance(create_form, TestForm) -def test_subdocument_config(): - app, db, admin = setup() - +def test_subdocument_config(app, db, admin): class Comment(db.EmbeddedDocument): name = db.StringField(max_length=20, required=True) value = db.StringField(max_length=20) @@ -830,9 +810,7 @@ class Model1(db.Document): assert 'value' not in dir(form.subdoc.form) -def test_subdocument_class_config(): - app, db, admin = setup() - +def test_subdocument_class_config(app, db, admin): from flask_admin.contrib.mongoengine import EmbeddedForm class Comment(db.EmbeddedDocument): @@ -859,9 +837,7 @@ class EmbeddedConfig(EmbeddedForm): assert 'value' not in dir(form.subdoc.form) -def test_nested_subdocument_config(): - app, db, admin = setup() - +def test_nested_subdocument_config(app, db, admin): # Check recursive class Comment(db.EmbeddedDocument): name = db.StringField(max_length=20, required=True) @@ -893,9 +869,7 @@ class Model1(db.Document): assert 'value' not in dir(form.nested.form.comment.form) -def test_nested_list_subdocument(): - app, db, admin = setup() - +def test_nested_list_subdocument(app, db, admin): class Comment(db.EmbeddedDocument): name = db.StringField(max_length=20, required=True) value = db.StringField(max_length=20) @@ -926,9 +900,7 @@ class Model1(db.Document): assert 'value' not in dir(inline_form) -def test_nested_sortedlist_subdocument(): - app, db, admin = setup() - +def test_nested_sortedlist_subdocument(app, db, admin): class Comment(db.EmbeddedDocument): name = db.StringField(max_length=20, required=True) value = db.StringField(max_length=20) @@ -958,9 +930,7 @@ class Model1(db.Document): assert 'value' not in dir(inline_form) -def test_sortedlist_subdocument_validation(): - app, db, admin = setup() - +def test_sortedlist_subdocument_validation(app, db, admin): class Comment(db.EmbeddedDocument): name = db.StringField(max_length=20, required=True) value = db.StringField(max_length=20) @@ -983,9 +953,7 @@ class Model1(db.Document): assert b'This field is required' in rv.data -def test_list_subdocument_validation(): - app, db, admin = setup() - +def test_list_subdocument_validation(app, db, admin): class Comment(db.EmbeddedDocument): name = db.StringField(max_length=20, required=True) value = db.StringField(max_length=20) @@ -1008,9 +976,7 @@ class Model1(db.Document): assert b'This field is required' in rv.data -def test_ajax_fk(): - app, db, admin = setup() - +def test_ajax_fk(app, db, admin): Model1, Model2 = create_models(db) view = CustomModelView( @@ -1071,9 +1037,7 @@ def test_ajax_fk(): assert mdl.model1.test1 == u'first' -def test_nested_ajax_refs(): - app, db, admin = setup() - +def test_nested_ajax_refs(app, db, admin): # Check recursive class Comment(db.Document): name = db.StringField(max_length=20, required=True) @@ -1105,9 +1069,7 @@ class Model1(db.Document): assert 'nested-comment' in view1._form_ajax_refs -def test_form_flat_choices(): - app, db, admin = setup() - +def test_form_flat_choices(app, db, admin): class Model(db.Document): name = db.StringField(max_length=20, choices=('a', 'b', 'c')) @@ -1118,9 +1080,7 @@ class Model(db.Document): assert form.name.choices == [('a', 'a'), ('b', 'b'), ('c', 'c')] -def test_form_args(): - app, db, admin = setup() - +def test_form_args(app, db, admin): class Model(db.Document): test = db.StringField(required=True) @@ -1137,9 +1097,7 @@ class Model(db.Document): assert len(edit_form.test.validators) == 2 -def test_form_args_embeddeddoc(): - app, db, admin = setup() - +def test_form_args_embeddeddoc(app, db, admin): class Info(db.EmbeddedDocument): name = db.StringField() age = db.StringField() @@ -1162,8 +1120,7 @@ class Model(db.Document): assert form.info.label.text == 'Information' -def test_simple_list_pager(): - app, db, admin = setup() +def test_simple_list_pager(app, db, admin): Model1, _ = create_models(db) class TestModelView(CustomModelView): @@ -1179,8 +1136,7 @@ def get_count_query(self): assert count is None -def test_export_csv(): - app, db, admin = setup() +def test_export_csv(app, db, admin): Model1, Model2 = create_models(db) view = CustomModelView(Model1, can_export=True, diff --git a/flask_admin/tests/peeweemodel/__init__.py b/flask_admin/tests/peeweemodel/__init__.py index 20fe5543c..e69de29bb 100644 --- a/flask_admin/tests/peeweemodel/__init__.py +++ b/flask_admin/tests/peeweemodel/__init__.py @@ -1,15 +0,0 @@ -from flask import Flask -from flask_admin import Admin -import peewee - - -def setup(): - app = Flask(__name__) - app.config['SECRET_KEY'] = '1' - app.config['CSRF_ENABLED'] = False - app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' - - db = peewee.SqliteDatabase(':memory:') - admin = Admin(app) - - return app, db, admin diff --git a/flask_admin/tests/peeweemodel/conftest.py b/flask_admin/tests/peeweemodel/conftest.py new file mode 100644 index 000000000..0cdeb91dc --- /dev/null +++ b/flask_admin/tests/peeweemodel/conftest.py @@ -0,0 +1,18 @@ +import pytest + +from flask_admin import Admin +import peewee + + +@pytest.fixture +def db(): + db = peewee.SqliteDatabase(':memory:') + yield db + + +@pytest.fixture +def admin(app, babel, db): + app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + + admin = Admin(app) + yield admin diff --git a/flask_admin/tests/peeweemodel/test_basic.py b/flask_admin/tests/peeweemodel/test_basic.py index ea1ce8253..c4c0d96b6 100644 --- a/flask_admin/tests/peeweemodel/test_basic.py +++ b/flask_admin/tests/peeweemodel/test_basic.py @@ -10,8 +10,6 @@ from flask_admin._compat import iteritems from flask_admin.contrib.peewee import ModelView -from . import setup - from datetime import datetime, time, date @@ -104,8 +102,7 @@ def fill_db(Model1, Model2): Model1('datetime_obj2', datetime_field=datetime(2013, 3, 2, 0, 8, 0)).save() -def test_model(): - app, db, admin = setup() +def test_model(app, db, admin): Model1, Model2 = create_models(db) view = CustomModelView(Model1) @@ -177,9 +174,7 @@ def test_model(): # @pytest.mark.filterwarnings("ignore:Please update your type formatter:UserWarning") -def test_column_editable_list(): - app, db, admin = setup() - +def test_column_editable_list(app, db, admin): Model1, Model2 = create_models(db) # wtf-peewee doesn't automatically add length validators for max_length @@ -252,9 +247,7 @@ def test_column_editable_list(): assert 'test1_val_3' in data -def test_details_view(): - app, db, admin = setup() - +def test_details_view(app, db, admin): Model1, Model2 = create_models(db) view_no_details = CustomModelView(Model1) @@ -305,9 +298,7 @@ def test_details_view(): assert '5000' not in data -def test_column_filters(): - app, db, admin = setup() - +def test_column_filters(app, db, admin): Model1, Model2 = create_models(db) fill_db(Model1, Model2) @@ -855,8 +846,7 @@ def test_column_filters(): assert 'timeonly_obj2' in data -def test_default_sort(): - app, db, admin = setup() +def test_default_sort(app, db, admin): M1, _ = create_models(db) M1('c', 1).save() @@ -887,9 +877,7 @@ def test_default_sort(): assert data[2].test1 == 'a' -def test_extra_fields(): - app, db, admin = setup() - +def test_extra_fields(app, db, admin): Model1, _ = create_models(db) view = CustomModelView( @@ -913,9 +901,7 @@ def test_extra_fields(): assert pos2 < pos1 -def test_custom_form_base(): - app, db, admin = setup() - +def test_custom_form_base(app, db, admin): class TestForm(form.BaseForm): pass @@ -933,9 +919,7 @@ class TestForm(form.BaseForm): assert isinstance(create_form, TestForm) -def test_form_args(): - app, db, admin = setup() - +def test_form_args(app, db, admin): class BaseModel(peewee.Model): class Meta: database = db @@ -959,9 +943,7 @@ class Model(BaseModel): assert len(edit_form.test.validators) == 2 -def test_ajax_fk(): - app, db, admin = setup() - +def test_ajax_fk(app, db, admin): class BaseModel(peewee.Model): class Meta: database = db @@ -1038,9 +1020,7 @@ class Model2(BaseModel): assert mdl.model1.test1 == u'first' -def test_export_csv(): - app, db, admin = setup() - +def test_export_csv(app, db, admin): Model1, Model2 = create_models(db) view = CustomModelView(Model1, can_export=True, diff --git a/flask_admin/tests/pymongo/__init__.py b/flask_admin/tests/pymongo/__init__.py index 8a9d27b03..e69de29bb 100644 --- a/flask_admin/tests/pymongo/__init__.py +++ b/flask_admin/tests/pymongo/__init__.py @@ -1,17 +0,0 @@ -from pymongo import MongoClient - -from flask import Flask -from flask_admin import Admin - - -def setup(): - app = Flask(__name__) - app.config['SECRET_KEY'] = '1' - app.config['CSRF_ENABLED'] = False - - client = MongoClient() - db = client.tests - - admin = Admin(app) - - return app, db, admin diff --git a/flask_admin/tests/pymongo/conftest.py b/flask_admin/tests/pymongo/conftest.py new file mode 100644 index 000000000..eb3dc2062 --- /dev/null +++ b/flask_admin/tests/pymongo/conftest.py @@ -0,0 +1,17 @@ +import pytest +from pymongo import MongoClient + +from flask_admin import Admin + + +@pytest.fixture +def db(): + client = MongoClient() + db = client.tests + yield db + + +@pytest.fixture +def admin(app, babel, db): + admin = Admin(app) + yield admin diff --git a/flask_admin/tests/pymongo/test_basic.py b/flask_admin/tests/pymongo/test_basic.py index 267d0a0c3..7fe31335c 100644 --- a/flask_admin/tests/pymongo/test_basic.py +++ b/flask_admin/tests/pymongo/test_basic.py @@ -2,8 +2,6 @@ from flask_admin.contrib.pymongo import ModelView -from . import setup - class TestForm(form.Form): __test__ = False @@ -19,9 +17,7 @@ class TestView(ModelView): form = TestForm -def test_model(): - app, db, admin = setup() - +def test_model(app, db, admin): view = TestView(db.test, 'Test') admin.add_view(view) diff --git a/flask_admin/tests/sqla/__init__.py b/flask_admin/tests/sqla/__init__.py index c601abc50..e69de29bb 100644 --- a/flask_admin/tests/sqla/__init__.py +++ b/flask_admin/tests/sqla/__init__.py @@ -1,33 +0,0 @@ -from flask import Flask -from flask_admin import Admin -from flask_sqlalchemy import SQLAlchemy - - -def setup(): - app = Flask(__name__) - app.config['SECRET_KEY'] = '1' - app.config['CSRF_ENABLED'] = False - app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' - app.config['SQLALCHEMY_ECHO'] = True - app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False - - db = SQLAlchemy() - db.init_app(app) - admin = Admin(app) - - return app, db, admin - - -def setup_postgres(): - app = Flask(__name__) - app.config['SECRET_KEY'] = '1' - app.config['CSRF_ENABLED'] = False - app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://postgres:postgres@localhost/flask_admin_test' - app.config['SQLALCHEMY_ECHO'] = True - app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False - - db = SQLAlchemy() - db.init_app(app) - admin = Admin(app) - - return app, db, admin diff --git a/flask_admin/tests/sqla/conftest.py b/flask_admin/tests/sqla/conftest.py new file mode 100644 index 000000000..edeb0335f --- /dev/null +++ b/flask_admin/tests/sqla/conftest.py @@ -0,0 +1,48 @@ +import pytest +from flask import Flask + +from flask_admin import Admin +from flask_sqlalchemy import SQLAlchemy + + +@pytest.fixture(scope='function') +def app(): + # Overrides the `app` fixture in `flask_admin/tests/conftest.py` so that the `sqla` + # directory/import path is configured as the root path for Flask. This will + # cause the `templates` directory here to be used for template resolution. + app = Flask(__name__) + app.config['SECRET_KEY'] = '1' + app.config['WTF_CSRF_ENABLED'] = False + + yield app + + +@pytest.fixture +def db(app): + app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + app.config['SQLALCHEMY_ECHO'] = True + app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False + db = SQLAlchemy(app) + yield db + + +@pytest.fixture +def postgres_db(app): + app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://postgres:postgres@localhost/flask_admin_test' + app.config['SQLALCHEMY_ECHO'] = True + app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False + + db = SQLAlchemy(app) + yield db + + +@pytest.fixture +def admin(app, babel, db): + admin = Admin(app) + yield admin + + +@pytest.fixture +def postgres_admin(app, babel, postgres_db): + admin = Admin(app) + yield admin diff --git a/flask_admin/tests/sqla/test_basic.py b/flask_admin/tests/sqla/test_basic.py index 97dd6bb7f..5a053cc18 100644 --- a/flask_admin/tests/sqla/test_basic.py +++ b/flask_admin/tests/sqla/test_basic.py @@ -7,12 +7,10 @@ from flask_admin._compat import as_unicode from flask_admin._compat import iteritems from flask_admin.contrib.sqla import ModelView, filters, tools -from flask_babel import Babel from sqlalchemy.ext.hybrid import hybrid_property from sqlalchemy import cast from sqlalchemy_utils import EmailType, ChoiceType, UUIDType, URLType, CurrencyType, ColorType, ArrowType, IPAddressType -from . import setup from datetime import datetime, time, date import uuid @@ -156,9 +154,7 @@ def fill_db(db, Model1, Model2): @pytest.mark.filterwarnings("ignore:Please update your type formatter:UserWarning") -def test_model(): - app, db, admin = setup() - +def test_model(app, db, admin): with app.app_context(): Model1, Model2 = create_models(db) @@ -309,9 +305,7 @@ def test_model(): @pytest.mark.xfail(raises=Exception) -def test_no_pk(): - app, db, admin = setup() - +def test_no_pk(app, db, admin): class Model(db.Model): test = db.Column(db.Integer) @@ -319,9 +313,7 @@ class Model(db.Model): admin.add_view(view) -def test_list_columns(): - app, db, admin = setup() - +def test_list_columns(app, db, admin): with app.app_context(): Model1, Model2 = create_models(db) @@ -356,9 +348,7 @@ def test_list_columns(): assert 'Test2' not in data -def test_complex_list_columns(): - app, db, admin = setup() - +def test_complex_list_columns(app, db, admin): with app.app_context(): M1, M2 = create_models(db) @@ -381,9 +371,7 @@ def test_complex_list_columns(): assert 'model1_val1' in data -def test_exclude_columns(): - app, db, admin = setup() - +def test_exclude_columns(app, db, admin): with app.app_context(): Model1, Model2 = create_models(db) @@ -408,9 +396,7 @@ def test_exclude_columns(): assert 'Test2' not in data -def test_column_searchable_list(): - app, db, admin = setup() - +def test_column_searchable_list(app, db, admin): with app.app_context(): Model1, Model2 = create_models(db) @@ -443,9 +429,7 @@ def test_column_searchable_list(): assert 'model2-test' in data -def test_extra_args_search(): - app, db, admin = setup() - +def test_extra_args_search(app, db, admin): with app.app_context(): Model1, Model2 = create_models(db) @@ -465,9 +449,7 @@ def test_extra_args_search(): assert '<input type="hidden" name="foo" value="bar">' in data -def test_extra_args_filter(): - app, db, admin = setup() - +def test_extra_args_filter(app, db, admin): with app.app_context(): Model1, Model2 = create_models(db) @@ -487,9 +469,7 @@ def test_extra_args_filter(): @pytest.mark.filterwarnings("ignore:Please update your type formatter:UserWarning") -def test_complex_searchable_list(): - app, db, admin = setup() - +def test_complex_searchable_list(app, db, admin): with app.app_context(): Model1, Model2 = create_models(db) @@ -524,9 +504,7 @@ def test_complex_searchable_list(): @pytest.mark.filterwarnings("ignore:Please update your type formatter:UserWarning") -def test_complex_searchable_list_missing_children(): - app, db, admin = setup() - +def test_complex_searchable_list_missing_children(app, db, admin): with app.app_context(): Model1, Model2 = create_models(db) @@ -546,9 +524,7 @@ def test_complex_searchable_list_missing_children(): @pytest.mark.filterwarnings("ignore:Please update your type formatter:UserWarning") -def test_column_editable_list(): - app, db, admin = setup() - +def test_column_editable_list(app, db, admin): with app.app_context(): Model1, Model2 = create_models(db) @@ -617,9 +593,7 @@ def test_column_editable_list(): assert 'test1_val_3' in data -def test_details_view(): - app, db, admin = setup() - +def test_details_view(app, db, admin): with app.app_context(): Model1, Model2 = create_models(db) @@ -670,11 +644,9 @@ def test_details_view(): assert 'test1_val_1' not in data -def test_editable_list_special_pks(): +def test_editable_list_special_pks(app, db, admin): ''' Tests editable list view + a primary key with special characters ''' - app, db, admin = setup() - with app.app_context(): class Model1(db.Model): def __init__(self, id=None, val1=None): @@ -710,9 +682,7 @@ def __init__(self, id=None, val1=None): @pytest.mark.filterwarnings("ignore:Please update your type formatter:UserWarning") -def test_column_filters(): - app, db, admin = setup() - +def test_column_filters(app, db, admin): with app.app_context(): Model1, Model2 = create_models(db) @@ -1571,9 +1541,7 @@ def test_column_filters(): assert 'test1_val_2' not in data -def test_column_filters_sqla_obj(): - app, db, admin = setup() - +def test_column_filters_sqla_obj(app, db, admin): with app.app_context(): Model1, Model2 = create_models(db) @@ -1586,9 +1554,7 @@ def test_column_filters_sqla_obj(): assert len(view._filters) == 7 -def test_hybrid_property(): - app, db, admin = setup() - +def test_hybrid_property(app, db, admin): with app.app_context(): class Model1(db.Model): id = db.Column(db.Integer, primary_key=True) @@ -1655,9 +1621,7 @@ def number_of_pixels_str(cls): assert 'test_row_1' not in data -def test_hybrid_property_nested(): - app, db, admin = setup() - +def test_hybrid_property_nested(app, db, admin): with app.app_context(): class Model1(db.Model): @@ -1704,9 +1668,7 @@ class Model2(db.Model): @pytest.mark.filterwarnings("ignore:Please update your type formatter:UserWarning") -def test_url_args(): - app, db, admin = setup() - +def test_url_args(app, db, admin): with app.app_context(): Model1, Model2 = create_models(db) @@ -1763,9 +1725,7 @@ def test_url_args(): assert 'data2' in data -def test_non_int_pk(): - app, db, admin = setup() - +def test_non_int_pk(app, db, admin): with app.app_context(): class Model(db.Model): @@ -1797,9 +1757,7 @@ class Model(db.Model): assert 'test2' in data -def test_form_columns(): - app, db, admin = setup() - +def test_form_columns(app, db, admin): with app.app_context(): class Model(db.Model): @@ -1863,9 +1821,7 @@ class EnumChoices(enum.Enum): @pytest.mark.xfail(raises=Exception) -def test_complex_form_columns(): - app, db, admin = setup() - +def test_complex_form_columns(app, db, admin): with app.app_context(): M1, M2 = create_models(db) @@ -1874,9 +1830,7 @@ def test_complex_form_columns(): view.create_form() -def test_form_args(): - app, db, admin = setup() - +def test_form_args(app, db, admin): with app.app_context(): class Model(db.Model): id = db.Column(db.String, primary_key=True) @@ -1897,9 +1851,7 @@ class Model(db.Model): assert len(edit_form.test.validators) == 2 -def test_form_override(): - app, db, admin = setup() - +def test_form_override(app, db, admin): with app.app_context(): class Model(db.Model): id = db.Column(db.String, primary_key=True) @@ -1916,9 +1868,7 @@ class Model(db.Model): assert view2._create_form_class.test.field_class == fields.FileField -def test_form_onetoone(): - app, db, admin = setup() - +def test_form_onetoone(app, db, admin): with app.app_context(): class Model1(db.Model): id = db.Column(db.Integer, primary_key=True) @@ -1955,9 +1905,7 @@ def test_relations(): pass -def test_on_model_change_delete(): - app, db, admin = setup() - +def test_on_model_change_delete(app, db, admin): with app.app_context(): Model1, _ = create_models(db) @@ -1990,9 +1938,7 @@ def on_model_delete(self, model): assert view.deleted -def test_multiple_delete(): - app, db, admin = setup() - +def test_multiple_delete(app, db, admin): with app.app_context(): M1, _ = create_models(db) @@ -2010,9 +1956,7 @@ def test_multiple_delete(): assert M1.query.count() == 0 -def test_default_sort(): - app, db, admin = setup() - +def test_default_sort(app, db, admin): with app.app_context(): M1, _ = create_models(db) @@ -2068,9 +2012,7 @@ def test_default_sort(): assert data[2].test1 == 'a' -def test_complex_sort(): - app, db, admin = setup() - +def test_complex_sort(app, db, admin): with app.app_context(): M1, M2 = create_models(db) @@ -2121,9 +2063,7 @@ def test_complex_sort(): @pytest.mark.xfail(raises=Exception) -def test_complex_sort_exception(): - app, db, admin = setup() - +def test_complex_sort_exception(app, db, admin): with app.app_context(): M1, M2 = create_models(db) @@ -2140,9 +2080,7 @@ def test_complex_sort_exception(): assert data[1].model1.test1 == 'b' -def test_default_complex_sort(): - app, db, admin = setup() - +def test_default_complex_sort(app, db, admin): with app.app_context(): M1, M2 = create_models(db) @@ -2177,8 +2115,7 @@ def test_default_complex_sort(): assert data[1].model1.test1 == 'b' -def test_extra_fields(): - app, db, admin = setup() +def test_extra_fields(app, db, admin): with app.app_context(): Model1, _ = create_models(db) @@ -2203,9 +2140,7 @@ def test_extra_fields(): assert pos2 < pos1 -def test_extra_field_order(): - app, db, admin = setup() - +def test_extra_field_order(app, db, admin): with app.app_context(): Model1, _ = create_models(db) @@ -2230,45 +2165,59 @@ def test_extra_field_order(): assert pos2 > pos1 -def test_modelview_localization(): - def test_locale(locale): - try: - app, db, admin = setup() - - app.config['BABEL_DEFAULT_LOCALE'] = locale - Babel(app) +@pytest.mark.parametrize( + 'locale, expect_text', + ( + ('en', 'Home'), + ('cs', 'Domů'), + ('de', 'Start'), + ('es', 'Inicio'), + ('fa', 'خانه'), + ('fr', 'Accueil'), + ('pt', 'Início'), + ('ru', 'Главная'), + ('pa', 'ਹੋਮ'), + ('zh_CN', '首页'), + ('zh_TW', '首頁'), + ) +) +def test_modelview_localization(request, app, locale, expect_text): + # We need to configure the default Babel locale _before_ the `babel` fixture is + # initialised, so we have to use `request.getfixturevalue` to pull the fixture + # within the test function rather than the test signature. The `admin` fixture + # pulls in the `babel` fixture, which will then use the configuration here. + app.config['BABEL_DEFAULT_LOCALE'] = locale + db = request.getfixturevalue('db') + admin = request.getfixturevalue('admin') - with app.app_context(): - Model1, _ = create_models(db) - - view = CustomModelView( - Model1, db.session, - column_filters=['test1', 'bool_field', 'date_field', 'datetime_field', 'time_field'] - ) - - admin.add_view(view) + with app.app_context(): + Model1, _ = create_models(db) - client = app.test_client() + view = CustomModelView( + Model1, db.session, + column_filters=['test1', 'bool_field', 'date_field', 'datetime_field', 'time_field'] + ) - rv = client.get('/admin/model1/') - assert rv.status_code == 200 + admin.add_view(view) - rv = client.get('/admin/model1/new/') - assert rv.status_code == 200 - except: - print("Error on the following locale:", locale) - raise + client = app.test_client() - locales = ['en', 'cs', 'de', 'es', 'fa', 'fr', 'pt', 'ru', 'zh_CN', 'zh_TW'] - for locale in locales: - test_locale(locale) + rv = client.get('/admin/model1/') + assert expect_text in rv.text + assert rv.status_code == 200 + rv = client.get('/admin/model1/new/') + assert rv.status_code == 200 -def test_modelview_named_filter_localization(): - app, db, admin = setup() +def test_modelview_named_filter_localization(request, app): + # We need to configure the default Babel locale _before_ the `babel` fixture is + # initialised, so we have to use `request.getfixturevalue` to pull the fixture + # within the test function rather than the test signature. The `admin` fixture + # pulls in the `babel` fixture, which will then use the configuration here. app.config['BABEL_DEFAULT_LOCALE'] = 'de' - Babel(app) + db = request.getfixturevalue('db') + _ = request.getfixturevalue('admin') with app.app_context(): Model1, _ = create_models(db) @@ -2286,9 +2235,7 @@ def test_modelview_named_filter_localization(): assert 'test1_equals' == flt_name -def test_custom_form_base(): - app, db, admin = setup() - +def test_custom_form_base(app, db, admin): with app.app_context(): class TestForm(form.BaseForm): pass @@ -2307,9 +2254,7 @@ class TestForm(form.BaseForm): assert isinstance(create_form, TestForm) -def test_ajax_fk(): - app, db, admin = setup() - +def test_ajax_fk(app, db, admin): with app.app_context(): Model1, Model2 = create_models(db) @@ -2372,9 +2317,7 @@ def test_ajax_fk(): assert mdl.model1.test1 == u'first' -def test_ajax_fk_multi(): - app, db, admin = setup() - +def test_ajax_fk_multi(app, db, admin): with app.app_context(): class Model1(db.Model): __tablename__ = 'model1' @@ -2439,9 +2382,7 @@ class Model2(db.Model): assert len(mdl.model1) == 1 -def test_safe_redirect(): - app, db, admin = setup() - +def test_safe_redirect(app, db, admin): with app.app_context(): Model1, _ = create_models(db) @@ -2477,8 +2418,7 @@ def test_safe_redirect(): assert 'id=2' in rv.location -def test_simple_list_pager(): - app, db, admin = setup() +def test_simple_list_pager(app, db, admin): with app.app_context(): Model1, _ = create_models(db) @@ -2495,8 +2435,7 @@ def get_count_query(self): assert count is None -def test_unlimited_page_size(): - app, db, admin = setup() +def test_unlimited_page_size(app, db, admin): with app.app_context(): M1, _ = create_models(db) @@ -2518,8 +2457,7 @@ def test_unlimited_page_size(): assert len(data) == 21 -def test_advanced_joins(): - app, db, admin = setup() +def test_advanced_joins(app, db, admin): with app.app_context(): class Model1(db.Model): id = db.Column(db.Integer, primary_key=True) @@ -2593,8 +2531,7 @@ class Model3(db.Model): assert alias is None -def test_multipath_joins(): - app, db, admin = setup() +def test_multipath_joins(app, db, admin): with app.app_context(): class Model1(db.Model): id = db.Column(db.Integer, primary_key=True) @@ -2624,8 +2561,7 @@ class Model2(db.Model): # TODO: Why this fails? @pytest.mark.xfail(raises=Exception) -def test_different_bind_joins(): - app, db, admin = setup() +def test_different_bind_joins(app, db, admin): app.config['SQLALCHEMY_BINDS'] = { 'other': 'sqlite:///' } @@ -2653,8 +2589,7 @@ class Model2(db.Model): assert rv.status_code == 200 -def test_model_default(): - app, db, admin = setup() +def test_model_default(app, db, admin): with app.app_context(): _, Model2 = create_models(db) @@ -2669,9 +2604,7 @@ class ModelView(CustomModelView): assert b'This field is required' not in rv.data -def test_export_csv(): - app, db, admin = setup() - +def test_export_csv(app, db, admin): with app.app_context(): Model1, Model2 = create_models(db) diff --git a/flask_admin/tests/sqla/test_form_rules.py b/flask_admin/tests/sqla/test_form_rules.py index faae6521b..75558240b 100644 --- a/flask_admin/tests/sqla/test_form_rules.py +++ b/flask_admin/tests/sqla/test_form_rules.py @@ -1,15 +1,12 @@ import pytest -from . import setup from .test_basic import CustomModelView, create_models from flask_admin.form import rules @pytest.mark.filterwarnings("ignore:Fields missing:UserWarning") -def test_form_rules(): - app, db, admin = setup() - +def test_form_rules(app, db, admin): with app.app_context(): Model1, _ = create_models(db) db.create_all() @@ -34,9 +31,7 @@ def test_form_rules(): @pytest.mark.filterwarnings("ignore:Fields missing:UserWarning") -def test_rule_macro(): - app, db, admin = setup() - +def test_rule_macro(app, db, admin): with app.app_context(): Model1, _ = create_models(db) db.create_all() @@ -58,9 +53,7 @@ def test_rule_macro(): @pytest.mark.filterwarnings("ignore:Fields missing:UserWarning") -def test_rule_container(): - app, db, admin = setup() - +def test_rule_container(app, db, admin): with app.app_context(): Model1, _ = create_models(db) db.create_all() @@ -86,8 +79,7 @@ def test_rule_container(): @pytest.mark.filterwarnings("ignore:Fields missing:UserWarning") -def test_rule_header(): - app, db, admin = setup() +def test_rule_header(app, db, admin): with app.app_context(): Model1, _ = create_models(db) db.create_all() @@ -106,8 +98,7 @@ def test_rule_header(): @pytest.mark.filterwarnings("ignore:Fields missing:UserWarning") -def test_rule_field_set(): - app, db, admin = setup() +def test_rule_field_set(app, db, admin): with app.app_context(): Model1, _ = create_models(db) db.create_all() @@ -133,8 +124,7 @@ def test_rule_field_set(): @pytest.mark.filterwarnings("ignore:Fields missing:UserWarning") -def test_rule_inlinefieldlist(): - app, db, admin = setup() +def test_rule_inlinefieldlist(app, db, admin): with app.app_context(): Model1, Model2 = create_models(db) db.create_all() @@ -150,8 +140,7 @@ def test_rule_inlinefieldlist(): assert rv.status_code == 200 -def test_inline_model_rules(): - app, db, admin = setup() +def test_inline_model_rules(app, db, admin): with app.app_context(): Model1, Model2 = create_models(db) db.create_all() diff --git a/flask_admin/tests/sqla/test_inlineform.py b/flask_admin/tests/sqla/test_inlineform.py index 8523b1f63..d28f89078 100644 --- a/flask_admin/tests/sqla/test_inlineform.py +++ b/flask_admin/tests/sqla/test_inlineform.py @@ -6,12 +6,8 @@ from flask_admin.contrib.sqla.fields import InlineModelFormList from flask_admin.contrib.sqla.validators import ItemsRequired -from . import setup - - -def test_inline_form(): - app, db, admin = setup() +def test_inline_form(app, db, admin): with app.app_context(): client = app.test_client() @@ -110,9 +106,7 @@ class UserModelView(ModelView): assert UserInfo.query.count() == 0 -def test_inline_form_required(): - app, db, admin = setup() - +def test_inline_form_required(app, db, admin): with app.app_context(): client = app.test_client() @@ -171,9 +165,7 @@ class UserModelView(ModelView): assert UserEmail.query.count() == 1 -def test_inline_form_ajax_fk(): - app, db, admin = setup() - +def test_inline_form_ajax_fk(app, db, admin): with app.app_context(): # Set up models and database class User(db.Model): @@ -228,9 +220,7 @@ class UserModelView(ModelView): assert 'userinfo-tag' in view._form_ajax_refs -def test_inline_form_self(): - app, db, admin = setup() - +def test_inline_form_self(app, db, admin): with app.app_context(): class Tree(db.Model): id = db.Column(db.Integer, primary_key=True) @@ -250,8 +240,7 @@ class TreeView(ModelView): assert form.parent.data == parent -def test_inline_form_base_class(): - app, db, admin = setup() +def test_inline_form_base_class(app, db, admin): client = app.test_client() with app.app_context(): diff --git a/flask_admin/tests/sqla/test_multi_pk.py b/flask_admin/tests/sqla/test_multi_pk.py index dd122baee..59bfa9bee 100644 --- a/flask_admin/tests/sqla/test_multi_pk.py +++ b/flask_admin/tests/sqla/test_multi_pk.py @@ -1,14 +1,11 @@ -from . import setup from .test_basic import CustomModelView from flask_sqlalchemy import Model from sqlalchemy.ext.declarative import declarative_base -def test_multiple_pk(): +def test_multiple_pk(app, db, admin): # Test multiple primary keys - mix int and string together - app, db, admin = setup() - with app.app_context(): class Model(db.Model): id = db.Column(db.Integer, primary_key=True) @@ -44,10 +41,8 @@ class Model(db.Model): assert rv.status_code == 302 -def test_joined_inheritance(): +def test_joined_inheritance(app, db, admin): # Test multiple primary keys - mix int and string together - app, db, admin = setup() - with app.app_context(): class Parent(db.Model): id = db.Column(db.Integer, primary_key=True) @@ -84,10 +79,8 @@ class Child(Parent): assert 'bar' in data -def test_single_table_inheritance(): +def test_single_table_inheritance(app, db, admin): # Test multiple primary keys - mix int and string together - app, db, admin = setup() - with app.app_context(): CustomModel = declarative_base(cls=Model, name='Model') @@ -125,10 +118,8 @@ class Child(Parent): assert 'bar' in data -def test_concrete_table_inheritance(): +def test_concrete_table_inheritance(app, db, admin): # Test multiple primary keys - mix int and string together - app, db, admin = setup() - with app.app_context(): class Parent(db.Model): id = db.Column(db.Integer, primary_key=True) @@ -161,10 +152,8 @@ class Child(Parent): assert 'bar' in data -def test_concrete_multipk_inheritance(): +def test_concrete_multipk_inheritance(app, db, admin): # Test multiple primary keys - mix int and string together - app, db, admin = setup() - with app.app_context(): class Parent(db.Model): id = db.Column(db.Integer, primary_key=True) diff --git a/flask_admin/tests/sqla/test_postgres.py b/flask_admin/tests/sqla/test_postgres.py index 1cf202dd7..c374b6c43 100644 --- a/flask_admin/tests/sqla/test_postgres.py +++ b/flask_admin/tests/sqla/test_postgres.py @@ -1,22 +1,19 @@ -from . import setup_postgres from .test_basic import CustomModelView from sqlalchemy.dialects.postgresql import HSTORE, JSON from citext import CIText -def test_hstore(): - app, db, admin = setup_postgres() - +def test_hstore(app, postgres_db, postgres_admin): with app.app_context(): - class Model(db.Model): - id = db.Column(db.Integer, primary_key=True, autoincrement=True) - hstore_test = db.Column(HSTORE) + class Model(postgres_db.Model): + id = postgres_db.Column(postgres_db.Integer, primary_key=True, autoincrement=True) + hstore_test = postgres_db.Column(HSTORE) - db.create_all() + postgres_db.create_all() - view = CustomModelView(Model, db.session) - admin.add_view(view) + view = CustomModelView(Model, postgres_db.session) + postgres_admin.add_view(view) client = app.test_client() @@ -42,18 +39,16 @@ class Model(db.Model): assert 'test_val2' in data -def test_json(): - app, db, admin = setup_postgres() - +def test_json(app, postgres_db, postgres_admin): with app.app_context(): - class JSONModel(db.Model): - id = db.Column(db.Integer, primary_key=True, autoincrement=True) - json_test = db.Column(JSON) + class JSONModel(postgres_db.Model): + id = postgres_db.Column(postgres_db.Integer, primary_key=True, autoincrement=True) + json_test = postgres_db.Column(JSON) - db.create_all() + postgres_db.create_all() - view = CustomModelView(JSONModel, db.session) - admin.add_view(view) + view = CustomModelView(JSONModel, postgres_db.session) + postgres_admin.add_view(view) client = app.test_client() @@ -79,18 +74,17 @@ class JSONModel(db.Model): '{"test_key1": "test_value1"}<' in data) -def test_citext(): - app, db, admin = setup_postgres() +def test_citext(app, postgres_db, postgres_admin): with app.app_context(): - class CITextModel(db.Model): - id = db.Column(db.Integer, primary_key=True, autoincrement=True) - citext_test = db.Column(CIText) + class CITextModel(postgres_db.Model): + id = postgres_db.Column(postgres_db.Integer, primary_key=True, autoincrement=True) + citext_test = postgres_db.Column(CIText) - db.engine.execute('CREATE EXTENSION IF NOT EXISTS citext') - db.create_all() + postgres_db.engine.execute('CREATE EXTENSION IF NOT EXISTS citext') + postgres_db.create_all() - view = CustomModelView(CITextModel, db.session) - admin.add_view(view) + view = CustomModelView(CITextModel, postgres_db.session) + postgres_admin.add_view(view) client = app.test_client() diff --git a/flask_admin/tests/sqla/test_translation.py b/flask_admin/tests/sqla/test_translation.py index ed1bc54ab..99150f1c4 100644 --- a/flask_admin/tests/sqla/test_translation.py +++ b/flask_admin/tests/sqla/test_translation.py @@ -1,19 +1,20 @@ from flask_admin.babel import lazy_gettext -from flask_babel import Babel -from . import setup from .test_basic import CustomModelView, create_models -def test_column_label_translation(): - app, db, admin = setup() +def test_column_label_translation(request, app): + # We need to configure the default Babel locale _before_ the `babel` fixture is + # initialised, so we have to use `request.getfixturevalue` to pull the fixture + # within the test function rather than the test signature. The `admin` fixture + # pulls in the `babel` fixture, which will then use the configuration here. + app.config['BABEL_DEFAULT_LOCALE'] = 'es' + db = request.getfixturevalue('db') + admin = request.getfixturevalue('admin') with app.app_context(): Model1, _ = create_models(db) - app.config['BABEL_DEFAULT_LOCALE'] = 'es' - Babel(app) - label = lazy_gettext('Name') view = CustomModelView(Model1, db.session, diff --git a/flask_admin/tests/test_base.py b/flask_admin/tests/test_base.py index 5ca3efb70..9c1616f25 100644 --- a/flask_admin/tests/test_base.py +++ b/flask_admin/tests/test_base.py @@ -8,6 +8,18 @@ from flask_admin import base +@pytest.fixture +def app(): + # Overrides the `app` fixture in `flask_admin/tests/conftest.py` so that the `sqla` + # directory/import path is configured as the root path for Flask. This will + # cause the `templates` directory here to be used for template resolution. + app = Flask(__name__) + app.config['SECRET_KEY'] = '1' + app.config['WTF_CSRF_ENABLED'] = False + + yield app + + class MockView(base.BaseView): # Various properties allow_call = True @@ -117,10 +129,9 @@ def test_custom_index_view(): assert admin._views[0] == view -def test_custom_index_view_in_init_app(): +def test_custom_index_view_in_init_app(app, babel): view = base.AdminIndexView(name='a', category='b', endpoint='c', url='/d', template='e') - app = Flask(__name__) admin = base.Admin() admin.init_app(app, index_view=view) @@ -136,16 +147,12 @@ def test_custom_index_view_in_init_app(): assert admin._views[0] == view -def test_base_registration(): - app = Flask(__name__) - admin = base.Admin(app) - +def test_base_registration(app, admin): assert admin.app == app assert admin.index_view.blueprint is not None -def test_admin_customizations(): - app = Flask(__name__) +def test_admin_customizations(app, babel): admin = base.Admin(app, name='Test', url='/foobar', static_url_path='/static/my/admin') assert admin.name == 'Test' assert admin.url == '/foobar' @@ -208,31 +215,21 @@ def test_baseview_registration(): @pytest.mark.filterwarnings("ignore:unclosed file:ResourceWarning") -def test_baseview_urls(): - app = Flask(__name__) - admin = base.Admin(app) - +def test_baseview_urls(admin): view = MockView() admin.add_view(view) assert len(view._urls) == 2 -# @pytest.mark.filterwarnings("ignore:unclosed file:ResourceWarning") -def test_add_views(): - app = Flask(__name__) - admin = base.Admin(app) - +def test_add_views(admin): admin.add_views(MockView(endpoint='test1'), MockView(endpoint='test2')) assert len(admin.menu()) == 3 -def test_add_category(): - app = Flask(__name__) - admin = base.Admin(app) - +def test_add_category(admin): admin.add_category('Category1', 'class-name', 'icon-type', 'icon-value') admin.add_view(MockView(name='Test 1', endpoint='test1', category='Category1')) admin.add_view(MockView(name='Test 2', endpoint='test2', category='Category2')) @@ -257,15 +254,11 @@ def test_add_category(): @pytest.mark.xfail(raises=Exception) -def test_no_default(): - app = Flask(__name__) - admin = base.Admin(app) +def test_no_default(admin): admin.add_view(base.BaseView()) -def test_call(): - app = Flask(__name__) - admin = base.Admin(app) +def test_call(app, admin): view = MockView() admin.add_view(view) client = app.test_client() @@ -285,9 +278,7 @@ def test_call(): assert rv.data == b'Failure!' -def test_permissions(): - app = Flask(__name__) - admin = base.Admin(app) +def test_permissions(app, admin): view = MockView() admin.add_view(view) client = app.test_client() @@ -298,9 +289,7 @@ def test_permissions(): assert rv.status_code == 403 -def test_inaccessible_callback(): - app = Flask(__name__) - admin = base.Admin(app) +def test_inaccessible_callback(app, admin): view = MockView() admin.add_view(view) client = app.test_client() @@ -312,10 +301,7 @@ def test_inaccessible_callback(): assert rv.status_code == 418 -def get_visibility(): - app = Flask(__name__) - admin = base.Admin(app) - +def get_visibility(app, admin): view = MockView(name='TestMenuItem') view.visible = False @@ -327,9 +313,7 @@ def get_visibility(): assert 'TestMenuItem' not in rv.data.decode('utf-8') -def test_submenu(): - app = Flask(__name__) - admin = base.Admin(app) +def test_submenu(admin): admin.add_view(MockView(name='Test 1', category='Test', endpoint='test1')) # Second view is not normally accessible @@ -354,11 +338,8 @@ def test_submenu(): assert children[0].is_accessible() -def test_delayed_init(): - app = Flask(__name__) - admin = base.Admin() +def test_delayed_init(app, admin): admin.add_view(MockView()) - admin.init_app(app) client = app.test_client() @@ -366,10 +347,7 @@ def test_delayed_init(): assert rv.data == b'Success!' -def test_multi_instances_init(): - app = Flask(__name__) - _ = base.Admin(app) - +def test_multi_instances_init(app, admin): class ManageIndex(base.AdminIndexView): pass @@ -377,16 +355,11 @@ class ManageIndex(base.AdminIndexView): @pytest.mark.xfail(raises=Exception) -def test_double_init(): - app = Flask(__name__) - admin = base.Admin(app) +def test_double_init(app, admin): admin.init_app(app) -def test_nested_flask_views(): - app = Flask(__name__) - admin = base.Admin(app) - +def test_nested_flask_views(app, admin): view = MockMethodView() admin.add_view(view) @@ -417,8 +390,7 @@ def test_nested_flask_views(): assert rv.data == b'GET - API3' -def test_root_mount(): - app = Flask(__name__) +def test_root_mount(app, babel): admin = base.Admin(app, url='/') admin.add_view(MockView()) @@ -433,9 +405,7 @@ def test_root_mount(): assert rv.status_code == 200 -def test_menu_links(): - app = Flask(__name__) - admin = base.Admin(app) +def test_menu_links(app, admin): admin.add_link(base.MenuLink('TestMenuLink1', endpoint='.index')) admin.add_link(base.MenuLink('TestMenuLink2', url='http://python.org/')) @@ -447,9 +417,7 @@ def test_menu_links(): assert 'TestMenuLink2' in data -def test_add_links(): - app = Flask(__name__) - admin = base.Admin(app) +def test_add_links(app, admin): admin.add_links(base.MenuLink('TestMenuLink1', endpoint='.index'), base.MenuLink('TestMenuLink2', url='http://python.org/')) diff --git a/flask_admin/tests/test_form_upload.py b/flask_admin/tests/test_form_upload.py index 2faeb03d5..73c4ee858 100644 --- a/flask_admin/tests/test_form_upload.py +++ b/flask_admin/tests/test_form_upload.py @@ -4,6 +4,7 @@ from io import BytesIO from flask import Flask, url_for + from flask_admin import form, helpers @@ -26,9 +27,7 @@ def safe_delete(path, name): pass -def test_upload_field(): - app = Flask(__name__) - +def test_upload_field(app, babel): path = _create_temp() def _remove_testfiles(): diff --git a/flask_admin/tests/test_model.py b/flask_admin/tests/test_model.py index d4fd8b1bb..0197573db 100644 --- a/flask_admin/tests/test_model.py +++ b/flask_admin/tests/test_model.py @@ -109,18 +109,7 @@ def delete_model(self, model): return True -def setup(): - app = Flask(__name__) - app.config['CSRF_ENABLED'] = False - app.secret_key = '1' - admin = Admin(app) - - return app, admin - - -def test_mockview(): - app, admin = setup() - +def test_mockview(app, admin): view = MockModelView(Model) admin.add_view(view) @@ -205,9 +194,7 @@ def test_mockview(): assert model.col1 == 'another test!' -def test_permissions(): - app, admin = setup() - +def test_permissions(app, admin): view = MockModelView(Model) admin.add_view(view) @@ -226,9 +213,7 @@ def test_permissions(): assert rv.status_code == 302 -def test_templates(): - app, admin = setup() - +def test_templates(app, admin): view = MockModelView(Model) admin.add_view(view) @@ -248,9 +233,7 @@ def test_templates(): assert rv.data == b'Success!' -def test_list_columns(): - app, admin = setup() - +def test_list_columns(app, admin): view = MockModelView(Model, column_list=['col1', 'col3'], column_labels=dict(col1='Column1')) @@ -267,9 +250,7 @@ def test_list_columns(): assert 'Col2' not in data -def test_exclude_columns(): - app, admin = setup() - +def test_exclude_columns(app, admin): view = MockModelView(Model, column_exclude_list=['col2']) admin.add_view(view) @@ -283,18 +264,14 @@ def test_exclude_columns(): assert 'Col2' not in data -def test_sortable_columns(): - app, admin = setup() - +def test_sortable_columns(app, admin): view = MockModelView(Model, column_sortable_list=['col1', ('col2', 'test1')]) admin.add_view(view) assert view._sortable_columns == dict(col1='col1', col2='test1') -def test_column_searchable_list(): - app, admin = setup() - +def test_column_searchable_list(app, admin): view = MockModelView(Model, column_searchable_list=['col1', 'col2']) admin.add_view(view) @@ -303,9 +280,7 @@ def test_column_searchable_list(): # TODO: Make calls with search -def test_column_filters(): - app, admin = setup() - +def test_column_filters(app, admin): view = MockModelView(Model, column_filters=['col1', 'col2']) admin.add_view(view) @@ -319,9 +294,7 @@ def test_column_filters(): # TODO: Make calls with filters -def test_filter_list_callable(): - app, admin = setup() - +def test_filter_list_callable(app, admin): flt = SimpleFilter('test', options=lambda: [('1', 'Test 1'), ('2', 'Test 2')]) view = MockModelView(Model, column_filters=[flt]) @@ -340,7 +313,7 @@ def test_form(): pass -def test_csrf(): +def test_csrf(app, admin): class SecureModelView(MockModelView): form_base_class = form.SecureForm @@ -352,8 +325,6 @@ def get_csrf_token(data): token = data.split('"')[0] return token - app, admin = setup() - view = SecureModelView(Model, endpoint='secure') admin.add_view(view) @@ -437,9 +408,7 @@ def get_csrf_token(data): assert u'Failed to perform action.' in rv.data.decode('utf-8') -def test_custom_form(): - app, admin = setup() - +def test_custom_form(app, admin): class TestForm(form.BaseForm): pass @@ -452,25 +421,19 @@ class TestForm(form.BaseForm): assert not hasattr(view._create_form_class, 'col1') -def test_modal_edit(): - # bootstrap 2 - test edit_modal - app_bs2 = Flask(__name__) - admin_bs2 = Admin(app_bs2, template_mode="bootstrap2") +def test_modal_edit_bs2(app, babel): + admin_bs2 = Admin(app, template_mode="bootstrap2") - edit_modal_on = MockModelView(Model, edit_modal=True, - endpoint="edit_modal_on") - edit_modal_off = MockModelView(Model, edit_modal=False, - endpoint="edit_modal_off") - create_modal_on = MockModelView(Model, create_modal=True, - endpoint="create_modal_on") - create_modal_off = MockModelView(Model, create_modal=False, - endpoint="create_modal_off") + edit_modal_on = MockModelView(Model, edit_modal=True, endpoint="edit_modal_on") + edit_modal_off = MockModelView(Model, edit_modal=False, endpoint="edit_modal_off") + create_modal_on = MockModelView(Model, create_modal=True, endpoint="create_modal_on") + create_modal_off = MockModelView(Model, create_modal=False, endpoint="create_modal_off") admin_bs2.add_view(edit_modal_on) admin_bs2.add_view(edit_modal_off) admin_bs2.add_view(create_modal_on) admin_bs2.add_view(create_modal_off) - client_bs2 = app_bs2.test_client() + client_bs2 = app.test_client() # bootstrap 2 - ensure modal window is added when edit_modal is enabled rv = client_bs2.get('/admin/edit_modal_on/') @@ -496,16 +459,20 @@ def test_modal_edit(): data = rv.data.decode('utf-8') assert 'fa_modal_window' not in data - # bootstrap 3 - app_bs3 = Flask(__name__) - admin_bs3 = Admin(app_bs3, template_mode="bootstrap3") +def test_modal_edit_bs3(app, babel): + admin_bs3 = Admin(app, template_mode="bootstrap3") + + edit_modal_on = MockModelView(Model, edit_modal=True, endpoint="edit_modal_on") + edit_modal_off = MockModelView(Model, edit_modal=False, endpoint="edit_modal_off") + create_modal_on = MockModelView(Model, create_modal=True, endpoint="create_modal_on") + create_modal_off = MockModelView(Model, create_modal=False, endpoint="create_modal_off") admin_bs3.add_view(edit_modal_on) admin_bs3.add_view(edit_modal_off) admin_bs3.add_view(create_modal_on) admin_bs3.add_view(create_modal_off) - client_bs3 = app_bs3.test_client() + client_bs3 = app.test_client() # bootstrap 3 - ensure modal window is added when edit_modal is enabled rv = client_bs3.get('/admin/edit_modal_on/') @@ -540,8 +507,7 @@ class DummyView(MockModelView): assert view.name == 'Dummy View' -def test_export_csv(): - app, admin = setup() +def test_export_csv(app, admin): client = app.test_client() # test redirect when csv export is disabled @@ -740,8 +706,7 @@ def export_formatter(v, c, m, p): assert rv.status_code == 500 -def test_list_row_actions(): - app, admin = setup() +def test_list_row_actions(app, admin): client = app.test_client() from flask_admin.model import template From 801e632835409a619ca9dae08cecf0abecd7e8eb Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Wed, 17 Jul 2024 21:52:37 +0100 Subject: [PATCH 028/156] Fix github org for flask-babel --- examples/babel/README.rst | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/examples/babel/README.rst b/examples/babel/README.rst index 6fb933cd1..5d4c9c791 100644 --- a/examples/babel/README.rst +++ b/examples/babel/README.rst @@ -1,4 +1,4 @@ -This example show how to translate Flask-Admin into different language using customized version of the `Flask-Babel <https://github.com/mrjoes/flask-babel>` +This example show how to translate Flask-Admin into different language using customized version of the `Flask-Babel <https://github.com/python-babel/flask-babel>` To run this example: @@ -19,5 +19,3 @@ To run this example: 4. Run the application:: python examples/babel/app.py - - From 3153466021956bd392bfe4842d6e86ba205d0ed9 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Wed, 17 Jul 2024 21:57:13 +0100 Subject: [PATCH 029/156] Add a test run without Flask-Babel installed Adds a `flask_babel` mark to any tests that explicitly require `Flask-Babel` to be installed. Configures tox and GitHub Actions to run a test suite with Flask-Babel removed. This validates a codepath through `flask_admin.babel`, which should essentially be passthrough/noop behaviour if Flask-Babel is unavailable. --- .github/workflows/tests.yaml | 11 +++++++++-- flask_admin/tests/__init__.py | 20 ++++++++++++++++++++ flask_admin/tests/sqla/test_basic.py | 4 ++++ flask_admin/tests/sqla/test_translation.py | 2 ++ pyproject.toml | 3 +++ tox.ini | 6 ++++++ 6 files changed, 44 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 19087e593..d468c965f 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -15,13 +15,20 @@ on: - '*.rst' jobs: tests: - name: ${{ format('py{0}-wtforms{1}', matrix.python, matrix.wtforms) }} + name: ${{ matrix.tox == 'normal' && format('py{0}-flask{1}-wtforms{2}', matrix.python, matrix.flask, matrix.wtforms) || matrix.tox }} runs-on: ${{ matrix.os || 'ubuntu-latest' }} strategy: fail-fast: false matrix: python: ['3.8', '3.9', '3.10', '3.11', '3.12'] + flask: ['2'] wtforms: ['2'] + tox: ['normal'] + include: + - python: '3.12' + flask: '2' + wtforms: '2' + tox: 'py312-flask2-wtforms2-no-flask-babel' services: # Label used to access the service container postgres: @@ -68,7 +75,7 @@ jobs: PGPASSWORD: postgres run: psql -U postgres -h localhost -c 'CREATE EXTENSION hstore;' flask_admin_test - run: pip install tox - - run: tox run -e ${{ matrix.tox || format('py{0}-wtforms{1}', matrix.python, matrix.wtforms) }} + - run: tox run -e ${{ matrix.tox == 'normal' && format('py{0}-flask{1}-wtforms{2}', matrix.python, matrix.flask, matrix.wtforms) || matrix.tox }} not_tests: name: ${{ matrix.tox }} runs-on: ubuntu-latest diff --git a/flask_admin/tests/__init__.py b/flask_admin/tests/__init__.py index e69de29bb..4dbd5a41f 100644 --- a/flask_admin/tests/__init__.py +++ b/flask_admin/tests/__init__.py @@ -0,0 +1,20 @@ +import pytest + + +def flask_babel_test_decorator(fn): + """Decorator to annotate any tests that *require* Flask-Babel to be available, + ie they check translations directly, with the `flask_babel` mark. + + If Flask-Babel is not installed, we add the `xfail` mark to the test so that pytest + will expect, and therefore ignore, its failure. + """ + fn = pytest.mark.flask_babel(fn) + + try: + import flask_babel + except ImportError: + return pytest.mark.xfail( + reason="flask-babel is not installed; translations unavailable" + )(fn) + + return fn diff --git a/flask_admin/tests/sqla/test_basic.py b/flask_admin/tests/sqla/test_basic.py index 5a053cc18..8fe1785f2 100644 --- a/flask_admin/tests/sqla/test_basic.py +++ b/flask_admin/tests/sqla/test_basic.py @@ -17,6 +17,8 @@ import enum import arrow +from flask_admin.tests import flask_babel_test_decorator + class CustomModelView(ModelView): def __init__(self, model, session, @@ -2181,6 +2183,7 @@ def test_extra_field_order(app, db, admin): ('zh_TW', '首頁'), ) ) +@flask_babel_test_decorator def test_modelview_localization(request, app, locale, expect_text): # We need to configure the default Babel locale _before_ the `babel` fixture is # initialised, so we have to use `request.getfixturevalue` to pull the fixture @@ -2210,6 +2213,7 @@ def test_modelview_localization(request, app, locale, expect_text): assert rv.status_code == 200 +@flask_babel_test_decorator def test_modelview_named_filter_localization(request, app): # We need to configure the default Babel locale _before_ the `babel` fixture is # initialised, so we have to use `request.getfixturevalue` to pull the fixture diff --git a/flask_admin/tests/sqla/test_translation.py b/flask_admin/tests/sqla/test_translation.py index 99150f1c4..80dadec4b 100644 --- a/flask_admin/tests/sqla/test_translation.py +++ b/flask_admin/tests/sqla/test_translation.py @@ -1,8 +1,10 @@ from flask_admin.babel import lazy_gettext from .test_basic import CustomModelView, create_models +from .. import flask_babel_test_decorator +@flask_babel_test_decorator def test_column_label_translation(request, app): # We need to configure the default Babel locale _before_ the `babel` fixture is # initialised, so we have to use `request.getfixturevalue` to pull the fixture diff --git a/pyproject.toml b/pyproject.toml index 44b0bbcc1..ac2e3bd8d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,6 +41,9 @@ name = "flask_admin" [tool.pytest.ini_options] testpaths = ["tests"] +markers = [ + "flask_babel: requires Flask-Babel to be installed" +] filterwarnings = [ "error", # TODO: remove the ignored deprecation warning when support for WTForms 3 has been added. diff --git a/tox.ini b/tox.ini index 377218a31..8ea0728d5 100644 --- a/tox.ini +++ b/tox.ini @@ -1,6 +1,7 @@ [tox] envlist = py3{8,9,10,11,12}-flask{2}-wtforms{2} + py312-flask2-wtforms2-no-flask-babel # only tested against latest of all configurations, sans flask-babel # style typing docs @@ -23,6 +24,11 @@ deps = wtforms2: WTForms>=2.0,<3 commands = pytest -v --tb=short --basetemp={envtmpdir} flask_admin/tests {posargs} +[testenv:py312-flask2-wtforms2-no-flask-babel] +commands = + pip uninstall -y flask-babel + pytest -v --tb=short --basetemp={envtmpdir} flask_admin/tests {posargs} + [testenv:style] deps = pre-commit skip_install = true From a10e5086ff3764ff37ba555d18ece49574bb9ad2 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Fri, 19 Jul 2024 12:08:03 +0100 Subject: [PATCH 030/156] Add host support to admin blueprints If Flask is running in `host_matching` mode, all routes need to be configured with a `host` that restricts resolution to only specific domains. --- admin/__init__.py | 0 doc/advanced.rst | 49 +++++ examples/host-matching/README.rst | 21 ++ examples/host-matching/app.py | 55 +++++ examples/host-matching/requirements.txt | 2 + examples/host-matching/templates/first.html | 4 + examples/host-matching/templates/second.html | 4 + examples/host-matching/templates/third.html | 4 + flask_admin/base.py | 50 ++++- flask_admin/blueprints.py | 59 ++++++ flask_admin/consts.py | 4 + flask_admin/tests/test_base.py | 2 +- flask_admin/tests/test_host_matching.py | 209 +++++++++++++++++++ 13 files changed, 458 insertions(+), 5 deletions(-) create mode 100644 admin/__init__.py create mode 100644 examples/host-matching/README.rst create mode 100644 examples/host-matching/app.py create mode 100644 examples/host-matching/requirements.txt create mode 100644 examples/host-matching/templates/first.html create mode 100644 examples/host-matching/templates/second.html create mode 100644 examples/host-matching/templates/third.html create mode 100644 flask_admin/blueprints.py create mode 100644 flask_admin/tests/test_host_matching.py diff --git a/admin/__init__.py b/admin/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/doc/advanced.rst b/doc/advanced.rst index c01eeb555..c01d26d6d 100644 --- a/doc/advanced.rst +++ b/doc/advanced.rst @@ -68,6 +68,55 @@ header to make the selection automatically. If the built-in translations are not enough, look at the `Flask-Babel documentation <https://pythonhosted.org/Flask-Babel/>`_ to see how you can add your own. +Using with Flask in `host_matching` mode +---------------------------------------- + +**** + +If Flask is configured with `host_matching` enabled, then all routes registered on the app need to know which host(s) they should be served for. + +This requires some additional explicit configuration for Flask-Admin by passing the `host` argument to `Admin()` calls. + +#. With your Flask app initialised:: + + from flask import Flask + app = Flask(__name__, host='my.domain.com', static_host='static.domain.com') + + +Serving Flask-Admin on a single, explicit host +********************************************** +Construct your Admin instance(s) and pass the desired `host` for the admin instance:: + + class AdminView(admin.BaseView): + @admin.expose('/') + def index(self): + return self.render('template.html') + + admin1 = admin.Admin(app, url='/admin', host='admin.domain.com') + admin1.add_view(AdminView()) + +Flask's `url_for` calls will work without any additional configuration/information:: + + url_for('admin.index', _external=True) == 'http://admin.domain.com/admin') + + +Serving Flask-Admin on all hosts +******************************** +Pass a wildcard to the `host` parameter to serve the admin instance on all hosts:: + + class AdminView(admin.BaseView): + @admin.expose('/') + def index(self): + return self.render('template.html') + + admin1 = admin.Admin(app, url='/admin', host='*') + admin1.add_view(AdminView()) + +If you need to generate URLs for a wildcard admin instance, you will need to pass `admin_routes_host` to the `url_for` call:: + + url_for('admin.index', admin_routes_host='admin.domain.com', _external=True) == 'http://admin.domain.com/admin') + url_for('admin.index', admin_routes_host='admin2.domain.com', _external=True) == 'http://admin2.domain.com/admin') + .. _file-admin: Managing Files & Folders diff --git a/examples/host-matching/README.rst b/examples/host-matching/README.rst new file mode 100644 index 000000000..0dea7fbe6 --- /dev/null +++ b/examples/host-matching/README.rst @@ -0,0 +1,21 @@ +This example shows how to configure Flask-Admin when you're using Flask's `host_matching` mode. Any Flask-Admin instance can be exposed on just a specific host, or on every host. + +To run this example: + +1. Clone the repository:: + + git clone https://github.com/flask-admin/flask-admin.git + cd flask-admin + +2. Create and activate a virtual environment:: + + python3 -m venv .venv + source .venv/bin/activate + +3. Install requirements:: + + pip install -r 'examples/host-matching/requirements.txt' + +4. Run the application:: + + python examples/host-matching/app.py diff --git a/examples/host-matching/app.py b/examples/host-matching/app.py new file mode 100644 index 000000000..1214c1108 --- /dev/null +++ b/examples/host-matching/app.py @@ -0,0 +1,55 @@ +from flask import Flask, url_for + +import flask_admin as admin + + +# Views +class FirstView(admin.BaseView): + @admin.expose('/') + def index(self): + return self.render('first.html') + + +class SecondView(admin.BaseView): + @admin.expose('/') + def index(self): + return self.render('second.html') + + +class ThirdViewAllHosts(admin.BaseView): + @admin.expose('/') + def index(self): + return self.render('third.html') + + +# Create flask app +app = Flask(__name__, template_folder='templates', host_matching=True, static_host='static.localhost:5000') + + +# Flask views +@app.route('/', host='<anyhost>') +def index(anyhost): + return ( + f'<a href="{url_for("admin.index")}">Click me to get to Admin 1</a>' + f'<br/>' + f'<a href="{url_for("admin2.index")}">Click me to get to Admin 2</a>' + f'<br/>' + f'<a href="{url_for("admin3.index", admin_routes_host="anything.localhost:5000")}">Click me to get to Admin 3 under `anything.localhost:5000`</a>' + ) + + +if __name__ == '__main__': + # Create first administrative interface at `first.localhost:5000/admin1` + admin1 = admin.Admin(app, url='/admin1', host='first.localhost:5000') + admin1.add_view(FirstView()) + + # Create second administrative interface at `second.localhost:5000/admin2` + admin2 = admin.Admin(app, url='/admin2', endpoint='admin2', host='second.localhost:5000') + admin2.add_view(SecondView()) + + # Create third administrative interface, available on any domain at `/admin3` + admin3 = admin.Admin(app, url='/admin3', endpoint='admin3', host='*') + admin3.add_view(ThirdViewAllHosts()) + + # Start app + app.run(debug=True) diff --git a/examples/host-matching/requirements.txt b/examples/host-matching/requirements.txt new file mode 100644 index 000000000..a821c9bd4 --- /dev/null +++ b/examples/host-matching/requirements.txt @@ -0,0 +1,2 @@ +Flask +Flask-Admin diff --git a/examples/host-matching/templates/first.html b/examples/host-matching/templates/first.html new file mode 100644 index 000000000..b3cf9a03b --- /dev/null +++ b/examples/host-matching/templates/first.html @@ -0,0 +1,4 @@ +{% extends 'admin/master.html' %} +{% block body %} + First admin view. +{% endblock %} diff --git a/examples/host-matching/templates/second.html b/examples/host-matching/templates/second.html new file mode 100644 index 000000000..64ba3182b --- /dev/null +++ b/examples/host-matching/templates/second.html @@ -0,0 +1,4 @@ +{% extends 'admin/master.html' %} +{% block body %} + Second admin view. +{% endblock %} diff --git a/examples/host-matching/templates/third.html b/examples/host-matching/templates/third.html new file mode 100644 index 000000000..bba73a975 --- /dev/null +++ b/examples/host-matching/templates/third.html @@ -0,0 +1,4 @@ +{% extends 'admin/master.html' %} +{% block body %} + Third admin view. +{% endblock %} diff --git a/flask_admin/base.py b/flask_admin/base.py index 1c913da8d..2338be5c7 100644 --- a/flask_admin/base.py +++ b/flask_admin/base.py @@ -1,14 +1,17 @@ import os.path as op +import typing as t import warnings from functools import wraps -from flask import Blueprint, current_app, render_template, abort, g, url_for +from flask import current_app, render_template, abort, g, url_for, request from flask_admin import babel from flask_admin._compat import as_unicode from flask_admin import helpers as h # For compatibility reasons import MenuLink +from flask_admin.blueprints import _BlueprintWithHostSupport as Blueprint +from flask_admin.consts import ADMIN_ROUTES_HOST_VARIABLE from flask_admin.menu import MenuCategory, MenuView, MenuLink, SubMenuCategory # noqa: F401 @@ -268,6 +271,10 @@ def create_blueprint(self, admin): template_folder=op.join('templates', self.admin.template_mode), static_folder=self.static_folder, static_url_path=self.static_url_path) + self.blueprint.attach_url_defaults_and_value_preprocessor( + app=self.admin.app, + host=self.admin.host + ) for url, name, methods in self._urls: self.blueprint.add_url_rule(url, @@ -467,7 +474,8 @@ def __init__(self, app=None, name=None, static_url_path=None, base_template=None, template_mode=None, - category_icon_classes=None): + category_icon_classes=None, + host=None): """ Constructor. @@ -498,6 +506,8 @@ def __init__(self, app=None, name=None, :param category_icon_classes: A dict of category names as keys and html classes as values to be added to menu category icons. Example: {'Favorites': 'glyphicon glyphicon-star'} + :param host: + The host to register all admin views on. Mutually exclusive with `subdomain` """ self.app = app @@ -517,10 +527,13 @@ def __init__(self, app=None, name=None, self.url = url or self.index_view.url self.static_url_path = static_url_path self.subdomain = subdomain + self.host = host self.base_template = base_template or 'admin/base.html' self.template_mode = template_mode or 'bootstrap2' self.category_icon_classes = category_icon_classes or dict() + self._validate_admin_host_and_subdomain() + # Add index view self._set_admin_index_view(index_view=index_view, endpoint=endpoint, url=url) @@ -528,6 +541,28 @@ def __init__(self, app=None, name=None, if app is not None: self._init_extension() + def _validate_admin_host_and_subdomain(self): + if self.subdomain is not None and self.host is not None: + raise ValueError("`subdomain` and `host` are mutually-exclusive") + + if self.host is None: + return + + if self.app and not self.app.url_map.host_matching: + raise ValueError( + "`host` should only be set if your Flask app is using `host_matching`." + ) + + if self.host.strip() in {"*", ADMIN_ROUTES_HOST_VARIABLE}: + self.host = ADMIN_ROUTES_HOST_VARIABLE + + elif "<" in self.host and ">" in self.host: + raise ValueError( + "`host` must either be a host name with no variables, to serve all " + "Flask-Admin routes from a single host, or `*` to match the current " + "request's host." + ) + def add_view(self, view): """ Add a view to the collection. @@ -540,7 +575,10 @@ def add_view(self, view): # If app was provided in constructor, register view with Flask app if self.app is not None: - self.app.register_blueprint(view.create_blueprint(self)) + self.app.register_blueprint( + view.create_blueprint(self), + host=self.host, + ) self._add_view_to_menu(view) @@ -708,6 +746,7 @@ def init_app(self, app, index_view=None, Flask application instance """ self.app = app + self._validate_admin_host_and_subdomain() self._init_extension() @@ -721,7 +760,10 @@ def init_app(self, app, index_view=None, # Register views for view in self._views: - app.register_blueprint(view.create_blueprint(self)) + app.register_blueprint( + view.create_blueprint(self), + host=self.host + ) def _init_extension(self): if not hasattr(self.app, 'extensions'): diff --git a/flask_admin/blueprints.py b/flask_admin/blueprints.py new file mode 100644 index 000000000..dc4d2c2c3 --- /dev/null +++ b/flask_admin/blueprints.py @@ -0,0 +1,59 @@ +import typing as t + +from flask import request, Flask +from flask.blueprints import Blueprint as FlaskBlueprint +from flask.blueprints import BlueprintSetupState as FlaskBlueprintSetupState + +from flask_admin.consts import ADMIN_ROUTES_HOST_VARIABLE_NAME, \ + ADMIN_ROUTES_HOST_VARIABLE + + +class _BlueprintSetupStateWithHostSupport(FlaskBlueprintSetupState): + """Adds the ability to set a hostname on all routes when registering the blueprint.""" + + def __init__(self, blueprint, app, options, first_registration): + super().__init__(blueprint, app, options, first_registration) + self.host = self.options.get("host") + + def add_url_rule(self, rule, endpoint=None, view_func=None, **options): + # Ensure that every route registered by this blueprint has the host parameter + options.setdefault("host", self.host) + super().add_url_rule(rule, endpoint, view_func, **options) + + +class _BlueprintWithHostSupport(FlaskBlueprint): + def make_setup_state(self, app, options, first_registration=False): + return _BlueprintSetupStateWithHostSupport( + self, app, options, first_registration + ) + + def attach_url_defaults_and_value_preprocessor(self, app: Flask, host: str): + if host != ADMIN_ROUTES_HOST_VARIABLE: + return + + # Automatically inject `admin_routes_host` into `url_for` calls on admin + # endpoints. + @self.url_defaults + def inject_admin_routes_host_if_required( + endpoint: str, values: t.Dict[str, t.Any] + ) -> None: + if app.url_map.is_endpoint_expecting( + endpoint, ADMIN_ROUTES_HOST_VARIABLE_NAME + ): + values.setdefault(ADMIN_ROUTES_HOST_VARIABLE_NAME, request.host) + + # Automatically strip `admin_routes_host` from the endpoint values so + # that the view methods don't receive that parameter, as it's not actually + # required by any of them. + @self.url_value_preprocessor + def strip_admin_routes_host_from_static_endpoint( + endpoint: t.Optional[str], values: t.Optional[t.Dict[str, t.Any]] + ) -> None: + if ( + endpoint + and values + and app.url_map.is_endpoint_expecting( + endpoint, ADMIN_ROUTES_HOST_VARIABLE_NAME + ) + ): + values.pop(ADMIN_ROUTES_HOST_VARIABLE_NAME, None) diff --git a/flask_admin/consts.py b/flask_admin/consts.py index be1b4667e..95e7df903 100644 --- a/flask_admin/consts.py +++ b/flask_admin/consts.py @@ -6,3 +6,7 @@ ICON_TYPE_IMAGE = 'image' # external image ICON_TYPE_IMAGE_URL = 'image-url' + + +ADMIN_ROUTES_HOST_VARIABLE = "<admin_routes_host>" +ADMIN_ROUTES_HOST_VARIABLE_NAME = "admin_routes_host" diff --git a/flask_admin/tests/test_base.py b/flask_admin/tests/test_base.py index 9c1616f25..2d1013ed6 100644 --- a/flask_admin/tests/test_base.py +++ b/flask_admin/tests/test_base.py @@ -10,7 +10,7 @@ @pytest.fixture def app(): - # Overrides the `app` fixture in `flask_admin/tests/conftest.py` so that the `sqla` + # Overrides the `app` fixture in `flask_admin/tests/conftest.py` so that the `tests` # directory/import path is configured as the root path for Flask. This will # cause the `templates` directory here to be used for template resolution. app = Flask(__name__) diff --git a/flask_admin/tests/test_host_matching.py b/flask_admin/tests/test_host_matching.py new file mode 100644 index 000000000..f60617ce8 --- /dev/null +++ b/flask_admin/tests/test_host_matching.py @@ -0,0 +1,209 @@ +import pytest +from flask import Flask, url_for + +from flask_admin import base + + +@pytest.fixture +def app(): + app = Flask(__name__, host_matching=True, static_host='static.test.localhost') + app.config['SECRET_KEY'] = '1' + app.config['WTF_CSRF_ENABLED'] = False + + yield app + + +def init_admin(app, using_init_app: bool, admin_kwargs): + if using_init_app: + admin = base.Admin(**admin_kwargs) + admin.init_app(app) + else: + admin = base.Admin(app, **admin_kwargs) + + return admin + + +class MockView(base.BaseView): + # Various properties + allow_call = True + allow_access = True + visible = True + + @base.expose('/') + def index(self): + return 'Success!' + + @base.expose('/test/') + def test(self): + return self.render('mock.html') + + @base.expose('/base/') + def base(self): + return self.render('admin/base.html') + + def _handle_view(self, name, **kwargs): + if self.allow_call: + return super(MockView, self)._handle_view(name, **kwargs) + else: + return 'Failure!' + + def is_accessible(self): + if self.allow_access: + return super(MockView, self).is_accessible() + + return False + + def is_visible(self): + if self.visible: + return super(MockView, self).is_visible() + + return False + + +@pytest.mark.parametrize("initialise_using_init_app", [True, False]) +def test_mounting_on_host_with_variable_is_unsupported(app, babel, initialise_using_init_app): + with pytest.raises(ValueError) as e: + init_admin( + app, + using_init_app=initialise_using_init_app, + admin_kwargs=dict(url='/', host="<blah>"), + ) + + assert str(e.value) == ( + "`host` must either be a host name with no variables, to serve all Flask-Admin " + "routes from a single host, or `*` to match the current request's host." + ) + + +@pytest.mark.parametrize("initialise_using_init_app", [True, False]) +def test_mounting_on_host_with_flask_mismatch(initialise_using_init_app): + app = Flask(__name__, host_matching=False) + + with pytest.raises(ValueError) as e: + init_admin( + app=app, + using_init_app=initialise_using_init_app, + admin_kwargs=dict(url='/', host="host"), + ) + + assert str(e.value) == ( + "`host` should only be set if your Flask app is using `host_matching`." + ) + + +@pytest.mark.parametrize("initialise_using_init_app", [True, False]) +def test_mounting_on_subdomain_and_host_is_rejected( + app, babel, initialise_using_init_app +): + with pytest.raises(ValueError) as e: + init_admin( + app, + using_init_app=initialise_using_init_app, + admin_kwargs=dict(url='/', subdomain='subdomain', host="host"), + ) + + assert str(e.value) == "`subdomain` and `host` are mutually-exclusive" + + +@pytest.mark.parametrize("initialise_using_init_app", [True, False]) +def test_mounting_on_host(app, babel, initialise_using_init_app): + admin = init_admin( + app, + using_init_app=initialise_using_init_app, + admin_kwargs=dict(url='/', host="admin.test.localhost"), + ) + admin.add_view(MockView()) + + client = app.test_client() + rv = client.get('/mockview/') + assert rv.status_code == 404 + + rv = client.get('/mockview/', headers={"Host": "admin.test.localhost"}) + assert rv.status_code == 200 + assert rv.data == b'Success!' + + client = app.test_client() + rv = client.get('/mockview/base/') + assert rv.status_code == 404 + + rv = client.get('/mockview/base/', headers={"Host": "admin.test.localhost"}) + assert rv.status_code == 200 + + # Check that static assets are embedded with the expected (relative) URLs + assert ( + b'<link href="/static/admin/bootstrap/bootstrap2/swatch' + b'/default/bootstrap.min.css?v=2.3.2" rel="stylesheet">' + in rv.data + ) + assert ( + b'<script src="/static/admin/vendor' + b'/jquery.min.js?v=3.5.1" type="text/javascript">' + in rv.data + ) + + # test static files when url='/' + with app.test_request_context('/', headers={"Host": "admin.test.localhost"}): + rv = client.get( + url_for( + 'admin.static', + filename='bootstrap/bootstrap2/css/bootstrap.min.css', + ) + ) + rv.close() + assert rv.status_code == 404 + + rv = client.get( + url_for( + 'admin.static', + filename='bootstrap/bootstrap2/css/bootstrap.min.css', + ), + headers={"Host": "admin.test.localhost"} + ) + rv.close() + assert rv.status_code == 200 + + +@pytest.mark.parametrize("initialise_using_init_app", [True, False]) +def test_mounting_on_wildcard_host(app, babel, initialise_using_init_app): + admin = init_admin( + app, + using_init_app=initialise_using_init_app, + admin_kwargs=dict(url='/', host="*"), + ) + admin.add_view(MockView()) + + client = app.test_client() + + for host_header in [ + {}, + {"Host": "admin.test.localhost"}, + {"Host": "absolutely.any.value"}, + ]: + rv = client.get('/mockview/base/', headers=host_header) + rv.close() + assert rv.status_code == 200 + + # Check that static assets are embedded with the expected (relative) URLs + assert ( + b'<link href="/static/admin/bootstrap/bootstrap2/swatch' + b'/default/bootstrap.min.css?v=2.3.2" ' + b'rel="stylesheet">' + in rv.data + ) + assert ( + b'<script src="/static/admin/vendor' + b'/jquery.min.js?v=3.5.1" type="text/javascript">' + in rv.data + ) + + # test static files when url='/' + with app.test_request_context('/'): + rv = client.get( + url_for( + 'admin.static', + filename='bootstrap/bootstrap2/css/bootstrap.min.css', + headers=host_header, + ), + ) + rv.close() + assert rv.status_code == 200 From fa23170e991e6cfa5686719925ca7e8d54ec45b8 Mon Sep 17 00:00:00 2001 From: David Gilman <davidgilman1@gmail.com> Date: Wed, 18 Jan 2023 18:02:42 -0500 Subject: [PATCH 031/156] Refactor _nullable_common logic in sqla --- flask_admin/contrib/sqla/form.py | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/flask_admin/contrib/sqla/form.py b/flask_admin/contrib/sqla/form.py index 6bc42f7e7..709f82b12 100644 --- a/flask_admin/contrib/sqla/form.py +++ b/flask_admin/contrib/sqla/form.py @@ -265,6 +265,13 @@ def convert(self, model, mapper, name, prop, field_args, hidden_pk): column=column, field_args=kwargs) return None + @classmethod + def _nullable_common(cls, column, field_args): + if column.nullable: + filters = field_args.get('filters', []) + filters.append(lambda x: x or None) + field_args['filters'] = filters + @classmethod def _string_common(cls, column, field_args, **extra): if hasattr(column.type, 'length') and isinstance(column.type.length, int) and column.type.length: @@ -272,12 +279,8 @@ def _string_common(cls, column, field_args, **extra): @converts('String') # includes VARCHAR, CHAR, and Unicode def conv_String(self, column, field_args, **extra): - if column.nullable: - filters = field_args.get('filters', []) - filters.append(lambda x: x or None) - field_args['filters'] = filters - self._string_common(column=column, field_args=field_args, **extra) + self._nullable_common(column, field_args) return fields.StringField(**field_args) @converts('sqlalchemy.sql.sqltypes.Enum') @@ -288,9 +291,8 @@ def convert_enum(self, column, field_args, **extra): if column.nullable: field_args['allow_blank'] = column.nullable accepted_values.append(None) - filters = field_args.get('filters', []) - filters.append(lambda x: x or None) - field_args['filters'] = filters + + self._nullable_common(column, field_args) field_args['choices'] = available_choices field_args['validators'].append(validators.AnyOf(accepted_values)) @@ -310,9 +312,8 @@ def convert_choice_type(self, column, field_args, **extra): if column.nullable: field_args['allow_blank'] = column.nullable accepted_values.append(None) - filters = field_args.get('filters', []) - filters.append(lambda x: x or None) - field_args['filters'] = filters + + self._nullable_common(column, field_args) field_args['choices'] = available_choices field_args['validators'].append(validators.AnyOf(accepted_values)) @@ -347,10 +348,7 @@ def convert_arrow_time(self, field_args, **extra): @converts('sqlalchemy_utils.types.email.EmailType') def convert_email(self, field_args, column=None, **extra): - if column.nullable: - filters = field_args.get('filters', []) - filters.append(lambda x: x or None) - field_args['filters'] = filters + self._nullable_common(column, field_args) field_args['validators'].append(validators.Email()) return fields.StringField(**field_args) From 3173169e31b6a228d9f76808059edd5ed6fea1c8 Mon Sep 17 00:00:00 2001 From: David Gilman <davidgilman1@gmail.com> Date: Wed, 18 Jan 2023 18:04:27 -0500 Subject: [PATCH 032/156] Unify nullable behavior for sqla String and Text --- flask_admin/contrib/sqla/form.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flask_admin/contrib/sqla/form.py b/flask_admin/contrib/sqla/form.py index 709f82b12..543342ae3 100644 --- a/flask_admin/contrib/sqla/form.py +++ b/flask_admin/contrib/sqla/form.py @@ -276,11 +276,11 @@ def _nullable_common(cls, column, field_args): def _string_common(cls, column, field_args, **extra): if hasattr(column.type, 'length') and isinstance(column.type.length, int) and column.type.length: field_args['validators'].append(validators.Length(max=column.type.length)) + cls._nullable_common(column, field_args) @converts('String') # includes VARCHAR, CHAR, and Unicode def conv_String(self, column, field_args, **extra): self._string_common(column=column, field_args=field_args, **extra) - self._nullable_common(column, field_args) return fields.StringField(**field_args) @converts('sqlalchemy.sql.sqltypes.Enum') From 7c4b58116816060ad161eb5b6ba56c929566c028 Mon Sep 17 00:00:00 2001 From: David Gilman <davidgilman1@gmail.com> Date: Wed, 18 Jan 2023 19:42:36 -0500 Subject: [PATCH 033/156] Add unit test to verify string null handling --- flask_admin/tests/sqla/test_basic.py | 86 ++++++++++++++++++++++++++-- 1 file changed, 82 insertions(+), 4 deletions(-) diff --git a/flask_admin/tests/sqla/test_basic.py b/flask_admin/tests/sqla/test_basic.py index 8fe1785f2..0478fe287 100644 --- a/flask_admin/tests/sqla/test_basic.py +++ b/flask_admin/tests/sqla/test_basic.py @@ -235,8 +235,8 @@ def test_model(app, db, admin): model = db.session.query(Model1).first() assert model.test1 == u'test1large' assert model.test2 == u'test2' - assert model.test3 == u'' - assert model.test4 == u'' + assert model.test3 == None + assert model.test4 == None assert model.email_field == u'test@test.com' assert model.choice_field == u'choice-1' assert model.enum_field == u'model1_v1' @@ -285,8 +285,8 @@ def test_model(app, db, admin): model = db.session.query(Model1).first() assert model.test1 == 'test1small' assert model.test2 == 'test2large' - assert model.test3 == '' - assert model.test4 == '' + assert model.test3 == None + assert model.test4 == None assert model.email_field == u'test2@test.com' assert model.choice_field is None assert model.enum_field is None @@ -2639,3 +2639,81 @@ def test_export_csv(app, db, admin): data = rv.data.decode('utf-8') assert rv.status_code == 200 assert len(data.splitlines()) > 21 + + +STRING_CONSTANT = "Anyway, here's Wonderwall" + + +def test_string_null_behavior(app, db, admin): + class StringTestModel(db.Model): + id = db.Column(db.Integer, primary_key=True) + test_no = db.Column(db.Integer, nullable=False) + string_field = db.Column(db.String) + string_field_nonull = db.Column(db.String, nullable=False) + string_field_nonull_default = db.Column(db.String, nullable=False, default='') + text_field = db.Column(db.Text) + text_field_nonull = db.Column(db.Text, nullable=False) + text_field_nonull_default = db.Column(db.Text, nullable=False, default='') + + db.create_all() + + view = CustomModelView(StringTestModel, db.session) + admin.add_view(view) + + client = app.test_client() + + valid_params = { + "test_no": 1, + "string_field_nonull": STRING_CONSTANT, + "text_field_nonull": STRING_CONSTANT, + } + rv = client.post('/admin/stringtestmodel/new/', + data=valid_params) + assert rv.status_code == 302 + + # Assert on defaults + valid_inst = db.session.query(StringTestModel).filter(StringTestModel.test_no == 1).one() + assert valid_inst.string_field is None + assert valid_inst.string_field_nonull == STRING_CONSTANT + assert valid_inst.string_field_nonull_default == '' + assert valid_inst.text_field is None + assert valid_inst.text_field_nonull == STRING_CONSTANT + assert valid_inst.text_field_nonull_default == '' + + # Assert that nulls are caught on the non-null fields + invalid_string_field = { + "test_no": 2, + "string_field_nonull": None, + "text_field_nonull": STRING_CONSTANT, + } + rv = client.post('/admin/stringtestmodel/new/', + data=invalid_string_field) + assert rv.status_code == 200 + assert b'This field is required.' in rv.data + assert db.session.query(StringTestModel).filter(StringTestModel.test_no == 2).all() == [] + + invalid_text_field = { + "test_no": 3, + "string_field_nonull": STRING_CONSTANT, + "text_field_nonull": None, + } + rv = client.post('/admin/stringtestmodel/new/', + data=invalid_text_field) + assert rv.status_code == 200 + assert b'This field is required.' in rv.data + assert db.session.query(StringTestModel).filter(StringTestModel.test_no == 3).all() == [] + + # Assert that empty strings are converted to None on nullable fields. + empty_strings = { + "test_no": 4, + "string_field": "", + "text_field": "", + "string_field_nonull": STRING_CONSTANT, + "text_field_nonull": STRING_CONSTANT, + } + rv = client.post('/admin/stringtestmodel/new/', + data=empty_strings) + assert rv.status_code == 302 + empty_string_inst = db.session.query(StringTestModel).filter(StringTestModel.test_no == 4).one() + assert empty_string_inst.string_field is None + assert empty_string_inst.text_field is None From 3e4159514ba8ac62e2cb75c55760986dcb128e8a Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Sat, 20 Jul 2024 09:19:59 +0100 Subject: [PATCH 034/156] Update test to use fixtures --- flask_admin/tests/sqla/test_basic.py | 137 ++++++++++++++------------- 1 file changed, 69 insertions(+), 68 deletions(-) diff --git a/flask_admin/tests/sqla/test_basic.py b/flask_admin/tests/sqla/test_basic.py index 0478fe287..b0fb2f348 100644 --- a/flask_admin/tests/sqla/test_basic.py +++ b/flask_admin/tests/sqla/test_basic.py @@ -2645,75 +2645,76 @@ def test_export_csv(app, db, admin): def test_string_null_behavior(app, db, admin): - class StringTestModel(db.Model): - id = db.Column(db.Integer, primary_key=True) - test_no = db.Column(db.Integer, nullable=False) - string_field = db.Column(db.String) - string_field_nonull = db.Column(db.String, nullable=False) - string_field_nonull_default = db.Column(db.String, nullable=False, default='') - text_field = db.Column(db.Text) - text_field_nonull = db.Column(db.Text, nullable=False) - text_field_nonull_default = db.Column(db.Text, nullable=False, default='') + with app.app_context(): + class StringTestModel(db.Model): + id = db.Column(db.Integer, primary_key=True) + test_no = db.Column(db.Integer, nullable=False) + string_field = db.Column(db.String) + string_field_nonull = db.Column(db.String, nullable=False) + string_field_nonull_default = db.Column(db.String, nullable=False, default='') + text_field = db.Column(db.Text) + text_field_nonull = db.Column(db.Text, nullable=False) + text_field_nonull_default = db.Column(db.Text, nullable=False, default='') - db.create_all() + db.create_all() - view = CustomModelView(StringTestModel, db.session) - admin.add_view(view) + view = CustomModelView(StringTestModel, db.session) + admin.add_view(view) - client = app.test_client() + client = app.test_client() - valid_params = { - "test_no": 1, - "string_field_nonull": STRING_CONSTANT, - "text_field_nonull": STRING_CONSTANT, - } - rv = client.post('/admin/stringtestmodel/new/', - data=valid_params) - assert rv.status_code == 302 - - # Assert on defaults - valid_inst = db.session.query(StringTestModel).filter(StringTestModel.test_no == 1).one() - assert valid_inst.string_field is None - assert valid_inst.string_field_nonull == STRING_CONSTANT - assert valid_inst.string_field_nonull_default == '' - assert valid_inst.text_field is None - assert valid_inst.text_field_nonull == STRING_CONSTANT - assert valid_inst.text_field_nonull_default == '' - - # Assert that nulls are caught on the non-null fields - invalid_string_field = { - "test_no": 2, - "string_field_nonull": None, - "text_field_nonull": STRING_CONSTANT, - } - rv = client.post('/admin/stringtestmodel/new/', - data=invalid_string_field) - assert rv.status_code == 200 - assert b'This field is required.' in rv.data - assert db.session.query(StringTestModel).filter(StringTestModel.test_no == 2).all() == [] - - invalid_text_field = { - "test_no": 3, - "string_field_nonull": STRING_CONSTANT, - "text_field_nonull": None, - } - rv = client.post('/admin/stringtestmodel/new/', - data=invalid_text_field) - assert rv.status_code == 200 - assert b'This field is required.' in rv.data - assert db.session.query(StringTestModel).filter(StringTestModel.test_no == 3).all() == [] - - # Assert that empty strings are converted to None on nullable fields. - empty_strings = { - "test_no": 4, - "string_field": "", - "text_field": "", - "string_field_nonull": STRING_CONSTANT, - "text_field_nonull": STRING_CONSTANT, - } - rv = client.post('/admin/stringtestmodel/new/', - data=empty_strings) - assert rv.status_code == 302 - empty_string_inst = db.session.query(StringTestModel).filter(StringTestModel.test_no == 4).one() - assert empty_string_inst.string_field is None - assert empty_string_inst.text_field is None + valid_params = { + "test_no": 1, + "string_field_nonull": STRING_CONSTANT, + "text_field_nonull": STRING_CONSTANT, + } + rv = client.post('/admin/stringtestmodel/new/', + data=valid_params) + assert rv.status_code == 302 + + # Assert on defaults + valid_inst = db.session.query(StringTestModel).filter(StringTestModel.test_no == 1).one() + assert valid_inst.string_field is None + assert valid_inst.string_field_nonull == STRING_CONSTANT + assert valid_inst.string_field_nonull_default == '' + assert valid_inst.text_field is None + assert valid_inst.text_field_nonull == STRING_CONSTANT + assert valid_inst.text_field_nonull_default == '' + + # Assert that nulls are caught on the non-null fields + invalid_string_field = { + "test_no": 2, + "string_field_nonull": None, + "text_field_nonull": STRING_CONSTANT, + } + rv = client.post('/admin/stringtestmodel/new/', + data=invalid_string_field) + assert rv.status_code == 200 + assert b'This field is required.' in rv.data + assert db.session.query(StringTestModel).filter(StringTestModel.test_no == 2).all() == [] + + invalid_text_field = { + "test_no": 3, + "string_field_nonull": STRING_CONSTANT, + "text_field_nonull": None, + } + rv = client.post('/admin/stringtestmodel/new/', + data=invalid_text_field) + assert rv.status_code == 200 + assert b'This field is required.' in rv.data + assert db.session.query(StringTestModel).filter(StringTestModel.test_no == 3).all() == [] + + # Assert that empty strings are converted to None on nullable fields. + empty_strings = { + "test_no": 4, + "string_field": "", + "text_field": "", + "string_field_nonull": STRING_CONSTANT, + "text_field_nonull": STRING_CONSTANT, + } + rv = client.post('/admin/stringtestmodel/new/', + data=empty_strings) + assert rv.status_code == 302 + empty_string_inst = db.session.query(StringTestModel).filter(StringTestModel.test_no == 4).one() + assert empty_string_inst.string_field is None + assert empty_string_inst.text_field is None From 912d257541fd084dec0586aade1eb3f40743e9ea Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Sat, 20 Jul 2024 09:48:15 +0100 Subject: [PATCH 035/156] Fix SQLAlchemy example for Flask-Babel --- examples/sqla/admin/__init__.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/sqla/admin/__init__.py b/examples/sqla/admin/__init__.py index 6a44f298c..5f3856ec7 100644 --- a/examples/sqla/admin/__init__.py +++ b/examples/sqla/admin/__init__.py @@ -7,11 +7,7 @@ app.config.from_pyfile('config.py') db = SQLAlchemy(app) -# Initialize babel -babel = Babel(app) - -@babel.localeselector def get_locale(): override = request.args.get('lang') @@ -21,4 +17,8 @@ def get_locale(): return session.get('lang', 'en') +# Initialize babel +babel = Babel(app, locale_selector=get_locale) + + import admin.main From f9543bad829848ca5522007d94ff63ebfc55d11b Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Sat, 20 Jul 2024 09:50:33 +0100 Subject: [PATCH 036/156] Fix translation of 'Already exists' There are two problems with the translation of this string: 1) We use WTForm's translation rather than Flask-Admin's, so the translation isn't found. 2) We cache the result of the first translation for the lifetime of the app. This means that if the user changes language dynamically, the message is not re-translated. By using `lazy_gettext` we can force the message to be translated every time the unique constraint is called. --- flask_admin/contrib/sqla/validators.py | 7 ++--- flask_admin/tests/conftest.py | 3 +- flask_admin/tests/sqla/test_translation.py | 33 ++++++++++++++++++++-- 3 files changed, 36 insertions(+), 7 deletions(-) diff --git a/flask_admin/contrib/sqla/validators.py b/flask_admin/contrib/sqla/validators.py index 7f9809cdd..b141138e7 100644 --- a/flask_admin/contrib/sqla/validators.py +++ b/flask_admin/contrib/sqla/validators.py @@ -4,6 +4,7 @@ from wtforms.validators import InputRequired from flask_admin._compat import filter_list +from flask_admin.babel import lazy_gettext class Unique(object): @@ -24,7 +25,7 @@ def __init__(self, db_session, model, column, message=None): self.db_session = db_session self.model = model self.column = column - self.message = message + self.message = message or lazy_gettext('Already exists.') def __call__(self, form, field): # databases allow multiple NULL values for unique columns @@ -37,9 +38,7 @@ def __call__(self, form, field): .one()) if not hasattr(form, '_obj') or not form._obj == obj: - if self.message is None: - self.message = field.gettext(u'Already exists.') - raise ValidationError(self.message) + raise ValidationError(str(self.message)) except NoResultFound: pass diff --git a/flask_admin/tests/conftest.py b/flask_admin/tests/conftest.py index 674c21919..fefedf4b4 100644 --- a/flask_admin/tests/conftest.py +++ b/flask_admin/tests/conftest.py @@ -15,9 +15,10 @@ def app(): @pytest.fixture def babel(app): + babel = None try: from flask_babel import Babel - _ = Babel(app) + babel = Babel(app) except ImportError: pass diff --git a/flask_admin/tests/sqla/test_translation.py b/flask_admin/tests/sqla/test_translation.py index 80dadec4b..ba951318b 100644 --- a/flask_admin/tests/sqla/test_translation.py +++ b/flask_admin/tests/sqla/test_translation.py @@ -1,7 +1,8 @@ -from flask_admin.babel import lazy_gettext +from flask_admin.babel import gettext from .test_basic import CustomModelView, create_models from .. import flask_babel_test_decorator +from ...contrib.sqla import ModelView @flask_babel_test_decorator @@ -17,7 +18,7 @@ def test_column_label_translation(request, app): with app.app_context(): Model1, _ = create_models(db) - label = lazy_gettext('Name') + label = gettext('Name') view = CustomModelView(Model1, db.session, column_list=['test1', 'test3'], @@ -30,3 +31,31 @@ def test_column_label_translation(request, app): rv = client.get('/admin/model1/?flt1_0=test') assert rv.status_code == 200 assert '{"Nombre":' in rv.data.decode('utf-8') + + +@flask_babel_test_decorator +def test_unique_validator_translation_is_dynamic(app, db, admin): + with app.app_context(): + class UniqueTable(db.Model): + id = db.Column(db.Integer, primary_key=True) + value = db.Column(db.String, unique=True) + + db.create_all() + + view = ModelView(UniqueTable, db.session) + view.can_create = True + admin.add_view(view) + + client = app.test_client() + rv = client.post('/admin/uniquetable/new', data=dict(id="1", value='hello'), follow_redirects=True) + assert rv.status_code == 200 + + rv = client.post('/admin/uniquetable/new', data=dict(id="1", value='hello'), follow_redirects=True) + assert rv.status_code == 200 + assert "Already exists." in rv.text + + from flask_babel import force_locale + with force_locale('fr'): + rv = client.post('/admin/uniquetable/new', data=dict(id="1", value='hello'), follow_redirects=True) + assert rv.status_code == 200 + assert "Existe déjà." in rv.text From b8848714e53e2e0ec39fe507a42d64b2bf1652f8 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Sat, 20 Jul 2024 11:27:06 +0100 Subject: [PATCH 037/156] Update babel/jinja dependencies --- requirements/dev.txt | 6 +++--- requirements/docs.txt | 4 ++-- requirements/tests.in | 6 +++--- requirements/typing.txt | 6 +++--- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/requirements/dev.txt b/requirements/dev.txt index 696b821d6..d5f18631b 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -29,7 +29,7 @@ azure-storage-common==2.1.0 # via # -r typing.txt # azure-storage-blob -babel==2.9.1 +babel==2.15.0 # via # -r docs.txt # -r tests.in @@ -120,7 +120,7 @@ flask==2.1.3 # flask-mongoengine # flask-sqlalchemy # flask-wtf -flask-babel==2.0.0 +flask-babel==4.0.0 # via # -r tests.in # -r typing.txt @@ -172,7 +172,7 @@ itsdangerous==2.0.1 # -r typing.txt # flask # flask-wtf -jinja2==3.0.0 +jinja2==3.1.4 # via # -r docs.txt # -r tests.in diff --git a/requirements/docs.txt b/requirements/docs.txt index 32366b0e5..7de031b9a 100644 --- a/requirements/docs.txt +++ b/requirements/docs.txt @@ -6,7 +6,7 @@ # alabaster==0.7.13 # via sphinx -babel==2.9.1 +babel==2.15.0 # via # -c tests.in # sphinx @@ -22,7 +22,7 @@ imagesize==1.4.1 # via sphinx importlib-metadata==6.7.0 # via sphinx -jinja2==3.0.0 +jinja2==3.1.4 # via # -c tests.in # sphinx diff --git a/requirements/tests.in b/requirements/tests.in index f6df5de83..351456205 100644 --- a/requirements/tests.in +++ b/requirements/tests.in @@ -3,7 +3,7 @@ werkzeug sqlalchemy<2.0 itsdangerous<2.1.0 MarkupSafe<2.1.0 -jinja2<=3.0.0 +jinja2>=2.0.0 Flask-SQLAlchemy<3.0.0 peewee wtf-peewee @@ -11,8 +11,8 @@ mongoengine pymongo>=3.7.0 flask-mongoengine==0.8.2 pillow>=3.3.2 -Babel<=2.9.1 -flask-babel +Babel>=2.0.0 +flask-babel>=3.0.0 shapely>=2 geoalchemy2 psycopg2 diff --git a/requirements/typing.txt b/requirements/typing.txt index 7d6448173..3bce31eb3 100644 --- a/requirements/typing.txt +++ b/requirements/typing.txt @@ -16,7 +16,7 @@ azure-storage-blob==2.1.0 # via -r tests.in azure-storage-common==2.1.0 # via azure-storage-blob -babel==2.9.1 +babel==2.15.0 # via # -r tests.in # flask-babel @@ -56,7 +56,7 @@ flask==2.1.3 # flask-mongoengine # flask-sqlalchemy # flask-wtf -flask-babel==2.0.0 +flask-babel==4.0.0 # via -r tests.in flask-mongoengine==0.8.2 # via -r tests.in @@ -81,7 +81,7 @@ itsdangerous==2.0.1 # -r tests.in # flask # flask-wtf -jinja2==3.0.0 +jinja2==3.1.4 # via # -r tests.in # flask From bbc989f968fc5371f98c5b91117bc580662d8fca Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Fri, 19 Jul 2024 15:03:27 +0100 Subject: [PATCH 038/156] Change how Flask-Admin themes are configured Currently, Flask-Admin themes can be changed through a combination of configuration modes: * Through Admin() arguments; Admin(template_mode='bootstrap2') * Through environment variables, eg FLASK_ADMIN_SWATCH='cerulean'. These two modes work together to decide the UI framework/version used, and then the colour/styling applied within that framework. This patch switches us over to a single `theme` configuration object passed to the Admin instance. This brings all of the configuration for a specific visual style into one place, and also means that now separate Admin() instances can contain all of their styling information in an isolated way. This should also make it easier for end users to provide their own Admin theme, as the theme is also exposed to all of the `render_template` calls under a `theme` variable. --- doc/advanced.rst | 4 ++-- doc/introduction.rst | 9 +++----- examples/auth-flask-login/app.py | 4 +++- examples/auth/app.py | 3 ++- examples/bootstrap4/app.py | 6 ++--- examples/custom-layout/app.py | 3 ++- examples/forms-files-images/app.py | 9 +++----- examples/geo_alchemy/app.py | 4 +++- examples/simple/app.py | 5 +++- examples/sqla-association_proxy/app.py | 3 ++- examples/sqla/admin/__init__.py | 3 +++ examples/sqla/admin/config.py | 4 ---- examples/sqla/admin/main.py | 3 ++- flask_admin/base.py | 23 +++++++++++-------- flask_admin/form/widgets.py | 2 +- .../templates/bootstrap2/admin/base.html | 4 ++-- .../templates/bootstrap3/admin/base.html | 6 ++--- .../templates/bootstrap4/admin/base.html | 6 ++--- flask_admin/tests/fileadmin/test_fileadmin.py | 6 ++--- flask_admin/tests/test_model.py | 5 ++-- flask_admin/theme.py | 20 ++++++++++++++++ 21 files changed, 79 insertions(+), 53 deletions(-) create mode 100644 flask_admin/theme.py diff --git a/doc/advanced.rst b/doc/advanced.rst index c01d26d6d..93be11b83 100644 --- a/doc/advanced.rst +++ b/doc/advanced.rst @@ -134,7 +134,7 @@ can use it by adding a FileAdmin view to your app:: # Flask setup here - admin = Admin(app, name='microblog', template_mode='bootstrap4') + admin = Admin(app, name='microblog', theme=Bootstrap2Theme()) path = op.join(op.dirname(__file__), 'static') admin.add_view(FileAdmin(path, '/static/', name='Static Files')) @@ -173,7 +173,7 @@ instance running on the same machine as your app, you can:: # Flask setup here - admin = Admin(app, name='microblog', template_mode='bootstrap4') + admin = Admin(app, name='microblog', theme=Bootstrap2Theme()) admin.add_view(rediscli.RedisCli(Redis())) diff --git a/doc/introduction.rst b/doc/introduction.rst index 6468197e1..8646f6bb9 100644 --- a/doc/introduction.rst +++ b/doc/introduction.rst @@ -18,15 +18,12 @@ The first step is to initialize an empty admin interface for your Flask app:: app = Flask(__name__) - # set optional bootswatch theme - app.config['FLASK_ADMIN_SWATCH'] = 'cerulean' - - admin = Admin(app, name='microblog', template_mode='bootstrap4') + admin = Admin(app, name='microblog', theme=Bootstrap4Theme(swatch='cerulean')) # Add administrative views here app.run() -Here, both the *name* and *template_mode* parameters are optional. Alternatively, +Here, both the *name* and *theme* parameters are optional. Alternatively, you could use the :meth:`~flask_admin.base.Admin.init_app` method. If you start this application and navigate to `http://localhost:5000/admin/ <http://localhost:5000/admin/>`_, @@ -44,7 +41,7 @@ is the SQLAlchemy backend, which you can use as follows:: # Flask and Flask-SQLAlchemy initialization here - admin = Admin(app, name='microblog', template_mode='bootstrap4') + admin = Admin(app, name='microblog', theme=Bootstrap4Theme()) admin.add_view(ModelView(User, db.session)) admin.add_view(ModelView(Post, db.session)) diff --git a/examples/auth-flask-login/app.py b/examples/auth-flask-login/app.py index 95b790672..80f68e841 100644 --- a/examples/auth-flask-login/app.py +++ b/examples/auth-flask-login/app.py @@ -4,6 +4,8 @@ from wtforms import form, fields, validators import flask_admin as admin import flask_login as login + +from flask_admin.theme import Bootstrap4Theme from flask_admin.contrib import sqla from flask_admin import helpers, expose from werkzeug.security import generate_password_hash, check_password_hash @@ -164,7 +166,7 @@ def index(): init_login() # Create admin -admin = admin.Admin(app, 'Example: Auth', index_view=MyAdminIndexView(), base_template='my_master.html', template_mode='bootstrap4') +admin = admin.Admin(app, 'Example: Auth', index_view=MyAdminIndexView(), base_template='my_master.html', theme=Bootstrap4Theme()) # Add view admin.add_view(MyModelView(User, db.session)) diff --git a/examples/auth/app.py b/examples/auth/app.py index ae6de22d9..c04235618 100644 --- a/examples/auth/app.py +++ b/examples/auth/app.py @@ -5,6 +5,7 @@ UserMixin, RoleMixin, current_user from flask_security.utils import hash_password import flask_admin +from flask_admin.theme import Bootstrap4Theme from flask_admin.contrib import sqla from flask_admin import helpers as admin_helpers @@ -83,7 +84,7 @@ def index(): app, 'Example: Auth', base_template='my_master.html', - template_mode='bootstrap4', + theme=Bootstrap4Theme(), ) # Add model views diff --git a/examples/bootstrap4/app.py b/examples/bootstrap4/app.py index 884a615f8..972991fe1 100644 --- a/examples/bootstrap4/app.py +++ b/examples/bootstrap4/app.py @@ -5,6 +5,7 @@ from flask_sqlalchemy import SQLAlchemy import flask_admin as admin +from flask_admin.theme import Bootstrap4Theme from flask_admin.contrib.sqla import ModelView @@ -13,7 +14,6 @@ # Create dummy secrey key so we can use sessions app.config['SECRET_KEY'] = '123456790' -app.config['FLASK_ADMIN_SWATCH'] = 'flatly' # Create in-memory database app.config['DATABASE_FILE'] = 'sample_db.sqlite' @@ -61,10 +61,8 @@ def index(): return '<a href="/admin/">Click me to get to Admin!</a>' -# app.config['FLASK_ADMIN_SWATCH'] = 'Minty' - # Create admin with custom base template -admin = admin.Admin(app, 'Example: Bootstrap4', template_mode='bootstrap4') +admin = admin.Admin(app, 'Example: Bootstrap4', theme=Bootstrap4Theme(swatch='flatly')) # Add views admin.add_view(UserAdmin(User, db.session, category='Menu')) diff --git a/examples/custom-layout/app.py b/examples/custom-layout/app.py index 051c1cd1e..fe7b173ef 100644 --- a/examples/custom-layout/app.py +++ b/examples/custom-layout/app.py @@ -4,6 +4,7 @@ from flask_sqlalchemy import SQLAlchemy import flask_admin as admin +from flask_admin.theme import Bootstrap3Theme from flask_admin.contrib.sqla import ModelView @@ -58,7 +59,7 @@ def index(): # Create admin with custom base template -admin = admin.Admin(app, 'Example: Layout-BS3', base_template='layout.html', template_mode='bootstrap3') +admin = admin.Admin(app, 'Example: Layout-BS3', base_template='layout.html', theme=Bootstrap3Theme()) # Add views admin.add_view(UserAdmin(User, db.session)) diff --git a/examples/forms-files-images/app.py b/examples/forms-files-images/app.py index 0f0e6498f..ce7929455 100644 --- a/examples/forms-files-images/app.py +++ b/examples/forms-files-images/app.py @@ -10,6 +10,7 @@ from markupsafe import Markup from flask_admin import Admin, form +from flask_admin.theme import Bootstrap4Theme from flask_admin.form import rules from flask_admin.contrib import sqla, rediscli @@ -17,10 +18,6 @@ # Create application app = Flask(__name__, static_folder='files') -# set optional bootswatch theme -# see http://bootswatch.com/3/ for available swatches -app.config['FLASK_ADMIN_SWATCH'] = 'cerulean' - # Create dummy secrey key so we can use sessions app.config['SECRET_KEY'] = '123456790' @@ -198,7 +195,7 @@ def index(): return '<a href="/admin/">Click me to get to Admin!</a>' # Create admin -admin = Admin(app, 'Example: Forms', template_mode='bootstrap4') +admin = Admin(app, 'Example: Forms', theme=Bootstrap4Theme(swatch='cerulean')) # Add views admin.add_view(FileView(File, db.session)) @@ -296,6 +293,6 @@ def build_sample_db(): if not os.path.exists(database_path): with app.app_context(): build_sample_db() - + # Start app app.run(debug=True) diff --git a/examples/geo_alchemy/app.py b/examples/geo_alchemy/app.py index d91c48afc..c51f8a793 100644 --- a/examples/geo_alchemy/app.py +++ b/examples/geo_alchemy/app.py @@ -3,6 +3,8 @@ import flask_admin as admin from geoalchemy2.types import Geometry + +from flask_admin.theme import Bootstrap4Theme from flask_admin.contrib.geoa import ModelView @@ -54,7 +56,7 @@ def index(): return '<a href="/admin/">Click me to get to Admin!</a>' # Create admin -admin = admin.Admin(app, name='Example: GeoAlchemy', template_mode='bootstrap4') +admin = admin.Admin(app, name='Example: GeoAlchemy', theme=Bootstrap4Theme()) # Add views admin.add_view(ModelView(Point, db.session, category='Points')) diff --git a/examples/simple/app.py b/examples/simple/app.py index d62b6d7a6..20fb84c49 100644 --- a/examples/simple/app.py +++ b/examples/simple/app.py @@ -4,6 +4,9 @@ # Create custom admin view +from flask_admin.theme import Bootstrap4Theme + + class MyAdminView(admin.BaseView): @admin.expose('/') def index(self): @@ -30,7 +33,7 @@ def index(): return '<a href="/admin/">Click me to get to Admin!</a>' # Create admin interface -admin = admin.Admin(name="Example: Simple Views", template_mode='bootstrap4') +admin = admin.Admin(name="Example: Simple Views", theme=Bootstrap4Theme()) admin.add_view(MyAdminView(name="view1", category='Test')) admin.add_view(AnotherAdminView(name="view2", category='Test')) admin.init_app(app) diff --git a/examples/sqla-association_proxy/app.py b/examples/sqla-association_proxy/app.py index fcb78be37..e40f14b5e 100644 --- a/examples/sqla-association_proxy/app.py +++ b/examples/sqla-association_proxy/app.py @@ -4,6 +4,7 @@ from sqlalchemy.orm import relationship, backref import flask_admin as admin +from flask_admin.theme import Bootstrap4Theme from flask_admin.contrib import sqla # Create application @@ -87,7 +88,7 @@ class KeywordAdmin(sqla.ModelView): # Create admin -admin = admin.Admin(app, name='Example: SQLAlchemy Association Proxy', template_mode='bootstrap4') +admin = admin.Admin(app, name='Example: SQLAlchemy Association Proxy', theme=Bootstrap4Theme()) admin.add_view(UserAdmin(User, db.session)) admin.add_view(KeywordAdmin(Keyword, db.session)) diff --git a/examples/sqla/admin/__init__.py b/examples/sqla/admin/__init__.py index 5f3856ec7..36f432731 100644 --- a/examples/sqla/admin/__init__.py +++ b/examples/sqla/admin/__init__.py @@ -16,6 +16,9 @@ def get_locale(): return session.get('lang', 'en') +# Initialize babel +babel = Babel(app, locale_selector=get_locale) + # Initialize babel babel = Babel(app, locale_selector=get_locale) diff --git a/examples/sqla/admin/config.py b/examples/sqla/admin/config.py index c685d83a0..ae3759b03 100644 --- a/examples/sqla/admin/config.py +++ b/examples/sqla/admin/config.py @@ -1,7 +1,3 @@ -# set optional bootswatch theme -# see http://bootswatch.com/3/ for available swatches -FLASK_ADMIN_SWATCH = 'cerulean' - # Create dummy secrey key so we can use sessions SECRET_KEY = '123456790' diff --git a/examples/sqla/admin/main.py b/examples/sqla/admin/main.py index 3fc7878a4..ae7c40539 100644 --- a/examples/sqla/admin/main.py +++ b/examples/sqla/admin/main.py @@ -6,6 +6,7 @@ import flask_admin as admin from flask_admin.base import MenuLink +from flask_admin.theme import BootstrapTheme, Bootstrap4Theme from flask_admin.contrib import sqla from flask_admin.contrib.sqla import filters from flask_admin.contrib.sqla.filters import BaseSQLAFilter, FilterEqual @@ -242,7 +243,7 @@ def render(self, template, **kwargs): # Create admin -admin = admin.Admin(app, name='Example: SQLAlchemy', template_mode='bootstrap4') +admin = admin.Admin(app, name='Example: SQLAlchemy', theme=Bootstrap4Theme(swatch='default')) # Add views admin.add_view(UserAdmin(User, db.session)) diff --git a/flask_admin/base.py b/flask_admin/base.py index 2338be5c7..6552ea5cf 100644 --- a/flask_admin/base.py +++ b/flask_admin/base.py @@ -5,6 +5,7 @@ from functools import wraps from flask import current_app, render_template, abort, g, url_for, request +from flask import Blueprint, current_app, render_template, abort, g, url_for from flask_admin import babel from flask_admin._compat import as_unicode from flask_admin import helpers as h @@ -13,6 +14,7 @@ from flask_admin.blueprints import _BlueprintWithHostSupport as Blueprint from flask_admin.consts import ADMIN_ROUTES_HOST_VARIABLE from flask_admin.menu import MenuCategory, MenuView, MenuLink, SubMenuCategory # noqa: F401 +from flask_admin.theme import Theme, Bootstrap2Theme def expose(url='/', methods=('GET',)): @@ -268,7 +270,7 @@ def create_blueprint(self, admin): self.blueprint = Blueprint(self.endpoint, __name__, url_prefix=self.url, subdomain=self.admin.subdomain, - template_folder=op.join('templates', self.admin.template_mode), + template_folder=op.join('templates', self.admin.theme.folder), static_folder=self.static_folder, static_url_path=self.static_url_path) self.blueprint.attach_url_defaults_and_value_preprocessor( @@ -308,6 +310,7 @@ def render(self, template, **kwargs): # Expose config info kwargs['config'] = current_app.config + kwargs['theme'] = self.admin.theme # Contribute extra arguments kwargs.update(self._template_args) @@ -473,7 +476,7 @@ def __init__(self, app=None, name=None, endpoint=None, static_url_path=None, base_template=None, - template_mode=None, + theme: t.Optional[Theme] = None, category_icon_classes=None, host=None): """ @@ -500,9 +503,9 @@ def __init__(self, app=None, name=None, all its views. Can be overridden in view configuration. :param base_template: Override base HTML template for all static views. Defaults to `admin/base.html`. - :param template_mode: - Base template path. Defaults to `bootstrap2`. If you want to use - Bootstrap 3 or 4 integration, change it to `bootstrap3` or `bootstrap4`. + :param theme: + Base theme. Defaults to `Bootstrap2Theme()`. If you want to use + Bootstrap 3 or 4 integration, change it to `Bootstrap3Theme()` or `Bootstrap4Theme()`. :param category_icon_classes: A dict of category names as keys and html classes as values to be added to menu category icons. Example: {'Favorites': 'glyphicon glyphicon-star'} @@ -513,10 +516,10 @@ def __init__(self, app=None, name=None, self.translations_path = translations_path - self._views = [] - self._menu = [] - self._menu_categories = dict() - self._menu_links = [] + self._views = [] # type: ignore[var-annotated] + self._menu = [] # type: ignore[var-annotated] + self._menu_categories = dict() # type: ignore[var-annotated] + self._menu_links = [] # type: ignore[var-annotated] if name is None: name = 'Admin' @@ -529,7 +532,7 @@ def __init__(self, app=None, name=None, self.subdomain = subdomain self.host = host self.base_template = base_template or 'admin/base.html' - self.template_mode = template_mode or 'bootstrap2' + self.theme = theme or Bootstrap2Theme() self.category_icon_classes = category_icon_classes or dict() self._validate_admin_host_and_subdomain() diff --git a/flask_admin/form/widgets.py b/flask_admin/form/widgets.py index 4a9a270d9..b741ee233 100644 --- a/flask_admin/form/widgets.py +++ b/flask_admin/form/widgets.py @@ -8,7 +8,7 @@ def _is_bootstrap3(): view = h.get_current_view() - return view and view.admin.template_mode == 'bootstrap3' + return view and view.admin.theme.folder == 'bootstrap3' class Select2Widget(widgets.Select): diff --git a/flask_admin/templates/bootstrap2/admin/base.html b/flask_admin/templates/bootstrap2/admin/base.html index a90d27c76..fa9da6661 100644 --- a/flask_admin/templates/bootstrap2/admin/base.html +++ b/flask_admin/templates/bootstrap2/admin/base.html @@ -12,7 +12,7 @@ <meta name="author" content=""> {% endblock %} {% block head_css %} - <link href="{{ admin_static.url(filename='bootstrap/bootstrap2/swatch/{swatch}/bootstrap.min.css'.format(swatch=config.get('FLASK_ADMIN_SWATCH', 'default')), v='2.3.2') }}" rel="stylesheet"> + <link href="{{ admin_static.url(filename='bootstrap/bootstrap2/swatch/{swatch}/bootstrap.min.css'.format(swatch=theme.swatch), v='2.3.2') }}" rel="stylesheet"> <link href="{{ admin_static.url(filename='bootstrap/bootstrap2/css/bootstrap-responsive.css', v='2.3.2') }}" rel="stylesheet"> <link href="{{ admin_static.url(filename='admin/css/bootstrap2/admin.css', v='1.1.1') }}" rel="stylesheet"> {% if admin_view.extra_css %} @@ -33,7 +33,7 @@ </head> <body> {% block page_body %} - <div class="container{%if config.get('FLASK_ADMIN_FLUID_LAYOUT', False) %}-fluid{% endif %}"> + <div class="container{%if theme.fluid %}-fluid{% endif %}"> <div class="navbar"> <div class="navbar-inner"> {% block brand %} diff --git a/flask_admin/templates/bootstrap3/admin/base.html b/flask_admin/templates/bootstrap3/admin/base.html index 8a841d931..bd532b084 100644 --- a/flask_admin/templates/bootstrap3/admin/base.html +++ b/flask_admin/templates/bootstrap3/admin/base.html @@ -12,8 +12,8 @@ <meta name="author" content=""> {% endblock %} {% block head_css %} - <link href="{{ admin_static.url(filename='bootstrap/bootstrap3/swatch/{swatch}/bootstrap.min.css'.format(swatch=config.get('FLASK_ADMIN_SWATCH', 'default')), v='3.3.5') }}" rel="stylesheet"> - {%if config.get('FLASK_ADMIN_SWATCH', 'default') == 'default' %} + <link href="{{ admin_static.url(filename='bootstrap/bootstrap3/swatch/{swatch}/bootstrap.min.css'.format(swatch=theme.swatch), v='3.3.5') }}" rel="stylesheet"> + {%if theme.swatch == 'default' %} <link href="{{ admin_static.url(filename='bootstrap/bootstrap3/css/bootstrap-theme.min.css', v='3.3.5') }}" rel="stylesheet"> {%endif%} <link href="{{ admin_static.url(filename='admin/css/bootstrap3/admin.css', v='1.1.1') }}" rel="stylesheet"> @@ -36,7 +36,7 @@ </head> <body> {% block page_body %} - <div class="container{%if config.get('FLASK_ADMIN_FLUID_LAYOUT', False) %}-fluid{% endif %}"> + <div class="container{%if theme.fluid %}-fluid{% endif %}"> <nav class="navbar navbar-default" role="navigation"> <!-- Brand and toggle get grouped for better mobile display --> <div class="navbar-header"> diff --git a/flask_admin/templates/bootstrap4/admin/base.html b/flask_admin/templates/bootstrap4/admin/base.html index cccb75fdb..a46d5d54c 100644 --- a/flask_admin/templates/bootstrap4/admin/base.html +++ b/flask_admin/templates/bootstrap4/admin/base.html @@ -12,9 +12,9 @@ <meta name="author" content=""> {% endblock %} {% block head_css %} - <link href="{{ admin_static.url(filename='bootstrap/bootstrap4/swatch/{swatch}/bootstrap.min.css'.format(swatch=config.get('FLASK_ADMIN_SWATCH', 'default')), v='4.2.1') }}" + <link href="{{ admin_static.url(filename='bootstrap/bootstrap4/swatch/{swatch}/bootstrap.min.css'.format(swatch=theme.swatch), v='4.2.1') }}" rel="stylesheet"> - {% if config.get('FLASK_ADMIN_SWATCH', 'default') == 'default' %} + {% if theme.swatch == 'default' %} <link href="{{ admin_static.url(filename='bootstrap/bootstrap4/css/bootstrap.min.css', v='4.2.1') }}" rel="stylesheet"> {% endif %} <link href="{{ admin_static.url(filename='admin/css/bootstrap4/admin.css', v='1.1.1') }}" rel="stylesheet"> @@ -37,7 +37,7 @@ </head> <body> {% block page_body %} - <div class="container{% if config.get('FLASK_ADMIN_FLUID_LAYOUT', False) %}-fluid{% endif %}"> + <div class="container{% if theme.fluid %}-fluid{% endif %}"> <nav class="navbar navbar-expand-lg navbar-dark bg-dark mb-2" role="navigation"> <!-- Brand and toggle get grouped for better mobile display --> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#admin-navbar-collapse" diff --git a/flask_admin/tests/fileadmin/test_fileadmin.py b/flask_admin/tests/fileadmin/test_fileadmin.py index 0b01e1589..cbccc536e 100644 --- a/flask_admin/tests/fileadmin/test_fileadmin.py +++ b/flask_admin/tests/fileadmin/test_fileadmin.py @@ -2,9 +2,9 @@ import os import os.path as op +from flask_admin.theme import Bootstrap2Theme, Bootstrap3Theme from flask_admin.contrib import fileadmin from flask_admin import Admin -from flask import Flask class Base: @@ -128,7 +128,7 @@ class MyFileAdmin(fileadmin_class): assert 'path=dummy.txt' in rv.data.decode('utf-8') def test_modal_edit_bs2(self, app, babel): - admin_bs2 = Admin(app, template_mode="bootstrap2") + admin_bs2 = Admin(app, theme=Bootstrap2Theme()) fileadmin_class = self.fileadmin_class() fileadmin_args, fileadmin_kwargs = self.fileadmin_args() @@ -168,7 +168,7 @@ class EditModalOff(fileadmin_class): assert 'fa_modal_window' not in data def test_modal_edit_bs3(self, app, babel): - admin_bs3 = Admin(app, template_mode="bootstrap3") + admin_bs3 = Admin(app, theme=Bootstrap3Theme()) fileadmin_class = self.fileadmin_class() fileadmin_args, fileadmin_kwargs = self.fileadmin_args() diff --git a/flask_admin/tests/test_model.py b/flask_admin/tests/test_model.py index 0197573db..5e88d1b66 100644 --- a/flask_admin/tests/test_model.py +++ b/flask_admin/tests/test_model.py @@ -7,6 +7,7 @@ from flask_admin import Admin, form from flask_admin._compat import iteritems, itervalues +from flask_admin.theme import Bootstrap2Theme, Bootstrap3Theme from flask_admin.model import base, filters from flask_admin.model.template import macro @@ -422,7 +423,7 @@ class TestForm(form.BaseForm): def test_modal_edit_bs2(app, babel): - admin_bs2 = Admin(app, template_mode="bootstrap2") + admin_bs2 = Admin(app, theme=Bootstrap2Theme()) edit_modal_on = MockModelView(Model, edit_modal=True, endpoint="edit_modal_on") edit_modal_off = MockModelView(Model, edit_modal=False, endpoint="edit_modal_off") @@ -461,7 +462,7 @@ def test_modal_edit_bs2(app, babel): def test_modal_edit_bs3(app, babel): - admin_bs3 = Admin(app, template_mode="bootstrap3") + admin_bs3 = Admin(app, theme=Bootstrap3Theme()) edit_modal_on = MockModelView(Model, edit_modal=True, endpoint="edit_modal_on") edit_modal_off = MockModelView(Model, edit_modal=False, endpoint="edit_modal_off") diff --git a/flask_admin/theme.py b/flask_admin/theme.py new file mode 100644 index 000000000..a43252963 --- /dev/null +++ b/flask_admin/theme.py @@ -0,0 +1,20 @@ +import typing +from dataclasses import dataclass +from functools import partial + + +@dataclass +class Theme: + folder: str # The templates folder name to use + + +@dataclass +class BootstrapTheme(Theme): + folder: typing.Literal['bootstrap2', 'bootstrap3', 'bootstrap4'] + swatch: str = 'default' + fluid: bool = False + + +Bootstrap2Theme = partial(BootstrapTheme, folder='bootstrap2') +Bootstrap3Theme = partial(BootstrapTheme, folder='bootstrap3') +Bootstrap4Theme = partial(BootstrapTheme, folder='bootstrap4') From 09445e49088a0cb9ea1ba05b036ae4179037e703 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Sat, 20 Jul 2024 13:55:06 +0100 Subject: [PATCH 039/156] Include `base_template` in the Theme config object --- doc/introduction.rst | 6 +++--- examples/auth-flask-login/app.py | 2 +- examples/auth/app.py | 5 ++--- examples/custom-layout/app.py | 2 +- flask_admin/base.py | 6 +----- flask_admin/theme.py | 4 +++- 6 files changed, 11 insertions(+), 14 deletions(-) diff --git a/doc/introduction.rst b/doc/introduction.rst index 8646f6bb9..fb58856d6 100644 --- a/doc/introduction.rst +++ b/doc/introduction.rst @@ -139,7 +139,7 @@ Defining a `security_context_processor` function will take care of this for you: def security_context_processor(): return dict( - admin_base_template=admin.base_template, + admin_base_template=admin.theme.base_template, admin_view=admin.index_view, h=admin_helpers, ) @@ -408,9 +408,9 @@ Now, to make your view classes use this template, set the appropriate class prop # details_modal_template = 'microblog_details_modal.html' If you want to use your own base template, then pass the name of the template to -the admin constructor during initialization:: +the admin theme during initialization:: - admin = Admin(app, base_template='microblog_master.html') + admin = Admin(app, Bootstrap4Theme(base_template='microblog_master.html')) Overriding the Built-in Templates -------------------------------- diff --git a/examples/auth-flask-login/app.py b/examples/auth-flask-login/app.py index 80f68e841..2d1ca25f5 100644 --- a/examples/auth-flask-login/app.py +++ b/examples/auth-flask-login/app.py @@ -166,7 +166,7 @@ def index(): init_login() # Create admin -admin = admin.Admin(app, 'Example: Auth', index_view=MyAdminIndexView(), base_template='my_master.html', theme=Bootstrap4Theme()) +admin = admin.Admin(app, 'Example: Auth', index_view=MyAdminIndexView(), theme=Bootstrap4Theme(base_template='my_master.html')) # Add view admin.add_view(MyModelView(User, db.session)) diff --git a/examples/auth/app.py b/examples/auth/app.py index c04235618..8710238e8 100644 --- a/examples/auth/app.py +++ b/examples/auth/app.py @@ -83,8 +83,7 @@ def index(): admin = flask_admin.Admin( app, 'Example: Auth', - base_template='my_master.html', - theme=Bootstrap4Theme(), + theme=Bootstrap4Theme(base_template='my_master.html'), ) # Add model views @@ -96,7 +95,7 @@ def index(): @security.context_processor def security_context_processor(): return dict( - admin_base_template=admin.base_template, + admin_base_template=admin.theme.base_template, admin_view=admin.index_view, h=admin_helpers, get_url=url_for diff --git a/examples/custom-layout/app.py b/examples/custom-layout/app.py index fe7b173ef..b68e0cc4f 100644 --- a/examples/custom-layout/app.py +++ b/examples/custom-layout/app.py @@ -59,7 +59,7 @@ def index(): # Create admin with custom base template -admin = admin.Admin(app, 'Example: Layout-BS3', base_template='layout.html', theme=Bootstrap3Theme()) +admin = admin.Admin(app, 'Example: Layout-BS3', theme=Bootstrap3Theme(base_template='layout.html')) # Add views admin.add_view(UserAdmin(User, db.session)) diff --git a/flask_admin/base.py b/flask_admin/base.py index 6552ea5cf..31353bd04 100644 --- a/flask_admin/base.py +++ b/flask_admin/base.py @@ -297,7 +297,7 @@ def render(self, template, **kwargs): """ # Store self as admin_view kwargs['admin_view'] = self - kwargs['admin_base_template'] = self.admin.base_template + kwargs['admin_base_template'] = self.admin.theme.base_template # Provide i18n support even if flask-babel is not installed # or enabled. @@ -475,7 +475,6 @@ def __init__(self, app=None, name=None, translations_path=None, endpoint=None, static_url_path=None, - base_template=None, theme: t.Optional[Theme] = None, category_icon_classes=None, host=None): @@ -501,8 +500,6 @@ def __init__(self, app=None, name=None, :param static_url_path: Static URL Path. If provided, this specifies the default path to the static url directory for all its views. Can be overridden in view configuration. - :param base_template: - Override base HTML template for all static views. Defaults to `admin/base.html`. :param theme: Base theme. Defaults to `Bootstrap2Theme()`. If you want to use Bootstrap 3 or 4 integration, change it to `Bootstrap3Theme()` or `Bootstrap4Theme()`. @@ -531,7 +528,6 @@ def __init__(self, app=None, name=None, self.static_url_path = static_url_path self.subdomain = subdomain self.host = host - self.base_template = base_template or 'admin/base.html' self.theme = theme or Bootstrap2Theme() self.category_icon_classes = category_icon_classes or dict() diff --git a/flask_admin/theme.py b/flask_admin/theme.py index a43252963..6c61661d0 100644 --- a/flask_admin/theme.py +++ b/flask_admin/theme.py @@ -1,16 +1,18 @@ -import typing from dataclasses import dataclass +import typing from functools import partial @dataclass class Theme: folder: str # The templates folder name to use + base_template: str @dataclass class BootstrapTheme(Theme): folder: typing.Literal['bootstrap2', 'bootstrap3', 'bootstrap4'] + base_template: str = 'admin/base.html' swatch: str = 'default' fluid: bool = False From bbf4f5e26ba073cd335c3288cae6b4bd619297e4 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Sun, 21 Jul 2024 07:12:07 +0100 Subject: [PATCH 040/156] Improve/fix geoalchemy example --- examples/geo_alchemy/app.py | 2 ++ examples/geo_alchemy/config.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/geo_alchemy/app.py b/examples/geo_alchemy/app.py index c51f8a793..97fc25a94 100644 --- a/examples/geo_alchemy/app.py +++ b/examples/geo_alchemy/app.py @@ -1,4 +1,5 @@ from flask import Flask +from flask_babel import Babel from flask_sqlalchemy import SQLAlchemy import flask_admin as admin @@ -10,6 +11,7 @@ # Create application app = Flask(__name__) +babel = Babel(app) app.config.from_pyfile('config.py') db = SQLAlchemy(app) diff --git a/examples/geo_alchemy/config.py b/examples/geo_alchemy/config.py index fa0516330..54126793f 100644 --- a/examples/geo_alchemy/config.py +++ b/examples/geo_alchemy/config.py @@ -6,7 +6,7 @@ SQLALCHEMY_ECHO = True # credentials for loading map tiles from mapbox -MAPBOX_MAP_ID = '...' +MAPBOX_MAP_ID = 'light-v10' # example map id MAPBOX_ACCESS_TOKEN = '...' # when the creating new shapes, use this default map center From 8a812495e970ca8fbae75c33e551846649631cff Mon Sep 17 00:00:00 2001 From: Titotix M <titotix@free.fr> Date: Thu, 29 Dec 2022 15:57:46 +0100 Subject: [PATCH 041/156] fix: example code for sqla-custom-inline-forms Co-authored-by: Samuel Williams <samuelhwilliams@users.noreply.github.com> --- examples/sqla-custom-inline-forms/app.py | 50 +++++++++---------- .../sqla-custom-inline-forms/requirements.txt | 2 +- 2 files changed, 24 insertions(+), 28 deletions(-) diff --git a/examples/sqla-custom-inline-forms/app.py b/examples/sqla-custom-inline-forms/app.py index 55eb3365d..85535acd6 100644 --- a/examples/sqla-custom-inline-forms/app.py +++ b/examples/sqla-custom-inline-forms/app.py @@ -1,6 +1,5 @@ import os import os.path as op -from pathlib import Path from werkzeug.utils import secure_filename from sqlalchemy import event @@ -116,13 +115,13 @@ class LocationImageInlineModelForm(InlineFormAdmin): } def __init__(self): - return super(LocationImageInlineModelForm, self).__init__(LocationImage) + super(LocationImageInlineModelForm, self).__init__(LocationImage) def postprocess_form(self, form_class): form_class.upload = fields.FileField('Image') return form_class - def on_model_change(self, form, model): + def on_model_change(self, form, model, is_created): file_data = request.files.get(form.upload.name) if file_data: @@ -137,7 +136,7 @@ class LocationAdmin(ModelView): inline_models = (LocationImageInlineModelForm(),) def __init__(self): - super(LocationAdmin, self).__init__(Location, db.session, name='Locations') + super().__init__(Location, db.session, name='Locations') # Simple page to show images @@ -149,36 +148,33 @@ def index(): def first_time_setup(): """Run this to setup the database for the first time""" - # Create DB - db.drop_all() - db.create_all() + with app.app_context(): + # Create DB + db.drop_all() + db.create_all() - # Add some image types for the form_ajax_refs inside the inline_model - image_types = ("JPEG", "PNG", "GIF") - for image_type in image_types: - model = ImageType(name=image_type) - db.session.add(model) + # Add some image types for the form_ajax_refs inside the inline_model + image_types = ("JPEG", "PNG", "GIF") + for image_type in image_types: + model = ImageType(name=image_type) + db.session.add(model) - db.session.commit() + db.session.commit() - return +if __name__ == '__main__': + # Create upload directory + try: + os.mkdir(base_path) + except OSError: + pass -# if __name__ == '__main__': -# Create upload directory -try: - os.mkdir(base_path) -except OSError: - pass + # Create DB + first_time_setup() # Create admin admin = admin.Admin(app, name='Example: Inline Models') - - # Add views admin.add_view(LocationAdmin()) -# Create DB -first_time_setup() - -# Start app -app.run(debug=True) + # Start app + app.run(debug=True) diff --git a/examples/sqla-custom-inline-forms/requirements.txt b/examples/sqla-custom-inline-forms/requirements.txt index 59f7b047b..2952b5464 100644 --- a/examples/sqla-custom-inline-forms/requirements.txt +++ b/examples/sqla-custom-inline-forms/requirements.txt @@ -1,4 +1,4 @@ Flask Flask-Admin Flask-SQLAlchemy -WTForms==2.3.3 +WTForms From 6f30e67787f5c1d6322a9e76400105563c2647bd Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Sun, 21 Jul 2024 17:36:19 +0100 Subject: [PATCH 042/156] Delete images when parent deleted directly --- examples/sqla-custom-inline-forms/app.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/examples/sqla-custom-inline-forms/app.py b/examples/sqla-custom-inline-forms/app.py index 85535acd6..686130526 100644 --- a/examples/sqla-custom-inline-forms/app.py +++ b/examples/sqla-custom-inline-forms/app.py @@ -67,13 +67,14 @@ class LocationImage(db.Model): # Register after_delete handler which will delete image file after model gets deleted -@event.listens_for(LocationImage, 'after_delete') +@event.listens_for(Location, 'after_delete') def _handle_image_delete(mapper, conn, target): - try: - if target.path: - os.remove(op.join(base_path, target.path)) - except: - pass + for location_image in target.images: + try: + if location_image.path: + os.remove(op.join(base_path, location_image.path)) + except: + pass # This widget uses custom template for inline field list From bcab74c3f24634a8991f2b7a0a54fba45bed4cf1 Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Sun, 21 Jul 2024 17:40:48 +0100 Subject: [PATCH 043/156] Fix broken export_types documentation link to tablib formats --- flask_admin/model/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flask_admin/model/base.py b/flask_admin/model/base.py index f4452453c..7a053bf93 100755 --- a/flask_admin/model/base.py +++ b/flask_admin/model/base.py @@ -773,7 +773,7 @@ class MyModelView(BaseModelView): A list of available export filetypes. `csv` only is default, but any filetypes supported by tablib can be used. - Check tablib for https://github.com/kennethreitz/tablib/blob/master/README.rst + Check tablib for https://tablib.readthedocs.io/en/stable/formats.html for supported types. """ From aacc43ae4dc8a44ad697cec437034325e6713539 Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Sun, 21 Jul 2024 17:40:48 +0100 Subject: [PATCH 044/156] Test tsv model export using tablib --- flask_admin/tests/test_model.py | 25 +++++++++++++++++++++++++ requirements/tests.in | 1 + 2 files changed, 26 insertions(+) diff --git a/flask_admin/tests/test_model.py b/flask_admin/tests/test_model.py index 5e88d1b66..b8d82b446 100644 --- a/flask_admin/tests/test_model.py +++ b/flask_admin/tests/test_model.py @@ -707,6 +707,31 @@ def export_formatter(v, c, m, p): assert rv.status_code == 500 +def test_export_tablib(app, admin): + client = app.test_client() + + # basic test of tsv export with a few records using tablib + view_data = { + 1: Model(1, "col1_1", "col2_1"), + 2: Model(2, "col1_2", "col2_2"), + 3: Model(3, "col1_3", "col2_3"), + } + + view = MockModelView(Model, view_data, can_export=True, + column_list=['col1', 'col2'], + export_types=['tsv']) + admin.add_view(view) + + rv = client.get('/admin/model/export/tsv/') + data = rv.data.decode('utf-8') + assert rv.mimetype == 'text/tab-separated-values' + assert rv.status_code == 200 + assert "Col1\tCol2\r\n" + \ + "col1_1\tcol2_1\r\n" + \ + "col1_2\tcol2_2\r\n" + \ + "col1_3\tcol2_3\r\n" == data + + def test_list_row_actions(app, admin): client = app.test_client() diff --git a/requirements/tests.in b/requirements/tests.in index 351456205..4952c7526 100644 --- a/requirements/tests.in +++ b/requirements/tests.in @@ -27,3 +27,4 @@ arrow<0.14.0 colour email-validator wtforms +tablib From 7f35a647303c4ce46213292e8abb8132ab27f1c7 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Sun, 21 Jul 2024 20:32:53 +0100 Subject: [PATCH 045/156] Fix JS elements regression in modal windows In #2407 we removed some seemingly-duplicate network requests for `bs4_modal.js` every time a modal window is loaded. This would have been fine if that file didn't not include any side-effects, but it did: it re-applied 'global styling' every time the JS file is loaded. The goal here was to process 'styling' for any dynamica/interactive elements, such as map widgets, and fields that use 'select2' or 'x-editable'. When we removed these 'extra' JS calls, the modal windows stopped getting these interactive elements enabled/setup. This patch restores that functionality, while still retaining the goal of PR #2407: to prevent duplicate network requests for a file. We load `bs<x>_modal.js` on all pages that can display modals; this file now only sets up the event listener that is responsible for making sure a modal is cleared out/refreshed between multiple modal displays. The logic for applying styling to the window is now added inline to all of the relevant modal components. A further improvement on what we had before is that now, the call to add styling is scoped specifically to the modal. This prevents the issue described in #2351, where map elements may show up multiple times on the page because `applyGlobalStyles` is called multiple times. --- flask_admin/static/admin/js/bs2_modal.js | 13 +-- flask_admin/static/admin/js/bs3_modal.js | 13 +-- flask_admin/static/admin/js/bs4_modal.js | 5 -- .../templates/bootstrap2/admin/file/list.html | 1 + .../bootstrap2/admin/model/list.html | 1 + .../bootstrap2/admin/model/modals/create.html | 2 +- .../admin/model/modals/details.html | 80 +++++++++---------- .../bootstrap2/admin/model/modals/edit.html | 2 +- .../templates/bootstrap3/admin/file/list.html | 1 + .../bootstrap3/admin/model/list.html | 1 + .../bootstrap3/admin/model/modals/create.html | 2 +- .../admin/model/modals/details.html | 80 +++++++++---------- .../bootstrap3/admin/model/modals/edit.html | 2 +- .../bootstrap4/admin/model/modals/create.html | 4 + .../admin/model/modals/details.html | 3 +- .../bootstrap4/admin/model/modals/edit.html | 3 + 16 files changed, 105 insertions(+), 108 deletions(-) diff --git a/flask_admin/static/admin/js/bs2_modal.js b/flask_admin/static/admin/js/bs2_modal.js index 6a3b5f2bc..0174a8dc4 100755 --- a/flask_admin/static/admin/js/bs2_modal.js +++ b/flask_admin/static/admin/js/bs2_modal.js @@ -1,9 +1,4 @@ -// fixes "remote modal shows same content every time" -$('.modal').on('hidden', function() { - $(this).removeData('modal'); -}); - -$(function() { - // Apply flask-admin form styles after the modal is loaded - window.faForm.applyGlobalStyles(document); -}); +// fixes "remote modal shows same content every time" +$('.modal').on('hidden', function() { + $(this).removeData('modal'); +}); diff --git a/flask_admin/static/admin/js/bs3_modal.js b/flask_admin/static/admin/js/bs3_modal.js index ce67e1673..a93b2391c 100755 --- a/flask_admin/static/admin/js/bs3_modal.js +++ b/flask_admin/static/admin/js/bs3_modal.js @@ -1,9 +1,4 @@ -// fixes "remote modal shows same content every time", avoiding the flicker -$('body').on('hidden.bs.modal', '.modal', function () { - $(this).removeData('bs.modal').find(".modal-content").empty(); -}); - -$(function() { - // Apply flask-admin form styles after the modal is loaded - window.faForm.applyGlobalStyles(document); -}); +// fixes "remote modal shows same content every time", avoiding the flicker +$('body').on('hidden.bs.modal', '.modal', function () { + $(this).removeData('bs.modal').find(".modal-content").empty(); +}); diff --git a/flask_admin/static/admin/js/bs4_modal.js b/flask_admin/static/admin/js/bs4_modal.js index 99e1fc807..f84a03b76 100644 --- a/flask_admin/static/admin/js/bs4_modal.js +++ b/flask_admin/static/admin/js/bs4_modal.js @@ -2,8 +2,3 @@ $('body').on('click.modal.data-api', '[data-toggle="modal"]', function () { $($(this).data("target") + ' .modal-content').load($(this).attr('href')); }); - -$(function() { - // Apply flask-admin form styles after the modal is loaded - window.faForm.applyGlobalStyles(document); -}); diff --git a/flask_admin/templates/bootstrap2/admin/file/list.html b/flask_admin/templates/bootstrap2/admin/file/list.html index f3883c9c5..8817cca00 100644 --- a/flask_admin/templates/bootstrap2/admin/file/list.html +++ b/flask_admin/templates/bootstrap2/admin/file/list.html @@ -193,4 +193,5 @@ {{ actionslib.script(_gettext('Please select at least one file.'), actions, actions_confirmation) }} + <script src="{{ admin_static.url(filename='admin/js/bs2_modal.js', v='1.0.0') }}"></script> {% endblock %} diff --git a/flask_admin/templates/bootstrap2/admin/model/list.html b/flask_admin/templates/bootstrap2/admin/model/list.html index c3b29593d..255dbcef6 100755 --- a/flask_admin/templates/bootstrap2/admin/model/list.html +++ b/flask_admin/templates/bootstrap2/admin/model/list.html @@ -189,6 +189,7 @@ {{ lib.form_js() }} <script src="{{ admin_static.url(filename='admin/js/filters.js', v='1.0.0') }}"></script> + <script src="{{ admin_static.url(filename='admin/js/bs2_modal.js', v='1.0.0') }}"></script> {{ actionlib.script(_gettext('Please select at least one record.'), actions, diff --git a/flask_admin/templates/bootstrap2/admin/model/modals/create.html b/flask_admin/templates/bootstrap2/admin/model/modals/create.html index 58b3f45ec..a6c410f19 100644 --- a/flask_admin/templates/bootstrap2/admin/model/modals/create.html +++ b/flask_admin/templates/bootstrap2/admin/model/modals/create.html @@ -14,7 +14,7 @@ {% endblock %} {% block tail %} - <script src="{{ admin_static.url(filename='admin/js/bs2_modal.js', v='1.0.0') }}"></script> + <script>window.faForm.applyGlobalStyles(document.getElementsByClassName('modal'))</script> <script> // fill the header of modal dynamically diff --git a/flask_admin/templates/bootstrap2/admin/model/modals/details.html b/flask_admin/templates/bootstrap2/admin/model/modals/details.html index 3580ca4d9..ce31c9e0c 100755 --- a/flask_admin/templates/bootstrap2/admin/model/modals/details.html +++ b/flask_admin/templates/bootstrap2/admin/model/modals/details.html @@ -1,40 +1,40 @@ -{% import 'admin/static.html' as admin_static with context%} -{% import 'admin/lib.html' as lib with context %} - -{% block body %} - {% block details_search %} - <div class="row-fluid"> - <div class="input-prepend fa_filter_container"> - <span class="add-on">{{ _gettext('Filter') }}</span> - <input id="fa_filter" id="prependedInput" type="text"> - </div> - </div> - {% endblock %} - - {% block details_table %} - <table class="table table-hover table-bordered searchable"> - {% for c, name in details_columns %} - <tr> - <td> - <b>{{ name }}</b> - </td> - <td> - {{ get_value(model, c) }} - </td> - </tr> - {% endfor %} - </table> - {% endblock %} -{% endblock %} - -{% block tail %} - <script src="{{ admin_static.url(filename='admin/js/details_filter.js', v='1.0.0') }}"></script> - <script src="{{ admin_static.url(filename='admin/js/bs2_modal.js', v='1.0.0') }}"></script> - - <script> - // fill the header of modal dynamically - $('.modal-header h3').html('{% block header_text -%} - {{ _gettext('View Record') + ' #' + request.args.get('id') }} - {%- endblock %}'); - </script> -{% endblock %} +{% import 'admin/static.html' as admin_static with context%} +{% import 'admin/lib.html' as lib with context %} + +{% block body %} + {% block details_search %} + <div class="row-fluid"> + <div class="input-prepend fa_filter_container"> + <span class="add-on">{{ _gettext('Filter') }}</span> + <input id="fa_filter" id="prependedInput" type="text"> + </div> + </div> + {% endblock %} + + {% block details_table %} + <table class="table table-hover table-bordered searchable"> + {% for c, name in details_columns %} + <tr> + <td> + <b>{{ name }}</b> + </td> + <td> + {{ get_value(model, c) }} + </td> + </tr> + {% endfor %} + </table> + {% endblock %} +{% endblock %} + +{% block tail %} + <script src="{{ admin_static.url(filename='admin/js/details_filter.js', v='1.0.0') }}"></script> + <script>window.faForm.applyGlobalStyles(document.getElementsByClassName('modal'))</script> + + <script> + // fill the header of modal dynamically + $('.modal-header h3').html('{% block header_text -%} + {{ _gettext('View Record') + ' #' + request.args.get('id') }} + {%- endblock %}'); + </script> +{% endblock %} diff --git a/flask_admin/templates/bootstrap2/admin/model/modals/edit.html b/flask_admin/templates/bootstrap2/admin/model/modals/edit.html index 569aab992..91f5dfb58 100644 --- a/flask_admin/templates/bootstrap2/admin/model/modals/edit.html +++ b/flask_admin/templates/bootstrap2/admin/model/modals/edit.html @@ -14,7 +14,7 @@ {% endblock %} {% block tail %} - <script src="{{ admin_static.url(filename='admin/js/bs2_modal.js', v='1.0.0') }}"></script> + <script>window.faForm.applyGlobalStyles(document.getElementsByClassName('modal'))</script> <script> // fill the header of modal dynamically diff --git a/flask_admin/templates/bootstrap3/admin/file/list.html b/flask_admin/templates/bootstrap3/admin/file/list.html index 1fb093e10..330a8cc86 100644 --- a/flask_admin/templates/bootstrap3/admin/file/list.html +++ b/flask_admin/templates/bootstrap3/admin/file/list.html @@ -193,4 +193,5 @@ {{ actionslib.script(_gettext('Please select at least one file.'), actions, actions_confirmation) }} + <script src="{{ admin_static.url(filename='admin/js/bs3_modal.js', v='1.0.0') }}"></script> {% endblock %} diff --git a/flask_admin/templates/bootstrap3/admin/model/list.html b/flask_admin/templates/bootstrap3/admin/model/list.html index 08c1d5743..11ef4332b 100755 --- a/flask_admin/templates/bootstrap3/admin/model/list.html +++ b/flask_admin/templates/bootstrap3/admin/model/list.html @@ -190,6 +190,7 @@ {{ lib.form_js() }} <script src="{{ admin_static.url(filename='admin/js/filters.js', v='1.0.0') }}"></script> + <script src="{{ admin_static.url(filename='admin/js/bs3_modal.js', v='1.0.0') }}"></script> {{ actionlib.script(_gettext('Please select at least one record.'), actions, diff --git a/flask_admin/templates/bootstrap3/admin/model/modals/create.html b/flask_admin/templates/bootstrap3/admin/model/modals/create.html index abc1cf58e..4638bfd0f 100644 --- a/flask_admin/templates/bootstrap3/admin/model/modals/create.html +++ b/flask_admin/templates/bootstrap3/admin/model/modals/create.html @@ -20,5 +20,5 @@ {% endblock %} {% block tail %} - <script src="{{ admin_static.url(filename='admin/js/bs3_modal.js', v='1.0.0') }}"></script> + <script>window.faForm.applyGlobalStyles(document.getElementsByClassName('modal-content'));</script> {% endblock %} diff --git a/flask_admin/templates/bootstrap3/admin/model/modals/details.html b/flask_admin/templates/bootstrap3/admin/model/modals/details.html index 9abb55d38..540e31ae1 100755 --- a/flask_admin/templates/bootstrap3/admin/model/modals/details.html +++ b/flask_admin/templates/bootstrap3/admin/model/modals/details.html @@ -1,40 +1,40 @@ -{% import 'admin/static.html' as admin_static with context%} -{% import 'admin/lib.html' as lib with context %} - -{% block body %} - <div class="modal-header"> - <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> - {% block header_text %} - <h3>{{ _gettext('View Record') + ' #' + request.args.get('id') }}</h3> - {% endblock %} - </div> - - <div class="modal-body"> - {% block details_search %} - <div class="input-group fa_filter_container col-lg-6"> - <span class="input-group-addon">{{ _gettext('Filter') }}</span> - <input id="fa_filter" type="text" class="form-control"> - </div> - {% endblock %} - - {% block details_table %} - <table class="table table-hover table-bordered searchable"> - {% for c, name in details_columns %} - <tr> - <td> - <b>{{ name }}</b> - </td> - <td> - {{ get_value(model, c) }} - </td> - </tr> - {% endfor %} - </table> - {% endblock %} - </div> -{% endblock %} - -{% block tail %} - <script src="{{ admin_static.url(filename='admin/js/details_filter.js', v='1.0.0') }}"></script> - <script src="{{ admin_static.url(filename='admin/js/bs3_modal.js', v='1.0.0') }}"></script> -{% endblock %} +{% import 'admin/static.html' as admin_static with context%} +{% import 'admin/lib.html' as lib with context %} + +{% block body %} + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> + {% block header_text %} + <h3>{{ _gettext('View Record') + ' #' + request.args.get('id') }}</h3> + {% endblock %} + </div> + + <div class="modal-body"> + {% block details_search %} + <div class="input-group fa_filter_container col-lg-6"> + <span class="input-group-addon">{{ _gettext('Filter') }}</span> + <input id="fa_filter" type="text" class="form-control"> + </div> + {% endblock %} + + {% block details_table %} + <table class="table table-hover table-bordered searchable"> + {% for c, name in details_columns %} + <tr> + <td> + <b>{{ name }}</b> + </td> + <td> + {{ get_value(model, c) }} + </td> + </tr> + {% endfor %} + </table> + {% endblock %} + </div> +{% endblock %} + +{% block tail %} + <script src="{{ admin_static.url(filename='admin/js/details_filter.js', v='1.0.0') }}"></script> + <script>window.faForm.applyGlobalStyles(document.getElementsByClassName('modal-content'));</script> +{% endblock %} diff --git a/flask_admin/templates/bootstrap3/admin/model/modals/edit.html b/flask_admin/templates/bootstrap3/admin/model/modals/edit.html index 8897810f4..ceaaca074 100644 --- a/flask_admin/templates/bootstrap3/admin/model/modals/edit.html +++ b/flask_admin/templates/bootstrap3/admin/model/modals/edit.html @@ -22,5 +22,5 @@ <h3>{{ _gettext('Edit Record') + ' #' + request.args.get('id') }}</h3> {% endblock %} {% block tail %} - <script src="{{ admin_static.url(filename='admin/js/bs3_modal.js', v='1.0.0') }}"></script> + <script>window.faForm.applyGlobalStyles(document.getElementsByClassName('modal-content'));</script> {% endblock %} diff --git a/flask_admin/templates/bootstrap4/admin/model/modals/create.html b/flask_admin/templates/bootstrap4/admin/model/modals/create.html index 8c5aee463..2338b042a 100644 --- a/flask_admin/templates/bootstrap4/admin/model/modals/create.html +++ b/flask_admin/templates/bootstrap4/admin/model/modals/create.html @@ -30,3 +30,7 @@ {% endblock %} + +{% block tail %} + <script>window.faForm.applyGlobalStyles(document.getElementsByClassName('modal-content'));</script> +{% endblock %} diff --git a/flask_admin/templates/bootstrap4/admin/model/modals/details.html b/flask_admin/templates/bootstrap4/admin/model/modals/details.html index 0e8a52cdf..30e631347 100755 --- a/flask_admin/templates/bootstrap4/admin/model/modals/details.html +++ b/flask_admin/templates/bootstrap4/admin/model/modals/details.html @@ -36,4 +36,5 @@ <h3>{{ _gettext('View Record') + ' #' + request.args.get('id') }}</h3> {% block tail %} <script src="{{ admin_static.url(filename='admin/js/details_filter.js', v='1.0.0') }}"></script> -{% endblock %} \ No newline at end of file + <script>window.faForm.applyGlobalStyles(document.getElementsByClassName('modal-content'));</script> +{% endblock %} diff --git a/flask_admin/templates/bootstrap4/admin/model/modals/edit.html b/flask_admin/templates/bootstrap4/admin/model/modals/edit.html index a39f7e8b2..4f69e26e4 100644 --- a/flask_admin/templates/bootstrap4/admin/model/modals/edit.html +++ b/flask_admin/templates/bootstrap4/admin/model/modals/edit.html @@ -23,5 +23,8 @@ <h5 class="modal-title">{{ _gettext('Edit Record') + ' #' + request.args.get('id {{ lib.render_form_buttons(return_url, extra=None, is_modal=True) }} </div> {% endcall %} +{% endblock %} +{% block tail %} + <script>window.faForm.applyGlobalStyles(document.getElementsByClassName('modal-content'));</script> {% endblock %} From b38afd6c905f3709d5980220d8457e3acb63b7bc Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Sun, 21 Jul 2024 20:41:22 +0100 Subject: [PATCH 046/156] Update geoalchemy example with modal edit --- examples/geo_alchemy/app.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/examples/geo_alchemy/app.py b/examples/geo_alchemy/app.py index 97fc25a94..d7fc4937f 100644 --- a/examples/geo_alchemy/app.py +++ b/examples/geo_alchemy/app.py @@ -60,13 +60,17 @@ def index(): # Create admin admin = admin.Admin(app, name='Example: GeoAlchemy', theme=Bootstrap4Theme()) + +class ModalModelView(ModelView): + edit_modal = True + # Add views -admin.add_view(ModelView(Point, db.session, category='Points')) -admin.add_view(ModelView(MultiPoint, db.session, category='Points')) -admin.add_view(ModelView(Polygon, db.session, category='Polygons')) -admin.add_view(ModelView(MultiPolygon, db.session, category='Polygons')) -admin.add_view(ModelView(LineString, db.session, category='Lines')) -admin.add_view(ModelView(MultiLineString, db.session, category='Lines')) +admin.add_view(ModalModelView(Point, db.session, category='Points')) +admin.add_view(ModalModelView(MultiPoint, db.session, category='Points')) +admin.add_view(ModalModelView(Polygon, db.session, category='Polygons')) +admin.add_view(ModalModelView(MultiPolygon, db.session, category='Polygons')) +admin.add_view(ModalModelView(LineString, db.session, category='Lines')) +admin.add_view(ModalModelView(MultiLineString, db.session, category='Lines')) if __name__ == '__main__': From 68bc6de4056c493a44b616e9bc4ac7850c0441fe Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Mon, 22 Jul 2024 07:35:49 +0100 Subject: [PATCH 047/156] Remove redundant passenv from tox This env var is no longer needed on macos - and regardless of that, it actually doesn't get passed through as macos does not pass through DYLD_ vars (part of their 'system integrity protection') --- tox.ini | 1 - 1 file changed, 1 deletion(-) diff --git a/tox.ini b/tox.ini index 8ea0728d5..9dfe9ddbe 100644 --- a/tox.ini +++ b/tox.ini @@ -12,7 +12,6 @@ package = wheel wheel_build_env = .pkg constrain_package_deps = true use_frozen_constraints = true -passenv = DYLD_LIBRARY_PATH # TODO: Remove SQLALCHEMY_SILENCE_UBER_WARNINGwhen Flask-Admin is compatible with SQLAlchemy>=2.0.0 setenv = SQLALCHEMY_SILENCE_UBER_WARNING = 1 From 1a647bec56cc3a269a9aa3ffbf56405719498281 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Tue, 23 Jul 2024 07:49:17 +0100 Subject: [PATCH 048/156] Namespace all flask-admin configuration --- doc/advanced.rst | 12 +++++++--- examples/geo_alchemy/config.py | 8 +++---- flask_admin/contrib/sqla/view.py | 4 ++-- flask_admin/model/base.py | 2 +- flask_admin/static/admin/js/form.js | 16 +++++++------- .../templates/bootstrap2/admin/lib.html | 22 +++++++++---------- .../templates/bootstrap3/admin/lib.html | 22 +++++++++---------- .../templates/bootstrap4/admin/lib.html | 22 +++++++++---------- 8 files changed, 57 insertions(+), 51 deletions(-) diff --git a/doc/advanced.rst b/doc/advanced.rst index 93be11b83..9fd41e357 100644 --- a/doc/advanced.rst +++ b/doc/advanced.rst @@ -280,14 +280,20 @@ To have map data display correctly, you'll have to sign up for an account at htt and include some credentials in your application's config:: app = Flask(__name__) - app.config['MAPBOX_MAP_ID'] = "example.abc123" - app.config['MAPBOX_ACCESS_TOKEN'] = "pk.def456" - + app.config['FLASK_ADMIN_MAPBOX_MAP_ID'] = "example.abc123" + app.config['FLASK_ADMIN_MAPBOX_ACCESS_TOKEN'] = "pk.def456" + app.config['FLASK_ADMIN_DEFAULT_CENTER_LAT'] = -33.918861 # Replace with your own value + app.config['FLASK_ADMIN_DEFAULT_CENTER_LONG'] = 18.423300 # Replace with your own value Leaflet supports loading map tiles from any arbitrary map tile provider, but at the moment, Flask-Admin only supports Mapbox. If you want to use other providers, make a pull request! +If you want to include a search box on map widgets for looking up locations, you need the following additional configuration:: + + app.config['FLASK_ADMIN_MAPBOX_SEARCH'] = True + app.config['FLASK_ADMIN_GOOGLE_MAPS_API_KEY'] = 'secret' + Limitations *********** diff --git a/examples/geo_alchemy/config.py b/examples/geo_alchemy/config.py index 54126793f..1e21cee3d 100644 --- a/examples/geo_alchemy/config.py +++ b/examples/geo_alchemy/config.py @@ -6,9 +6,9 @@ SQLALCHEMY_ECHO = True # credentials for loading map tiles from mapbox -MAPBOX_MAP_ID = 'light-v10' # example map id -MAPBOX_ACCESS_TOKEN = '...' +FLASK_ADMIN_MAPBOX_MAP_ID = 'light-v10' # example map id +FLASK_ADMIN_MAPBOX_ACCESS_TOKEN = '...' # when the creating new shapes, use this default map center -DEFAULT_CENTER_LAT = -33.918861 -DEFAULT_CENTER_LONG = 18.423300 +FLASK_ADMIN_DEFAULT_CENTER_LAT = -33.918861 +FLASK_ADMIN_DEFAULT_CENTER_LONG = 18.423300 diff --git a/flask_admin/contrib/sqla/view.py b/flask_admin/contrib/sqla/view.py index 9b4622d5b..531985832 100755 --- a/flask_admin/contrib/sqla/view.py +++ b/flask_admin/contrib/sqla/view.py @@ -1126,8 +1126,8 @@ def get_one(self, id): def handle_view_exception(self, exc): if isinstance(exc, IntegrityError): if current_app.config.get( - 'ADMIN_RAISE_ON_INTEGRITY_ERROR', - current_app.config.get('ADMIN_RAISE_ON_VIEW_EXCEPTION') + 'FLASK_ADMIN_RAISE_ON_INTEGRITY_ERROR', + current_app.config.get('FLASK_ADMIN_RAISE_ON_VIEW_EXCEPTION') ): raise else: diff --git a/flask_admin/model/base.py b/flask_admin/model/base.py index 7a053bf93..920cc8531 100755 --- a/flask_admin/model/base.py +++ b/flask_admin/model/base.py @@ -1550,7 +1550,7 @@ def handle_view_exception(self, exc): flash(as_unicode(exc), 'error') return True - if current_app.config.get('ADMIN_RAISE_ON_VIEW_EXCEPTION'): + if current_app.config.get('FLASK_ADMIN_RAISE_ON_VIEW_EXCEPTION'): raise if self._debug: diff --git a/flask_admin/static/admin/js/form.js b/flask_admin/static/admin/js/form.js index 0f1176d6a..d298d8c4f 100644 --- a/flask_admin/static/admin/js/form.js +++ b/flask_admin/static/admin/js/form.js @@ -74,12 +74,12 @@ * Process Leaflet (map) widget */ function processLeafletWidget($el, name) { - if (!window.MAPBOX_MAP_ID) { - console.error("You must set MAPBOX_MAP_ID in your Flask settings to use the map widget"); + if (!window.FLASK_ADMIN_MAPBOX_MAP_ID) { + console.error("You must set FLASK_ADMIN_MAPBOX_MAP_ID in your Flask settings to use the map widget"); return false; } - if (!window.DEFAULT_CENTER_LAT || !window.DEFAULT_CENTER_LONG) { - console.error("You must set DEFAULT_CENTER_LAT and DEFAULT_CENTER_LONG in your Flask settings to use the map widget"); + if (!window.FLASK_ADMIN_DEFAULT_CENTER_LAT || !window.FLASK_ADMIN_DEFAULT_CENTER_LONG) { + console.error("You must set FLASK_ADMIN_DEFAULT_CENTER_LAT and FLASK_ADMIN_DEFAULT_CENTER_LONG in your Flask settings to use the map widget"); return false; } @@ -154,11 +154,11 @@ } } else { // use the default map center - map.setView([window.DEFAULT_CENTER_LAT, window.DEFAULT_CENTER_LONG], 12); + map.setView([window.FLASK_ADMIN_DEFAULT_CENTER_LAT, window.FLASK_ADMIN_DEFAULT_CENTER_LONG], 12); } // set up tiles - var mapboxHostnameAndPath = $el.data('tile-layer-url') || 'api.mapbox.com/styles/v1/mapbox/'+window.MAPBOX_MAP_ID+'/tiles/{z}/{x}/{y}?access_token={accessToken}'; + var mapboxHostnameAndPath = $el.data('tile-layer-url') || 'api.mapbox.com/styles/v1/mapbox/'+window.FLASK_ADMIN_MAPBOX_MAP_ID+'/tiles/{z}/{x}/{y}?access_token={accessToken}'; var attribution = $el.data('tile-layer-attribution') || 'Map data © <a href="//openstreetmap.org">OpenStreetMap</a> contributors, <a href="//creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="//mapbox.com">Mapbox</a>'; L.tileLayer('//' + mapboxHostnameAndPath, { // Attributes from https://docs.mapbox.com/help/troubleshooting/migrate-legacy-static-tiles-api/ @@ -166,7 +166,7 @@ maxZoom: 18, tileSize: 512, zoomOffset: -1, - accessToken: window.MAPBOX_ACCESS_TOKEN + accessToken: window.FLASK_ADMIN_MAPBOX_ACCESS_TOKEN }).addTo(map); // everything below here is to set up editing, so if we're not editable, @@ -201,7 +201,7 @@ } var drawControl = new L.Control.Draw(drawOptions); map.addControl(drawControl); - if (window.MAPBOX_SEARCH) { + if (window.FLASK_ADMIN_MAPBOX_SEARCH) { var circle = L.circleMarker([0, 0]); var $autocompleteEl = $('<input style="position: absolute; z-index: 9999; display: block; margin: -42px 0 0 10px; width: 50%">'); var $form = $($el.get(0).form); diff --git a/flask_admin/templates/bootstrap2/admin/lib.html b/flask_admin/templates/bootstrap2/admin/lib.html index f05d5f93e..37d50cbec 100644 --- a/flask_admin/templates/bootstrap2/admin/lib.html +++ b/flask_admin/templates/bootstrap2/admin/lib.html @@ -218,7 +218,7 @@ <h3>{{ text }}</h3> {% macro form_css() %} <link href="{{ admin_static.url(filename='vendor/select2/select2.css', v='3.5.2') }}" rel="stylesheet"> <link href="{{ admin_static.url(filename='vendor/bootstrap-daterangepicker/daterangepicker-bs2.css', v='1.3.22') }}" rel="stylesheet"> - {% if config.MAPBOX_MAP_ID %} + {% if config.FLASK_ADMIN_MAPBOX_MAP_ID %} <link href="{{ admin_static.url(filename='vendor/leaflet/leaflet.css', v='1.0.2') }}" rel="stylesheet"> <link href="{{ admin_static.url(filename='vendor/leaflet/leaflet.draw.css', v='0.4.6') }}" rel="stylesheet"> {% endif %} @@ -228,24 +228,24 @@ <h3>{{ text }}</h3> {% endmacro %} {% macro form_js() %} - {% if config.MAPBOX_MAP_ID %} + {% if config.FLASK_ADMIN_MAPBOX_MAP_ID %} <script> - window.MAPBOX_MAP_ID = "{{ config.MAPBOX_MAP_ID }}"; - {% if config.MAPBOX_ACCESS_TOKEN %} - window.MAPBOX_ACCESS_TOKEN = "{{ config.MAPBOX_ACCESS_TOKEN }}"; + window.FLASK_ADMIN_MAPBOX_MAP_ID = "{{ config.FLASK_ADMIN_MAPBOX_MAP_ID }}"; + {% if config.FLASK_ADMIN_MAPBOX_ACCESS_TOKEN %} + window.FLASK_ADMIN_MAPBOX_ACCESS_TOKEN = "{{ config.FLASK_ADMIN_MAPBOX_ACCESS_TOKEN }}"; {% endif %} - {% if config.DEFAULT_CENTER_LAT and config.DEFAULT_CENTER_LONG %} - window.DEFAULT_CENTER_LAT = "{{ config.DEFAULT_CENTER_LAT }}"; - window.DEFAULT_CENTER_LONG = "{{ config.DEFAULT_CENTER_LONG }}"; + {% if config.FLASK_ADMIN_DEFAULT_CENTER_LAT and config.FLASK_ADMIN_DEFAULT_CENTER_LONG %} + window.FLASK_ADMIN_DEFAULT_CENTER_LAT = "{{ config.FLASK_ADMIN_DEFAULT_CENTER_LAT }}"; + window.FLASK_ADMIN_DEFAULT_CENTER_LONG = "{{ config.FLASK_ADMIN_DEFAULT_CENTER_LONG }}"; {% endif %} </script> <script src="{{ admin_static.url(filename='vendor/leaflet/leaflet.js', v='1.0.2') }}"></script> <script src="{{ admin_static.url(filename='vendor/leaflet/leaflet.draw.js', v='0.4.6') }}"></script> - {% if config.MAPBOX_SEARCH %} + {% if config.FLASK_ADMIN_MAPBOX_SEARCH %} <script> - window.MAPBOX_SEARCH = "{{ config.MAPBOX_SEARCH }}"; + window.FLASK_ADMIN_MAPBOX_SEARCH = "{{ config.FLASK_ADMIN_MAPBOX_SEARCH }}"; </script> - <script src="https://maps.googleapis.com/maps/api/js?v=3&libraries=places&key={{ config.get('GOOGLE_MAPS_API_KEY') }}"></script> + <script src="https://maps.googleapis.com/maps/api/js?v=3&libraries=places&key={{ config.get('FLASK_ADMIN_GOOGLE_MAPS_API_KEY') }}"></script> {% endif %} {% endif %} <script src="{{ admin_static.url(filename='vendor/bootstrap-daterangepicker/daterangepicker.js', v='1.3.22') }}"></script> diff --git a/flask_admin/templates/bootstrap3/admin/lib.html b/flask_admin/templates/bootstrap3/admin/lib.html index 6bfdb05a6..c69f589ed 100644 --- a/flask_admin/templates/bootstrap3/admin/lib.html +++ b/flask_admin/templates/bootstrap3/admin/lib.html @@ -209,7 +209,7 @@ <h3>{{ text }}</h3> <link href="{{ admin_static.url(filename='vendor/select2/select2.css', v='3.5.2') }}" rel="stylesheet"> <link href="{{ admin_static.url(filename='vendor/select2/select2-bootstrap3.css', v='1.4.6') }}" rel="stylesheet"> <link href="{{ admin_static.url(filename='vendor/bootstrap-daterangepicker/daterangepicker-bs3.css', v='1.3.22') }}" rel="stylesheet"> - {% if config.MAPBOX_MAP_ID %} + {% if config.FLASK_ADMIN_MAPBOX_MAP_ID %} <link href="{{ admin_static.url(filename='vendor/leaflet/leaflet.css', v='1.0.2') }}" rel="stylesheet"> <link href="{{ admin_static.url(filename='vendor/leaflet/leaflet.draw.css', v='0.4.6') }}" rel="stylesheet"> {% endif %} @@ -219,24 +219,24 @@ <h3>{{ text }}</h3> {% endmacro %} {% macro form_js() %} - {% if config.MAPBOX_MAP_ID %} + {% if config.FLASK_ADMIN_MAPBOX_MAP_ID %} <script> - window.MAPBOX_MAP_ID = "{{ config.MAPBOX_MAP_ID }}"; - {% if config.MAPBOX_ACCESS_TOKEN %} - window.MAPBOX_ACCESS_TOKEN = "{{ config.MAPBOX_ACCESS_TOKEN }}"; + window.FLASK_ADMIN_MAPBOX_MAP_ID = "{{ config.FLASK_ADMIN_MAPBOX_MAP_ID }}"; + {% if config.FLASK_ADMIN_MAPBOX_ACCESS_TOKEN %} + window.FLASK_ADMIN_MAPBOX_ACCESS_TOKEN = "{{ config.FLASK_ADMIN_MAPBOX_ACCESS_TOKEN }}"; {% endif %} - {% if config.DEFAULT_CENTER_LAT and config.DEFAULT_CENTER_LONG %} - window.DEFAULT_CENTER_LAT = "{{ config.DEFAULT_CENTER_LAT }}"; - window.DEFAULT_CENTER_LONG = "{{ config.DEFAULT_CENTER_LONG }}"; + {% if config.FLASK_ADMIN_DEFAULT_CENTER_LAT and config.FLASK_ADMIN_DEFAULT_CENTER_LONG %} + window.FLASK_ADMIN_DEFAULT_CENTER_LAT = "{{ config.FLASK_ADMIN_DEFAULT_CENTER_LAT }}"; + window.FLASK_ADMIN_DEFAULT_CENTER_LONG = "{{ config.FLASK_ADMIN_DEFAULT_CENTER_LONG }}"; {% endif %} </script> <script src="{{ admin_static.url(filename='vendor/leaflet/leaflet.js', v='1.0.2') }}"></script> <script src="{{ admin_static.url(filename='vendor/leaflet/leaflet.draw.js', v='0.4.6') }}"></script> - {% if config.MAPBOX_SEARCH %} + {% if config.FLASK_ADMIN_MAPBOX_SEARCH %} <script> - window.MAPBOX_SEARCH = "{{ config.MAPBOX_SEARCH }}"; + window.FLASK_ADMIN_MAPBOX_SEARCH = "{{ config.FLASK_ADMIN_MAPBOX_SEARCH }}"; </script> - <script src="https://maps.googleapis.com/maps/api/js?v=3&libraries=places&key={{ config.get('GOOGLE_MAPS_API_KEY') }}"></script> + <script src="https://maps.googleapis.com/maps/api/js?v=3&libraries=places&key={{ config.get('FLASK_ADMIN_GOOGLE_MAPS_API_KEY') }}"></script> {% endif %} {% endif %} <script src="{{ admin_static.url(filename='vendor/bootstrap-daterangepicker/daterangepicker.js', v='1.3.22') }}"></script> diff --git a/flask_admin/templates/bootstrap4/admin/lib.html b/flask_admin/templates/bootstrap4/admin/lib.html index a4d0c37c9..0b021784d 100644 --- a/flask_admin/templates/bootstrap4/admin/lib.html +++ b/flask_admin/templates/bootstrap4/admin/lib.html @@ -247,7 +247,7 @@ <h3>{{ text }}</h3> <link href="{{ admin_static.url(filename='vendor/select2/select2.css', v='4.2.1') }}" rel="stylesheet"> <link href="{{ admin_static.url(filename='vendor/select2/select2-bootstrap4.css', v='1.4.6') }}" rel="stylesheet"> <link href="{{ admin_static.url(filename='vendor/bootstrap-daterangepicker/daterangepicker-bs4.css', v='1.3.22') }}" rel="stylesheet"> - {% if config.MAPBOX_MAP_ID %} + {% if config.FLASK_ADMIN_MAPBOX_MAP_ID %} <link href="{{ admin_static.url(filename='vendor/leaflet/leaflet.css', v='1.0.2') }}" rel="stylesheet"> <link href="{{ admin_static.url(filename='vendor/leaflet/leaflet.draw.css', v='0.4.6') }}" rel="stylesheet"> {% endif %} @@ -257,24 +257,24 @@ <h3>{{ text }}</h3> {% endmacro %} {% macro form_js() %} - {% if config.MAPBOX_MAP_ID %} + {% if config.FLASK_ADMIN_MAPBOX_MAP_ID %} <script> - window.MAPBOX_MAP_ID = "{{ config.MAPBOX_MAP_ID }}"; - {% if config.MAPBOX_ACCESS_TOKEN %} - window.MAPBOX_ACCESS_TOKEN = "{{ config.MAPBOX_ACCESS_TOKEN }}"; + window.FLASK_ADMIN_MAPBOX_MAP_ID = "{{ config.FLASK_ADMIN_MAPBOX_MAP_ID }}"; + {% if config.FLASK_ADMIN_MAPBOX_ACCESS_TOKEN %} + window.FLASK_ADMIN_MAPBOX_ACCESS_TOKEN = "{{ config.FLASK_ADMIN_MAPBOX_ACCESS_TOKEN }}"; {% endif %} - {% if config.DEFAULT_CENTER_LAT and config.DEFAULT_CENTER_LONG %} - window.DEFAULT_CENTER_LAT = "{{ config.DEFAULT_CENTER_LAT }}"; - window.DEFAULT_CENTER_LONG = "{{ config.DEFAULT_CENTER_LONG }}"; + {% if config.FLASK_ADMIN_DEFAULT_CENTER_LAT and config.FLASK_ADMIN_DEFAULT_CENTER_LONG %} + window.FLASK_ADMIN_DEFAULT_CENTER_LAT = "{{ config.FLASK_ADMIN_DEFAULT_CENTER_LAT }}"; + window.FLASK_ADMIN_DEFAULT_CENTER_LONG = "{{ config.FLASK_ADMIN_DEFAULT_CENTER_LONG }}"; {% endif %} </script> <script src="{{ admin_static.url(filename='vendor/leaflet/leaflet.js', v='1.0.2') }}"></script> <script src="{{ admin_static.url(filename='vendor/leaflet/leaflet.draw.js', v='0.4.6') }}"></script> - {% if config.MAPBOX_SEARCH %} + {% if config.FLASK_ADMIN_MAPBOX_SEARCH %} <script> - window.MAPBOX_SEARCH = "{{ config.MAPBOX_SEARCH }}"; + window.FLASK_ADMIN_MAPBOX_SEARCH = "{{ config.FLASK_ADMIN_MAPBOX_SEARCH }}"; </script> - <script src="https://maps.googleapis.com/maps/api/js?v=3&libraries=places&key={{ config.get('GOOGLE_MAPS_API_KEY') }}"></script> + <script src="https://maps.googleapis.com/maps/api/js?v=3&libraries=places&key={{ config.get('FLASK_ADMIN_GOOGLE_MAPS_API_KEY') }}"></script> {% endif %} {% endif %} <script src="{{ admin_static.url(filename='vendor/bootstrap-daterangepicker/daterangepicker.js', v='1.3.22') }}"></script> From 48ba66d8c39b09a61c476444a80718baab15f75c Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Tue, 23 Jul 2024 07:59:09 +0100 Subject: [PATCH 049/156] Add mapbox config to geoalchemy example --- examples/geo_alchemy/config.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/examples/geo_alchemy/config.py b/examples/geo_alchemy/config.py index 1e21cee3d..f0df2dcd7 100644 --- a/examples/geo_alchemy/config.py +++ b/examples/geo_alchemy/config.py @@ -12,3 +12,6 @@ # when the creating new shapes, use this default map center FLASK_ADMIN_DEFAULT_CENTER_LAT = -33.918861 FLASK_ADMIN_DEFAULT_CENTER_LONG = 18.423300 + +FLASK_ADMIN_MAPBOX_SEARCH = True +FLASK_ADMIN_GOOGLE_MAPS_API_KEY = '...' From 7bf6b728f1c00c64915a91bdbc52c09413be87e8 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Tue, 23 Jul 2024 08:42:28 +0100 Subject: [PATCH 050/156] Add documentation around missing env vars --- doc/advanced.rst | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/doc/advanced.rst b/doc/advanced.rst index 9fd41e357..fbcdf4d25 100644 --- a/doc/advanced.rst +++ b/doc/advanced.rst @@ -611,3 +611,34 @@ While the wrapped function should accept only one parameter - `ids`:: raise flash(gettext('Failed to approve users. %(error)s', error=str(ex)), 'error') + + +Raise exceptions instead of flash error messages +------------------------------------------------ + +**** + +By default, Flask-Admin will capture most exceptions related to reading/writing models +and display a flash message instead of raising an exception. If your Flask app is running +in debug mode (ie under local development), exceptions will not be suppressed. + +The flash message behaviour can be overridden with some Flask configuration.:: + + app = Flask(__name__) + app.config['FLASK_ADMIN_RAISE_ON_VIEW_EXCEPTION'] = True + app.config['FLASK_ADMIN_RAISE_ON_INTEGRITY_ERROR'] = True + + +FLASK_ADMIN_RAISE_ON_VIEW_EXCEPTION +*********************************** +Instead of turning exceptions on model create/update/delete actions into flash messages, +raise the exception as normal. You should expect the view to return a 500 to the user, +unless you add specific handling to prevent this. + +FLASK_ADMIN_RAISE_ON_INTEGRITY_ERROR +************************************ +This targets SQLAlchemy specifically. + +Unlike the previous setting, this will specifically only affect the behaviour of +IntegrityErrors. These usually come from violations on constraints in the database, +for example trying to insert a row with a primary key that already exists. From 40ad8050a36fdbf1246a7a997a61ee92532f3007 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Tue, 23 Jul 2024 09:36:58 +0100 Subject: [PATCH 051/156] Rename the conditional maps config variable Previously the Flask app config option `FLASK_ADMIN_MAPBOX_MAP_ID` was required to enable map widgets, even if MapBox wasn't being used. Let's clear up this confusion by having a clearer config name for toggling maps on/off: `FLASK_ADMIN_MAPS`. And then finally update the documentation around maps to talk about this new configuration, and also talk about how to override the default MapBox integration. Finally, we update the geoalchemy example app to have some pages use the default MapBox integration and some use OSM instead. --- doc/advanced.rst | 33 +++++++++++++------ examples/geo_alchemy/app.py | 19 +++++++---- examples/geo_alchemy/config.py | 3 +- flask_admin/static/admin/js/form.js | 6 ++-- .../templates/bootstrap2/admin/lib.html | 9 ++--- .../templates/bootstrap3/admin/lib.html | 9 ++--- .../templates/bootstrap4/admin/lib.html | 9 ++--- 7 files changed, 55 insertions(+), 33 deletions(-) diff --git a/doc/advanced.rst b/doc/advanced.rst index fbcdf4d25..9409c808d 100644 --- a/doc/advanced.rst +++ b/doc/advanced.rst @@ -273,27 +273,40 @@ Some of the Geometry field types that are available include: Have a look at https://github.com/flask-admin/flask-admin/tree/master/examples/geo_alchemy to get started. -Loading Tiles From Mapbox -************************* +Display map widgets +******************* + +Flask-Admin uses `Leaflet <https://leafletjs.com/>`_ to display map widgets for +geographical data. By default, this uses `MapBox <https://www.mapbox.com>`_. -To have map data display correctly, you'll have to sign up for an account at https://www.mapbox.com/ -and include some credentials in your application's config:: +To have MapBox data display correctly, you'll have to sign up for an account and include +some credentials in your application's config:: app = Flask(__name__) + app.config['FLASK_ADMIN_MAPS'] = True + + # Required: configure the default centre position for blank maps + app.config['FLASK_ADMIN_DEFAULT_CENTER_LAT'] = -33.918861 + app.config['FLASK_ADMIN_DEFAULT_CENTER_LONG'] = 18.423300 + + # Required if using the default Mapbox integration app.config['FLASK_ADMIN_MAPBOX_MAP_ID'] = "example.abc123" app.config['FLASK_ADMIN_MAPBOX_ACCESS_TOKEN'] = "pk.def456" - app.config['FLASK_ADMIN_DEFAULT_CENTER_LAT'] = -33.918861 # Replace with your own value - app.config['FLASK_ADMIN_DEFAULT_CENTER_LONG'] = 18.423300 # Replace with your own value -Leaflet supports loading map tiles from any arbitrary map tile provider, but -at the moment, Flask-Admin only supports Mapbox. If you want to use other -providers, make a pull request! +If you want to use a map provider other than MapBox (eg OpenStreetMaps), you can override +the tile layer URLs and tile attribution attributes:: + + class CityView(ModelView): + tile_layer_url = '{s}.tile.openstreetmap.org/{z}/{x}/{y}.png' + tile_layer_attribution = '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors' If you want to include a search box on map widgets for looking up locations, you need the following additional configuration:: - app.config['FLASK_ADMIN_MAPBOX_SEARCH'] = True + app.config['FLASK_ADMIN_MAPS_SEARCH'] = True app.config['FLASK_ADMIN_GOOGLE_MAPS_API_KEY'] = 'secret' +Flask-Admin currently only supports Google Maps for map search. + Limitations *********** diff --git a/examples/geo_alchemy/app.py b/examples/geo_alchemy/app.py index 028210afc..9257e537d 100644 --- a/examples/geo_alchemy/app.py +++ b/examples/geo_alchemy/app.py @@ -61,16 +61,21 @@ def index(): admin = admin.Admin(app, name='Example: GeoAlchemy', theme=Bootstrap4Theme()) -class ModalModelView(ModelView): +class LeafletModelView(ModelView): edit_modal = True + +class OSMModelView(ModelView): + tile_layer_url = '{s}.tile.openstreetmap.org/{z}/{x}/{y}.png' + tile_layer_attribution = '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors' + # Add views -admin.add_view(ModalModelView(Point, db.session, category='Points')) -admin.add_view(ModalModelView(MultiPoint, db.session, category='Points')) -admin.add_view(ModalModelView(Polygon, db.session, category='Polygons')) -admin.add_view(ModalModelView(MultiPolygon, db.session, category='Polygons')) -admin.add_view(ModalModelView(LineString, db.session, category='Lines')) -admin.add_view(ModalModelView(MultiLineString, db.session, category='Lines')) +admin.add_view(LeafletModelView(Point, db.session, category='Points')) +admin.add_view(OSMModelView(MultiPoint, db.session, category='Points')) +admin.add_view(LeafletModelView(Polygon, db.session, category='Polygons')) +admin.add_view(OSMModelView(MultiPolygon, db.session, category='Polygons')) +admin.add_view(LeafletModelView(LineString, db.session, category='Lines')) +admin.add_view(OSMModelView(MultiLineString, db.session, category='Lines')) if __name__ == '__main__': diff --git a/examples/geo_alchemy/config.py b/examples/geo_alchemy/config.py index f0df2dcd7..29d529f6a 100644 --- a/examples/geo_alchemy/config.py +++ b/examples/geo_alchemy/config.py @@ -6,6 +6,8 @@ SQLALCHEMY_ECHO = True # credentials for loading map tiles from mapbox +FLASK_ADMIN_MAPS = True +FLASK_ADMIN_MAPS_SEARCH = False FLASK_ADMIN_MAPBOX_MAP_ID = 'light-v10' # example map id FLASK_ADMIN_MAPBOX_ACCESS_TOKEN = '...' @@ -13,5 +15,4 @@ FLASK_ADMIN_DEFAULT_CENTER_LAT = -33.918861 FLASK_ADMIN_DEFAULT_CENTER_LONG = 18.423300 -FLASK_ADMIN_MAPBOX_SEARCH = True FLASK_ADMIN_GOOGLE_MAPS_API_KEY = '...' diff --git a/flask_admin/static/admin/js/form.js b/flask_admin/static/admin/js/form.js index d298d8c4f..d16f8accd 100644 --- a/flask_admin/static/admin/js/form.js +++ b/flask_admin/static/admin/js/form.js @@ -74,8 +74,8 @@ * Process Leaflet (map) widget */ function processLeafletWidget($el, name) { - if (!window.FLASK_ADMIN_MAPBOX_MAP_ID) { - console.error("You must set FLASK_ADMIN_MAPBOX_MAP_ID in your Flask settings to use the map widget"); + if (!window.FLASK_ADMIN_MAPS) { + console.error("You must set FLASK_ADMIN_MAPS in your Flask settings to use the map widget"); return false; } if (!window.FLASK_ADMIN_DEFAULT_CENTER_LAT || !window.FLASK_ADMIN_DEFAULT_CENTER_LONG) { @@ -201,7 +201,7 @@ } var drawControl = new L.Control.Draw(drawOptions); map.addControl(drawControl); - if (window.FLASK_ADMIN_MAPBOX_SEARCH) { + if (window.FLASK_ADMIN_MAPS_SEARCH) { var circle = L.circleMarker([0, 0]); var $autocompleteEl = $('<input style="position: absolute; z-index: 9999; display: block; margin: -42px 0 0 10px; width: 50%">'); var $form = $($el.get(0).form); diff --git a/flask_admin/templates/bootstrap2/admin/lib.html b/flask_admin/templates/bootstrap2/admin/lib.html index 37d50cbec..b00bb9ad8 100644 --- a/flask_admin/templates/bootstrap2/admin/lib.html +++ b/flask_admin/templates/bootstrap2/admin/lib.html @@ -218,7 +218,7 @@ <h3>{{ text }}</h3> {% macro form_css() %} <link href="{{ admin_static.url(filename='vendor/select2/select2.css', v='3.5.2') }}" rel="stylesheet"> <link href="{{ admin_static.url(filename='vendor/bootstrap-daterangepicker/daterangepicker-bs2.css', v='1.3.22') }}" rel="stylesheet"> - {% if config.FLASK_ADMIN_MAPBOX_MAP_ID %} + {% if config.FLASK_ADMIN_MAPS %} <link href="{{ admin_static.url(filename='vendor/leaflet/leaflet.css', v='1.0.2') }}" rel="stylesheet"> <link href="{{ admin_static.url(filename='vendor/leaflet/leaflet.draw.css', v='0.4.6') }}" rel="stylesheet"> {% endif %} @@ -228,8 +228,9 @@ <h3>{{ text }}</h3> {% endmacro %} {% macro form_js() %} - {% if config.FLASK_ADMIN_MAPBOX_MAP_ID %} + {% if config.FLASK_ADMIN_MAPS %} <script> + window.FLASK_ADMIN_MAPS = true; window.FLASK_ADMIN_MAPBOX_MAP_ID = "{{ config.FLASK_ADMIN_MAPBOX_MAP_ID }}"; {% if config.FLASK_ADMIN_MAPBOX_ACCESS_TOKEN %} window.FLASK_ADMIN_MAPBOX_ACCESS_TOKEN = "{{ config.FLASK_ADMIN_MAPBOX_ACCESS_TOKEN }}"; @@ -241,9 +242,9 @@ <h3>{{ text }}</h3> </script> <script src="{{ admin_static.url(filename='vendor/leaflet/leaflet.js', v='1.0.2') }}"></script> <script src="{{ admin_static.url(filename='vendor/leaflet/leaflet.draw.js', v='0.4.6') }}"></script> - {% if config.FLASK_ADMIN_MAPBOX_SEARCH %} + {% if config.FLASK_ADMIN_MAPS_SEARCH %} <script> - window.FLASK_ADMIN_MAPBOX_SEARCH = "{{ config.FLASK_ADMIN_MAPBOX_SEARCH }}"; + window.FLASK_ADMIN_MAPS_SEARCH = "{{ config.FLASK_ADMIN_MAPS_SEARCH }}"; </script> <script src="https://maps.googleapis.com/maps/api/js?v=3&libraries=places&key={{ config.get('FLASK_ADMIN_GOOGLE_MAPS_API_KEY') }}"></script> {% endif %} diff --git a/flask_admin/templates/bootstrap3/admin/lib.html b/flask_admin/templates/bootstrap3/admin/lib.html index c69f589ed..d3a441118 100644 --- a/flask_admin/templates/bootstrap3/admin/lib.html +++ b/flask_admin/templates/bootstrap3/admin/lib.html @@ -209,7 +209,7 @@ <h3>{{ text }}</h3> <link href="{{ admin_static.url(filename='vendor/select2/select2.css', v='3.5.2') }}" rel="stylesheet"> <link href="{{ admin_static.url(filename='vendor/select2/select2-bootstrap3.css', v='1.4.6') }}" rel="stylesheet"> <link href="{{ admin_static.url(filename='vendor/bootstrap-daterangepicker/daterangepicker-bs3.css', v='1.3.22') }}" rel="stylesheet"> - {% if config.FLASK_ADMIN_MAPBOX_MAP_ID %} + {% if config.FLASK_ADMIN_MAPS %} <link href="{{ admin_static.url(filename='vendor/leaflet/leaflet.css', v='1.0.2') }}" rel="stylesheet"> <link href="{{ admin_static.url(filename='vendor/leaflet/leaflet.draw.css', v='0.4.6') }}" rel="stylesheet"> {% endif %} @@ -219,8 +219,9 @@ <h3>{{ text }}</h3> {% endmacro %} {% macro form_js() %} - {% if config.FLASK_ADMIN_MAPBOX_MAP_ID %} + {% if config.FLASK_ADMIN_MAPS %} <script> + window.FLASK_ADMIN_MAPS = true; window.FLASK_ADMIN_MAPBOX_MAP_ID = "{{ config.FLASK_ADMIN_MAPBOX_MAP_ID }}"; {% if config.FLASK_ADMIN_MAPBOX_ACCESS_TOKEN %} window.FLASK_ADMIN_MAPBOX_ACCESS_TOKEN = "{{ config.FLASK_ADMIN_MAPBOX_ACCESS_TOKEN }}"; @@ -232,9 +233,9 @@ <h3>{{ text }}</h3> </script> <script src="{{ admin_static.url(filename='vendor/leaflet/leaflet.js', v='1.0.2') }}"></script> <script src="{{ admin_static.url(filename='vendor/leaflet/leaflet.draw.js', v='0.4.6') }}"></script> - {% if config.FLASK_ADMIN_MAPBOX_SEARCH %} + {% if config.FLASK_ADMIN_MAPS_SEARCH %} <script> - window.FLASK_ADMIN_MAPBOX_SEARCH = "{{ config.FLASK_ADMIN_MAPBOX_SEARCH }}"; + window.FLASK_ADMIN_MAPS_SEARCH = "{{ config.FLASK_ADMIN_MAPS_SEARCH }}"; </script> <script src="https://maps.googleapis.com/maps/api/js?v=3&libraries=places&key={{ config.get('FLASK_ADMIN_GOOGLE_MAPS_API_KEY') }}"></script> {% endif %} diff --git a/flask_admin/templates/bootstrap4/admin/lib.html b/flask_admin/templates/bootstrap4/admin/lib.html index 0b021784d..7574ff9a6 100644 --- a/flask_admin/templates/bootstrap4/admin/lib.html +++ b/flask_admin/templates/bootstrap4/admin/lib.html @@ -247,7 +247,7 @@ <h3>{{ text }}</h3> <link href="{{ admin_static.url(filename='vendor/select2/select2.css', v='4.2.1') }}" rel="stylesheet"> <link href="{{ admin_static.url(filename='vendor/select2/select2-bootstrap4.css', v='1.4.6') }}" rel="stylesheet"> <link href="{{ admin_static.url(filename='vendor/bootstrap-daterangepicker/daterangepicker-bs4.css', v='1.3.22') }}" rel="stylesheet"> - {% if config.FLASK_ADMIN_MAPBOX_MAP_ID %} + {% if config.FLASK_ADMIN_MAPS %} <link href="{{ admin_static.url(filename='vendor/leaflet/leaflet.css', v='1.0.2') }}" rel="stylesheet"> <link href="{{ admin_static.url(filename='vendor/leaflet/leaflet.draw.css', v='0.4.6') }}" rel="stylesheet"> {% endif %} @@ -257,8 +257,9 @@ <h3>{{ text }}</h3> {% endmacro %} {% macro form_js() %} - {% if config.FLASK_ADMIN_MAPBOX_MAP_ID %} + {% if config.FLASK_ADMIN_MAPS %} <script> + window.FLASK_ADMIN_MAPS = true; window.FLASK_ADMIN_MAPBOX_MAP_ID = "{{ config.FLASK_ADMIN_MAPBOX_MAP_ID }}"; {% if config.FLASK_ADMIN_MAPBOX_ACCESS_TOKEN %} window.FLASK_ADMIN_MAPBOX_ACCESS_TOKEN = "{{ config.FLASK_ADMIN_MAPBOX_ACCESS_TOKEN }}"; @@ -270,9 +271,9 @@ <h3>{{ text }}</h3> </script> <script src="{{ admin_static.url(filename='vendor/leaflet/leaflet.js', v='1.0.2') }}"></script> <script src="{{ admin_static.url(filename='vendor/leaflet/leaflet.draw.js', v='0.4.6') }}"></script> - {% if config.FLASK_ADMIN_MAPBOX_SEARCH %} + {% if config.FLASK_ADMIN_MAPS_SEARCH %} <script> - window.FLASK_ADMIN_MAPBOX_SEARCH = "{{ config.FLASK_ADMIN_MAPBOX_SEARCH }}"; + window.FLASK_ADMIN_MAPS_SEARCH = "{{ config.FLASK_ADMIN_MAPS_SEARCH }}"; </script> <script src="https://maps.googleapis.com/maps/api/js?v=3&libraries=places&key={{ config.get('FLASK_ADMIN_GOOGLE_MAPS_API_KEY') }}"></script> {% endif %} From 950da64f8bf93c568ff88ec9899884ec25f26cd7 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Tue, 23 Jul 2024 19:38:27 +0100 Subject: [PATCH 052/156] Add release notes generator configuration --- .github/release.yml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 .github/release.yml diff --git a/.github/release.yml b/.github/release.yml new file mode 100644 index 000000000..b4640bfb6 --- /dev/null +++ b/.github/release.yml @@ -0,0 +1,25 @@ +# .github/release.yml + +changelog: + exclude: + labels: + - ignore-for-release + authors: + - octocat + categories: + - title: Breaking changes 🛠 + labels: + - Semver-Major + - breaking-change + - title: Exciting new features 🎉 + labels: + - Semver-Minor + - enhancement + - title: Bug fixes 🐛 + labels: + - Semver-Patch + - bug + - title: Other changes + labels: + - "*" + From 5d92d378d7d4b3ec3a9495fc97061db1ba42fd53 Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Tue, 23 Jul 2024 19:40:25 +0100 Subject: [PATCH 053/156] Fix translating after WTForms 3 removed form._get_translations --- flask_admin/form/__init__.py | 9 +++++---- flask_admin/tests/sqla/test_inlineform.py | 5 +++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/flask_admin/form/__init__.py b/flask_admin/form/__init__.py index 6fbbd1f60..b1e7a38b4 100644 --- a/flask_admin/form/__init__.py +++ b/flask_admin/form/__init__.py @@ -14,16 +14,17 @@ class BaseForm(form.Form): - _translations = Translations() + class Meta: + _translations = Translations() + + def get_translations(self, form): + return self._translations def __init__(self, formdata=None, obj=None, prefix=u'', **kwargs): self._obj = obj super(BaseForm, self).__init__(formdata=formdata, obj=obj, prefix=prefix, **kwargs) - def _get_translations(self): - return self._translations - class FormOpts(object): __slots__ = ['widget_args', 'form_rules'] diff --git a/flask_admin/tests/sqla/test_inlineform.py b/flask_admin/tests/sqla/test_inlineform.py index d28f89078..61e7a14f8 100644 --- a/flask_admin/tests/sqla/test_inlineform.py +++ b/flask_admin/tests/sqla/test_inlineform.py @@ -272,8 +272,9 @@ def ngettext(self, *args): return 'success!' class StubBaseForm(form.BaseForm): - def _get_translations(self): - return StubTranslation() + class Meta: + def get_translations(self, form): + return StubTranslation() # Set up Admin class UserModelView(ModelView): From 3c0d67a38e813825de2c085a3a123352bd61ee47 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Tue, 23 Jul 2024 20:46:04 +0100 Subject: [PATCH 054/156] Update geo_alchemy example docs --- examples/geo_alchemy/README.rst | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/examples/geo_alchemy/README.rst b/examples/geo_alchemy/README.rst index 40a8a58c1..1b9361b82 100644 --- a/examples/geo_alchemy/README.rst +++ b/examples/geo_alchemy/README.rst @@ -34,6 +34,10 @@ To run this example: python examples/geo_alchemy/app.py -6. You will notice that the maps are not rendered. To see them, you will have +6. You will notice that the maps are not rendered. By default, Flask-Admin expects +an integration with `Mapbox <https://www.mapbox.com/>`_. To see them, you will have to register for a free account at `Mapbox <https://www.mapbox.com/>`_ and set -the *MAPBOX_MAP_ID* and *MAPBOX_ACCESS_TOKEN* config variables accordingly. +the *FLASK_ADMIN_MAPBOX_MAP_ID* and *FLASK_ADMIN_MAPBOX_ACCESS_TOKEN* config +variables accordingly. + +However, some of the maps are overridden to use Open Street Maps From f9da4f00399080c4bcbe6f9ef1a4b879cb29e946 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Tue, 23 Jul 2024 20:54:57 +0100 Subject: [PATCH 055/156] Make default theme Bootstrap4, and add tests --- doc/advanced.rst | 4 +- flask_admin/base.py | 6 +-- flask_admin/tests/fileadmin/test_fileadmin.py | 42 ++++++++++++++++++- flask_admin/tests/test_base.py | 6 +-- flask_admin/tests/test_host_matching.py | 10 ++--- flask_admin/tests/test_model.py | 41 +++++++++++++++++- 6 files changed, 94 insertions(+), 15 deletions(-) diff --git a/doc/advanced.rst b/doc/advanced.rst index 9409c808d..711668512 100644 --- a/doc/advanced.rst +++ b/doc/advanced.rst @@ -134,7 +134,7 @@ can use it by adding a FileAdmin view to your app:: # Flask setup here - admin = Admin(app, name='microblog', theme=Bootstrap2Theme()) + admin = Admin(app, name='microblog', theme=Bootstrap4Theme()) path = op.join(op.dirname(__file__), 'static') admin.add_view(FileAdmin(path, '/static/', name='Static Files')) @@ -173,7 +173,7 @@ instance running on the same machine as your app, you can:: # Flask setup here - admin = Admin(app, name='microblog', theme=Bootstrap2Theme()) + admin = Admin(app, name='microblog', theme=Bootstrap4Theme()) admin.add_view(rediscli.RedisCli(Redis())) diff --git a/flask_admin/base.py b/flask_admin/base.py index 31353bd04..181be1d3e 100644 --- a/flask_admin/base.py +++ b/flask_admin/base.py @@ -14,7 +14,7 @@ from flask_admin.blueprints import _BlueprintWithHostSupport as Blueprint from flask_admin.consts import ADMIN_ROUTES_HOST_VARIABLE from flask_admin.menu import MenuCategory, MenuView, MenuLink, SubMenuCategory # noqa: F401 -from flask_admin.theme import Theme, Bootstrap2Theme +from flask_admin.theme import Theme, Bootstrap4Theme def expose(url='/', methods=('GET',)): @@ -501,7 +501,7 @@ def __init__(self, app=None, name=None, Static URL Path. If provided, this specifies the default path to the static url directory for all its views. Can be overridden in view configuration. :param theme: - Base theme. Defaults to `Bootstrap2Theme()`. If you want to use + Base theme. Defaults to `Bootstrap4Theme()`. If you want to use Bootstrap 3 or 4 integration, change it to `Bootstrap3Theme()` or `Bootstrap4Theme()`. :param category_icon_classes: A dict of category names as keys and html classes as values to be added to menu category icons. @@ -528,7 +528,7 @@ def __init__(self, app=None, name=None, self.static_url_path = static_url_path self.subdomain = subdomain self.host = host - self.theme = theme or Bootstrap2Theme() + self.theme = theme or Bootstrap4Theme() self.category_icon_classes = category_icon_classes or dict() self._validate_admin_host_and_subdomain() diff --git a/flask_admin/tests/fileadmin/test_fileadmin.py b/flask_admin/tests/fileadmin/test_fileadmin.py index cbccc536e..3c4ecccb3 100644 --- a/flask_admin/tests/fileadmin/test_fileadmin.py +++ b/flask_admin/tests/fileadmin/test_fileadmin.py @@ -2,7 +2,7 @@ import os import os.path as op -from flask_admin.theme import Bootstrap2Theme, Bootstrap3Theme +from flask_admin.theme import Bootstrap2Theme, Bootstrap3Theme, Bootstrap4Theme from flask_admin.contrib import fileadmin from flask_admin import Admin @@ -207,6 +207,46 @@ class EditModalOff(fileadmin_class): data = rv.data.decode('utf-8') assert 'fa_modal_window' not in data + def test_modal_edit_bs4(self, app, babel): + admin_bs4 = Admin(app, theme=Bootstrap4Theme()) + + fileadmin_class = self.fileadmin_class() + fileadmin_args, fileadmin_kwargs = self.fileadmin_args() + + class EditModalOn(fileadmin_class): + edit_modal = True + editable_extensions = ('txt',) + + class EditModalOff(fileadmin_class): + edit_modal = False + editable_extensions = ('txt',) + + on_view_kwargs = dict(fileadmin_kwargs) + on_view_kwargs.setdefault('endpoint', 'edit_modal_on') + edit_modal_on = EditModalOn(*fileadmin_args, **on_view_kwargs) + + off_view_kwargs = dict(fileadmin_kwargs) + off_view_kwargs.setdefault('endpoint', 'edit_modal_off') + edit_modal_off = EditModalOff(*fileadmin_args, **off_view_kwargs) + + admin_bs4.add_view(edit_modal_on) + admin_bs4.add_view(edit_modal_off) + + client_bs4 = app.test_client() + + # bootstrap 3 - ensure modal window is added when edit_modal is + # enabled + rv = client_bs4.get('/admin/edit_modal_on/') + assert rv.status_code == 200 + data = rv.data.decode('utf-8') + assert 'fa_modal_window' in data + + # bootstrap 3 - test modal disabled + rv = client_bs4.get('/admin/edit_modal_off/') + assert rv.status_code == 200 + data = rv.data.decode('utf-8') + assert 'fa_modal_window' not in data + class TestLocalFileAdmin(Base.FileAdminTests): def fileadmin_class(self): diff --git a/flask_admin/tests/test_base.py b/flask_admin/tests/test_base.py index 2d1013ed6..63ac2ee30 100644 --- a/flask_admin/tests/test_base.py +++ b/flask_admin/tests/test_base.py @@ -164,7 +164,7 @@ def test_admin_customizations(app, babel): # test custom static_url_path with app.test_request_context('/'): - rv = client.get(url_for('admin.static', filename='bootstrap/bootstrap2/css/bootstrap.css')) + rv = client.get(url_for('admin.static', filename='bootstrap/bootstrap4/css/bootstrap.css')) assert rv.status_code == 200 @@ -186,7 +186,7 @@ def test_baseview_registration(): # Verify generated blueprint properties assert bp.name == view.endpoint assert bp.url_prefix == view.url - assert bp.template_folder == os.path.join('templates', 'bootstrap2') + assert bp.template_folder == os.path.join('templates', 'bootstrap4') assert bp.static_folder == view.static_folder # Verify customizations @@ -400,7 +400,7 @@ def test_root_mount(app, babel): # test static files when url='/' with app.test_request_context('/'): - rv = client.get(url_for('admin.static', filename='bootstrap/bootstrap2/css/bootstrap.css')) + rv = client.get(url_for('admin.static', filename='bootstrap/bootstrap4/css/bootstrap.css')) rv.close() assert rv.status_code == 200 diff --git a/flask_admin/tests/test_host_matching.py b/flask_admin/tests/test_host_matching.py index f60617ce8..b715a7d91 100644 --- a/flask_admin/tests/test_host_matching.py +++ b/flask_admin/tests/test_host_matching.py @@ -131,7 +131,7 @@ def test_mounting_on_host(app, babel, initialise_using_init_app): # Check that static assets are embedded with the expected (relative) URLs assert ( - b'<link href="/static/admin/bootstrap/bootstrap2/swatch' + b'<link href="/static/admin/bootstrap/bootstrap4/swatch' b'/default/bootstrap.min.css?v=2.3.2" rel="stylesheet">' in rv.data ) @@ -146,7 +146,7 @@ def test_mounting_on_host(app, babel, initialise_using_init_app): rv = client.get( url_for( 'admin.static', - filename='bootstrap/bootstrap2/css/bootstrap.min.css', + filename='bootstrap/bootstrap4/css/bootstrap.min.css', ) ) rv.close() @@ -155,7 +155,7 @@ def test_mounting_on_host(app, babel, initialise_using_init_app): rv = client.get( url_for( 'admin.static', - filename='bootstrap/bootstrap2/css/bootstrap.min.css', + filename='bootstrap/bootstrap4/css/bootstrap.min.css', ), headers={"Host": "admin.test.localhost"} ) @@ -185,7 +185,7 @@ def test_mounting_on_wildcard_host(app, babel, initialise_using_init_app): # Check that static assets are embedded with the expected (relative) URLs assert ( - b'<link href="/static/admin/bootstrap/bootstrap2/swatch' + b'<link href="/static/admin/bootstrap/bootstrap4/swatch' b'/default/bootstrap.min.css?v=2.3.2" ' b'rel="stylesheet">' in rv.data @@ -201,7 +201,7 @@ def test_mounting_on_wildcard_host(app, babel, initialise_using_init_app): rv = client.get( url_for( 'admin.static', - filename='bootstrap/bootstrap2/css/bootstrap.min.css', + filename='bootstrap/bootstrap4/css/bootstrap.min.css', headers=host_header, ), ) diff --git a/flask_admin/tests/test_model.py b/flask_admin/tests/test_model.py index b8d82b446..3ec5aaeb0 100644 --- a/flask_admin/tests/test_model.py +++ b/flask_admin/tests/test_model.py @@ -7,7 +7,7 @@ from flask_admin import Admin, form from flask_admin._compat import iteritems, itervalues -from flask_admin.theme import Bootstrap2Theme, Bootstrap3Theme +from flask_admin.theme import Bootstrap2Theme, Bootstrap3Theme, Bootstrap4Theme from flask_admin.model import base, filters from flask_admin.model.template import macro @@ -500,6 +500,45 @@ def test_modal_edit_bs3(app, babel): assert 'fa_modal_window' not in data +def test_modal_edit_bs4(app, babel): + admin_bs4 = Admin(app, theme=Bootstrap4Theme()) + + edit_modal_on = MockModelView(Model, edit_modal=True, endpoint="edit_modal_on") + edit_modal_off = MockModelView(Model, edit_modal=False, endpoint="edit_modal_off") + create_modal_on = MockModelView(Model, create_modal=True, endpoint="create_modal_on") + create_modal_off = MockModelView(Model, create_modal=False, endpoint="create_modal_off") + admin_bs4.add_view(edit_modal_on) + admin_bs4.add_view(edit_modal_off) + admin_bs4.add_view(create_modal_on) + admin_bs4.add_view(create_modal_off) + + client_bs4 = app.test_client() + + # bootstrap 2 - ensure modal window is added when edit_modal is enabled + rv = client_bs4.get('/admin/edit_modal_on/') + assert rv.status_code == 200 + data = rv.data.decode('utf-8') + assert 'fa_modal_window' in data + + # bootstrap 2 - test edit modal disabled + rv = client_bs4.get('/admin/edit_modal_off/') + assert rv.status_code == 200 + data = rv.data.decode('utf-8') + assert 'fa_modal_window' not in data + + # bootstrap 2 - ensure modal window is added when create_modal is enabled + rv = client_bs4.get('/admin/create_modal_on/') + assert rv.status_code == 200 + data = rv.data.decode('utf-8') + assert 'fa_modal_window' in data + + # bootstrap 2 - test create modal disabled + rv = client_bs4.get('/admin/create_modal_off/') + assert rv.status_code == 200 + data = rv.data.decode('utf-8') + assert 'fa_modal_window' not in data + + def check_class_name(): class DummyView(MockModelView): pass From d5825093c09ef6a03426becd18ddd9b34aea671a Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Tue, 23 Jul 2024 20:52:46 +0100 Subject: [PATCH 056/156] Remove Bootstrap2Theme --- .../static/admin/css/bootstrap2/admin.css | 165 - .../static/admin/css/bootstrap2/rediscli.css | 48 - flask_admin/static/admin/js/bs2_modal.js | 4 - .../bootstrap2/css/bootstrap-responsive.css | 1109 --- .../css/bootstrap-responsive.min.css | 9 - .../bootstrap/bootstrap2/css/bootstrap.css | 6167 ----------------- .../bootstrap2/css/bootstrap.min.css | 9 - .../bootstrap/bootstrap2/js/bootstrap.js | 2280 ------ .../bootstrap/bootstrap2/js/bootstrap.min.js | 6 - .../swatch/amelia/bootstrap.min.css | 9 - .../swatch/cerulean/bootstrap.min.css | 9 - .../bootstrap2/swatch/cosmo/bootstrap.min.css | 9 - .../swatch/cyborg/bootstrap.min.css | 9 - .../swatch/default/bootstrap.min.css | 9 - .../swatch/flatly/bootstrap.min.css | 9 - .../swatch/img/glyphicons-halflings-white.png | Bin 8777 -> 0 bytes .../swatch/img/glyphicons-halflings.png | Bin 12799 -> 0 bytes .../swatch/journal/bootstrap.min.css | 9 - .../swatch/readable/bootstrap.min.css | 9 - .../swatch/simplex/bootstrap.min.css | 9 - .../bootstrap2/swatch/slate/bootstrap.min.css | 9 - .../swatch/spacelab/bootstrap.min.css | 9 - .../swatch/spruce/bootstrap.min.css | 9 - .../swatch/superhero/bootstrap.min.css | 9 - .../swatch/united/bootstrap.min.css | 9 - .../daterangepicker-bs2.css | 303 - .../x-editable/css/bootstrap2-editable.css | 663 -- .../x-editable/js/bootstrap2-editable.min.js | 7 - .../templates/bootstrap2/admin/actions.html | 34 - .../templates/bootstrap2/admin/base.html | 83 - .../templates/bootstrap2/admin/file/form.html | 9 - .../templates/bootstrap2/admin/file/list.html | 197 - .../bootstrap2/admin/file/modals/form.html | 18 - .../templates/bootstrap2/admin/index.html | 4 - .../templates/bootstrap2/admin/layout.html | 96 - .../templates/bootstrap2/admin/lib.html | 266 - .../templates/bootstrap2/admin/master.html | 1 - .../bootstrap2/admin/model/create.html | 30 - .../bootstrap2/admin/model/details.html | 54 - .../bootstrap2/admin/model/edit.html | 40 - .../admin/model/inline_field_list.html | 15 - .../bootstrap2/admin/model/inline_form.html | 4 - .../admin/model/inline_list_base.html | 42 - .../bootstrap2/admin/model/layout.html | 105 - .../bootstrap2/admin/model/list.html | 197 - .../bootstrap2/admin/model/modals/create.html | 25 - .../admin/model/modals/details.html | 40 - .../bootstrap2/admin/model/modals/edit.html | 25 - .../bootstrap2/admin/model/row_actions.html | 38 - .../bootstrap2/admin/rediscli/console.html | 27 - .../bootstrap2/admin/rediscli/response.html | 32 - .../templates/bootstrap2/admin/static.html | 3 - flask_admin/tests/fileadmin/test_fileadmin.py | 42 +- flask_admin/tests/test_model.py | 41 +- flask_admin/theme.py | 3 +- 55 files changed, 3 insertions(+), 12364 deletions(-) delete mode 100644 flask_admin/static/admin/css/bootstrap2/admin.css delete mode 100644 flask_admin/static/admin/css/bootstrap2/rediscli.css delete mode 100755 flask_admin/static/admin/js/bs2_modal.js delete mode 100644 flask_admin/static/bootstrap/bootstrap2/css/bootstrap-responsive.css delete mode 100644 flask_admin/static/bootstrap/bootstrap2/css/bootstrap-responsive.min.css delete mode 100644 flask_admin/static/bootstrap/bootstrap2/css/bootstrap.css delete mode 100644 flask_admin/static/bootstrap/bootstrap2/css/bootstrap.min.css delete mode 100644 flask_admin/static/bootstrap/bootstrap2/js/bootstrap.js delete mode 100644 flask_admin/static/bootstrap/bootstrap2/js/bootstrap.min.js delete mode 100644 flask_admin/static/bootstrap/bootstrap2/swatch/amelia/bootstrap.min.css delete mode 100644 flask_admin/static/bootstrap/bootstrap2/swatch/cerulean/bootstrap.min.css delete mode 100644 flask_admin/static/bootstrap/bootstrap2/swatch/cosmo/bootstrap.min.css delete mode 100644 flask_admin/static/bootstrap/bootstrap2/swatch/cyborg/bootstrap.min.css delete mode 100644 flask_admin/static/bootstrap/bootstrap2/swatch/default/bootstrap.min.css delete mode 100644 flask_admin/static/bootstrap/bootstrap2/swatch/flatly/bootstrap.min.css delete mode 100644 flask_admin/static/bootstrap/bootstrap2/swatch/img/glyphicons-halflings-white.png delete mode 100644 flask_admin/static/bootstrap/bootstrap2/swatch/img/glyphicons-halflings.png delete mode 100644 flask_admin/static/bootstrap/bootstrap2/swatch/journal/bootstrap.min.css delete mode 100644 flask_admin/static/bootstrap/bootstrap2/swatch/readable/bootstrap.min.css delete mode 100644 flask_admin/static/bootstrap/bootstrap2/swatch/simplex/bootstrap.min.css delete mode 100644 flask_admin/static/bootstrap/bootstrap2/swatch/slate/bootstrap.min.css delete mode 100644 flask_admin/static/bootstrap/bootstrap2/swatch/spacelab/bootstrap.min.css delete mode 100644 flask_admin/static/bootstrap/bootstrap2/swatch/spruce/bootstrap.min.css delete mode 100644 flask_admin/static/bootstrap/bootstrap2/swatch/superhero/bootstrap.min.css delete mode 100644 flask_admin/static/bootstrap/bootstrap2/swatch/united/bootstrap.min.css delete mode 100644 flask_admin/static/vendor/bootstrap-daterangepicker/daterangepicker-bs2.css delete mode 100755 flask_admin/static/vendor/x-editable/css/bootstrap2-editable.css delete mode 100755 flask_admin/static/vendor/x-editable/js/bootstrap2-editable.min.js delete mode 100644 flask_admin/templates/bootstrap2/admin/actions.html delete mode 100644 flask_admin/templates/bootstrap2/admin/base.html delete mode 100644 flask_admin/templates/bootstrap2/admin/file/form.html delete mode 100644 flask_admin/templates/bootstrap2/admin/file/list.html delete mode 100644 flask_admin/templates/bootstrap2/admin/file/modals/form.html delete mode 100644 flask_admin/templates/bootstrap2/admin/index.html delete mode 100644 flask_admin/templates/bootstrap2/admin/layout.html delete mode 100644 flask_admin/templates/bootstrap2/admin/lib.html delete mode 100644 flask_admin/templates/bootstrap2/admin/master.html delete mode 100644 flask_admin/templates/bootstrap2/admin/model/create.html delete mode 100644 flask_admin/templates/bootstrap2/admin/model/details.html delete mode 100644 flask_admin/templates/bootstrap2/admin/model/edit.html delete mode 100644 flask_admin/templates/bootstrap2/admin/model/inline_field_list.html delete mode 100644 flask_admin/templates/bootstrap2/admin/model/inline_form.html delete mode 100644 flask_admin/templates/bootstrap2/admin/model/inline_list_base.html delete mode 100644 flask_admin/templates/bootstrap2/admin/model/layout.html delete mode 100755 flask_admin/templates/bootstrap2/admin/model/list.html delete mode 100644 flask_admin/templates/bootstrap2/admin/model/modals/create.html delete mode 100755 flask_admin/templates/bootstrap2/admin/model/modals/details.html delete mode 100644 flask_admin/templates/bootstrap2/admin/model/modals/edit.html delete mode 100644 flask_admin/templates/bootstrap2/admin/model/row_actions.html delete mode 100644 flask_admin/templates/bootstrap2/admin/rediscli/console.html delete mode 100644 flask_admin/templates/bootstrap2/admin/rediscli/response.html delete mode 100644 flask_admin/templates/bootstrap2/admin/static.html diff --git a/flask_admin/static/admin/css/bootstrap2/admin.css b/flask_admin/static/admin/css/bootstrap2/admin.css deleted file mode 100644 index 726dedc5c..000000000 --- a/flask_admin/static/admin/css/bootstrap2/admin.css +++ /dev/null @@ -1,165 +0,0 @@ -/* List View - fix trash icon inside table column */ -.model-list form.icon { - display: inline; -} - -.model-list form.icon button { - border: none; - background: transparent; - text-decoration: none; - padding: 0; - line-height: normal; -} - -/* List View - link icons - prevent underline */ -.model-list a.icon { - text-decoration: none; -} - -/* List View - fix checkbox column width */ -.list-checkbox-column { - width: 14px; -} - -/* List View - prevent word wrap on buttons column, to keep it on one line */ -.list-buttons-column { - white-space: nowrap; -} - -/* List View - fix gap between actions and table */ -.model-list { - position: static; - margin-top: -1px; - z-index: 999; -} - -.actions-nav { -margin-bottom: 0; -margin-left: 4px; -margin-right: 4px; -} - -#filter_form { - margin-bottom: 0; -} - -/* List View Search Form - fix gap between form and table */ -.actions-nav form.search-form { - margin: -1px 0 0 0; -} - -/* Filters */ -table.filters { - border-collapse: collapse; - border-spacing: 4px; -} - -/* prevents gap between table and actions while there are no filters set */ -table.filters:not(:empty) { - margin: 12px 0px 20px 0px; -} - -/* spacing between filter X button, operation, and value field */ -/* uses tables instead of form classes for bootstrap2-3 compatibility */ -table.filters tr td { - padding-right: 5px; - padding-bottom: 3px; -} - -/* match filter operation drop-down height with bootstrap input */ -.filters .filter-op > a { - height: 28px; - line-height: 28px; -} - -/* Image thumbnails */ -.image-thumbnail img { - max-width: 100px; - max-height: 100px; -} - -/* Forms */ -.admin-form .control-label { - width: 100px; - text-align: left; - margin-left: 4px; -} - -/* add spacing between labels and form fields */ -.admin-form .controls { - margin-left: 110px; -} - -@media only screen and (max-width: 800px) { - - /* Force table to not be like tables anymore */ - #no-more-tables table, - #no-more-tables thead, - #no-more-tables tbody, - #no-more-tables th, - #no-more-tables td, - #no-more-tables tr { - display: block; - } - - /* Hide table headers (but not display: none;, for accessibility) */ - #no-more-tables thead tr { - position: absolute; - top: -9999px; - left: -9999px; - } - - #no-more-tables tr { border: 1px solid #ccc; } - - #no-more-tables td { - /* Behave like a "row" */ - border: none; - border-bottom: 1px solid #eee; - position: relative; - padding-left: 50%; - white-space: normal; - text-align:left; - } - - #no-more-tables td:before { - /* Now like a table header */ - position: absolute; - /* Top/left values mimic padding */ - top: 6px; - left: 6px; - width: 45%; - padding-right: 10px; - white-space: nowrap; - text-align:left; - font-weight: bold; - } - - /* - Label the data - */ - #no-more-tables td:before { content: attr(data-title); } -} - -.editable-input .select2-container { - min-width: 220px; -} - -[placeholder]{ - text-overflow:ellipsis; -} - -::-webkit-input-placeholder { /* Chrome/Opera/Safari */ - text-overflow:ellipsis; -} - -::-moz-placeholder { /* Firefox 19+ */ - text-overflow:ellipsis; -} - -:-ms-input-placeholder { /* IE 10+ */ - text-overflow:ellipsis; -} - -:-moz-placeholder { /* Firefox 18- */ - text-overflow:ellipsis; -} diff --git a/flask_admin/static/admin/css/bootstrap2/rediscli.css b/flask_admin/static/admin/css/bootstrap2/rediscli.css deleted file mode 100644 index 5bf391f2b..000000000 --- a/flask_admin/static/admin/css/bootstrap2/rediscli.css +++ /dev/null @@ -1,48 +0,0 @@ -.console { - position: relative; - width: 100%; - min-height: 400px; -} - -.console-container { - border-radius: 4px; - position: absolute; - border: 1px solid #d4d4d4; - padding: 2px; - overflow: scroll; - top: 2px; - left: 2px; - right: 2px; - bottom: 5em; -} - -.console-line { - position: absolute; - left: 2px; - right: 2px; - bottom: 2px; -} - -.console-line input { - width: 100%; - box-sizing: border-box; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - height: 2em; -} - -.console .cmd { - background-color: #f5f5f5; - padding: 2px; - margin: 1px; -} - -.console .response { - background-color: #f0f0f0; - padding: 2px; - margin: 1px; -} - -.console .error { - color: red; -} \ No newline at end of file diff --git a/flask_admin/static/admin/js/bs2_modal.js b/flask_admin/static/admin/js/bs2_modal.js deleted file mode 100755 index 0174a8dc4..000000000 --- a/flask_admin/static/admin/js/bs2_modal.js +++ /dev/null @@ -1,4 +0,0 @@ -// fixes "remote modal shows same content every time" -$('.modal').on('hidden', function() { - $(this).removeData('modal'); -}); diff --git a/flask_admin/static/bootstrap/bootstrap2/css/bootstrap-responsive.css b/flask_admin/static/bootstrap/bootstrap2/css/bootstrap-responsive.css deleted file mode 100644 index c0bba15b3..000000000 --- a/flask_admin/static/bootstrap/bootstrap2/css/bootstrap-responsive.css +++ /dev/null @@ -1,1109 +0,0 @@ -/*! - * Bootstrap Responsive v2.3.2 - * - * Copyright 2013 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world by @mdo and @fat. - */ - -.clearfix { - *zoom: 1; -} - -.clearfix:before, -.clearfix:after { - display: table; - line-height: 0; - content: ""; -} - -.clearfix:after { - clear: both; -} - -.hide-text { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.input-block-level { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -@-ms-viewport { - width: device-width; -} - -.hidden { - display: none; - visibility: hidden; -} - -.visible-phone { - display: none !important; -} - -.visible-tablet { - display: none !important; -} - -.hidden-desktop { - display: none !important; -} - -.visible-desktop { - display: inherit !important; -} - -@media (min-width: 768px) and (max-width: 979px) { - .hidden-desktop { - display: inherit !important; - } - .visible-desktop { - display: none !important ; - } - .visible-tablet { - display: inherit !important; - } - .hidden-tablet { - display: none !important; - } -} - -@media (max-width: 767px) { - .hidden-desktop { - display: inherit !important; - } - .visible-desktop { - display: none !important; - } - .visible-phone { - display: inherit !important; - } - .hidden-phone { - display: none !important; - } -} - -.visible-print { - display: none !important; -} - -@media print { - .visible-print { - display: inherit !important; - } - .hidden-print { - display: none !important; - } -} - -@media (min-width: 1200px) { - .row { - margin-left: -30px; - *zoom: 1; - } - .row:before, - .row:after { - display: table; - line-height: 0; - content: ""; - } - .row:after { - clear: both; - } - [class*="span"] { - float: left; - min-height: 1px; - margin-left: 30px; - } - .container, - .navbar-static-top .container, - .navbar-fixed-top .container, - .navbar-fixed-bottom .container { - width: 1170px; - } - .span12 { - width: 1170px; - } - .span11 { - width: 1070px; - } - .span10 { - width: 970px; - } - .span9 { - width: 870px; - } - .span8 { - width: 770px; - } - .span7 { - width: 670px; - } - .span6 { - width: 570px; - } - .span5 { - width: 470px; - } - .span4 { - width: 370px; - } - .span3 { - width: 270px; - } - .span2 { - width: 170px; - } - .span1 { - width: 70px; - } - .offset12 { - margin-left: 1230px; - } - .offset11 { - margin-left: 1130px; - } - .offset10 { - margin-left: 1030px; - } - .offset9 { - margin-left: 930px; - } - .offset8 { - margin-left: 830px; - } - .offset7 { - margin-left: 730px; - } - .offset6 { - margin-left: 630px; - } - .offset5 { - margin-left: 530px; - } - .offset4 { - margin-left: 430px; - } - .offset3 { - margin-left: 330px; - } - .offset2 { - margin-left: 230px; - } - .offset1 { - margin-left: 130px; - } - .row-fluid { - width: 100%; - *zoom: 1; - } - .row-fluid:before, - .row-fluid:after { - display: table; - line-height: 0; - content: ""; - } - .row-fluid:after { - clear: both; - } - .row-fluid [class*="span"] { - display: block; - float: left; - width: 100%; - min-height: 30px; - margin-left: 2.564102564102564%; - *margin-left: 2.5109110747408616%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .row-fluid [class*="span"]:first-child { - margin-left: 0; - } - .row-fluid .controls-row [class*="span"] + [class*="span"] { - margin-left: 2.564102564102564%; - } - .row-fluid .span12 { - width: 100%; - *width: 99.94680851063829%; - } - .row-fluid .span11 { - width: 91.45299145299145%; - *width: 91.39979996362975%; - } - .row-fluid .span10 { - width: 82.90598290598291%; - *width: 82.8527914166212%; - } - .row-fluid .span9 { - width: 74.35897435897436%; - *width: 74.30578286961266%; - } - .row-fluid .span8 { - width: 65.81196581196582%; - *width: 65.75877432260411%; - } - .row-fluid .span7 { - width: 57.26495726495726%; - *width: 57.21176577559556%; - } - .row-fluid .span6 { - width: 48.717948717948715%; - *width: 48.664757228587014%; - } - .row-fluid .span5 { - width: 40.17094017094017%; - *width: 40.11774868157847%; - } - .row-fluid .span4 { - width: 31.623931623931625%; - *width: 31.570740134569924%; - } - .row-fluid .span3 { - width: 23.076923076923077%; - *width: 23.023731587561375%; - } - .row-fluid .span2 { - width: 14.52991452991453%; - *width: 14.476723040552828%; - } - .row-fluid .span1 { - width: 5.982905982905983%; - *width: 5.929714493544281%; - } - .row-fluid .offset12 { - margin-left: 105.12820512820512%; - *margin-left: 105.02182214948171%; - } - .row-fluid .offset12:first-child { - margin-left: 102.56410256410257%; - *margin-left: 102.45771958537915%; - } - .row-fluid .offset11 { - margin-left: 96.58119658119658%; - *margin-left: 96.47481360247316%; - } - .row-fluid .offset11:first-child { - margin-left: 94.01709401709402%; - *margin-left: 93.91071103837061%; - } - .row-fluid .offset10 { - margin-left: 88.03418803418803%; - *margin-left: 87.92780505546462%; - } - .row-fluid .offset10:first-child { - margin-left: 85.47008547008548%; - *margin-left: 85.36370249136206%; - } - .row-fluid .offset9 { - margin-left: 79.48717948717949%; - *margin-left: 79.38079650845607%; - } - .row-fluid .offset9:first-child { - margin-left: 76.92307692307693%; - *margin-left: 76.81669394435352%; - } - .row-fluid .offset8 { - margin-left: 70.94017094017094%; - *margin-left: 70.83378796144753%; - } - .row-fluid .offset8:first-child { - margin-left: 68.37606837606839%; - *margin-left: 68.26968539734497%; - } - .row-fluid .offset7 { - margin-left: 62.393162393162385%; - *margin-left: 62.28677941443899%; - } - .row-fluid .offset7:first-child { - margin-left: 59.82905982905982%; - *margin-left: 59.72267685033642%; - } - .row-fluid .offset6 { - margin-left: 53.84615384615384%; - *margin-left: 53.739770867430444%; - } - .row-fluid .offset6:first-child { - margin-left: 51.28205128205128%; - *margin-left: 51.175668303327875%; - } - .row-fluid .offset5 { - margin-left: 45.299145299145295%; - *margin-left: 45.1927623204219%; - } - .row-fluid .offset5:first-child { - margin-left: 42.73504273504273%; - *margin-left: 42.62865975631933%; - } - .row-fluid .offset4 { - margin-left: 36.75213675213675%; - *margin-left: 36.645753773413354%; - } - .row-fluid .offset4:first-child { - margin-left: 34.18803418803419%; - *margin-left: 34.081651209310785%; - } - .row-fluid .offset3 { - margin-left: 28.205128205128204%; - *margin-left: 28.0987452264048%; - } - .row-fluid .offset3:first-child { - margin-left: 25.641025641025642%; - *margin-left: 25.53464266230224%; - } - .row-fluid .offset2 { - margin-left: 19.65811965811966%; - *margin-left: 19.551736679396257%; - } - .row-fluid .offset2:first-child { - margin-left: 17.094017094017094%; - *margin-left: 16.98763411529369%; - } - .row-fluid .offset1 { - margin-left: 11.11111111111111%; - *margin-left: 11.004728132387708%; - } - .row-fluid .offset1:first-child { - margin-left: 8.547008547008547%; - *margin-left: 8.440625568285142%; - } - input, - textarea, - .uneditable-input { - margin-left: 0; - } - .controls-row [class*="span"] + [class*="span"] { - margin-left: 30px; - } - input.span12, - textarea.span12, - .uneditable-input.span12 { - width: 1156px; - } - input.span11, - textarea.span11, - .uneditable-input.span11 { - width: 1056px; - } - input.span10, - textarea.span10, - .uneditable-input.span10 { - width: 956px; - } - input.span9, - textarea.span9, - .uneditable-input.span9 { - width: 856px; - } - input.span8, - textarea.span8, - .uneditable-input.span8 { - width: 756px; - } - input.span7, - textarea.span7, - .uneditable-input.span7 { - width: 656px; - } - input.span6, - textarea.span6, - .uneditable-input.span6 { - width: 556px; - } - input.span5, - textarea.span5, - .uneditable-input.span5 { - width: 456px; - } - input.span4, - textarea.span4, - .uneditable-input.span4 { - width: 356px; - } - input.span3, - textarea.span3, - .uneditable-input.span3 { - width: 256px; - } - input.span2, - textarea.span2, - .uneditable-input.span2 { - width: 156px; - } - input.span1, - textarea.span1, - .uneditable-input.span1 { - width: 56px; - } - .thumbnails { - margin-left: -30px; - } - .thumbnails > li { - margin-left: 30px; - } - .row-fluid .thumbnails { - margin-left: 0; - } -} - -@media (min-width: 768px) and (max-width: 979px) { - .row { - margin-left: -20px; - *zoom: 1; - } - .row:before, - .row:after { - display: table; - line-height: 0; - content: ""; - } - .row:after { - clear: both; - } - [class*="span"] { - float: left; - min-height: 1px; - margin-left: 20px; - } - .container, - .navbar-static-top .container, - .navbar-fixed-top .container, - .navbar-fixed-bottom .container { - width: 724px; - } - .span12 { - width: 724px; - } - .span11 { - width: 662px; - } - .span10 { - width: 600px; - } - .span9 { - width: 538px; - } - .span8 { - width: 476px; - } - .span7 { - width: 414px; - } - .span6 { - width: 352px; - } - .span5 { - width: 290px; - } - .span4 { - width: 228px; - } - .span3 { - width: 166px; - } - .span2 { - width: 104px; - } - .span1 { - width: 42px; - } - .offset12 { - margin-left: 764px; - } - .offset11 { - margin-left: 702px; - } - .offset10 { - margin-left: 640px; - } - .offset9 { - margin-left: 578px; - } - .offset8 { - margin-left: 516px; - } - .offset7 { - margin-left: 454px; - } - .offset6 { - margin-left: 392px; - } - .offset5 { - margin-left: 330px; - } - .offset4 { - margin-left: 268px; - } - .offset3 { - margin-left: 206px; - } - .offset2 { - margin-left: 144px; - } - .offset1 { - margin-left: 82px; - } - .row-fluid { - width: 100%; - *zoom: 1; - } - .row-fluid:before, - .row-fluid:after { - display: table; - line-height: 0; - content: ""; - } - .row-fluid:after { - clear: both; - } - .row-fluid [class*="span"] { - display: block; - float: left; - width: 100%; - min-height: 30px; - margin-left: 2.7624309392265194%; - *margin-left: 2.709239449864817%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .row-fluid [class*="span"]:first-child { - margin-left: 0; - } - .row-fluid .controls-row [class*="span"] + [class*="span"] { - margin-left: 2.7624309392265194%; - } - .row-fluid .span12 { - width: 100%; - *width: 99.94680851063829%; - } - .row-fluid .span11 { - width: 91.43646408839778%; - *width: 91.38327259903608%; - } - .row-fluid .span10 { - width: 82.87292817679558%; - *width: 82.81973668743387%; - } - .row-fluid .span9 { - width: 74.30939226519337%; - *width: 74.25620077583166%; - } - .row-fluid .span8 { - width: 65.74585635359117%; - *width: 65.69266486422946%; - } - .row-fluid .span7 { - width: 57.18232044198895%; - *width: 57.12912895262725%; - } - .row-fluid .span6 { - width: 48.61878453038674%; - *width: 48.56559304102504%; - } - .row-fluid .span5 { - width: 40.05524861878453%; - *width: 40.00205712942283%; - } - .row-fluid .span4 { - width: 31.491712707182323%; - *width: 31.43852121782062%; - } - .row-fluid .span3 { - width: 22.92817679558011%; - *width: 22.87498530621841%; - } - .row-fluid .span2 { - width: 14.3646408839779%; - *width: 14.311449394616199%; - } - .row-fluid .span1 { - width: 5.801104972375691%; - *width: 5.747913483013988%; - } - .row-fluid .offset12 { - margin-left: 105.52486187845304%; - *margin-left: 105.41847889972962%; - } - .row-fluid .offset12:first-child { - margin-left: 102.76243093922652%; - *margin-left: 102.6560479605031%; - } - .row-fluid .offset11 { - margin-left: 96.96132596685082%; - *margin-left: 96.8549429881274%; - } - .row-fluid .offset11:first-child { - margin-left: 94.1988950276243%; - *margin-left: 94.09251204890089%; - } - .row-fluid .offset10 { - margin-left: 88.39779005524862%; - *margin-left: 88.2914070765252%; - } - .row-fluid .offset10:first-child { - margin-left: 85.6353591160221%; - *margin-left: 85.52897613729868%; - } - .row-fluid .offset9 { - margin-left: 79.8342541436464%; - *margin-left: 79.72787116492299%; - } - .row-fluid .offset9:first-child { - margin-left: 77.07182320441989%; - *margin-left: 76.96544022569647%; - } - .row-fluid .offset8 { - margin-left: 71.2707182320442%; - *margin-left: 71.16433525332079%; - } - .row-fluid .offset8:first-child { - margin-left: 68.50828729281768%; - *margin-left: 68.40190431409427%; - } - .row-fluid .offset7 { - margin-left: 62.70718232044199%; - *margin-left: 62.600799341718584%; - } - .row-fluid .offset7:first-child { - margin-left: 59.94475138121547%; - *margin-left: 59.838368402492065%; - } - .row-fluid .offset6 { - margin-left: 54.14364640883978%; - *margin-left: 54.037263430116376%; - } - .row-fluid .offset6:first-child { - margin-left: 51.38121546961326%; - *margin-left: 51.27483249088986%; - } - .row-fluid .offset5 { - margin-left: 45.58011049723757%; - *margin-left: 45.47372751851417%; - } - .row-fluid .offset5:first-child { - margin-left: 42.81767955801105%; - *margin-left: 42.71129657928765%; - } - .row-fluid .offset4 { - margin-left: 37.01657458563536%; - *margin-left: 36.91019160691196%; - } - .row-fluid .offset4:first-child { - margin-left: 34.25414364640884%; - *margin-left: 34.14776066768544%; - } - .row-fluid .offset3 { - margin-left: 28.45303867403315%; - *margin-left: 28.346655695309746%; - } - .row-fluid .offset3:first-child { - margin-left: 25.69060773480663%; - *margin-left: 25.584224756083227%; - } - .row-fluid .offset2 { - margin-left: 19.88950276243094%; - *margin-left: 19.783119783707537%; - } - .row-fluid .offset2:first-child { - margin-left: 17.12707182320442%; - *margin-left: 17.02068884448102%; - } - .row-fluid .offset1 { - margin-left: 11.32596685082873%; - *margin-left: 11.219583872105325%; - } - .row-fluid .offset1:first-child { - margin-left: 8.56353591160221%; - *margin-left: 8.457152932878806%; - } - input, - textarea, - .uneditable-input { - margin-left: 0; - } - .controls-row [class*="span"] + [class*="span"] { - margin-left: 20px; - } - input.span12, - textarea.span12, - .uneditable-input.span12 { - width: 710px; - } - input.span11, - textarea.span11, - .uneditable-input.span11 { - width: 648px; - } - input.span10, - textarea.span10, - .uneditable-input.span10 { - width: 586px; - } - input.span9, - textarea.span9, - .uneditable-input.span9 { - width: 524px; - } - input.span8, - textarea.span8, - .uneditable-input.span8 { - width: 462px; - } - input.span7, - textarea.span7, - .uneditable-input.span7 { - width: 400px; - } - input.span6, - textarea.span6, - .uneditable-input.span6 { - width: 338px; - } - input.span5, - textarea.span5, - .uneditable-input.span5 { - width: 276px; - } - input.span4, - textarea.span4, - .uneditable-input.span4 { - width: 214px; - } - input.span3, - textarea.span3, - .uneditable-input.span3 { - width: 152px; - } - input.span2, - textarea.span2, - .uneditable-input.span2 { - width: 90px; - } - input.span1, - textarea.span1, - .uneditable-input.span1 { - width: 28px; - } -} - -@media (max-width: 767px) { - body { - padding-right: 20px; - padding-left: 20px; - } - .navbar-fixed-top, - .navbar-fixed-bottom, - .navbar-static-top { - margin-right: -20px; - margin-left: -20px; - } - .container-fluid { - padding: 0; - } - .dl-horizontal dt { - float: none; - width: auto; - clear: none; - text-align: left; - } - .dl-horizontal dd { - margin-left: 0; - } - .container { - width: auto; - } - .row-fluid { - width: 100%; - } - .row, - .thumbnails { - margin-left: 0; - } - .thumbnails > li { - float: none; - margin-left: 0; - } - [class*="span"], - .uneditable-input[class*="span"], - .row-fluid [class*="span"] { - display: block; - float: none; - width: 100%; - margin-left: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .span12, - .row-fluid .span12 { - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .row-fluid [class*="offset"]:first-child { - margin-left: 0; - } - .input-large, - .input-xlarge, - .input-xxlarge, - input[class*="span"], - select[class*="span"], - textarea[class*="span"], - .uneditable-input { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .input-prepend input, - .input-append input, - .input-prepend input[class*="span"], - .input-append input[class*="span"] { - display: inline-block; - width: auto; - } - .controls-row [class*="span"] + [class*="span"] { - margin-left: 0; - } - .modal { - position: fixed; - top: 20px; - right: 20px; - left: 20px; - width: auto; - margin: 0; - } - .modal.fade { - top: -100px; - } - .modal.fade.in { - top: 20px; - } -} - -@media (max-width: 480px) { - .nav-collapse { - -webkit-transform: translate3d(0, 0, 0); - } - .page-header h1 small { - display: block; - line-height: 20px; - } - input[type="checkbox"], - input[type="radio"] { - border: 1px solid #ccc; - } - .form-horizontal .control-label { - float: none; - width: auto; - padding-top: 0; - text-align: left; - } - .form-horizontal .controls { - margin-left: 0; - } - .form-horizontal .control-list { - padding-top: 0; - } - .form-horizontal .form-actions { - padding-right: 10px; - padding-left: 10px; - } - .media .pull-left, - .media .pull-right { - display: block; - float: none; - margin-bottom: 10px; - } - .media-object { - margin-right: 0; - margin-left: 0; - } - .modal { - top: 10px; - right: 10px; - left: 10px; - } - .modal-header .close { - padding: 10px; - margin: -10px; - } - .carousel-caption { - position: static; - } -} - -@media (max-width: 979px) { - body { - padding-top: 0; - } - .navbar-fixed-top, - .navbar-fixed-bottom { - position: static; - } - .navbar-fixed-top { - margin-bottom: 20px; - } - .navbar-fixed-bottom { - margin-top: 20px; - } - .navbar-fixed-top .navbar-inner, - .navbar-fixed-bottom .navbar-inner { - padding: 5px; - } - .navbar .container { - width: auto; - padding: 0; - } - .navbar .brand { - padding-right: 10px; - padding-left: 10px; - margin: 0 0 0 -5px; - } - .nav-collapse { - clear: both; - } - .nav-collapse .nav { - float: none; - margin: 0 0 10px; - } - .nav-collapse .nav > li { - float: none; - } - .nav-collapse .nav > li > a { - margin-bottom: 2px; - } - .nav-collapse .nav > .divider-vertical { - display: none; - } - .nav-collapse .nav .nav-header { - color: #777777; - text-shadow: none; - } - .nav-collapse .nav > li > a, - .nav-collapse .dropdown-menu a { - padding: 9px 15px; - font-weight: bold; - color: #777777; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - } - .nav-collapse .btn { - padding: 4px 10px 4px; - font-weight: normal; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - } - .nav-collapse .dropdown-menu li + li a { - margin-bottom: 2px; - } - .nav-collapse .nav > li > a:hover, - .nav-collapse .nav > li > a:focus, - .nav-collapse .dropdown-menu a:hover, - .nav-collapse .dropdown-menu a:focus { - background-color: #f2f2f2; - } - .navbar-inverse .nav-collapse .nav > li > a, - .navbar-inverse .nav-collapse .dropdown-menu a { - color: #999999; - } - .navbar-inverse .nav-collapse .nav > li > a:hover, - .navbar-inverse .nav-collapse .nav > li > a:focus, - .navbar-inverse .nav-collapse .dropdown-menu a:hover, - .navbar-inverse .nav-collapse .dropdown-menu a:focus { - background-color: #111111; - } - .nav-collapse.in .btn-group { - padding: 0; - margin-top: 5px; - } - .nav-collapse .dropdown-menu { - position: static; - top: auto; - left: auto; - display: none; - float: none; - max-width: none; - padding: 0; - margin: 0 15px; - background-color: transparent; - border: none; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - } - .nav-collapse .open > .dropdown-menu { - display: block; - } - .nav-collapse .dropdown-menu:before, - .nav-collapse .dropdown-menu:after { - display: none; - } - .nav-collapse .dropdown-menu .divider { - display: none; - } - .nav-collapse .nav > li > .dropdown-menu:before, - .nav-collapse .nav > li > .dropdown-menu:after { - display: none; - } - .nav-collapse .navbar-form, - .nav-collapse .navbar-search { - float: none; - padding: 10px 15px; - margin: 10px 0; - border-top: 1px solid #f2f2f2; - border-bottom: 1px solid #f2f2f2; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - } - .navbar-inverse .nav-collapse .navbar-form, - .navbar-inverse .nav-collapse .navbar-search { - border-top-color: #111111; - border-bottom-color: #111111; - } - .navbar .nav-collapse .nav.pull-right { - float: none; - margin-left: 0; - } - .nav-collapse, - .nav-collapse.collapse { - height: 0; - overflow: hidden; - } - .navbar .btn-navbar { - display: block; - } - .navbar-static .navbar-inner { - padding-right: 10px; - padding-left: 10px; - } -} - -@media (min-width: 980px) { - .nav-collapse.collapse { - height: auto !important; - overflow: visible !important; - } -} diff --git a/flask_admin/static/bootstrap/bootstrap2/css/bootstrap-responsive.min.css b/flask_admin/static/bootstrap/bootstrap2/css/bootstrap-responsive.min.css deleted file mode 100644 index 96a435be9..000000000 --- a/flask_admin/static/bootstrap/bootstrap2/css/bootstrap-responsive.min.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * Bootstrap Responsive v2.3.2 - * - * Copyright 2013 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world by @mdo and @fat. - */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@-ms-viewport{width:device-width}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}@media(min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:inherit!important}.hidden-print{display:none!important}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.564102564102564%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.7624309392265194%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.uneditable-input[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="offset"]:first-child{margin-left:0}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.controls-row [class*="span"]+[class*="span"]{margin-left:0}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade{top:-100px}.modal.fade.in{top:20px}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.media .pull-left,.media .pull-right{display:block;float:none;margin-bottom:10px}.media-object{margin-right:0;margin-left:0}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:979px){body{padding-top:0}.navbar-fixed-top,.navbar-fixed-bottom{position:static}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#777;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .nav>li>a:focus,.nav-collapse .dropdown-menu a:hover,.nav-collapse .dropdown-menu a:focus{background-color:#f2f2f2}.navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#999}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .nav>li>a:focus,.navbar-inverse .nav-collapse .dropdown-menu a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:focus{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:none;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .open>.dropdown-menu{display:block}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111;border-bottom-color:#111}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}} diff --git a/flask_admin/static/bootstrap/bootstrap2/css/bootstrap.css b/flask_admin/static/bootstrap/bootstrap2/css/bootstrap.css deleted file mode 100644 index 5b7fe7e85..000000000 --- a/flask_admin/static/bootstrap/bootstrap2/css/bootstrap.css +++ /dev/null @@ -1,6167 +0,0 @@ -/*! - * Bootstrap v2.3.2 - * - * Copyright 2013 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world by @mdo and @fat. - */ - -.clearfix { - *zoom: 1; -} - -.clearfix:before, -.clearfix:after { - display: table; - line-height: 0; - content: ""; -} - -.clearfix:after { - clear: both; -} - -.hide-text { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.input-block-level { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -nav, -section { - display: block; -} - -audio, -canvas, -video { - display: inline-block; - *display: inline; - *zoom: 1; -} - -audio:not([controls]) { - display: none; -} - -html { - font-size: 100%; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} - -a:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -a:hover, -a:active { - outline: 0; -} - -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -img { - width: auto\9; - height: auto; - max-width: 100%; - vertical-align: middle; - border: 0; - -ms-interpolation-mode: bicubic; -} - -#map_canvas img, -.google-maps img { - max-width: none; -} - -button, -input, -select, -textarea { - margin: 0; - font-size: 100%; - vertical-align: middle; -} - -button, -input { - *overflow: visible; - line-height: normal; -} - -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} - -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - cursor: pointer; - -webkit-appearance: button; -} - -label, -select, -button, -input[type="button"], -input[type="reset"], -input[type="submit"], -input[type="radio"], -input[type="checkbox"] { - cursor: pointer; -} - -input[type="search"] { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: textfield; -} - -input[type="search"]::-webkit-search-decoration, -input[type="search"]::-webkit-search-cancel-button { - -webkit-appearance: none; -} - -textarea { - overflow: auto; - vertical-align: top; -} - -@media print { - * { - color: #000 !important; - text-shadow: none !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) ")"; - } - .ir a:after, - 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; - } - @page { - margin: 0.5cm; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } -} - -body { - margin: 0; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 20px; - color: #333333; - background-color: #ffffff; -} - -a { - color: #0088cc; - text-decoration: none; -} - -a:hover, -a:focus { - color: #005580; - text-decoration: underline; -} - -.img-rounded { - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.img-polaroid { - padding: 4px; - background-color: #fff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); -} - -.img-circle { - -webkit-border-radius: 500px; - -moz-border-radius: 500px; - border-radius: 500px; -} - -.row { - margin-left: -20px; - *zoom: 1; -} - -.row:before, -.row:after { - display: table; - line-height: 0; - content: ""; -} - -.row:after { - clear: both; -} - -[class*="span"] { - float: left; - min-height: 1px; - margin-left: 20px; -} - -.container, -.navbar-static-top .container, -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; -} - -.span12 { - width: 940px; -} - -.span11 { - width: 860px; -} - -.span10 { - width: 780px; -} - -.span9 { - width: 700px; -} - -.span8 { - width: 620px; -} - -.span7 { - width: 540px; -} - -.span6 { - width: 460px; -} - -.span5 { - width: 380px; -} - -.span4 { - width: 300px; -} - -.span3 { - width: 220px; -} - -.span2 { - width: 140px; -} - -.span1 { - width: 60px; -} - -.offset12 { - margin-left: 980px; -} - -.offset11 { - margin-left: 900px; -} - -.offset10 { - margin-left: 820px; -} - -.offset9 { - margin-left: 740px; -} - -.offset8 { - margin-left: 660px; -} - -.offset7 { - margin-left: 580px; -} - -.offset6 { - margin-left: 500px; -} - -.offset5 { - margin-left: 420px; -} - -.offset4 { - margin-left: 340px; -} - -.offset3 { - margin-left: 260px; -} - -.offset2 { - margin-left: 180px; -} - -.offset1 { - margin-left: 100px; -} - -.row-fluid { - width: 100%; - *zoom: 1; -} - -.row-fluid:before, -.row-fluid:after { - display: table; - line-height: 0; - content: ""; -} - -.row-fluid:after { - clear: both; -} - -.row-fluid [class*="span"] { - display: block; - float: left; - width: 100%; - min-height: 30px; - margin-left: 2.127659574468085%; - *margin-left: 2.074468085106383%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.row-fluid [class*="span"]:first-child { - margin-left: 0; -} - -.row-fluid .controls-row [class*="span"] + [class*="span"] { - margin-left: 2.127659574468085%; -} - -.row-fluid .span12 { - width: 100%; - *width: 99.94680851063829%; -} - -.row-fluid .span11 { - width: 91.48936170212765%; - *width: 91.43617021276594%; -} - -.row-fluid .span10 { - width: 82.97872340425532%; - *width: 82.92553191489361%; -} - -.row-fluid .span9 { - width: 74.46808510638297%; - *width: 74.41489361702126%; -} - -.row-fluid .span8 { - width: 65.95744680851064%; - *width: 65.90425531914893%; -} - -.row-fluid .span7 { - width: 57.44680851063829%; - *width: 57.39361702127659%; -} - -.row-fluid .span6 { - width: 48.93617021276595%; - *width: 48.88297872340425%; -} - -.row-fluid .span5 { - width: 40.42553191489362%; - *width: 40.37234042553192%; -} - -.row-fluid .span4 { - width: 31.914893617021278%; - *width: 31.861702127659576%; -} - -.row-fluid .span3 { - width: 23.404255319148934%; - *width: 23.351063829787233%; -} - -.row-fluid .span2 { - width: 14.893617021276595%; - *width: 14.840425531914894%; -} - -.row-fluid .span1 { - width: 6.382978723404255%; - *width: 6.329787234042553%; -} - -.row-fluid .offset12 { - margin-left: 104.25531914893617%; - *margin-left: 104.14893617021275%; -} - -.row-fluid .offset12:first-child { - margin-left: 102.12765957446808%; - *margin-left: 102.02127659574467%; -} - -.row-fluid .offset11 { - margin-left: 95.74468085106382%; - *margin-left: 95.6382978723404%; -} - -.row-fluid .offset11:first-child { - margin-left: 93.61702127659574%; - *margin-left: 93.51063829787232%; -} - -.row-fluid .offset10 { - margin-left: 87.23404255319149%; - *margin-left: 87.12765957446807%; -} - -.row-fluid .offset10:first-child { - margin-left: 85.1063829787234%; - *margin-left: 84.99999999999999%; -} - -.row-fluid .offset9 { - margin-left: 78.72340425531914%; - *margin-left: 78.61702127659572%; -} - -.row-fluid .offset9:first-child { - margin-left: 76.59574468085106%; - *margin-left: 76.48936170212764%; -} - -.row-fluid .offset8 { - margin-left: 70.2127659574468%; - *margin-left: 70.10638297872339%; -} - -.row-fluid .offset8:first-child { - margin-left: 68.08510638297872%; - *margin-left: 67.9787234042553%; -} - -.row-fluid .offset7 { - margin-left: 61.70212765957446%; - *margin-left: 61.59574468085106%; -} - -.row-fluid .offset7:first-child { - margin-left: 59.574468085106375%; - *margin-left: 59.46808510638297%; -} - -.row-fluid .offset6 { - margin-left: 53.191489361702125%; - *margin-left: 53.085106382978715%; -} - -.row-fluid .offset6:first-child { - margin-left: 51.063829787234035%; - *margin-left: 50.95744680851063%; -} - -.row-fluid .offset5 { - margin-left: 44.68085106382979%; - *margin-left: 44.57446808510638%; -} - -.row-fluid .offset5:first-child { - margin-left: 42.5531914893617%; - *margin-left: 42.4468085106383%; -} - -.row-fluid .offset4 { - margin-left: 36.170212765957444%; - *margin-left: 36.06382978723405%; -} - -.row-fluid .offset4:first-child { - margin-left: 34.04255319148936%; - *margin-left: 33.93617021276596%; -} - -.row-fluid .offset3 { - margin-left: 27.659574468085104%; - *margin-left: 27.5531914893617%; -} - -.row-fluid .offset3:first-child { - margin-left: 25.53191489361702%; - *margin-left: 25.425531914893618%; -} - -.row-fluid .offset2 { - margin-left: 19.148936170212764%; - *margin-left: 19.04255319148936%; -} - -.row-fluid .offset2:first-child { - margin-left: 17.02127659574468%; - *margin-left: 16.914893617021278%; -} - -.row-fluid .offset1 { - margin-left: 10.638297872340425%; - *margin-left: 10.53191489361702%; -} - -.row-fluid .offset1:first-child { - margin-left: 8.51063829787234%; - *margin-left: 8.404255319148938%; -} - -[class*="span"].hide, -.row-fluid [class*="span"].hide { - display: none; -} - -[class*="span"].pull-right, -.row-fluid [class*="span"].pull-right { - float: right; -} - -.container { - margin-right: auto; - margin-left: auto; - *zoom: 1; -} - -.container:before, -.container:after { - display: table; - line-height: 0; - content: ""; -} - -.container:after { - clear: both; -} - -.container-fluid { - padding-right: 20px; - padding-left: 20px; - *zoom: 1; -} - -.container-fluid:before, -.container-fluid:after { - display: table; - line-height: 0; - content: ""; -} - -.container-fluid:after { - clear: both; -} - -p { - margin: 0 0 10px; -} - -.lead { - margin-bottom: 20px; - font-size: 21px; - font-weight: 200; - line-height: 30px; -} - -small { - font-size: 85%; -} - -strong { - font-weight: bold; -} - -em { - font-style: italic; -} - -cite { - font-style: normal; -} - -.muted { - color: #999999; -} - -a.muted:hover, -a.muted:focus { - color: #808080; -} - -.text-warning { - color: #c09853; -} - -a.text-warning:hover, -a.text-warning:focus { - color: #a47e3c; -} - -.text-error { - color: #b94a48; -} - -a.text-error:hover, -a.text-error:focus { - color: #953b39; -} - -.text-info { - color: #3a87ad; -} - -a.text-info:hover, -a.text-info:focus { - color: #2d6987; -} - -.text-success { - color: #468847; -} - -a.text-success:hover, -a.text-success:focus { - color: #356635; -} - -.text-left { - text-align: left; -} - -.text-right { - text-align: right; -} - -.text-center { - text-align: center; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 10px 0; - font-family: inherit; - font-weight: bold; - line-height: 20px; - color: inherit; - text-rendering: optimizelegibility; -} - -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small { - font-weight: normal; - line-height: 1; - color: #999999; -} - -h1, -h2, -h3 { - line-height: 40px; -} - -h1 { - font-size: 38.5px; -} - -h2 { - font-size: 31.5px; -} - -h3 { - font-size: 24.5px; -} - -h4 { - font-size: 17.5px; -} - -h5 { - font-size: 14px; -} - -h6 { - font-size: 11.9px; -} - -h1 small { - font-size: 24.5px; -} - -h2 small { - font-size: 17.5px; -} - -h3 small { - font-size: 14px; -} - -h4 small { - font-size: 14px; -} - -.page-header { - padding-bottom: 9px; - margin: 20px 0 30px; - border-bottom: 1px solid #eeeeee; -} - -ul, -ol { - padding: 0; - margin: 0 0 10px 25px; -} - -ul ul, -ul ol, -ol ol, -ol ul { - margin-bottom: 0; -} - -li { - line-height: 20px; -} - -ul.unstyled, -ol.unstyled { - margin-left: 0; - list-style: none; -} - -ul.inline, -ol.inline { - margin-left: 0; - list-style: none; -} - -ul.inline > li, -ol.inline > li { - display: inline-block; - *display: inline; - padding-right: 5px; - padding-left: 5px; - *zoom: 1; -} - -dl { - margin-bottom: 20px; -} - -dt, -dd { - line-height: 20px; -} - -dt { - font-weight: bold; -} - -dd { - margin-left: 10px; -} - -.dl-horizontal { - *zoom: 1; -} - -.dl-horizontal:before, -.dl-horizontal:after { - display: table; - line-height: 0; - content: ""; -} - -.dl-horizontal:after { - clear: both; -} - -.dl-horizontal dt { - float: left; - width: 160px; - overflow: hidden; - clear: left; - text-align: right; - text-overflow: ellipsis; - white-space: nowrap; -} - -.dl-horizontal dd { - margin-left: 180px; -} - -hr { - margin: 20px 0; - border: 0; - border-top: 1px solid #eeeeee; - border-bottom: 1px solid #ffffff; -} - -abbr[title], -abbr[data-original-title] { - cursor: help; - border-bottom: 1px dotted #999999; -} - -abbr.initialism { - font-size: 90%; - text-transform: uppercase; -} - -blockquote { - padding: 0 0 0 15px; - margin: 0 0 20px; - border-left: 5px solid #eeeeee; -} - -blockquote p { - margin-bottom: 0; - font-size: 17.5px; - font-weight: 300; - line-height: 1.25; -} - -blockquote small { - display: block; - line-height: 20px; - color: #999999; -} - -blockquote small:before { - content: '\2014 \00A0'; -} - -blockquote.pull-right { - float: right; - padding-right: 15px; - padding-left: 0; - border-right: 5px solid #eeeeee; - border-left: 0; -} - -blockquote.pull-right p, -blockquote.pull-right small { - text-align: right; -} - -blockquote.pull-right small:before { - content: ''; -} - -blockquote.pull-right small:after { - content: '\00A0 \2014'; -} - -q:before, -q:after, -blockquote:before, -blockquote:after { - content: ""; -} - -address { - display: block; - margin-bottom: 20px; - font-style: normal; - line-height: 20px; -} - -code, -pre { - padding: 0 3px 2px; - font-family: Monaco, Menlo, Consolas, "Courier New", monospace; - font-size: 12px; - color: #333333; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -code { - padding: 2px 4px; - color: #d14; - white-space: nowrap; - background-color: #f7f7f9; - border: 1px solid #e1e1e8; -} - -pre { - display: block; - padding: 9.5px; - margin: 0 0 10px; - font-size: 13px; - line-height: 20px; - word-break: break-all; - word-wrap: break-word; - white-space: pre; - white-space: pre-wrap; - background-color: #f5f5f5; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.15); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -pre.prettyprint { - margin-bottom: 20px; -} - -pre code { - padding: 0; - color: inherit; - white-space: pre; - white-space: pre-wrap; - background-color: transparent; - border: 0; -} - -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} - -form { - margin: 0 0 20px; -} - -fieldset { - padding: 0; - margin: 0; - border: 0; -} - -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: 40px; - color: #333333; - border: 0; - border-bottom: 1px solid #e5e5e5; -} - -legend small { - font-size: 15px; - color: #999999; -} - -label, -input, -button, -select, -textarea { - font-size: 14px; - font-weight: normal; - line-height: 20px; -} - -input, -button, -select, -textarea { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -} - -label { - display: block; - margin-bottom: 5px; -} - -select, -textarea, -input[type="text"], -input[type="password"], -input[type="datetime"], -input[type="datetime-local"], -input[type="date"], -input[type="month"], -input[type="time"], -input[type="week"], -input[type="number"], -input[type="email"], -input[type="url"], -input[type="search"], -input[type="tel"], -input[type="color"], -.uneditable-input { - display: inline-block; - height: 20px; - padding: 4px 6px; - margin-bottom: 10px; - font-size: 14px; - line-height: 20px; - color: #555555; - vertical-align: middle; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -input, -textarea, -.uneditable-input { - width: 206px; -} - -textarea { - height: auto; -} - -textarea, -input[type="text"], -input[type="password"], -input[type="datetime"], -input[type="datetime-local"], -input[type="date"], -input[type="month"], -input[type="time"], -input[type="week"], -input[type="number"], -input[type="email"], -input[type="url"], -input[type="search"], -input[type="tel"], -input[type="color"], -.uneditable-input { - background-color: #ffffff; - border: 1px solid #cccccc; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; - -moz-transition: border linear 0.2s, box-shadow linear 0.2s; - -o-transition: border linear 0.2s, box-shadow linear 0.2s; - transition: border linear 0.2s, box-shadow linear 0.2s; -} - -textarea:focus, -input[type="text"]:focus, -input[type="password"]:focus, -input[type="datetime"]:focus, -input[type="datetime-local"]:focus, -input[type="date"]:focus, -input[type="month"]:focus, -input[type="time"]:focus, -input[type="week"]:focus, -input[type="number"]:focus, -input[type="email"]:focus, -input[type="url"]:focus, -input[type="search"]:focus, -input[type="tel"]:focus, -input[type="color"]:focus, -.uneditable-input:focus { - border-color: rgba(82, 168, 236, 0.8); - outline: 0; - outline: thin dotted \9; - /* IE6-9 */ - - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); -} - -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - margin-top: 1px \9; - *margin-top: 0; - line-height: normal; -} - -input[type="file"], -input[type="image"], -input[type="submit"], -input[type="reset"], -input[type="button"], -input[type="radio"], -input[type="checkbox"] { - width: auto; -} - -select, -input[type="file"] { - height: 30px; - /* In IE7, the height of the select element cannot be changed by height, only font-size */ - - *margin-top: 4px; - /* For IE7, add top margin to align select with labels */ - - line-height: 30px; -} - -select { - width: 220px; - background-color: #ffffff; - border: 1px solid #cccccc; -} - -select[multiple], -select[size] { - height: auto; -} - -select:focus, -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -.uneditable-input, -.uneditable-textarea { - color: #999999; - cursor: not-allowed; - background-color: #fcfcfc; - border-color: #cccccc; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); -} - -.uneditable-input { - overflow: hidden; - white-space: nowrap; -} - -.uneditable-textarea { - width: auto; - height: auto; -} - -input:-moz-placeholder, -textarea:-moz-placeholder { - color: #999999; -} - -input:-ms-input-placeholder, -textarea:-ms-input-placeholder { - color: #999999; -} - -input::-webkit-input-placeholder, -textarea::-webkit-input-placeholder { - color: #999999; -} - -.radio, -.checkbox { - min-height: 20px; - padding-left: 20px; -} - -.radio input[type="radio"], -.checkbox input[type="checkbox"] { - float: left; - margin-left: -20px; -} - -.controls > .radio:first-child, -.controls > .checkbox:first-child { - padding-top: 5px; -} - -.radio.inline, -.checkbox.inline { - display: inline-block; - padding-top: 5px; - margin-bottom: 0; - vertical-align: middle; -} - -.radio.inline + .radio.inline, -.checkbox.inline + .checkbox.inline { - margin-left: 10px; -} - -.input-mini { - width: 60px; -} - -.input-small { - width: 90px; -} - -.input-medium { - width: 150px; -} - -.input-large { - width: 210px; -} - -.input-xlarge { - width: 270px; -} - -.input-xxlarge { - width: 530px; -} - -input[class*="span"], -select[class*="span"], -textarea[class*="span"], -.uneditable-input[class*="span"], -.row-fluid input[class*="span"], -.row-fluid select[class*="span"], -.row-fluid textarea[class*="span"], -.row-fluid .uneditable-input[class*="span"] { - float: none; - margin-left: 0; -} - -.input-append input[class*="span"], -.input-append .uneditable-input[class*="span"], -.input-prepend input[class*="span"], -.input-prepend .uneditable-input[class*="span"], -.row-fluid input[class*="span"], -.row-fluid select[class*="span"], -.row-fluid textarea[class*="span"], -.row-fluid .uneditable-input[class*="span"], -.row-fluid .input-prepend [class*="span"], -.row-fluid .input-append [class*="span"] { - display: inline-block; -} - -input, -textarea, -.uneditable-input { - margin-left: 0; -} - -.controls-row [class*="span"] + [class*="span"] { - margin-left: 20px; -} - -input.span12, -textarea.span12, -.uneditable-input.span12 { - width: 926px; -} - -input.span11, -textarea.span11, -.uneditable-input.span11 { - width: 846px; -} - -input.span10, -textarea.span10, -.uneditable-input.span10 { - width: 766px; -} - -input.span9, -textarea.span9, -.uneditable-input.span9 { - width: 686px; -} - -input.span8, -textarea.span8, -.uneditable-input.span8 { - width: 606px; -} - -input.span7, -textarea.span7, -.uneditable-input.span7 { - width: 526px; -} - -input.span6, -textarea.span6, -.uneditable-input.span6 { - width: 446px; -} - -input.span5, -textarea.span5, -.uneditable-input.span5 { - width: 366px; -} - -input.span4, -textarea.span4, -.uneditable-input.span4 { - width: 286px; -} - -input.span3, -textarea.span3, -.uneditable-input.span3 { - width: 206px; -} - -input.span2, -textarea.span2, -.uneditable-input.span2 { - width: 126px; -} - -input.span1, -textarea.span1, -.uneditable-input.span1 { - width: 46px; -} - -.controls-row { - *zoom: 1; -} - -.controls-row:before, -.controls-row:after { - display: table; - line-height: 0; - content: ""; -} - -.controls-row:after { - clear: both; -} - -.controls-row [class*="span"], -.row-fluid .controls-row [class*="span"] { - float: left; -} - -.controls-row .checkbox[class*="span"], -.controls-row .radio[class*="span"] { - padding-top: 5px; -} - -input[disabled], -select[disabled], -textarea[disabled], -input[readonly], -select[readonly], -textarea[readonly] { - cursor: not-allowed; - background-color: #eeeeee; -} - -input[type="radio"][disabled], -input[type="checkbox"][disabled], -input[type="radio"][readonly], -input[type="checkbox"][readonly] { - background-color: transparent; -} - -.control-group.warning .control-label, -.control-group.warning .help-block, -.control-group.warning .help-inline { - color: #c09853; -} - -.control-group.warning .checkbox, -.control-group.warning .radio, -.control-group.warning input, -.control-group.warning select, -.control-group.warning textarea { - color: #c09853; -} - -.control-group.warning input, -.control-group.warning select, -.control-group.warning textarea { - border-color: #c09853; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.control-group.warning input:focus, -.control-group.warning select:focus, -.control-group.warning textarea:focus { - border-color: #a47e3c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; -} - -.control-group.warning .input-prepend .add-on, -.control-group.warning .input-append .add-on { - color: #c09853; - background-color: #fcf8e3; - border-color: #c09853; -} - -.control-group.error .control-label, -.control-group.error .help-block, -.control-group.error .help-inline { - color: #b94a48; -} - -.control-group.error .checkbox, -.control-group.error .radio, -.control-group.error input, -.control-group.error select, -.control-group.error textarea { - color: #b94a48; -} - -.control-group.error input, -.control-group.error select, -.control-group.error textarea { - border-color: #b94a48; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.control-group.error input:focus, -.control-group.error select:focus, -.control-group.error textarea:focus { - border-color: #953b39; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; -} - -.control-group.error .input-prepend .add-on, -.control-group.error .input-append .add-on { - color: #b94a48; - background-color: #f2dede; - border-color: #b94a48; -} - -.control-group.success .control-label, -.control-group.success .help-block, -.control-group.success .help-inline { - color: #468847; -} - -.control-group.success .checkbox, -.control-group.success .radio, -.control-group.success input, -.control-group.success select, -.control-group.success textarea { - color: #468847; -} - -.control-group.success input, -.control-group.success select, -.control-group.success textarea { - border-color: #468847; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.control-group.success input:focus, -.control-group.success select:focus, -.control-group.success textarea:focus { - border-color: #356635; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; -} - -.control-group.success .input-prepend .add-on, -.control-group.success .input-append .add-on { - color: #468847; - background-color: #dff0d8; - border-color: #468847; -} - -.control-group.info .control-label, -.control-group.info .help-block, -.control-group.info .help-inline { - color: #3a87ad; -} - -.control-group.info .checkbox, -.control-group.info .radio, -.control-group.info input, -.control-group.info select, -.control-group.info textarea { - color: #3a87ad; -} - -.control-group.info input, -.control-group.info select, -.control-group.info textarea { - border-color: #3a87ad; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.control-group.info input:focus, -.control-group.info select:focus, -.control-group.info textarea:focus { - border-color: #2d6987; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; -} - -.control-group.info .input-prepend .add-on, -.control-group.info .input-append .add-on { - color: #3a87ad; - background-color: #d9edf7; - border-color: #3a87ad; -} - -input:focus:invalid, -textarea:focus:invalid, -select:focus:invalid { - color: #b94a48; - border-color: #ee5f5b; -} - -input:focus:invalid:focus, -textarea:focus:invalid:focus, -select:focus:invalid:focus { - border-color: #e9322d; - -webkit-box-shadow: 0 0 6px #f8b9b7; - -moz-box-shadow: 0 0 6px #f8b9b7; - box-shadow: 0 0 6px #f8b9b7; -} - -.form-actions { - padding: 19px 20px 20px; - margin-top: 20px; - margin-bottom: 20px; - background-color: #f5f5f5; - border-top: 1px solid #e5e5e5; - *zoom: 1; -} - -.form-actions:before, -.form-actions:after { - display: table; - line-height: 0; - content: ""; -} - -.form-actions:after { - clear: both; -} - -.help-block, -.help-inline { - color: #595959; -} - -.help-block { - display: block; - margin-bottom: 10px; -} - -.help-inline { - display: inline-block; - *display: inline; - padding-left: 5px; - vertical-align: middle; - *zoom: 1; -} - -.input-append, -.input-prepend { - display: inline-block; - margin-bottom: 10px; - font-size: 0; - white-space: nowrap; - vertical-align: middle; -} - -.input-append input, -.input-prepend input, -.input-append select, -.input-prepend select, -.input-append .uneditable-input, -.input-prepend .uneditable-input, -.input-append .dropdown-menu, -.input-prepend .dropdown-menu, -.input-append .popover, -.input-prepend .popover { - font-size: 14px; -} - -.input-append input, -.input-prepend input, -.input-append select, -.input-prepend select, -.input-append .uneditable-input, -.input-prepend .uneditable-input { - position: relative; - margin-bottom: 0; - *margin-left: 0; - vertical-align: top; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.input-append input:focus, -.input-prepend input:focus, -.input-append select:focus, -.input-prepend select:focus, -.input-append .uneditable-input:focus, -.input-prepend .uneditable-input:focus { - z-index: 2; -} - -.input-append .add-on, -.input-prepend .add-on { - display: inline-block; - width: auto; - height: 20px; - min-width: 16px; - padding: 4px 5px; - font-size: 14px; - font-weight: normal; - line-height: 20px; - text-align: center; - text-shadow: 0 1px 0 #ffffff; - background-color: #eeeeee; - border: 1px solid #ccc; -} - -.input-append .add-on, -.input-prepend .add-on, -.input-append .btn, -.input-prepend .btn, -.input-append .btn-group > .dropdown-toggle, -.input-prepend .btn-group > .dropdown-toggle { - vertical-align: top; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.input-append .active, -.input-prepend .active { - background-color: #a9dba9; - border-color: #46a546; -} - -.input-prepend .add-on, -.input-prepend .btn { - margin-right: -1px; -} - -.input-prepend .add-on:first-child, -.input-prepend .btn:first-child { - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} - -.input-append input, -.input-append select, -.input-append .uneditable-input { - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} - -.input-append input + .btn-group .btn:last-child, -.input-append select + .btn-group .btn:last-child, -.input-append .uneditable-input + .btn-group .btn:last-child { - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.input-append .add-on, -.input-append .btn, -.input-append .btn-group { - margin-left: -1px; -} - -.input-append .add-on:last-child, -.input-append .btn:last-child, -.input-append .btn-group:last-child > .dropdown-toggle { - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.input-prepend.input-append input, -.input-prepend.input-append select, -.input-prepend.input-append .uneditable-input { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.input-prepend.input-append input + .btn-group .btn, -.input-prepend.input-append select + .btn-group .btn, -.input-prepend.input-append .uneditable-input + .btn-group .btn { - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.input-prepend.input-append .add-on:first-child, -.input-prepend.input-append .btn:first-child { - margin-right: -1px; - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} - -.input-prepend.input-append .add-on:last-child, -.input-prepend.input-append .btn:last-child { - margin-left: -1px; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.input-prepend.input-append .btn-group:first-child { - margin-left: 0; -} - -input.search-query { - padding-right: 14px; - padding-right: 4px \9; - padding-left: 14px; - padding-left: 4px \9; - /* IE7-8 doesn't have border-radius, so don't indent the padding */ - - margin-bottom: 0; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} - -/* Allow for input prepend/append in search forms */ - -.form-search .input-append .search-query, -.form-search .input-prepend .search-query { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.form-search .input-append .search-query { - -webkit-border-radius: 14px 0 0 14px; - -moz-border-radius: 14px 0 0 14px; - border-radius: 14px 0 0 14px; -} - -.form-search .input-append .btn { - -webkit-border-radius: 0 14px 14px 0; - -moz-border-radius: 0 14px 14px 0; - border-radius: 0 14px 14px 0; -} - -.form-search .input-prepend .search-query { - -webkit-border-radius: 0 14px 14px 0; - -moz-border-radius: 0 14px 14px 0; - border-radius: 0 14px 14px 0; -} - -.form-search .input-prepend .btn { - -webkit-border-radius: 14px 0 0 14px; - -moz-border-radius: 14px 0 0 14px; - border-radius: 14px 0 0 14px; -} - -.form-search input, -.form-inline input, -.form-horizontal input, -.form-search textarea, -.form-inline textarea, -.form-horizontal textarea, -.form-search select, -.form-inline select, -.form-horizontal select, -.form-search .help-inline, -.form-inline .help-inline, -.form-horizontal .help-inline, -.form-search .uneditable-input, -.form-inline .uneditable-input, -.form-horizontal .uneditable-input, -.form-search .input-prepend, -.form-inline .input-prepend, -.form-horizontal .input-prepend, -.form-search .input-append, -.form-inline .input-append, -.form-horizontal .input-append { - display: inline-block; - *display: inline; - margin-bottom: 0; - vertical-align: middle; - *zoom: 1; -} - -.form-search .hide, -.form-inline .hide, -.form-horizontal .hide { - display: none; -} - -.form-search label, -.form-inline label, -.form-search .btn-group, -.form-inline .btn-group { - display: inline-block; -} - -.form-search .input-append, -.form-inline .input-append, -.form-search .input-prepend, -.form-inline .input-prepend { - margin-bottom: 0; -} - -.form-search .radio, -.form-search .checkbox, -.form-inline .radio, -.form-inline .checkbox { - padding-left: 0; - margin-bottom: 0; - vertical-align: middle; -} - -.form-search .radio input[type="radio"], -.form-search .checkbox input[type="checkbox"], -.form-inline .radio input[type="radio"], -.form-inline .checkbox input[type="checkbox"] { - float: left; - margin-right: 3px; - margin-left: 0; -} - -.control-group { - margin-bottom: 10px; -} - -legend + .control-group { - margin-top: 20px; - -webkit-margin-top-collapse: separate; -} - -.form-horizontal .control-group { - margin-bottom: 20px; - *zoom: 1; -} - -.form-horizontal .control-group:before, -.form-horizontal .control-group:after { - display: table; - line-height: 0; - content: ""; -} - -.form-horizontal .control-group:after { - clear: both; -} - -.form-horizontal .control-label { - float: left; - width: 160px; - padding-top: 5px; - text-align: right; -} - -.form-horizontal .controls { - *display: inline-block; - *padding-left: 20px; - margin-left: 180px; - *margin-left: 0; -} - -.form-horizontal .controls:first-child { - *padding-left: 180px; -} - -.form-horizontal .help-block { - margin-bottom: 0; -} - -.form-horizontal input + .help-block, -.form-horizontal select + .help-block, -.form-horizontal textarea + .help-block, -.form-horizontal .uneditable-input + .help-block, -.form-horizontal .input-prepend + .help-block, -.form-horizontal .input-append + .help-block { - margin-top: 10px; -} - -.form-horizontal .form-actions { - padding-left: 180px; -} - -table { - max-width: 100%; - background-color: transparent; - border-collapse: collapse; - border-spacing: 0; -} - -.table { - width: 100%; - margin-bottom: 20px; -} - -.table th, -.table td { - padding: 8px; - line-height: 20px; - text-align: left; - vertical-align: top; - border-top: 1px solid #dddddd; -} - -.table th { - font-weight: bold; -} - -.table thead th { - vertical-align: bottom; -} - -.table caption + thead tr:first-child th, -.table caption + thead tr:first-child td, -.table colgroup + thead tr:first-child th, -.table colgroup + thead tr:first-child td, -.table thead:first-child tr:first-child th, -.table thead:first-child tr:first-child td { - border-top: 0; -} - -.table tbody + tbody { - border-top: 2px solid #dddddd; -} - -.table .table { - background-color: #ffffff; -} - -.table-condensed th, -.table-condensed td { - padding: 4px 5px; -} - -.table-bordered { - border: 1px solid #dddddd; - border-collapse: separate; - *border-collapse: collapse; - border-left: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.table-bordered th, -.table-bordered td { - border-left: 1px solid #dddddd; -} - -.table-bordered caption + thead tr:first-child th, -.table-bordered caption + tbody tr:first-child th, -.table-bordered caption + tbody tr:first-child td, -.table-bordered colgroup + thead tr:first-child th, -.table-bordered colgroup + tbody tr:first-child th, -.table-bordered colgroup + tbody tr:first-child td, -.table-bordered thead:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child td { - border-top: 0; -} - -.table-bordered thead:first-child tr:first-child > th:first-child, -.table-bordered tbody:first-child tr:first-child > td:first-child, -.table-bordered tbody:first-child tr:first-child > th:first-child { - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; -} - -.table-bordered thead:first-child tr:first-child > th:last-child, -.table-bordered tbody:first-child tr:first-child > td:last-child, -.table-bordered tbody:first-child tr:first-child > th:last-child { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; -} - -.table-bordered thead:last-child tr:last-child > th:first-child, -.table-bordered tbody:last-child tr:last-child > td:first-child, -.table-bordered tbody:last-child tr:last-child > th:first-child, -.table-bordered tfoot:last-child tr:last-child > td:first-child, -.table-bordered tfoot:last-child tr:last-child > th:first-child { - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; -} - -.table-bordered thead:last-child tr:last-child > th:last-child, -.table-bordered tbody:last-child tr:last-child > td:last-child, -.table-bordered tbody:last-child tr:last-child > th:last-child, -.table-bordered tfoot:last-child tr:last-child > td:last-child, -.table-bordered tfoot:last-child tr:last-child > th:last-child { - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -moz-border-radius-bottomright: 4px; -} - -.table-bordered tfoot + tbody:last-child tr:last-child td:first-child { - -webkit-border-bottom-left-radius: 0; - border-bottom-left-radius: 0; - -moz-border-radius-bottomleft: 0; -} - -.table-bordered tfoot + tbody:last-child tr:last-child td:last-child { - -webkit-border-bottom-right-radius: 0; - border-bottom-right-radius: 0; - -moz-border-radius-bottomright: 0; -} - -.table-bordered caption + thead tr:first-child th:first-child, -.table-bordered caption + tbody tr:first-child td:first-child, -.table-bordered colgroup + thead tr:first-child th:first-child, -.table-bordered colgroup + tbody tr:first-child td:first-child { - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; -} - -.table-bordered caption + thead tr:first-child th:last-child, -.table-bordered caption + tbody tr:first-child td:last-child, -.table-bordered colgroup + thead tr:first-child th:last-child, -.table-bordered colgroup + tbody tr:first-child td:last-child { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; -} - -.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 td[class*="span"], -table th[class*="span"], -.row-fluid table td[class*="span"], -.row-fluid table th[class*="span"] { - display: table-cell; - float: none; - margin-left: 0; -} - -.table td.span1, -.table th.span1 { - float: none; - width: 44px; - margin-left: 0; -} - -.table td.span2, -.table th.span2 { - float: none; - width: 124px; - margin-left: 0; -} - -.table td.span3, -.table th.span3 { - float: none; - width: 204px; - margin-left: 0; -} - -.table td.span4, -.table th.span4 { - float: none; - width: 284px; - margin-left: 0; -} - -.table td.span5, -.table th.span5 { - float: none; - width: 364px; - margin-left: 0; -} - -.table td.span6, -.table th.span6 { - float: none; - width: 444px; - margin-left: 0; -} - -.table td.span7, -.table th.span7 { - float: none; - width: 524px; - margin-left: 0; -} - -.table td.span8, -.table th.span8 { - float: none; - width: 604px; - margin-left: 0; -} - -.table td.span9, -.table th.span9 { - float: none; - width: 684px; - margin-left: 0; -} - -.table td.span10, -.table th.span10 { - float: none; - width: 764px; - margin-left: 0; -} - -.table td.span11, -.table th.span11 { - float: none; - width: 844px; - margin-left: 0; -} - -.table td.span12, -.table th.span12 { - float: none; - width: 924px; - margin-left: 0; -} - -.table tbody tr.success > td { - background-color: #dff0d8; -} - -.table tbody tr.error > td { - background-color: #f2dede; -} - -.table tbody tr.warning > td { - background-color: #fcf8e3; -} - -.table tbody tr.info > td { - background-color: #d9edf7; -} - -.table-hover tbody tr.success:hover > td { - background-color: #d0e9c6; -} - -.table-hover tbody tr.error:hover > td { - background-color: #ebcccc; -} - -.table-hover tbody tr.warning:hover > td { - background-color: #faf2cc; -} - -.table-hover tbody tr.info:hover > td { - background-color: #c4e3f3; -} - -[class^="icon-"], -[class*=" icon-"] { - display: inline-block; - width: 14px; - height: 14px; - margin-top: 1px; - *margin-right: .3em; - line-height: 14px; - vertical-align: text-top; - background-image: url("../img/glyphicons-halflings.png"); - background-position: 14px 14px; - background-repeat: no-repeat; -} - -/* White icons with optional class, or on hover/focus/active states of certain elements */ - -.icon-white, -.nav-pills > .active > a > [class^="icon-"], -.nav-pills > .active > a > [class*=" icon-"], -.nav-list > .active > a > [class^="icon-"], -.nav-list > .active > a > [class*=" icon-"], -.navbar-inverse .nav > .active > a > [class^="icon-"], -.navbar-inverse .nav > .active > a > [class*=" icon-"], -.dropdown-menu > li > a:hover > [class^="icon-"], -.dropdown-menu > li > a:focus > [class^="icon-"], -.dropdown-menu > li > a:hover > [class*=" icon-"], -.dropdown-menu > li > a:focus > [class*=" icon-"], -.dropdown-menu > .active > a > [class^="icon-"], -.dropdown-menu > .active > a > [class*=" icon-"], -.dropdown-submenu:hover > a > [class^="icon-"], -.dropdown-submenu:focus > a > [class^="icon-"], -.dropdown-submenu:hover > a > [class*=" icon-"], -.dropdown-submenu:focus > a > [class*=" icon-"] { - background-image: url("../img/glyphicons-halflings-white.png"); -} - -.icon-glass { - background-position: 0 0; -} - -.icon-music { - background-position: -24px 0; -} - -.icon-search { - background-position: -48px 0; -} - -.icon-envelope { - background-position: -72px 0; -} - -.icon-heart { - background-position: -96px 0; -} - -.icon-star { - background-position: -120px 0; -} - -.icon-star-empty { - background-position: -144px 0; -} - -.icon-user { - background-position: -168px 0; -} - -.icon-film { - background-position: -192px 0; -} - -.icon-th-large { - background-position: -216px 0; -} - -.icon-th { - background-position: -240px 0; -} - -.icon-th-list { - background-position: -264px 0; -} - -.icon-ok { - background-position: -288px 0; -} - -.icon-remove { - background-position: -312px 0; -} - -.icon-zoom-in { - background-position: -336px 0; -} - -.icon-zoom-out { - background-position: -360px 0; -} - -.icon-off { - background-position: -384px 0; -} - -.icon-signal { - background-position: -408px 0; -} - -.icon-cog { - background-position: -432px 0; -} - -.icon-trash { - background-position: -456px 0; -} - -.icon-home { - background-position: 0 -24px; -} - -.icon-file { - background-position: -24px -24px; -} - -.icon-time { - background-position: -48px -24px; -} - -.icon-road { - background-position: -72px -24px; -} - -.icon-download-alt { - background-position: -96px -24px; -} - -.icon-download { - background-position: -120px -24px; -} - -.icon-upload { - background-position: -144px -24px; -} - -.icon-inbox { - background-position: -168px -24px; -} - -.icon-play-circle { - background-position: -192px -24px; -} - -.icon-repeat { - background-position: -216px -24px; -} - -.icon-refresh { - background-position: -240px -24px; -} - -.icon-list-alt { - background-position: -264px -24px; -} - -.icon-lock { - background-position: -287px -24px; -} - -.icon-flag { - background-position: -312px -24px; -} - -.icon-headphones { - background-position: -336px -24px; -} - -.icon-volume-off { - background-position: -360px -24px; -} - -.icon-volume-down { - background-position: -384px -24px; -} - -.icon-volume-up { - background-position: -408px -24px; -} - -.icon-qrcode { - background-position: -432px -24px; -} - -.icon-barcode { - background-position: -456px -24px; -} - -.icon-tag { - background-position: 0 -48px; -} - -.icon-tags { - background-position: -25px -48px; -} - -.icon-book { - background-position: -48px -48px; -} - -.icon-bookmark { - background-position: -72px -48px; -} - -.icon-print { - background-position: -96px -48px; -} - -.icon-camera { - background-position: -120px -48px; -} - -.icon-font { - background-position: -144px -48px; -} - -.icon-bold { - background-position: -167px -48px; -} - -.icon-italic { - background-position: -192px -48px; -} - -.icon-text-height { - background-position: -216px -48px; -} - -.icon-text-width { - background-position: -240px -48px; -} - -.icon-align-left { - background-position: -264px -48px; -} - -.icon-align-center { - background-position: -288px -48px; -} - -.icon-align-right { - background-position: -312px -48px; -} - -.icon-align-justify { - background-position: -336px -48px; -} - -.icon-list { - background-position: -360px -48px; -} - -.icon-indent-left { - background-position: -384px -48px; -} - -.icon-indent-right { - background-position: -408px -48px; -} - -.icon-facetime-video { - background-position: -432px -48px; -} - -.icon-picture { - background-position: -456px -48px; -} - -.icon-pencil { - background-position: 0 -72px; -} - -.icon-map-marker { - background-position: -24px -72px; -} - -.icon-adjust { - background-position: -48px -72px; -} - -.icon-tint { - background-position: -72px -72px; -} - -.icon-edit { - background-position: -96px -72px; -} - -.icon-share { - background-position: -120px -72px; -} - -.icon-check { - background-position: -144px -72px; -} - -.icon-move { - background-position: -168px -72px; -} - -.icon-step-backward { - background-position: -192px -72px; -} - -.icon-fast-backward { - background-position: -216px -72px; -} - -.icon-backward { - background-position: -240px -72px; -} - -.icon-play { - background-position: -264px -72px; -} - -.icon-pause { - background-position: -288px -72px; -} - -.icon-stop { - background-position: -312px -72px; -} - -.icon-forward { - background-position: -336px -72px; -} - -.icon-fast-forward { - background-position: -360px -72px; -} - -.icon-step-forward { - background-position: -384px -72px; -} - -.icon-eject { - background-position: -408px -72px; -} - -.icon-chevron-left { - background-position: -432px -72px; -} - -.icon-chevron-right { - background-position: -456px -72px; -} - -.icon-plus-sign { - background-position: 0 -96px; -} - -.icon-minus-sign { - background-position: -24px -96px; -} - -.icon-remove-sign { - background-position: -48px -96px; -} - -.icon-ok-sign { - background-position: -72px -96px; -} - -.icon-question-sign { - background-position: -96px -96px; -} - -.icon-info-sign { - background-position: -120px -96px; -} - -.icon-screenshot { - background-position: -144px -96px; -} - -.icon-remove-circle { - background-position: -168px -96px; -} - -.icon-ok-circle { - background-position: -192px -96px; -} - -.icon-ban-circle { - background-position: -216px -96px; -} - -.icon-arrow-left { - background-position: -240px -96px; -} - -.icon-arrow-right { - background-position: -264px -96px; -} - -.icon-arrow-up { - background-position: -289px -96px; -} - -.icon-arrow-down { - background-position: -312px -96px; -} - -.icon-share-alt { - background-position: -336px -96px; -} - -.icon-resize-full { - background-position: -360px -96px; -} - -.icon-resize-small { - background-position: -384px -96px; -} - -.icon-plus { - background-position: -408px -96px; -} - -.icon-minus { - background-position: -433px -96px; -} - -.icon-asterisk { - background-position: -456px -96px; -} - -.icon-exclamation-sign { - background-position: 0 -120px; -} - -.icon-gift { - background-position: -24px -120px; -} - -.icon-leaf { - background-position: -48px -120px; -} - -.icon-fire { - background-position: -72px -120px; -} - -.icon-eye-open { - background-position: -96px -120px; -} - -.icon-eye-close { - background-position: -120px -120px; -} - -.icon-warning-sign { - background-position: -144px -120px; -} - -.icon-plane { - background-position: -168px -120px; -} - -.icon-calendar { - background-position: -192px -120px; -} - -.icon-random { - width: 16px; - background-position: -216px -120px; -} - -.icon-comment { - background-position: -240px -120px; -} - -.icon-magnet { - background-position: -264px -120px; -} - -.icon-chevron-up { - background-position: -288px -120px; -} - -.icon-chevron-down { - background-position: -313px -119px; -} - -.icon-retweet { - background-position: -336px -120px; -} - -.icon-shopping-cart { - background-position: -360px -120px; -} - -.icon-folder-close { - width: 16px; - background-position: -384px -120px; -} - -.icon-folder-open { - width: 16px; - background-position: -408px -120px; -} - -.icon-resize-vertical { - background-position: -432px -119px; -} - -.icon-resize-horizontal { - background-position: -456px -118px; -} - -.icon-hdd { - background-position: 0 -144px; -} - -.icon-bullhorn { - background-position: -24px -144px; -} - -.icon-bell { - background-position: -48px -144px; -} - -.icon-certificate { - background-position: -72px -144px; -} - -.icon-thumbs-up { - background-position: -96px -144px; -} - -.icon-thumbs-down { - background-position: -120px -144px; -} - -.icon-hand-right { - background-position: -144px -144px; -} - -.icon-hand-left { - background-position: -168px -144px; -} - -.icon-hand-up { - background-position: -192px -144px; -} - -.icon-hand-down { - background-position: -216px -144px; -} - -.icon-circle-arrow-right { - background-position: -240px -144px; -} - -.icon-circle-arrow-left { - background-position: -264px -144px; -} - -.icon-circle-arrow-up { - background-position: -288px -144px; -} - -.icon-circle-arrow-down { - background-position: -312px -144px; -} - -.icon-globe { - background-position: -336px -144px; -} - -.icon-wrench { - background-position: -360px -144px; -} - -.icon-tasks { - background-position: -384px -144px; -} - -.icon-filter { - background-position: -408px -144px; -} - -.icon-briefcase { - background-position: -432px -144px; -} - -.icon-fullscreen { - background-position: -456px -144px; -} - -.dropup, -.dropdown { - position: relative; -} - -.dropdown-toggle { - *margin-bottom: -3px; -} - -.dropdown-toggle:active, -.open .dropdown-toggle { - outline: 0; -} - -.caret { - display: inline-block; - width: 0; - height: 0; - vertical-align: top; - border-top: 4px solid #000000; - border-right: 4px solid transparent; - border-left: 4px solid transparent; - content: ""; -} - -.dropdown .caret { - margin-top: 8px; - margin-left: 2px; -} - -.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; - background-color: #ffffff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - *border-right-width: 2px; - *border-bottom-width: 2px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; -} - -.dropdown-menu.pull-right { - right: 0; - left: auto; -} - -.dropdown-menu .divider { - *width: 100%; - height: 1px; - margin: 9px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #ffffff; -} - -.dropdown-menu > li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 20px; - color: #333333; - white-space: nowrap; -} - -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus, -.dropdown-submenu:hover > a, -.dropdown-submenu:focus > a { - color: #ffffff; - text-decoration: none; - background-color: #0081c2; - background-image: -moz-linear-gradient(top, #0088cc, #0077b3); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); - background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); - background-image: -o-linear-gradient(top, #0088cc, #0077b3); - background-image: linear-gradient(to bottom, #0088cc, #0077b3); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); -} - -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - color: #ffffff; - text-decoration: none; - background-color: #0081c2; - background-image: -moz-linear-gradient(top, #0088cc, #0077b3); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); - background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); - background-image: -o-linear-gradient(top, #0088cc, #0077b3); - background-image: linear-gradient(to bottom, #0088cc, #0077b3); - background-repeat: repeat-x; - outline: 0; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); -} - -.dropdown-menu > .disabled > a, -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - color: #999999; -} - -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - text-decoration: none; - cursor: default; - background-color: transparent; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.open { - *z-index: 1000; -} - -.open > .dropdown-menu { - display: block; -} - -.dropdown-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 990; -} - -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} - -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - border-top: 0; - border-bottom: 4px solid #000000; - content: ""; -} - -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 1px; -} - -.dropdown-submenu { - position: relative; -} - -.dropdown-submenu > .dropdown-menu { - top: 0; - left: 100%; - margin-top: -6px; - margin-left: -1px; - -webkit-border-radius: 0 6px 6px 6px; - -moz-border-radius: 0 6px 6px 6px; - border-radius: 0 6px 6px 6px; -} - -.dropdown-submenu:hover > .dropdown-menu { - display: block; -} - -.dropup .dropdown-submenu > .dropdown-menu { - top: auto; - bottom: 0; - margin-top: 0; - margin-bottom: -2px; - -webkit-border-radius: 5px 5px 5px 0; - -moz-border-radius: 5px 5px 5px 0; - border-radius: 5px 5px 5px 0; -} - -.dropdown-submenu > a:after { - display: block; - float: right; - width: 0; - height: 0; - margin-top: 5px; - margin-right: -10px; - border-color: transparent; - border-left-color: #cccccc; - border-style: solid; - border-width: 5px 0 5px 5px; - content: " "; -} - -.dropdown-submenu:hover > a:after { - border-left-color: #ffffff; -} - -.dropdown-submenu.pull-left { - float: none; -} - -.dropdown-submenu.pull-left > .dropdown-menu { - left: -100%; - margin-left: 10px; - -webkit-border-radius: 6px 0 6px 6px; - -moz-border-radius: 6px 0 6px 6px; - border-radius: 6px 0 6px 6px; -} - -.dropdown .dropdown-menu .nav-header { - padding-right: 20px; - padding-left: 20px; -} - -.typeahead { - z-index: 1051; - margin-top: 2px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #e3e3e3; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); -} - -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, 0.15); -} - -.well-large { - padding: 24px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.well-small { - padding: 9px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.fade { - opacity: 0; - -webkit-transition: opacity 0.15s linear; - -moz-transition: opacity 0.15s linear; - -o-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; -} - -.fade.in { - opacity: 1; -} - -.collapse { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height 0.35s ease; - -moz-transition: height 0.35s ease; - -o-transition: height 0.35s ease; - transition: height 0.35s ease; -} - -.collapse.in { - height: auto; -} - -.close { - float: right; - font-size: 20px; - font-weight: bold; - line-height: 20px; - color: #000000; - text-shadow: 0 1px 0 #ffffff; - opacity: 0.2; - filter: alpha(opacity=20); -} - -.close:hover, -.close:focus { - color: #000000; - text-decoration: none; - cursor: pointer; - opacity: 0.4; - filter: alpha(opacity=40); -} - -button.close { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; -} - -.btn { - display: inline-block; - *display: inline; - padding: 4px 12px; - margin-bottom: 0; - *margin-left: .3em; - font-size: 14px; - line-height: 20px; - color: #333333; - text-align: center; - text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); - vertical-align: middle; - cursor: pointer; - background-color: #f5f5f5; - *background-color: #e6e6e6; - background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); - background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); - background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); - background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); - background-repeat: repeat-x; - border: 1px solid #cccccc; - *border: 0; - border-color: #e6e6e6 #e6e6e6 #bfbfbf; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - border-bottom-color: #b3b3b3; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); - *zoom: 1; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn:hover, -.btn:focus, -.btn:active, -.btn.active, -.btn.disabled, -.btn[disabled] { - color: #333333; - background-color: #e6e6e6; - *background-color: #d9d9d9; -} - -.btn:active, -.btn.active { - background-color: #cccccc \9; -} - -.btn:first-child { - *margin-left: 0; -} - -.btn:hover, -.btn:focus { - color: #333333; - text-decoration: none; - background-position: 0 -15px; - -webkit-transition: background-position 0.1s linear; - -moz-transition: background-position 0.1s linear; - -o-transition: background-position 0.1s linear; - transition: background-position 0.1s linear; -} - -.btn:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -.btn.active, -.btn:active { - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn.disabled, -.btn[disabled] { - cursor: default; - background-image: none; - opacity: 0.65; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} - -.btn-large { - padding: 11px 19px; - font-size: 17.5px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.btn-large [class^="icon-"], -.btn-large [class*=" icon-"] { - margin-top: 4px; -} - -.btn-small { - padding: 2px 10px; - font-size: 11.9px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.btn-small [class^="icon-"], -.btn-small [class*=" icon-"] { - margin-top: 0; -} - -.btn-mini [class^="icon-"], -.btn-mini [class*=" icon-"] { - margin-top: -1px; -} - -.btn-mini { - padding: 0 6px; - font-size: 10.5px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.btn-block { - display: block; - width: 100%; - padding-right: 0; - padding-left: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.btn-block + .btn-block { - margin-top: 5px; -} - -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} - -.btn-primary.active, -.btn-warning.active, -.btn-danger.active, -.btn-success.active, -.btn-info.active, -.btn-inverse.active { - color: rgba(255, 255, 255, 0.75); -} - -.btn-primary { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #006dcc; - *background-color: #0044cc; - background-image: -moz-linear-gradient(top, #0088cc, #0044cc); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); - background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); - background-image: -o-linear-gradient(top, #0088cc, #0044cc); - background-image: linear-gradient(to bottom, #0088cc, #0044cc); - background-repeat: repeat-x; - border-color: #0044cc #0044cc #002a80; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-primary:hover, -.btn-primary:focus, -.btn-primary:active, -.btn-primary.active, -.btn-primary.disabled, -.btn-primary[disabled] { - color: #ffffff; - background-color: #0044cc; - *background-color: #003bb3; -} - -.btn-primary:active, -.btn-primary.active { - background-color: #003399 \9; -} - -.btn-warning { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #faa732; - *background-color: #f89406; - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(to bottom, #fbb450, #f89406); - background-repeat: repeat-x; - border-color: #f89406 #f89406 #ad6704; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-warning:hover, -.btn-warning:focus, -.btn-warning:active, -.btn-warning.active, -.btn-warning.disabled, -.btn-warning[disabled] { - color: #ffffff; - background-color: #f89406; - *background-color: #df8505; -} - -.btn-warning:active, -.btn-warning.active { - background-color: #c67605 \9; -} - -.btn-danger { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #da4f49; - *background-color: #bd362f; - background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); - background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); - background-repeat: repeat-x; - border-color: #bd362f #bd362f #802420; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-danger:hover, -.btn-danger:focus, -.btn-danger:active, -.btn-danger.active, -.btn-danger.disabled, -.btn-danger[disabled] { - color: #ffffff; - background-color: #bd362f; - *background-color: #a9302a; -} - -.btn-danger:active, -.btn-danger.active { - background-color: #942a25 \9; -} - -.btn-success { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #5bb75b; - *background-color: #51a351; - background-image: -moz-linear-gradient(top, #62c462, #51a351); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); - background-image: -webkit-linear-gradient(top, #62c462, #51a351); - background-image: -o-linear-gradient(top, #62c462, #51a351); - background-image: linear-gradient(to bottom, #62c462, #51a351); - background-repeat: repeat-x; - border-color: #51a351 #51a351 #387038; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-success:hover, -.btn-success:focus, -.btn-success:active, -.btn-success.active, -.btn-success.disabled, -.btn-success[disabled] { - color: #ffffff; - background-color: #51a351; - *background-color: #499249; -} - -.btn-success:active, -.btn-success.active { - background-color: #408140 \9; -} - -.btn-info { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #49afcd; - *background-color: #2f96b4; - background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); - background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); - background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); - background-repeat: repeat-x; - border-color: #2f96b4 #2f96b4 #1f6377; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-info:hover, -.btn-info:focus, -.btn-info:active, -.btn-info.active, -.btn-info.disabled, -.btn-info[disabled] { - color: #ffffff; - background-color: #2f96b4; - *background-color: #2a85a0; -} - -.btn-info:active, -.btn-info.active { - background-color: #24748c \9; -} - -.btn-inverse { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #363636; - *background-color: #222222; - background-image: -moz-linear-gradient(top, #444444, #222222); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222)); - background-image: -webkit-linear-gradient(top, #444444, #222222); - background-image: -o-linear-gradient(top, #444444, #222222); - background-image: linear-gradient(to bottom, #444444, #222222); - background-repeat: repeat-x; - border-color: #222222 #222222 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-inverse:hover, -.btn-inverse:focus, -.btn-inverse:active, -.btn-inverse.active, -.btn-inverse.disabled, -.btn-inverse[disabled] { - color: #ffffff; - background-color: #222222; - *background-color: #151515; -} - -.btn-inverse:active, -.btn-inverse.active { - background-color: #080808 \9; -} - -button.btn, -input[type="submit"].btn { - *padding-top: 3px; - *padding-bottom: 3px; -} - -button.btn::-moz-focus-inner, -input[type="submit"].btn::-moz-focus-inner { - padding: 0; - border: 0; -} - -button.btn.btn-large, -input[type="submit"].btn.btn-large { - *padding-top: 7px; - *padding-bottom: 7px; -} - -button.btn.btn-small, -input[type="submit"].btn.btn-small { - *padding-top: 3px; - *padding-bottom: 3px; -} - -button.btn.btn-mini, -input[type="submit"].btn.btn-mini { - *padding-top: 1px; - *padding-bottom: 1px; -} - -.btn-link, -.btn-link:active, -.btn-link[disabled] { - background-color: transparent; - background-image: none; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} - -.btn-link { - color: #0088cc; - cursor: pointer; - border-color: transparent; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.btn-link:hover, -.btn-link:focus { - color: #005580; - text-decoration: underline; - background-color: transparent; -} - -.btn-link[disabled]:hover, -.btn-link[disabled]:focus { - color: #333333; - text-decoration: none; -} - -.btn-group { - position: relative; - display: inline-block; - *display: inline; - *margin-left: .3em; - font-size: 0; - white-space: nowrap; - vertical-align: middle; - *zoom: 1; -} - -.btn-group:first-child { - *margin-left: 0; -} - -.btn-group + .btn-group { - margin-left: 5px; -} - -.btn-toolbar { - margin-top: 10px; - margin-bottom: 10px; - font-size: 0; -} - -.btn-toolbar > .btn + .btn, -.btn-toolbar > .btn-group + .btn, -.btn-toolbar > .btn + .btn-group { - margin-left: 5px; -} - -.btn-group > .btn { - position: relative; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.btn-group > .btn + .btn { - margin-left: -1px; -} - -.btn-group > .btn, -.btn-group > .dropdown-menu, -.btn-group > .popover { - font-size: 14px; -} - -.btn-group > .btn-mini { - font-size: 10.5px; -} - -.btn-group > .btn-small { - font-size: 11.9px; -} - -.btn-group > .btn-large { - font-size: 17.5px; -} - -.btn-group > .btn:first-child { - margin-left: 0; - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; - -moz-border-radius-topleft: 4px; -} - -.btn-group > .btn:last-child, -.btn-group > .dropdown-toggle { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -moz-border-radius-topright: 4px; - -moz-border-radius-bottomright: 4px; -} - -.btn-group > .btn.large:first-child { - margin-left: 0; - -webkit-border-bottom-left-radius: 6px; - border-bottom-left-radius: 6px; - -webkit-border-top-left-radius: 6px; - border-top-left-radius: 6px; - -moz-border-radius-bottomleft: 6px; - -moz-border-radius-topleft: 6px; -} - -.btn-group > .btn.large:last-child, -.btn-group > .large.dropdown-toggle { - -webkit-border-top-right-radius: 6px; - border-top-right-radius: 6px; - -webkit-border-bottom-right-radius: 6px; - border-bottom-right-radius: 6px; - -moz-border-radius-topright: 6px; - -moz-border-radius-bottomright: 6px; -} - -.btn-group > .btn:hover, -.btn-group > .btn:focus, -.btn-group > .btn:active, -.btn-group > .btn.active { - z-index: 2; -} - -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} - -.btn-group > .btn + .dropdown-toggle { - *padding-top: 5px; - padding-right: 8px; - *padding-bottom: 5px; - padding-left: 8px; - -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn-group > .btn-mini + .dropdown-toggle { - *padding-top: 2px; - padding-right: 5px; - *padding-bottom: 2px; - padding-left: 5px; -} - -.btn-group > .btn-small + .dropdown-toggle { - *padding-top: 5px; - *padding-bottom: 4px; -} - -.btn-group > .btn-large + .dropdown-toggle { - *padding-top: 7px; - padding-right: 12px; - *padding-bottom: 7px; - padding-left: 12px; -} - -.btn-group.open .dropdown-toggle { - background-image: none; - -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn-group.open .btn.dropdown-toggle { - background-color: #e6e6e6; -} - -.btn-group.open .btn-primary.dropdown-toggle { - background-color: #0044cc; -} - -.btn-group.open .btn-warning.dropdown-toggle { - background-color: #f89406; -} - -.btn-group.open .btn-danger.dropdown-toggle { - background-color: #bd362f; -} - -.btn-group.open .btn-success.dropdown-toggle { - background-color: #51a351; -} - -.btn-group.open .btn-info.dropdown-toggle { - background-color: #2f96b4; -} - -.btn-group.open .btn-inverse.dropdown-toggle { - background-color: #222222; -} - -.btn .caret { - margin-top: 8px; - margin-left: 0; -} - -.btn-large .caret { - margin-top: 6px; -} - -.btn-large .caret { - border-top-width: 5px; - border-right-width: 5px; - border-left-width: 5px; -} - -.btn-mini .caret, -.btn-small .caret { - margin-top: 8px; -} - -.dropup .btn-large .caret { - border-bottom-width: 5px; -} - -.btn-primary .caret, -.btn-warning .caret, -.btn-danger .caret, -.btn-info .caret, -.btn-success .caret, -.btn-inverse .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - -.btn-group-vertical { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - - *zoom: 1; -} - -.btn-group-vertical > .btn { - display: block; - float: none; - max-width: 100%; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.btn-group-vertical > .btn + .btn { - margin-top: -1px; - margin-left: 0; -} - -.btn-group-vertical > .btn:first-child { - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} - -.btn-group-vertical > .btn:last-child { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} - -.btn-group-vertical > .btn-large:first-child { - -webkit-border-radius: 6px 6px 0 0; - -moz-border-radius: 6px 6px 0 0; - border-radius: 6px 6px 0 0; -} - -.btn-group-vertical > .btn-large:last-child { - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; -} - -.alert { - padding: 8px 35px 8px 14px; - margin-bottom: 20px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - background-color: #fcf8e3; - border: 1px solid #fbeed5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.alert, -.alert h4 { - color: #c09853; -} - -.alert h4 { - margin: 0; -} - -.alert .close { - position: relative; - top: -2px; - right: -21px; - line-height: 20px; -} - -.alert-success { - color: #468847; - background-color: #dff0d8; - border-color: #d6e9c6; -} - -.alert-success h4 { - color: #468847; -} - -.alert-danger, -.alert-error { - color: #b94a48; - background-color: #f2dede; - border-color: #eed3d7; -} - -.alert-danger h4, -.alert-error h4 { - color: #b94a48; -} - -.alert-info { - color: #3a87ad; - background-color: #d9edf7; - border-color: #bce8f1; -} - -.alert-info h4 { - color: #3a87ad; -} - -.alert-block { - padding-top: 14px; - padding-bottom: 14px; -} - -.alert-block > p, -.alert-block > ul { - margin-bottom: 0; -} - -.alert-block p + p { - margin-top: 5px; -} - -.nav { - margin-bottom: 20px; - margin-left: 0; - list-style: none; -} - -.nav > li > a { - display: block; -} - -.nav > li > a:hover, -.nav > li > a:focus { - text-decoration: none; - background-color: #eeeeee; -} - -.nav > li > a > img { - max-width: none; -} - -.nav > .pull-right { - float: right; -} - -.nav-header { - display: block; - padding: 3px 15px; - font-size: 11px; - font-weight: bold; - line-height: 20px; - color: #999999; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - text-transform: uppercase; -} - -.nav li + .nav-header { - margin-top: 9px; -} - -.nav-list { - padding-right: 15px; - padding-left: 15px; - margin-bottom: 0; -} - -.nav-list > li > a, -.nav-list .nav-header { - margin-right: -15px; - margin-left: -15px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); -} - -.nav-list > li > a { - padding: 3px 15px; -} - -.nav-list > .active > a, -.nav-list > .active > a:hover, -.nav-list > .active > a:focus { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); - background-color: #0088cc; -} - -.nav-list [class^="icon-"], -.nav-list [class*=" icon-"] { - margin-right: 2px; -} - -.nav-list .divider { - *width: 100%; - height: 1px; - margin: 9px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #ffffff; -} - -.nav-tabs, -.nav-pills { - *zoom: 1; -} - -.nav-tabs:before, -.nav-pills:before, -.nav-tabs:after, -.nav-pills:after { - display: table; - line-height: 0; - content: ""; -} - -.nav-tabs:after, -.nav-pills:after { - clear: both; -} - -.nav-tabs > li, -.nav-pills > li { - float: left; -} - -.nav-tabs > li > a, -.nav-pills > li > a { - padding-right: 12px; - padding-left: 12px; - margin-right: 2px; - line-height: 14px; -} - -.nav-tabs { - border-bottom: 1px solid #ddd; -} - -.nav-tabs > li { - margin-bottom: -1px; -} - -.nav-tabs > li > a { - padding-top: 8px; - padding-bottom: 8px; - line-height: 20px; - border: 1px solid transparent; - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} - -.nav-tabs > li > a:hover, -.nav-tabs > li > a:focus { - border-color: #eeeeee #eeeeee #dddddd; -} - -.nav-tabs > .active > a, -.nav-tabs > .active > a:hover, -.nav-tabs > .active > a:focus { - color: #555555; - cursor: default; - background-color: #ffffff; - border: 1px solid #ddd; - border-bottom-color: transparent; -} - -.nav-pills > li > a { - padding-top: 8px; - padding-bottom: 8px; - margin-top: 2px; - margin-bottom: 2px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} - -.nav-pills > .active > a, -.nav-pills > .active > a:hover, -.nav-pills > .active > a:focus { - color: #ffffff; - background-color: #0088cc; -} - -.nav-stacked > li { - float: none; -} - -.nav-stacked > li > a { - margin-right: 0; -} - -.nav-tabs.nav-stacked { - border-bottom: 0; -} - -.nav-tabs.nav-stacked > li > a { - border: 1px solid #ddd; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.nav-tabs.nav-stacked > li:first-child > a { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-topright: 4px; - -moz-border-radius-topleft: 4px; -} - -.nav-tabs.nav-stacked > li:last-child > a { - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -moz-border-radius-bottomright: 4px; - -moz-border-radius-bottomleft: 4px; -} - -.nav-tabs.nav-stacked > li > a:hover, -.nav-tabs.nav-stacked > li > a:focus { - z-index: 2; - border-color: #ddd; -} - -.nav-pills.nav-stacked > li > a { - margin-bottom: 3px; -} - -.nav-pills.nav-stacked > li:last-child > a { - margin-bottom: 1px; -} - -.nav-tabs .dropdown-menu { - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; -} - -.nav-pills .dropdown-menu { - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.nav .dropdown-toggle .caret { - margin-top: 6px; - border-top-color: #0088cc; - border-bottom-color: #0088cc; -} - -.nav .dropdown-toggle:hover .caret, -.nav .dropdown-toggle:focus .caret { - border-top-color: #005580; - border-bottom-color: #005580; -} - -/* move down carets for tabs */ - -.nav-tabs .dropdown-toggle .caret { - margin-top: 8px; -} - -.nav .active .dropdown-toggle .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} - -.nav-tabs .active .dropdown-toggle .caret { - border-top-color: #555555; - border-bottom-color: #555555; -} - -.nav > .dropdown.active > a:hover, -.nav > .dropdown.active > a:focus { - cursor: pointer; -} - -.nav-tabs .open .dropdown-toggle, -.nav-pills .open .dropdown-toggle, -.nav > li.dropdown.open.active > a:hover, -.nav > li.dropdown.open.active > a:focus { - color: #ffffff; - background-color: #999999; - border-color: #999999; -} - -.nav li.dropdown.open .caret, -.nav li.dropdown.open.active .caret, -.nav li.dropdown.open a:hover .caret, -.nav li.dropdown.open a:focus .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; - opacity: 1; - filter: alpha(opacity=100); -} - -.tabs-stacked .open > a:hover, -.tabs-stacked .open > a:focus { - border-color: #999999; -} - -.tabbable { - *zoom: 1; -} - -.tabbable:before, -.tabbable:after { - display: table; - line-height: 0; - content: ""; -} - -.tabbable:after { - clear: both; -} - -.tab-content { - overflow: auto; -} - -.tabs-below > .nav-tabs, -.tabs-right > .nav-tabs, -.tabs-left > .nav-tabs { - border-bottom: 0; -} - -.tab-content > .tab-pane, -.pill-content > .pill-pane { - display: none; -} - -.tab-content > .active, -.pill-content > .active { - display: block; -} - -.tabs-below > .nav-tabs { - border-top: 1px solid #ddd; -} - -.tabs-below > .nav-tabs > li { - margin-top: -1px; - margin-bottom: 0; -} - -.tabs-below > .nav-tabs > li > a { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} - -.tabs-below > .nav-tabs > li > a:hover, -.tabs-below > .nav-tabs > li > a:focus { - border-top-color: #ddd; - border-bottom-color: transparent; -} - -.tabs-below > .nav-tabs > .active > a, -.tabs-below > .nav-tabs > .active > a:hover, -.tabs-below > .nav-tabs > .active > a:focus { - border-color: transparent #ddd #ddd #ddd; -} - -.tabs-left > .nav-tabs > li, -.tabs-right > .nav-tabs > li { - float: none; -} - -.tabs-left > .nav-tabs > li > a, -.tabs-right > .nav-tabs > li > a { - min-width: 74px; - margin-right: 0; - margin-bottom: 3px; -} - -.tabs-left > .nav-tabs { - float: left; - margin-right: 19px; - border-right: 1px solid #ddd; -} - -.tabs-left > .nav-tabs > li > a { - margin-right: -1px; - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} - -.tabs-left > .nav-tabs > li > a:hover, -.tabs-left > .nav-tabs > li > a:focus { - border-color: #eeeeee #dddddd #eeeeee #eeeeee; -} - -.tabs-left > .nav-tabs .active > a, -.tabs-left > .nav-tabs .active > a:hover, -.tabs-left > .nav-tabs .active > a:focus { - border-color: #ddd transparent #ddd #ddd; - *border-right-color: #ffffff; -} - -.tabs-right > .nav-tabs { - float: right; - margin-left: 19px; - border-left: 1px solid #ddd; -} - -.tabs-right > .nav-tabs > li > a { - margin-left: -1px; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.tabs-right > .nav-tabs > li > a:hover, -.tabs-right > .nav-tabs > li > a:focus { - border-color: #eeeeee #eeeeee #eeeeee #dddddd; -} - -.tabs-right > .nav-tabs .active > a, -.tabs-right > .nav-tabs .active > a:hover, -.tabs-right > .nav-tabs .active > a:focus { - border-color: #ddd #ddd #ddd transparent; - *border-left-color: #ffffff; -} - -.nav > .disabled > a { - color: #999999; -} - -.nav > .disabled > a:hover, -.nav > .disabled > a:focus { - text-decoration: none; - cursor: default; - background-color: transparent; -} - -.navbar { - *position: relative; - *z-index: 2; - margin-bottom: 20px; - overflow: visible; -} - -.navbar-inner { - min-height: 40px; - padding-right: 20px; - padding-left: 20px; - background-color: #fafafa; - background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); - background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); - background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); - background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); - background-repeat: repeat-x; - border: 1px solid #d4d4d4; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); - *zoom: 1; - -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); -} - -.navbar-inner:before, -.navbar-inner:after { - display: table; - line-height: 0; - content: ""; -} - -.navbar-inner:after { - clear: both; -} - -.navbar .container { - width: auto; -} - -.nav-collapse.collapse { - height: auto; - overflow: visible; -} - -.navbar .brand { - display: block; - float: left; - padding: 10px 20px 10px; - margin-left: -20px; - font-size: 20px; - font-weight: 200; - color: #777777; - text-shadow: 0 1px 0 #ffffff; -} - -.navbar .brand:hover, -.navbar .brand:focus { - text-decoration: none; -} - -.navbar-text { - margin-bottom: 0; - line-height: 40px; - color: #777777; -} - -.navbar-link { - color: #777777; -} - -.navbar-link:hover, -.navbar-link:focus { - color: #333333; -} - -.navbar .divider-vertical { - height: 40px; - margin: 0 9px; - border-right: 1px solid #ffffff; - border-left: 1px solid #f2f2f2; -} - -.navbar .btn, -.navbar .btn-group { - margin-top: 5px; -} - -.navbar .btn-group .btn, -.navbar .input-prepend .btn, -.navbar .input-append .btn, -.navbar .input-prepend .btn-group, -.navbar .input-append .btn-group { - margin-top: 0; -} - -.navbar-form { - margin-bottom: 0; - *zoom: 1; -} - -.navbar-form:before, -.navbar-form:after { - display: table; - line-height: 0; - content: ""; -} - -.navbar-form:after { - clear: both; -} - -.navbar-form input, -.navbar-form select, -.navbar-form .radio, -.navbar-form .checkbox { - margin-top: 5px; -} - -.navbar-form input, -.navbar-form select, -.navbar-form .btn { - display: inline-block; - margin-bottom: 0; -} - -.navbar-form input[type="image"], -.navbar-form input[type="checkbox"], -.navbar-form input[type="radio"] { - margin-top: 3px; -} - -.navbar-form .input-append, -.navbar-form .input-prepend { - margin-top: 5px; - white-space: nowrap; -} - -.navbar-form .input-append input, -.navbar-form .input-prepend input { - margin-top: 0; -} - -.navbar-search { - position: relative; - float: left; - margin-top: 5px; - margin-bottom: 0; -} - -.navbar-search .search-query { - padding: 4px 14px; - margin-bottom: 0; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - font-weight: normal; - line-height: 1; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} - -.navbar-static-top { - position: static; - margin-bottom: 0; -} - -.navbar-static-top .navbar-inner { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; - margin-bottom: 0; -} - -.navbar-fixed-top .navbar-inner, -.navbar-static-top .navbar-inner { - border-width: 0 0 1px; -} - -.navbar-fixed-bottom .navbar-inner { - border-width: 1px 0 0; -} - -.navbar-fixed-top .navbar-inner, -.navbar-fixed-bottom .navbar-inner { - padding-right: 0; - padding-left: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.navbar-static-top .container, -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; -} - -.navbar-fixed-top { - top: 0; -} - -.navbar-fixed-top .navbar-inner, -.navbar-static-top .navbar-inner { - -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); - box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); -} - -.navbar-fixed-bottom { - bottom: 0; -} - -.navbar-fixed-bottom .navbar-inner { - -webkit-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); - box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); -} - -.navbar .nav { - position: relative; - left: 0; - display: block; - float: left; - margin: 0 10px 0 0; -} - -.navbar .nav.pull-right { - float: right; - margin-right: 0; -} - -.navbar .nav > li { - float: left; -} - -.navbar .nav > li > a { - float: none; - padding: 10px 15px 10px; - color: #777777; - text-decoration: none; - text-shadow: 0 1px 0 #ffffff; -} - -.navbar .nav .dropdown-toggle .caret { - margin-top: 8px; -} - -.navbar .nav > li > a:focus, -.navbar .nav > li > a:hover { - color: #333333; - text-decoration: none; - background-color: transparent; -} - -.navbar .nav > .active > a, -.navbar .nav > .active > a:hover, -.navbar .nav > .active > a:focus { - color: #555555; - text-decoration: none; - background-color: #e5e5e5; - -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); - -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); -} - -.navbar .btn-navbar { - display: none; - float: right; - padding: 7px 10px; - margin-right: 5px; - margin-left: 5px; - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #ededed; - *background-color: #e5e5e5; - background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5)); - background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); - background-repeat: repeat-x; - border-color: #e5e5e5 #e5e5e5 #bfbfbf; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); -} - -.navbar .btn-navbar:hover, -.navbar .btn-navbar:focus, -.navbar .btn-navbar:active, -.navbar .btn-navbar.active, -.navbar .btn-navbar.disabled, -.navbar .btn-navbar[disabled] { - color: #ffffff; - background-color: #e5e5e5; - *background-color: #d9d9d9; -} - -.navbar .btn-navbar:active, -.navbar .btn-navbar.active { - background-color: #cccccc \9; -} - -.navbar .btn-navbar .icon-bar { - display: block; - width: 18px; - height: 2px; - background-color: #f5f5f5; - -webkit-border-radius: 1px; - -moz-border-radius: 1px; - border-radius: 1px; - -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); -} - -.btn-navbar .icon-bar + .icon-bar { - margin-top: 3px; -} - -.navbar .nav > li > .dropdown-menu:before { - position: absolute; - top: -7px; - left: 9px; - display: inline-block; - border-right: 7px solid transparent; - border-bottom: 7px solid #ccc; - border-left: 7px solid transparent; - border-bottom-color: rgba(0, 0, 0, 0.2); - content: ''; -} - -.navbar .nav > li > .dropdown-menu:after { - position: absolute; - top: -6px; - left: 10px; - display: inline-block; - border-right: 6px solid transparent; - border-bottom: 6px solid #ffffff; - border-left: 6px solid transparent; - content: ''; -} - -.navbar-fixed-bottom .nav > li > .dropdown-menu:before { - top: auto; - bottom: -7px; - border-top: 7px solid #ccc; - border-bottom: 0; - border-top-color: rgba(0, 0, 0, 0.2); -} - -.navbar-fixed-bottom .nav > li > .dropdown-menu:after { - top: auto; - bottom: -6px; - border-top: 6px solid #ffffff; - border-bottom: 0; -} - -.navbar .nav li.dropdown > a:hover .caret, -.navbar .nav li.dropdown > a:focus .caret { - border-top-color: #333333; - border-bottom-color: #333333; -} - -.navbar .nav li.dropdown.open > .dropdown-toggle, -.navbar .nav li.dropdown.active > .dropdown-toggle, -.navbar .nav li.dropdown.open.active > .dropdown-toggle { - color: #555555; - background-color: #e5e5e5; -} - -.navbar .nav li.dropdown > .dropdown-toggle .caret { - border-top-color: #777777; - border-bottom-color: #777777; -} - -.navbar .nav li.dropdown.open > .dropdown-toggle .caret, -.navbar .nav li.dropdown.active > .dropdown-toggle .caret, -.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { - border-top-color: #555555; - border-bottom-color: #555555; -} - -.navbar .pull-right > li > .dropdown-menu, -.navbar .nav > li > .dropdown-menu.pull-right { - right: 0; - left: auto; -} - -.navbar .pull-right > li > .dropdown-menu:before, -.navbar .nav > li > .dropdown-menu.pull-right:before { - right: 12px; - left: auto; -} - -.navbar .pull-right > li > .dropdown-menu:after, -.navbar .nav > li > .dropdown-menu.pull-right:after { - right: 13px; - left: auto; -} - -.navbar .pull-right > li > .dropdown-menu .dropdown-menu, -.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu { - right: 100%; - left: auto; - margin-right: -1px; - margin-left: 0; - -webkit-border-radius: 6px 0 6px 6px; - -moz-border-radius: 6px 0 6px 6px; - border-radius: 6px 0 6px 6px; -} - -.navbar-inverse .navbar-inner { - background-color: #1b1b1b; - background-image: -moz-linear-gradient(top, #222222, #111111); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111)); - background-image: -webkit-linear-gradient(top, #222222, #111111); - background-image: -o-linear-gradient(top, #222222, #111111); - background-image: linear-gradient(to bottom, #222222, #111111); - background-repeat: repeat-x; - border-color: #252525; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0); -} - -.navbar-inverse .brand, -.navbar-inverse .nav > li > a { - color: #999999; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} - -.navbar-inverse .brand:hover, -.navbar-inverse .nav > li > a:hover, -.navbar-inverse .brand:focus, -.navbar-inverse .nav > li > a:focus { - color: #ffffff; -} - -.navbar-inverse .brand { - color: #999999; -} - -.navbar-inverse .navbar-text { - color: #999999; -} - -.navbar-inverse .nav > li > a:focus, -.navbar-inverse .nav > li > a:hover { - color: #ffffff; - background-color: transparent; -} - -.navbar-inverse .nav .active > a, -.navbar-inverse .nav .active > a:hover, -.navbar-inverse .nav .active > a:focus { - color: #ffffff; - background-color: #111111; -} - -.navbar-inverse .navbar-link { - color: #999999; -} - -.navbar-inverse .navbar-link:hover, -.navbar-inverse .navbar-link:focus { - color: #ffffff; -} - -.navbar-inverse .divider-vertical { - border-right-color: #222222; - border-left-color: #111111; -} - -.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { - color: #ffffff; - background-color: #111111; -} - -.navbar-inverse .nav li.dropdown > a:hover .caret, -.navbar-inverse .nav li.dropdown > a:focus .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - -.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { - border-top-color: #999999; - border-bottom-color: #999999; -} - -.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, -.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, -.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - -.navbar-inverse .navbar-search .search-query { - color: #ffffff; - background-color: #515151; - border-color: #111111; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - -webkit-transition: none; - -moz-transition: none; - -o-transition: none; - transition: none; -} - -.navbar-inverse .navbar-search .search-query:-moz-placeholder { - color: #cccccc; -} - -.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { - color: #cccccc; -} - -.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { - color: #cccccc; -} - -.navbar-inverse .navbar-search .search-query:focus, -.navbar-inverse .navbar-search .search-query.focused { - padding: 5px 15px; - color: #333333; - text-shadow: 0 1px 0 #ffffff; - background-color: #ffffff; - border: 0; - outline: 0; - -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); -} - -.navbar-inverse .btn-navbar { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e0e0e; - *background-color: #040404; - background-image: -moz-linear-gradient(top, #151515, #040404); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404)); - background-image: -webkit-linear-gradient(top, #151515, #040404); - background-image: -o-linear-gradient(top, #151515, #040404); - background-image: linear-gradient(to bottom, #151515, #040404); - background-repeat: repeat-x; - border-color: #040404 #040404 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.navbar-inverse .btn-navbar:hover, -.navbar-inverse .btn-navbar:focus, -.navbar-inverse .btn-navbar:active, -.navbar-inverse .btn-navbar.active, -.navbar-inverse .btn-navbar.disabled, -.navbar-inverse .btn-navbar[disabled] { - color: #ffffff; - background-color: #040404; - *background-color: #000000; -} - -.navbar-inverse .btn-navbar:active, -.navbar-inverse .btn-navbar.active { - background-color: #000000 \9; -} - -.breadcrumb { - padding: 8px 15px; - margin: 0 0 20px; - list-style: none; - background-color: #f5f5f5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.breadcrumb > li { - display: inline-block; - *display: inline; - text-shadow: 0 1px 0 #ffffff; - *zoom: 1; -} - -.breadcrumb > li > .divider { - padding: 0 5px; - color: #ccc; -} - -.breadcrumb > .active { - color: #999999; -} - -.pagination { - margin: 20px 0; -} - -.pagination ul { - display: inline-block; - *display: inline; - margin-bottom: 0; - margin-left: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - *zoom: 1; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.pagination ul > li { - display: inline; -} - -.pagination ul > li > a, -.pagination ul > li > span { - float: left; - padding: 4px 12px; - line-height: 20px; - text-decoration: none; - background-color: #ffffff; - border: 1px solid #dddddd; - border-left-width: 0; -} - -.pagination ul > li > a:hover, -.pagination ul > li > a:focus, -.pagination ul > .active > a, -.pagination ul > .active > span { - background-color: #f5f5f5; -} - -.pagination ul > .active > a, -.pagination ul > .active > span { - color: #999999; - cursor: default; -} - -.pagination ul > .disabled > span, -.pagination ul > .disabled > a, -.pagination ul > .disabled > a:hover, -.pagination ul > .disabled > a:focus { - color: #999999; - cursor: default; - background-color: transparent; -} - -.pagination ul > li:first-child > a, -.pagination ul > li:first-child > span { - border-left-width: 1px; - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; - -moz-border-radius-topleft: 4px; -} - -.pagination ul > li:last-child > a, -.pagination ul > li:last-child > span { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -moz-border-radius-topright: 4px; - -moz-border-radius-bottomright: 4px; -} - -.pagination-centered { - text-align: center; -} - -.pagination-right { - text-align: right; -} - -.pagination-large ul > li > a, -.pagination-large ul > li > span { - padding: 11px 19px; - font-size: 17.5px; -} - -.pagination-large ul > li:first-child > a, -.pagination-large ul > li:first-child > span { - -webkit-border-bottom-left-radius: 6px; - border-bottom-left-radius: 6px; - -webkit-border-top-left-radius: 6px; - border-top-left-radius: 6px; - -moz-border-radius-bottomleft: 6px; - -moz-border-radius-topleft: 6px; -} - -.pagination-large ul > li:last-child > a, -.pagination-large ul > li:last-child > span { - -webkit-border-top-right-radius: 6px; - border-top-right-radius: 6px; - -webkit-border-bottom-right-radius: 6px; - border-bottom-right-radius: 6px; - -moz-border-radius-topright: 6px; - -moz-border-radius-bottomright: 6px; -} - -.pagination-mini ul > li:first-child > a, -.pagination-small ul > li:first-child > a, -.pagination-mini ul > li:first-child > span, -.pagination-small ul > li:first-child > span { - -webkit-border-bottom-left-radius: 3px; - border-bottom-left-radius: 3px; - -webkit-border-top-left-radius: 3px; - border-top-left-radius: 3px; - -moz-border-radius-bottomleft: 3px; - -moz-border-radius-topleft: 3px; -} - -.pagination-mini ul > li:last-child > a, -.pagination-small ul > li:last-child > a, -.pagination-mini ul > li:last-child > span, -.pagination-small ul > li:last-child > span { - -webkit-border-top-right-radius: 3px; - border-top-right-radius: 3px; - -webkit-border-bottom-right-radius: 3px; - border-bottom-right-radius: 3px; - -moz-border-radius-topright: 3px; - -moz-border-radius-bottomright: 3px; -} - -.pagination-small ul > li > a, -.pagination-small ul > li > span { - padding: 2px 10px; - font-size: 11.9px; -} - -.pagination-mini ul > li > a, -.pagination-mini ul > li > span { - padding: 0 6px; - font-size: 10.5px; -} - -.pager { - margin: 20px 0; - text-align: center; - list-style: none; - *zoom: 1; -} - -.pager:before, -.pager:after { - display: table; - line-height: 0; - content: ""; -} - -.pager:after { - clear: both; -} - -.pager li { - display: inline; -} - -.pager li > a, -.pager li > span { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} - -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; - background-color: #f5f5f5; -} - -.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: #999999; - cursor: default; - background-color: #fff; -} - -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000000; -} - -.modal-backdrop.fade { - opacity: 0; -} - -.modal-backdrop, -.modal-backdrop.fade.in { - opacity: 0.8; - filter: alpha(opacity=80); -} - -.modal { - position: fixed; - top: 10%; - left: 50%; - z-index: 1050; - width: 560px; - margin-left: -280px; - background-color: #ffffff; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, 0.3); - *border: 1px solid #999; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - outline: none; - -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -webkit-background-clip: padding-box; - -moz-background-clip: padding-box; - background-clip: padding-box; -} - -.modal.fade { - top: -25%; - -webkit-transition: opacity 0.3s linear, top 0.3s ease-out; - -moz-transition: opacity 0.3s linear, top 0.3s ease-out; - -o-transition: opacity 0.3s linear, top 0.3s ease-out; - transition: opacity 0.3s linear, top 0.3s ease-out; -} - -.modal.fade.in { - top: 10%; -} - -.modal-header { - padding: 9px 15px; - border-bottom: 1px solid #eee; -} - -.modal-header .close { - margin-top: 2px; -} - -.modal-header h3 { - margin: 0; - line-height: 30px; -} - -.modal-body { - position: relative; - max-height: 400px; - padding: 15px; - overflow-y: auto; -} - -.modal-form { - margin-bottom: 0; -} - -.modal-footer { - padding: 14px 15px 15px; - margin-bottom: 0; - text-align: right; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; - *zoom: 1; - -webkit-box-shadow: inset 0 1px 0 #ffffff; - -moz-box-shadow: inset 0 1px 0 #ffffff; - box-shadow: inset 0 1px 0 #ffffff; -} - -.modal-footer:before, -.modal-footer:after { - display: table; - line-height: 0; - content: ""; -} - -.modal-footer:after { - clear: both; -} - -.modal-footer .btn + .btn { - margin-bottom: 0; - margin-left: 5px; -} - -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} - -.modal-footer .btn-block + .btn-block { - margin-left: 0; -} - -.tooltip { - position: absolute; - z-index: 1030; - display: block; - font-size: 11px; - line-height: 1.4; - opacity: 0; - filter: alpha(opacity=0); - visibility: visible; -} - -.tooltip.in { - opacity: 0.8; - filter: alpha(opacity=80); -} - -.tooltip.top { - padding: 5px 0; - margin-top: -3px; -} - -.tooltip.right { - padding: 0 5px; - margin-left: 3px; -} - -.tooltip.bottom { - padding: 5px 0; - margin-top: 3px; -} - -.tooltip.left { - padding: 0 5px; - margin-left: -3px; -} - -.tooltip-inner { - max-width: 200px; - padding: 8px; - color: #ffffff; - text-align: center; - text-decoration: none; - background-color: #000000; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - 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-top-color: #000000; - border-width: 5px 5px 0; -} - -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-right-color: #000000; - border-width: 5px 5px 5px 0; -} - -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-left-color: #000000; - border-width: 5px 0 5px 5px; -} - -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-bottom-color: #000000; - border-width: 0 5px 5px; -} - -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1010; - display: none; - max-width: 276px; - padding: 1px; - text-align: left; - white-space: normal; - background-color: #ffffff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; -} - -.popover.top { - margin-top: -10px; -} - -.popover.right { - margin-left: 10px; -} - -.popover.bottom { - margin-top: 10px; -} - -.popover.left { - margin-left: -10px; -} - -.popover-title { - padding: 8px 14px; - margin: 0; - font-size: 14px; - font-weight: normal; - line-height: 18px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - -webkit-border-radius: 5px 5px 0 0; - -moz-border-radius: 5px 5px 0 0; - border-radius: 5px 5px 0 0; -} - -.popover-title:empty { - display: none; -} - -.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 { - bottom: -11px; - left: 50%; - margin-left: -11px; - border-top-color: #999; - border-top-color: rgba(0, 0, 0, 0.25); - border-bottom-width: 0; -} - -.popover.top .arrow:after { - bottom: 1px; - margin-left: -10px; - border-top-color: #ffffff; - border-bottom-width: 0; -} - -.popover.right .arrow { - top: 50%; - left: -11px; - margin-top: -11px; - border-right-color: #999; - border-right-color: rgba(0, 0, 0, 0.25); - border-left-width: 0; -} - -.popover.right .arrow:after { - bottom: -10px; - left: 1px; - border-right-color: #ffffff; - border-left-width: 0; -} - -.popover.bottom .arrow { - top: -11px; - left: 50%; - margin-left: -11px; - border-bottom-color: #999; - border-bottom-color: rgba(0, 0, 0, 0.25); - border-top-width: 0; -} - -.popover.bottom .arrow:after { - top: 1px; - margin-left: -10px; - border-bottom-color: #ffffff; - border-top-width: 0; -} - -.popover.left .arrow { - top: 50%; - right: -11px; - margin-top: -11px; - border-left-color: #999; - border-left-color: rgba(0, 0, 0, 0.25); - border-right-width: 0; -} - -.popover.left .arrow:after { - right: 1px; - bottom: -10px; - border-left-color: #ffffff; - border-right-width: 0; -} - -.thumbnails { - margin-left: -20px; - list-style: none; - *zoom: 1; -} - -.thumbnails:before, -.thumbnails:after { - display: table; - line-height: 0; - content: ""; -} - -.thumbnails:after { - clear: both; -} - -.row-fluid .thumbnails { - margin-left: 0; -} - -.thumbnails > li { - float: left; - margin-bottom: 20px; - margin-left: 20px; -} - -.thumbnail { - display: block; - padding: 4px; - line-height: 20px; - border: 1px solid #ddd; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - -webkit-transition: all 0.2s ease-in-out; - -moz-transition: all 0.2s ease-in-out; - -o-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; -} - -a.thumbnail:hover, -a.thumbnail:focus { - border-color: #0088cc; - -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); -} - -.thumbnail > img { - display: block; - max-width: 100%; - margin-right: auto; - margin-left: auto; -} - -.thumbnail .caption { - padding: 9px; - color: #555555; -} - -.media, -.media-body { - overflow: hidden; - *overflow: visible; - 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 { - margin-left: 0; - list-style: none; -} - -.label, -.badge { - display: inline-block; - padding: 2px 4px; - font-size: 11.844px; - font-weight: bold; - line-height: 14px; - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - white-space: nowrap; - vertical-align: baseline; - background-color: #999999; -} - -.label { - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.badge { - padding-right: 9px; - padding-left: 9px; - -webkit-border-radius: 9px; - -moz-border-radius: 9px; - border-radius: 9px; -} - -.label:empty, -.badge:empty { - display: none; -} - -a.label:hover, -a.label:focus, -a.badge:hover, -a.badge:focus { - color: #ffffff; - text-decoration: none; - cursor: pointer; -} - -.label-important, -.badge-important { - background-color: #b94a48; -} - -.label-important[href], -.badge-important[href] { - background-color: #953b39; -} - -.label-warning, -.badge-warning { - background-color: #f89406; -} - -.label-warning[href], -.badge-warning[href] { - background-color: #c67605; -} - -.label-success, -.badge-success { - background-color: #468847; -} - -.label-success[href], -.badge-success[href] { - background-color: #356635; -} - -.label-info, -.badge-info { - background-color: #3a87ad; -} - -.label-info[href], -.badge-info[href] { - background-color: #2d6987; -} - -.label-inverse, -.badge-inverse { - background-color: #333333; -} - -.label-inverse[href], -.badge-inverse[href] { - background-color: #1a1a1a; -} - -.btn .label, -.btn .badge { - position: relative; - top: -1px; -} - -.btn-mini .label, -.btn-mini .badge { - top: 0; -} - -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-moz-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-ms-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-o-keyframes progress-bar-stripes { - from { - background-position: 0 0; - } - to { - background-position: 40px 0; - } -} - -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -.progress { - height: 20px; - margin-bottom: 20px; - overflow: hidden; - background-color: #f7f7f7; - background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); - background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); - background-repeat: repeat-x; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); -} - -.progress .bar { - float: left; - width: 0; - height: 100%; - font-size: 12px; - color: #ffffff; - text-align: center; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e90d2; - background-image: -moz-linear-gradient(top, #149bdf, #0480be); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); - background-image: -webkit-linear-gradient(top, #149bdf, #0480be); - background-image: -o-linear-gradient(top, #149bdf, #0480be); - background-image: linear-gradient(to bottom, #149bdf, #0480be); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-transition: width 0.6s ease; - -moz-transition: width 0.6s ease; - -o-transition: width 0.6s ease; - transition: width 0.6s ease; -} - -.progress .bar + .bar { - -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); -} - -.progress-striped .bar { - background-color: #149bdf; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - -webkit-background-size: 40px 40px; - -moz-background-size: 40px 40px; - -o-background-size: 40px 40px; - background-size: 40px 40px; -} - -.progress.active .bar { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -moz-animation: progress-bar-stripes 2s linear infinite; - -ms-animation: progress-bar-stripes 2s linear infinite; - -o-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} - -.progress-danger .bar, -.progress .bar-danger { - background-color: #dd514c; - background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); - background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); -} - -.progress-danger.progress-striped .bar, -.progress-striped .bar-danger { - background-color: #ee5f5b; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-success .bar, -.progress .bar-success { - background-color: #5eb95e; - background-image: -moz-linear-gradient(top, #62c462, #57a957); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); - background-image: -webkit-linear-gradient(top, #62c462, #57a957); - background-image: -o-linear-gradient(top, #62c462, #57a957); - background-image: linear-gradient(to bottom, #62c462, #57a957); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); -} - -.progress-success.progress-striped .bar, -.progress-striped .bar-success { - background-color: #62c462; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-info .bar, -.progress .bar-info { - background-color: #4bb1cf; - background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); - background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); - background-image: -o-linear-gradient(top, #5bc0de, #339bb9); - background-image: linear-gradient(to bottom, #5bc0de, #339bb9); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); -} - -.progress-info.progress-striped .bar, -.progress-striped .bar-info { - background-color: #5bc0de; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-warning .bar, -.progress .bar-warning { - background-color: #faa732; - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(to bottom, #fbb450, #f89406); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); -} - -.progress-warning.progress-striped .bar, -.progress-striped .bar-warning { - background-color: #fbb450; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.accordion { - margin-bottom: 20px; -} - -.accordion-group { - margin-bottom: 2px; - border: 1px solid #e5e5e5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.accordion-heading { - border-bottom: 0; -} - -.accordion-heading .accordion-toggle { - display: block; - padding: 8px 15px; -} - -.accordion-toggle { - cursor: pointer; -} - -.accordion-inner { - padding: 9px 15px; - border-top: 1px solid #e5e5e5; -} - -.carousel { - position: relative; - margin-bottom: 20px; - line-height: 1; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} - -.carousel-inner > .item { - position: relative; - display: none; - -webkit-transition: 0.6s ease-in-out left; - -moz-transition: 0.6s ease-in-out left; - -o-transition: 0.6s ease-in-out left; - transition: 0.6s ease-in-out left; -} - -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - display: block; - 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: 40%; - left: 15px; - width: 40px; - height: 40px; - margin-top: -20px; - font-size: 60px; - font-weight: 100; - line-height: 30px; - color: #ffffff; - text-align: center; - background: #222222; - border: 3px solid #ffffff; - -webkit-border-radius: 23px; - -moz-border-radius: 23px; - border-radius: 23px; - opacity: 0.5; - filter: alpha(opacity=50); -} - -.carousel-control.right { - right: 15px; - left: auto; -} - -.carousel-control:hover, -.carousel-control:focus { - color: #ffffff; - text-decoration: none; - opacity: 0.9; - filter: alpha(opacity=90); -} - -.carousel-indicators { - position: absolute; - top: 15px; - right: 15px; - z-index: 5; - margin: 0; - list-style: none; -} - -.carousel-indicators li { - display: block; - float: left; - width: 10px; - height: 10px; - margin-left: 5px; - text-indent: -999px; - background-color: #ccc; - background-color: rgba(255, 255, 255, 0.25); - border-radius: 5px; -} - -.carousel-indicators .active { - background-color: #fff; -} - -.carousel-caption { - position: absolute; - right: 0; - bottom: 0; - left: 0; - padding: 15px; - background: #333333; - background: rgba(0, 0, 0, 0.75); -} - -.carousel-caption h4, -.carousel-caption p { - line-height: 20px; - color: #ffffff; -} - -.carousel-caption h4 { - margin: 0 0 5px; -} - -.carousel-caption p { - margin-bottom: 0; -} - -.hero-unit { - padding: 60px; - margin-bottom: 30px; - font-size: 18px; - font-weight: 200; - line-height: 30px; - color: inherit; - background-color: #eeeeee; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.hero-unit h1 { - margin-bottom: 0; - font-size: 60px; - line-height: 1; - letter-spacing: -1px; - color: inherit; -} - -.hero-unit li { - line-height: 30px; -} - -.pull-right { - float: right; -} - -.pull-left { - float: left; -} - -.hide { - display: none; -} - -.show { - display: block; -} - -.invisible { - visibility: hidden; -} - -.affix { - position: fixed; -} diff --git a/flask_admin/static/bootstrap/bootstrap2/css/bootstrap.min.css b/flask_admin/static/bootstrap/bootstrap2/css/bootstrap.min.css deleted file mode 100644 index df96c8648..000000000 --- a/flask_admin/static/bootstrap/bootstrap2/css/bootstrap.min.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * Bootstrap v2.3.2 - * - * Copyright 2013 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world by @mdo and @fat. - */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!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) ")"}.ir a:after,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}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover,a:focus{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.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 td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.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;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.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;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;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:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.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;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;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-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.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{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;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{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;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:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} diff --git a/flask_admin/static/bootstrap/bootstrap2/js/bootstrap.js b/flask_admin/static/bootstrap/bootstrap2/js/bootstrap.js deleted file mode 100644 index 44109f62d..000000000 --- a/flask_admin/static/bootstrap/bootstrap2/js/bootstrap.js +++ /dev/null @@ -1,2280 +0,0 @@ -/* =================================================== - * bootstrap-transition.js v2.3.2 - * http://getbootstrap.com/2.3.2/javascript.html#transitions - * =================================================== - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* CSS TRANSITION SUPPORT (http://www.modernizr.com/) - * ======================================================= */ - - $(function () { - - $.support.transition = (function () { - - var transitionEnd = (function () { - - var el = document.createElement('bootstrap') - , transEndEventNames = { - 'WebkitTransition' : 'webkitTransitionEnd' - , 'MozTransition' : 'transitionend' - , 'OTransition' : 'oTransitionEnd otransitionend' - , 'transition' : 'transitionend' - } - , name - - for (name in transEndEventNames){ - if (el.style[name] !== undefined) { - return transEndEventNames[name] - } - } - - }()) - - return transitionEnd && { - end: transitionEnd - } - - })() - - }) - -}(window.jQuery);/* ========================================================== - * bootstrap-alert.js v2.3.2 - * http://getbootstrap.com/2.3.2/javascript.html#alerts - * ========================================================== - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* ALERT CLASS DEFINITION - * ====================== */ - - var dismiss = '[data-dismiss="alert"]' - , Alert = function (el) { - $(el).on('click', dismiss, this.close) - } - - Alert.prototype.close = function (e) { - var $this = $(this) - , selector = $this.attr('data-target') - , $parent - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - $parent = $(selector) - - e && e.preventDefault() - - $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent()) - - $parent.trigger(e = $.Event('close')) - - if (e.isDefaultPrevented()) return - - $parent.removeClass('in') - - function removeElement() { - $parent - .trigger('closed') - .remove() - } - - $.support.transition && $parent.hasClass('fade') ? - $parent.on($.support.transition.end, removeElement) : - removeElement() - } - - - /* ALERT PLUGIN DEFINITION - * ======================= */ - - var old = $.fn.alert - - $.fn.alert = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('alert') - if (!data) $this.data('alert', (data = new Alert(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.alert.Constructor = Alert - - - /* ALERT NO CONFLICT - * ================= */ - - $.fn.alert.noConflict = function () { - $.fn.alert = old - return this - } - - - /* ALERT DATA-API - * ============== */ - - $(document).on('click.alert.data-api', dismiss, Alert.prototype.close) - -}(window.jQuery);/* ============================================================ - * bootstrap-button.js v2.3.2 - * http://getbootstrap.com/2.3.2/javascript.html#buttons - * ============================================================ - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* BUTTON PUBLIC CLASS DEFINITION - * ============================== */ - - var Button = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.button.defaults, options) - } - - Button.prototype.setState = function (state) { - var d = 'disabled' - , $el = this.$element - , data = $el.data() - , val = $el.is('input') ? 'val' : 'html' - - state = state + 'Text' - data.resetText || $el.data('resetText', $el[val]()) - - $el[val](data[state] || this.options[state]) - - // push to event loop to allow forms to submit - setTimeout(function () { - state == 'loadingText' ? - $el.addClass(d).attr(d, d) : - $el.removeClass(d).removeAttr(d) - }, 0) - } - - Button.prototype.toggle = function () { - var $parent = this.$element.closest('[data-toggle="buttons-radio"]') - - $parent && $parent - .find('.active') - .removeClass('active') - - this.$element.toggleClass('active') - } - - - /* BUTTON PLUGIN DEFINITION - * ======================== */ - - var old = $.fn.button - - $.fn.button = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('button') - , options = typeof option == 'object' && option - if (!data) $this.data('button', (data = new Button(this, options))) - if (option == 'toggle') data.toggle() - else if (option) data.setState(option) - }) - } - - $.fn.button.defaults = { - loadingText: 'loading...' - } - - $.fn.button.Constructor = Button - - - /* BUTTON NO CONFLICT - * ================== */ - - $.fn.button.noConflict = function () { - $.fn.button = old - return this - } - - - /* BUTTON DATA-API - * =============== */ - - $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) { - var $btn = $(e.target) - if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') - $btn.button('toggle') - }) - -}(window.jQuery);/* ========================================================== - * bootstrap-carousel.js v2.3.2 - * http://getbootstrap.com/2.3.2/javascript.html#carousel - * ========================================================== - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* CAROUSEL CLASS DEFINITION - * ========================= */ - - var Carousel = function (element, options) { - this.$element = $(element) - this.$indicators = this.$element.find('.carousel-indicators') - this.options = options - this.options.pause == 'hover' && this.$element - .on('mouseenter', $.proxy(this.pause, this)) - .on('mouseleave', $.proxy(this.cycle, this)) - } - - Carousel.prototype = { - - cycle: function (e) { - if (!e) this.paused = false - if (this.interval) clearInterval(this.interval); - this.options.interval - && !this.paused - && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) - return this - } - - , getActiveIndex: function () { - this.$active = this.$element.find('.item.active') - this.$items = this.$active.parent().children() - return this.$items.index(this.$active) - } - - , to: function (pos) { - var activeIndex = this.getActiveIndex() - , that = this - - if (pos > (this.$items.length - 1) || pos < 0) return - - if (this.sliding) { - return this.$element.one('slid', function () { - that.to(pos) - }) - } - - if (activeIndex == pos) { - return this.pause().cycle() - } - - return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) - } - - , pause: function (e) { - if (!e) this.paused = true - if (this.$element.find('.next, .prev').length && $.support.transition.end) { - this.$element.trigger($.support.transition.end) - this.cycle(true) - } - clearInterval(this.interval) - this.interval = null - return this - } - - , next: function () { - if (this.sliding) return - return this.slide('next') - } - - , prev: function () { - if (this.sliding) return - return this.slide('prev') - } - - , slide: function (type, next) { - var $active = this.$element.find('.item.active') - , $next = next || $active[type]() - , isCycling = this.interval - , direction = type == 'next' ? 'left' : 'right' - , fallback = type == 'next' ? 'first' : 'last' - , that = this - , e - - this.sliding = true - - isCycling && this.pause() - - $next = $next.length ? $next : this.$element.find('.item')[fallback]() - - e = $.Event('slide', { - relatedTarget: $next[0] - , direction: direction - }) - - if ($next.hasClass('active')) return - - if (this.$indicators.length) { - this.$indicators.find('.active').removeClass('active') - this.$element.one('slid', function () { - var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) - $nextIndicator && $nextIndicator.addClass('active') - }) - } - - if ($.support.transition && this.$element.hasClass('slide')) { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $next.addClass(type) - $next[0].offsetWidth // force reflow - $active.addClass(direction) - $next.addClass(direction) - this.$element.one($.support.transition.end, function () { - $next.removeClass([type, direction].join(' ')).addClass('active') - $active.removeClass(['active', direction].join(' ')) - that.sliding = false - setTimeout(function () { that.$element.trigger('slid') }, 0) - }) - } else { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $active.removeClass('active') - $next.addClass('active') - this.sliding = false - this.$element.trigger('slid') - } - - isCycling && this.cycle() - - return this - } - - } - - - /* CAROUSEL PLUGIN DEFINITION - * ========================== */ - - var old = $.fn.carousel - - $.fn.carousel = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('carousel') - , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option) - , action = typeof option == 'string' ? option : options.slide - if (!data) $this.data('carousel', (data = new Carousel(this, options))) - if (typeof option == 'number') data.to(option) - else if (action) data[action]() - else if (options.interval) data.pause().cycle() - }) - } - - $.fn.carousel.defaults = { - interval: 5000 - , pause: 'hover' - } - - $.fn.carousel.Constructor = Carousel - - - /* CAROUSEL NO CONFLICT - * ==================== */ - - $.fn.carousel.noConflict = function () { - $.fn.carousel = old - return this - } - - /* CAROUSEL DATA-API - * ================= */ - - $(document).on('click.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { - var $this = $(this), href - , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - , options = $.extend({}, $target.data(), $this.data()) - , slideIndex - - $target.carousel(options) - - if (slideIndex = $this.attr('data-slide-to')) { - $target.data('carousel').pause().to(slideIndex).cycle() - } - - e.preventDefault() - }) - -}(window.jQuery);/* ============================================================= - * bootstrap-collapse.js v2.3.2 - * http://getbootstrap.com/2.3.2/javascript.html#collapse - * ============================================================= - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* COLLAPSE PUBLIC CLASS DEFINITION - * ================================ */ - - var Collapse = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.collapse.defaults, options) - - if (this.options.parent) { - this.$parent = $(this.options.parent) - } - - this.options.toggle && this.toggle() - } - - Collapse.prototype = { - - constructor: Collapse - - , dimension: function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } - - , show: function () { - var dimension - , scroll - , actives - , hasData - - if (this.transitioning || this.$element.hasClass('in')) return - - dimension = this.dimension() - scroll = $.camelCase(['scroll', dimension].join('-')) - actives = this.$parent && this.$parent.find('> .accordion-group > .in') - - if (actives && actives.length) { - hasData = actives.data('collapse') - if (hasData && hasData.transitioning) return - actives.collapse('hide') - hasData || actives.data('collapse', null) - } - - this.$element[dimension](0) - this.transition('addClass', $.Event('show'), 'shown') - $.support.transition && this.$element[dimension](this.$element[0][scroll]) - } - - , hide: function () { - var dimension - if (this.transitioning || !this.$element.hasClass('in')) return - dimension = this.dimension() - this.reset(this.$element[dimension]()) - this.transition('removeClass', $.Event('hide'), 'hidden') - this.$element[dimension](0) - } - - , reset: function (size) { - var dimension = this.dimension() - - this.$element - .removeClass('collapse') - [dimension](size || 'auto') - [0].offsetWidth - - this.$element[size !== null ? 'addClass' : 'removeClass']('collapse') - - return this - } - - , transition: function (method, startEvent, completeEvent) { - var that = this - , complete = function () { - if (startEvent.type == 'show') that.reset() - that.transitioning = 0 - that.$element.trigger(completeEvent) - } - - this.$element.trigger(startEvent) - - if (startEvent.isDefaultPrevented()) return - - this.transitioning = 1 - - this.$element[method]('in') - - $.support.transition && this.$element.hasClass('collapse') ? - this.$element.one($.support.transition.end, complete) : - complete() - } - - , toggle: function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } - - } - - - /* COLLAPSE PLUGIN DEFINITION - * ========================== */ - - var old = $.fn.collapse - - $.fn.collapse = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('collapse') - , options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option) - if (!data) $this.data('collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.collapse.defaults = { - toggle: true - } - - $.fn.collapse.Constructor = Collapse - - - /* COLLAPSE NO CONFLICT - * ==================== */ - - $.fn.collapse.noConflict = function () { - $.fn.collapse = old - return this - } - - - /* COLLAPSE DATA-API - * ================= */ - - $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) { - var $this = $(this), href - , target = $this.attr('data-target') - || e.preventDefault() - || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 - , option = $(target).data('collapse') ? 'toggle' : $this.data() - $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed') - $(target).collapse(option) - }) - -}(window.jQuery);/* ============================================================ - * bootstrap-dropdown.js v2.3.2 - * http://getbootstrap.com/2.3.2/javascript.html#dropdowns - * ============================================================ - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* DROPDOWN CLASS DEFINITION - * ========================= */ - - var toggle = '[data-toggle=dropdown]' - , Dropdown = function (element) { - var $el = $(element).on('click.dropdown.data-api', this.toggle) - $('html').on('click.dropdown.data-api', function () { - $el.parent().removeClass('open') - }) - } - - Dropdown.prototype = { - - constructor: Dropdown - - , toggle: function (e) { - var $this = $(this) - , $parent - , isActive - - if ($this.is('.disabled, :disabled')) return - - $parent = getParent($this) - - isActive = $parent.hasClass('open') - - clearMenus() - - if (!isActive) { - if ('ontouchstart' in document.documentElement) { - // if mobile we we use a backdrop because click events don't delegate - $('<div class="dropdown-backdrop"/>').insertBefore($(this)).on('click', clearMenus) - } - $parent.toggleClass('open') - } - - $this.focus() - - return false - } - - , keydown: function (e) { - var $this - , $items - , $active - , $parent - , isActive - , index - - if (!/(38|40|27)/.test(e.keyCode)) return - - $this = $(this) - - e.preventDefault() - e.stopPropagation() - - if ($this.is('.disabled, :disabled')) return - - $parent = getParent($this) - - isActive = $parent.hasClass('open') - - if (!isActive || (isActive && e.keyCode == 27)) { - if (e.which == 27) $parent.find(toggle).focus() - return $this.click() - } - - $items = $('[role=menu] li:not(.divider):visible a', $parent) - - if (!$items.length) return - - index = $items.index($items.filter(':focus')) - - if (e.keyCode == 38 && index > 0) index-- // up - if (e.keyCode == 40 && index < $items.length - 1) index++ // down - if (!~index) index = 0 - - $items - .eq(index) - .focus() - } - - } - - function clearMenus() { - $('.dropdown-backdrop').remove() - $(toggle).each(function () { - getParent($(this)).removeClass('open') - }) - } - - function getParent($this) { - var selector = $this.attr('data-target') - , $parent - - if (!selector) { - selector = $this.attr('href') - selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - $parent = selector && $(selector) - - if (!$parent || !$parent.length) $parent = $this.parent() - - return $parent - } - - - /* DROPDOWN PLUGIN DEFINITION - * ========================== */ - - var old = $.fn.dropdown - - $.fn.dropdown = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('dropdown') - if (!data) $this.data('dropdown', (data = new Dropdown(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.dropdown.Constructor = Dropdown - - - /* DROPDOWN NO CONFLICT - * ==================== */ - - $.fn.dropdown.noConflict = function () { - $.fn.dropdown = old - return this - } - - - /* APPLY TO STANDARD DROPDOWN ELEMENTS - * =================================== */ - - $(document) - .on('click.dropdown.data-api', clearMenus) - .on('click.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) - .on('click.dropdown.data-api' , toggle, Dropdown.prototype.toggle) - .on('keydown.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown) - -}(window.jQuery); -/* ========================================================= - * bootstrap-modal.js v2.3.2 - * http://getbootstrap.com/2.3.2/javascript.html#modals - * ========================================================= - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================= */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* MODAL CLASS DEFINITION - * ====================== */ - - var Modal = function (element, options) { - this.options = options - this.$element = $(element) - .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this)) - this.options.remote && this.$element.find('.modal-body').load(this.options.remote) - } - - Modal.prototype = { - - constructor: Modal - - , toggle: function () { - return this[!this.isShown ? 'show' : 'hide']() - } - - , show: function () { - var that = this - , e = $.Event('show') - - this.$element.trigger(e) - - if (this.isShown || e.isDefaultPrevented()) return - - this.isShown = true - - this.escape() - - this.backdrop(function () { - var transition = $.support.transition && that.$element.hasClass('fade') - - if (!that.$element.parent().length) { - that.$element.appendTo(document.body) //don't move modals dom position - } - - that.$element.show() - - if (transition) { - that.$element[0].offsetWidth // force reflow - } - - that.$element - .addClass('in') - .attr('aria-hidden', false) - - that.enforceFocus() - - transition ? - that.$element.one($.support.transition.end, function () { that.$element.focus().trigger('shown') }) : - that.$element.focus().trigger('shown') - - }) - } - - , hide: function (e) { - e && e.preventDefault() - - var that = this - - e = $.Event('hide') - - this.$element.trigger(e) - - if (!this.isShown || e.isDefaultPrevented()) return - - this.isShown = false - - this.escape() - - $(document).off('focusin.modal') - - this.$element - .removeClass('in') - .attr('aria-hidden', true) - - $.support.transition && this.$element.hasClass('fade') ? - this.hideWithTransition() : - this.hideModal() - } - - , enforceFocus: function () { - var that = this - $(document).on('focusin.modal', function (e) { - if (that.$element[0] !== e.target && !that.$element.has(e.target).length) { - that.$element.focus() - } - }) - } - - , escape: function () { - var that = this - if (this.isShown && this.options.keyboard) { - this.$element.on('keyup.dismiss.modal', function ( e ) { - e.which == 27 && that.hide() - }) - } else if (!this.isShown) { - this.$element.off('keyup.dismiss.modal') - } - } - - , hideWithTransition: function () { - var that = this - , timeout = setTimeout(function () { - that.$element.off($.support.transition.end) - that.hideModal() - }, 500) - - this.$element.one($.support.transition.end, function () { - clearTimeout(timeout) - that.hideModal() - }) - } - - , hideModal: function () { - var that = this - this.$element.hide() - this.backdrop(function () { - that.removeBackdrop() - that.$element.trigger('hidden') - }) - } - - , removeBackdrop: function () { - this.$backdrop && this.$backdrop.remove() - this.$backdrop = null - } - - , backdrop: function (callback) { - var that = this - , animate = this.$element.hasClass('fade') ? 'fade' : '' - - if (this.isShown && this.options.backdrop) { - var doAnimate = $.support.transition && animate - - this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />') - .appendTo(document.body) - - this.$backdrop.click( - this.options.backdrop == 'static' ? - $.proxy(this.$element[0].focus, this.$element[0]) - : $.proxy(this.hide, this) - ) - - if (doAnimate) this.$backdrop[0].offsetWidth // force reflow - - this.$backdrop.addClass('in') - - if (!callback) return - - doAnimate ? - this.$backdrop.one($.support.transition.end, callback) : - callback() - - } else if (!this.isShown && this.$backdrop) { - this.$backdrop.removeClass('in') - - $.support.transition && this.$element.hasClass('fade')? - this.$backdrop.one($.support.transition.end, callback) : - callback() - - } else if (callback) { - callback() - } - } - } - - - /* MODAL PLUGIN DEFINITION - * ======================= */ - - var old = $.fn.modal - - $.fn.modal = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('modal') - , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option) - if (!data) $this.data('modal', (data = new Modal(this, options))) - if (typeof option == 'string') data[option]() - else if (options.show) data.show() - }) - } - - $.fn.modal.defaults = { - backdrop: true - , keyboard: true - , show: true - } - - $.fn.modal.Constructor = Modal - - - /* MODAL NO CONFLICT - * ================= */ - - $.fn.modal.noConflict = function () { - $.fn.modal = old - return this - } - - - /* MODAL DATA-API - * ============== */ - - $(document).on('click.modal.data-api', '[data-toggle="modal"]', function (e) { - var $this = $(this) - , href = $this.attr('href') - , $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7 - , option = $target.data('modal') ? 'toggle' : $.extend({ remote:!/#/.test(href) && href }, $target.data(), $this.data()) - - e.preventDefault() - - $target - .modal(option) - .one('hide', function () { - $this.focus() - }) - }) - -}(window.jQuery); -/* =========================================================== - * bootstrap-tooltip.js v2.3.2 - * http://getbootstrap.com/2.3.2/javascript.html#tooltips - * Inspired by the original jQuery.tipsy by Jason Frame - * =========================================================== - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* TOOLTIP PUBLIC CLASS DEFINITION - * =============================== */ - - var Tooltip = function (element, options) { - this.init('tooltip', element, options) - } - - Tooltip.prototype = { - - constructor: Tooltip - - , init: function (type, element, options) { - var eventIn - , eventOut - , triggers - , trigger - , i - - this.type = type - this.$element = $(element) - this.options = this.getOptions(options) - this.enabled = true - - triggers = this.options.trigger.split(' ') - - for (i = triggers.length; i--;) { - trigger = triggers[i] - if (trigger == 'click') { - this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) - } else if (trigger != 'manual') { - eventIn = trigger == 'hover' ? 'mouseenter' : 'focus' - eventOut = trigger == 'hover' ? 'mouseleave' : 'blur' - this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) - this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) - } - } - - this.options.selector ? - (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : - this.fixTitle() - } - - , getOptions: function (options) { - options = $.extend({}, $.fn[this.type].defaults, this.$element.data(), options) - - if (options.delay && typeof options.delay == 'number') { - options.delay = { - show: options.delay - , hide: options.delay - } - } - - return options - } - - , enter: function (e) { - var defaults = $.fn[this.type].defaults - , options = {} - , self - - this._options && $.each(this._options, function (key, value) { - if (defaults[key] != value) options[key] = value - }, this) - - self = $(e.currentTarget)[this.type](options).data(this.type) - - if (!self.options.delay || !self.options.delay.show) return self.show() - - clearTimeout(this.timeout) - self.hoverState = 'in' - this.timeout = setTimeout(function() { - if (self.hoverState == 'in') self.show() - }, self.options.delay.show) - } - - , leave: function (e) { - var self = $(e.currentTarget)[this.type](this._options).data(this.type) - - if (this.timeout) clearTimeout(this.timeout) - if (!self.options.delay || !self.options.delay.hide) return self.hide() - - self.hoverState = 'out' - this.timeout = setTimeout(function() { - if (self.hoverState == 'out') self.hide() - }, self.options.delay.hide) - } - - , show: function () { - var $tip - , pos - , actualWidth - , actualHeight - , placement - , tp - , e = $.Event('show') - - if (this.hasContent() && this.enabled) { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $tip = this.tip() - this.setContent() - - if (this.options.animation) { - $tip.addClass('fade') - } - - placement = typeof this.options.placement == 'function' ? - this.options.placement.call(this, $tip[0], this.$element[0]) : - this.options.placement - - $tip - .detach() - .css({ top: 0, left: 0, display: 'block' }) - - this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) - - pos = this.getPosition() - - actualWidth = $tip[0].offsetWidth - actualHeight = $tip[0].offsetHeight - - switch (placement) { - case 'bottom': - tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2} - break - case 'top': - tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2} - break - case 'left': - tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth} - break - case 'right': - tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width} - break - } - - this.applyPlacement(tp, placement) - this.$element.trigger('shown') - } - } - - , applyPlacement: function(offset, placement){ - var $tip = this.tip() - , width = $tip[0].offsetWidth - , height = $tip[0].offsetHeight - , actualWidth - , actualHeight - , delta - , replace - - $tip - .offset(offset) - .addClass(placement) - .addClass('in') - - actualWidth = $tip[0].offsetWidth - actualHeight = $tip[0].offsetHeight - - if (placement == 'top' && actualHeight != height) { - offset.top = offset.top + height - actualHeight - replace = true - } - - if (placement == 'bottom' || placement == 'top') { - delta = 0 - - if (offset.left < 0){ - delta = offset.left * -2 - offset.left = 0 - $tip.offset(offset) - actualWidth = $tip[0].offsetWidth - actualHeight = $tip[0].offsetHeight - } - - this.replaceArrow(delta - width + actualWidth, actualWidth, 'left') - } else { - this.replaceArrow(actualHeight - height, actualHeight, 'top') - } - - if (replace) $tip.offset(offset) - } - - , replaceArrow: function(delta, dimension, position){ - this - .arrow() - .css(position, delta ? (50 * (1 - delta / dimension) + "%") : '') - } - - , setContent: function () { - var $tip = this.tip() - , title = this.getTitle() - - $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) - $tip.removeClass('fade in top bottom left right') - } - - , hide: function () { - var that = this - , $tip = this.tip() - , e = $.Event('hide') - - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - - $tip.removeClass('in') - - function removeWithAnimation() { - var timeout = setTimeout(function () { - $tip.off($.support.transition.end).detach() - }, 500) - - $tip.one($.support.transition.end, function () { - clearTimeout(timeout) - $tip.detach() - }) - } - - $.support.transition && this.$tip.hasClass('fade') ? - removeWithAnimation() : - $tip.detach() - - this.$element.trigger('hidden') - - return this - } - - , fixTitle: function () { - var $e = this.$element - if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') { - $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') - } - } - - , hasContent: function () { - return this.getTitle() - } - - , getPosition: function () { - var el = this.$element[0] - return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : { - width: el.offsetWidth - , height: el.offsetHeight - }, this.$element.offset()) - } - - , getTitle: function () { - var title - , $e = this.$element - , o = this.options - - title = $e.attr('data-original-title') - || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) - - return title - } - - , tip: function () { - return this.$tip = this.$tip || $(this.options.template) - } - - , arrow: function(){ - return this.$arrow = this.$arrow || this.tip().find(".tooltip-arrow") - } - - , validate: function () { - if (!this.$element[0].parentNode) { - this.hide() - this.$element = null - this.options = null - } - } - - , enable: function () { - this.enabled = true - } - - , disable: function () { - this.enabled = false - } - - , toggleEnabled: function () { - this.enabled = !this.enabled - } - - , toggle: function (e) { - var self = e ? $(e.currentTarget)[this.type](this._options).data(this.type) : this - self.tip().hasClass('in') ? self.hide() : self.show() - } - - , destroy: function () { - this.hide().$element.off('.' + this.type).removeData(this.type) - } - - } - - - /* TOOLTIP PLUGIN DEFINITION - * ========================= */ - - var old = $.fn.tooltip - - $.fn.tooltip = function ( option ) { - return this.each(function () { - var $this = $(this) - , data = $this.data('tooltip') - , options = typeof option == 'object' && option - if (!data) $this.data('tooltip', (data = new Tooltip(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.tooltip.Constructor = Tooltip - - $.fn.tooltip.defaults = { - animation: true - , placement: 'top' - , selector: false - , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>' - , trigger: 'hover focus' - , title: '' - , delay: 0 - , html: false - , container: false - } - - - /* TOOLTIP NO CONFLICT - * =================== */ - - $.fn.tooltip.noConflict = function () { - $.fn.tooltip = old - return this - } - -}(window.jQuery); -/* =========================================================== - * bootstrap-popover.js v2.3.2 - * http://getbootstrap.com/2.3.2/javascript.html#popovers - * =========================================================== - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * =========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* POPOVER PUBLIC CLASS DEFINITION - * =============================== */ - - var Popover = function (element, options) { - this.init('popover', element, options) - } - - - /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js - ========================================== */ - - Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, { - - constructor: Popover - - , setContent: function () { - var $tip = this.tip() - , title = this.getTitle() - , content = this.getContent() - - $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) - $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content) - - $tip.removeClass('fade top bottom left right in') - } - - , hasContent: function () { - return this.getTitle() || this.getContent() - } - - , getContent: function () { - var content - , $e = this.$element - , o = this.options - - content = (typeof o.content == 'function' ? o.content.call($e[0]) : o.content) - || $e.attr('data-content') - - return content - } - - , tip: function () { - if (!this.$tip) { - this.$tip = $(this.options.template) - } - return this.$tip - } - - , destroy: function () { - this.hide().$element.off('.' + this.type).removeData(this.type) - } - - }) - - - /* POPOVER PLUGIN DEFINITION - * ======================= */ - - var old = $.fn.popover - - $.fn.popover = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('popover') - , options = typeof option == 'object' && option - if (!data) $this.data('popover', (data = new Popover(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.popover.Constructor = Popover - - $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, { - placement: 'right' - , trigger: 'click' - , content: '' - , template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>' - }) - - - /* POPOVER NO CONFLICT - * =================== */ - - $.fn.popover.noConflict = function () { - $.fn.popover = old - return this - } - -}(window.jQuery); -/* ============================================================= - * bootstrap-scrollspy.js v2.3.2 - * http://getbootstrap.com/2.3.2/javascript.html#scrollspy - * ============================================================= - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* SCROLLSPY CLASS DEFINITION - * ========================== */ - - function ScrollSpy(element, options) { - var process = $.proxy(this.process, this) - , $element = $(element).is('body') ? $(window) : $(element) - , href - this.options = $.extend({}, $.fn.scrollspy.defaults, options) - this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process) - this.selector = (this.options.target - || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - || '') + ' .nav li > a' - this.$body = $('body') - this.refresh() - this.process() - } - - ScrollSpy.prototype = { - - constructor: ScrollSpy - - , refresh: function () { - var self = this - , $targets - - this.offsets = $([]) - this.targets = $([]) - - $targets = this.$body - .find(this.selector) - .map(function () { - var $el = $(this) - , href = $el.data('target') || $el.attr('href') - , $href = /^#\w/.test(href) && $(href) - return ( $href - && $href.length - && [[ $href.position().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]] ) || null - }) - .sort(function (a, b) { return a[0] - b[0] }) - .each(function () { - self.offsets.push(this[0]) - self.targets.push(this[1]) - }) - } - - , process: function () { - var scrollTop = this.$scrollElement.scrollTop() + this.options.offset - , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight - , maxScroll = scrollHeight - this.$scrollElement.height() - , offsets = this.offsets - , targets = this.targets - , activeTarget = this.activeTarget - , i - - if (scrollTop >= maxScroll) { - return activeTarget != (i = targets.last()[0]) - && this.activate ( i ) - } - - for (i = offsets.length; i--;) { - activeTarget != targets[i] - && scrollTop >= offsets[i] - && (!offsets[i + 1] || scrollTop <= offsets[i + 1]) - && this.activate( targets[i] ) - } - } - - , activate: function (target) { - var active - , selector - - this.activeTarget = target - - $(this.selector) - .parent('.active') - .removeClass('active') - - selector = this.selector - + '[data-target="' + target + '"],' - + this.selector + '[href="' + target + '"]' - - active = $(selector) - .parent('li') - .addClass('active') - - if (active.parent('.dropdown-menu').length) { - active = active.closest('li.dropdown').addClass('active') - } - - active.trigger('activate') - } - - } - - - /* SCROLLSPY PLUGIN DEFINITION - * =========================== */ - - var old = $.fn.scrollspy - - $.fn.scrollspy = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('scrollspy') - , options = typeof option == 'object' && option - if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.scrollspy.Constructor = ScrollSpy - - $.fn.scrollspy.defaults = { - offset: 10 - } - - - /* SCROLLSPY NO CONFLICT - * ===================== */ - - $.fn.scrollspy.noConflict = function () { - $.fn.scrollspy = old - return this - } - - - /* SCROLLSPY DATA-API - * ================== */ - - $(window).on('load', function () { - $('[data-spy="scroll"]').each(function () { - var $spy = $(this) - $spy.scrollspy($spy.data()) - }) - }) - -}(window.jQuery);/* ======================================================== - * bootstrap-tab.js v2.3.2 - * http://getbootstrap.com/2.3.2/javascript.html#tabs - * ======================================================== - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* TAB CLASS DEFINITION - * ==================== */ - - var Tab = function (element) { - this.element = $(element) - } - - Tab.prototype = { - - constructor: Tab - - , show: function () { - var $this = this.element - , $ul = $this.closest('ul:not(.dropdown-menu)') - , selector = $this.attr('data-target') - , previous - , $target - , e - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - if ( $this.parent('li').hasClass('active') ) return - - previous = $ul.find('.active:last a')[0] - - e = $.Event('show', { - relatedTarget: previous - }) - - $this.trigger(e) - - if (e.isDefaultPrevented()) return - - $target = $(selector) - - this.activate($this.parent('li'), $ul) - this.activate($target, $target.parent(), function () { - $this.trigger({ - type: 'shown' - , relatedTarget: previous - }) - }) - } - - , activate: function ( element, container, callback) { - var $active = container.find('> .active') - , transition = callback - && $.support.transition - && $active.hasClass('fade') - - function next() { - $active - .removeClass('active') - .find('> .dropdown-menu > .active') - .removeClass('active') - - element.addClass('active') - - if (transition) { - element[0].offsetWidth // reflow for transition - element.addClass('in') - } else { - element.removeClass('fade') - } - - if ( element.parent('.dropdown-menu') ) { - element.closest('li.dropdown').addClass('active') - } - - callback && callback() - } - - transition ? - $active.one($.support.transition.end, next) : - next() - - $active.removeClass('in') - } - } - - - /* TAB PLUGIN DEFINITION - * ===================== */ - - var old = $.fn.tab - - $.fn.tab = function ( option ) { - return this.each(function () { - var $this = $(this) - , data = $this.data('tab') - if (!data) $this.data('tab', (data = new Tab(this))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.tab.Constructor = Tab - - - /* TAB NO CONFLICT - * =============== */ - - $.fn.tab.noConflict = function () { - $.fn.tab = old - return this - } - - - /* TAB DATA-API - * ============ */ - - $(document).on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) { - e.preventDefault() - $(this).tab('show') - }) - -}(window.jQuery);/* ============================================================= - * bootstrap-typeahead.js v2.3.2 - * http://getbootstrap.com/2.3.2/javascript.html#typeahead - * ============================================================= - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function($){ - - "use strict"; // jshint ;_; - - - /* TYPEAHEAD PUBLIC CLASS DEFINITION - * ================================= */ - - var Typeahead = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.typeahead.defaults, options) - this.matcher = this.options.matcher || this.matcher - this.sorter = this.options.sorter || this.sorter - this.highlighter = this.options.highlighter || this.highlighter - this.updater = this.options.updater || this.updater - this.source = this.options.source - this.$menu = $(this.options.menu) - this.shown = false - this.listen() - } - - Typeahead.prototype = { - - constructor: Typeahead - - , select: function () { - var val = this.$menu.find('.active').attr('data-value') - this.$element - .val(this.updater(val)) - .change() - return this.hide() - } - - , updater: function (item) { - return item - } - - , show: function () { - var pos = $.extend({}, this.$element.position(), { - height: this.$element[0].offsetHeight - }) - - this.$menu - .insertAfter(this.$element) - .css({ - top: pos.top + pos.height - , left: pos.left - }) - .show() - - this.shown = true - return this - } - - , hide: function () { - this.$menu.hide() - this.shown = false - return this - } - - , lookup: function (event) { - var items - - this.query = this.$element.val() - - if (!this.query || this.query.length < this.options.minLength) { - return this.shown ? this.hide() : this - } - - items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source - - return items ? this.process(items) : this - } - - , process: function (items) { - var that = this - - items = $.grep(items, function (item) { - return that.matcher(item) - }) - - items = this.sorter(items) - - if (!items.length) { - return this.shown ? this.hide() : this - } - - return this.render(items.slice(0, this.options.items)).show() - } - - , matcher: function (item) { - return ~item.toLowerCase().indexOf(this.query.toLowerCase()) - } - - , sorter: function (items) { - var beginswith = [] - , caseSensitive = [] - , caseInsensitive = [] - , item - - while (item = items.shift()) { - if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item) - else if (~item.indexOf(this.query)) caseSensitive.push(item) - else caseInsensitive.push(item) - } - - return beginswith.concat(caseSensitive, caseInsensitive) - } - - , highlighter: function (item) { - var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&') - return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) { - return '<strong>' + match + '</strong>' - }) - } - - , render: function (items) { - var that = this - - items = $(items).map(function (i, item) { - i = $(that.options.item).attr('data-value', item) - i.find('a').html(that.highlighter(item)) - return i[0] - }) - - items.first().addClass('active') - this.$menu.html(items) - return this - } - - , next: function (event) { - var active = this.$menu.find('.active').removeClass('active') - , next = active.next() - - if (!next.length) { - next = $(this.$menu.find('li')[0]) - } - - next.addClass('active') - } - - , prev: function (event) { - var active = this.$menu.find('.active').removeClass('active') - , prev = active.prev() - - if (!prev.length) { - prev = this.$menu.find('li').last() - } - - prev.addClass('active') - } - - , listen: function () { - this.$element - .on('focus', $.proxy(this.focus, this)) - .on('blur', $.proxy(this.blur, this)) - .on('keypress', $.proxy(this.keypress, this)) - .on('keyup', $.proxy(this.keyup, this)) - - if (this.eventSupported('keydown')) { - this.$element.on('keydown', $.proxy(this.keydown, this)) - } - - this.$menu - .on('click', $.proxy(this.click, this)) - .on('mouseenter', 'li', $.proxy(this.mouseenter, this)) - .on('mouseleave', 'li', $.proxy(this.mouseleave, this)) - } - - , eventSupported: function(eventName) { - var isSupported = eventName in this.$element - if (!isSupported) { - this.$element.setAttribute(eventName, 'return;') - isSupported = typeof this.$element[eventName] === 'function' - } - return isSupported - } - - , move: function (e) { - if (!this.shown) return - - switch(e.keyCode) { - case 9: // tab - case 13: // enter - case 27: // escape - e.preventDefault() - break - - case 38: // up arrow - e.preventDefault() - this.prev() - break - - case 40: // down arrow - e.preventDefault() - this.next() - break - } - - e.stopPropagation() - } - - , keydown: function (e) { - this.suppressKeyPressRepeat = ~$.inArray(e.keyCode, [40,38,9,13,27]) - this.move(e) - } - - , keypress: function (e) { - if (this.suppressKeyPressRepeat) return - this.move(e) - } - - , keyup: function (e) { - switch(e.keyCode) { - case 40: // down arrow - case 38: // up arrow - case 16: // shift - case 17: // ctrl - case 18: // alt - break - - case 9: // tab - case 13: // enter - if (!this.shown) return - this.select() - break - - case 27: // escape - if (!this.shown) return - this.hide() - break - - default: - this.lookup() - } - - e.stopPropagation() - e.preventDefault() - } - - , focus: function (e) { - this.focused = true - } - - , blur: function (e) { - this.focused = false - if (!this.mousedover && this.shown) this.hide() - } - - , click: function (e) { - e.stopPropagation() - e.preventDefault() - this.select() - this.$element.focus() - } - - , mouseenter: function (e) { - this.mousedover = true - this.$menu.find('.active').removeClass('active') - $(e.currentTarget).addClass('active') - } - - , mouseleave: function (e) { - this.mousedover = false - if (!this.focused && this.shown) this.hide() - } - - } - - - /* TYPEAHEAD PLUGIN DEFINITION - * =========================== */ - - var old = $.fn.typeahead - - $.fn.typeahead = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('typeahead') - , options = typeof option == 'object' && option - if (!data) $this.data('typeahead', (data = new Typeahead(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.typeahead.defaults = { - source: [] - , items: 8 - , menu: '<ul class="typeahead dropdown-menu"></ul>' - , item: '<li><a href="#"></a></li>' - , minLength: 1 - } - - $.fn.typeahead.Constructor = Typeahead - - - /* TYPEAHEAD NO CONFLICT - * =================== */ - - $.fn.typeahead.noConflict = function () { - $.fn.typeahead = old - return this - } - - - /* TYPEAHEAD DATA-API - * ================== */ - - $(document).on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) { - var $this = $(this) - if ($this.data('typeahead')) return - $this.typeahead($this.data()) - }) - -}(window.jQuery); -/* ========================================================== - * bootstrap-affix.js v2.3.2 - * http://getbootstrap.com/2.3.2/javascript.html#affix - * ========================================================== - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* AFFIX CLASS DEFINITION - * ====================== */ - - var Affix = function (element, options) { - this.options = $.extend({}, $.fn.affix.defaults, options) - this.$window = $(window) - .on('scroll.affix.data-api', $.proxy(this.checkPosition, this)) - .on('click.affix.data-api', $.proxy(function () { setTimeout($.proxy(this.checkPosition, this), 1) }, this)) - this.$element = $(element) - this.checkPosition() - } - - Affix.prototype.checkPosition = function () { - if (!this.$element.is(':visible')) return - - var scrollHeight = $(document).height() - , scrollTop = this.$window.scrollTop() - , position = this.$element.offset() - , offset = this.options.offset - , offsetBottom = offset.bottom - , offsetTop = offset.top - , reset = 'affix affix-top affix-bottom' - , affix - - if (typeof offset != 'object') offsetBottom = offsetTop = offset - if (typeof offsetTop == 'function') offsetTop = offset.top() - if (typeof offsetBottom == 'function') offsetBottom = offset.bottom() - - affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? - false : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? - 'bottom' : offsetTop != null && scrollTop <= offsetTop ? - 'top' : false - - if (this.affixed === affix) return - - this.affixed = affix - this.unpin = affix == 'bottom' ? position.top - scrollTop : null - - this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : '')) - } - - - /* AFFIX PLUGIN DEFINITION - * ======================= */ - - var old = $.fn.affix - - $.fn.affix = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('affix') - , options = typeof option == 'object' && option - if (!data) $this.data('affix', (data = new Affix(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.affix.Constructor = Affix - - $.fn.affix.defaults = { - offset: 0 - } - - - /* AFFIX NO CONFLICT - * ================= */ - - $.fn.affix.noConflict = function () { - $.fn.affix = old - return this - } - - - /* AFFIX DATA-API - * ============== */ - - $(window).on('load', function () { - $('[data-spy="affix"]').each(function () { - var $spy = $(this) - , data = $spy.data() - - data.offset = data.offset || {} - - data.offsetBottom && (data.offset.bottom = data.offsetBottom) - data.offsetTop && (data.offset.top = data.offsetTop) - - $spy.affix(data) - }) - }) - - -}(window.jQuery); \ No newline at end of file diff --git a/flask_admin/static/bootstrap/bootstrap2/js/bootstrap.min.js b/flask_admin/static/bootstrap/bootstrap2/js/bootstrap.min.js deleted file mode 100644 index 848258d38..000000000 --- a/flask_admin/static/bootstrap/bootstrap2/js/bootstrap.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -* Bootstrap.js by @fat & @mdo -* Copyright 2013 Twitter, Inc. -* http://www.apache.org/licenses/LICENSE-2.0.txt -*/ -!function(e){"use strict";e(function(){e.support.transition=function(){var e=function(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},n;for(n in t)if(e.style[n]!==undefined)return t[n]}();return e&&{end:e}}()})}(window.jQuery),!function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};n.prototype.close=function(t){function s(){i.trigger("closed").remove()}var n=e(this),r=n.attr("data-target"),i;r||(r=n.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,"")),i=e(r),t&&t.preventDefault(),i.length||(i=n.hasClass("alert")?n:n.parent()),i.trigger(t=e.Event("close"));if(t.isDefaultPrevented())return;i.removeClass("in"),e.support.transition&&i.hasClass("fade")?i.on(e.support.transition.end,s):s()};var r=e.fn.alert;e.fn.alert=function(t){return this.each(function(){var r=e(this),i=r.data("alert");i||r.data("alert",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.alert.Constructor=n,e.fn.alert.noConflict=function(){return e.fn.alert=r,this},e(document).on("click.alert.data-api",t,n.prototype.close)}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.button.defaults,n)};t.prototype.setState=function(e){var t="disabled",n=this.$element,r=n.data(),i=n.is("input")?"val":"html";e+="Text",r.resetText||n.data("resetText",n[i]()),n[i](r[e]||this.options[e]),setTimeout(function(){e=="loadingText"?n.addClass(t).attr(t,t):n.removeClass(t).removeAttr(t)},0)},t.prototype.toggle=function(){var e=this.$element.closest('[data-toggle="buttons-radio"]');e&&e.find(".active").removeClass("active"),this.$element.toggleClass("active")};var n=e.fn.button;e.fn.button=function(n){return this.each(function(){var r=e(this),i=r.data("button"),s=typeof n=="object"&&n;i||r.data("button",i=new t(this,s)),n=="toggle"?i.toggle():n&&i.setState(n)})},e.fn.button.defaults={loadingText:"loading..."},e.fn.button.Constructor=t,e.fn.button.noConflict=function(){return e.fn.button=n,this},e(document).on("click.button.data-api","[data-toggle^=button]",function(t){var n=e(t.target);n.hasClass("btn")||(n=n.closest(".btn")),n.button("toggle")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.$indicators=this.$element.find(".carousel-indicators"),this.options=n,this.options.pause=="hover"&&this.$element.on("mouseenter",e.proxy(this.pause,this)).on("mouseleave",e.proxy(this.cycle,this))};t.prototype={cycle:function(t){return t||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},getActiveIndex:function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},to:function(t){var n=this.getActiveIndex(),r=this;if(t>this.$items.length-1||t<0)return;return this.sliding?this.$element.one("slid",function(){r.to(t)}):n==t?this.pause().cycle():this.slide(t>n?"next":"prev",e(this.$items[t]))},pause:function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition.end&&(this.$element.trigger(e.support.transition.end),this.cycle(!0)),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(t,n){var r=this.$element.find(".item.active"),i=n||r[t](),s=this.interval,o=t=="next"?"left":"right",u=t=="next"?"first":"last",a=this,f;this.sliding=!0,s&&this.pause(),i=i.length?i:this.$element.find(".item")[u](),f=e.Event("slide",{relatedTarget:i[0],direction:o});if(i.hasClass("active"))return;this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var t=e(a.$indicators.children()[a.getActiveIndex()]);t&&t.addClass("active")}));if(e.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(f);if(f.isDefaultPrevented())return;i.addClass(t),i[0].offsetWidth,r.addClass(o),i.addClass(o),this.$element.one(e.support.transition.end,function(){i.removeClass([t,o].join(" ")).addClass("active"),r.removeClass(["active",o].join(" ")),a.sliding=!1,setTimeout(function(){a.$element.trigger("slid")},0)})}else{this.$element.trigger(f);if(f.isDefaultPrevented())return;r.removeClass("active"),i.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return s&&this.cycle(),this}};var n=e.fn.carousel;e.fn.carousel=function(n){return this.each(function(){var r=e(this),i=r.data("carousel"),s=e.extend({},e.fn.carousel.defaults,typeof n=="object"&&n),o=typeof n=="string"?n:s.slide;i||r.data("carousel",i=new t(this,s)),typeof n=="number"?i.to(n):o?i[o]():s.interval&&i.pause().cycle()})},e.fn.carousel.defaults={interval:5e3,pause:"hover"},e.fn.carousel.Constructor=t,e.fn.carousel.noConflict=function(){return e.fn.carousel=n,this},e(document).on("click.carousel.data-api","[data-slide], [data-slide-to]",function(t){var n=e(this),r,i=e(n.attr("data-target")||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,"")),s=e.extend({},i.data(),n.data()),o;i.carousel(s),(o=n.attr("data-slide-to"))&&i.data("carousel").pause().to(o).cycle(),t.preventDefault()})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.collapse.defaults,n),this.options.parent&&(this.$parent=e(this.options.parent)),this.options.toggle&&this.toggle()};t.prototype={constructor:t,dimension:function(){var e=this.$element.hasClass("width");return e?"width":"height"},show:function(){var t,n,r,i;if(this.transitioning||this.$element.hasClass("in"))return;t=this.dimension(),n=e.camelCase(["scroll",t].join("-")),r=this.$parent&&this.$parent.find("> .accordion-group > .in");if(r&&r.length){i=r.data("collapse");if(i&&i.transitioning)return;r.collapse("hide"),i||r.data("collapse",null)}this.$element[t](0),this.transition("addClass",e.Event("show"),"shown"),e.support.transition&&this.$element[t](this.$element[0][n])},hide:function(){var t;if(this.transitioning||!this.$element.hasClass("in"))return;t=this.dimension(),this.reset(this.$element[t]()),this.transition("removeClass",e.Event("hide"),"hidden"),this.$element[t](0)},reset:function(e){var t=this.dimension();return this.$element.removeClass("collapse")[t](e||"auto")[0].offsetWidth,this.$element[e!==null?"addClass":"removeClass"]("collapse"),this},transition:function(t,n,r){var i=this,s=function(){n.type=="show"&&i.reset(),i.transitioning=0,i.$element.trigger(r)};this.$element.trigger(n);if(n.isDefaultPrevented())return;this.transitioning=1,this.$element[t]("in"),e.support.transition&&this.$element.hasClass("collapse")?this.$element.one(e.support.transition.end,s):s()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var n=e.fn.collapse;e.fn.collapse=function(n){return this.each(function(){var r=e(this),i=r.data("collapse"),s=e.extend({},e.fn.collapse.defaults,r.data(),typeof n=="object"&&n);i||r.data("collapse",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.collapse.defaults={toggle:!0},e.fn.collapse.Constructor=t,e.fn.collapse.noConflict=function(){return e.fn.collapse=n,this},e(document).on("click.collapse.data-api","[data-toggle=collapse]",function(t){var n=e(this),r,i=n.attr("data-target")||t.preventDefault()||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,""),s=e(i).data("collapse")?"toggle":n.data();n[e(i).hasClass("in")?"addClass":"removeClass"]("collapsed"),e(i).collapse(s)})}(window.jQuery),!function(e){"use strict";function r(){e(".dropdown-backdrop").remove(),e(t).each(function(){i(e(this)).removeClass("open")})}function i(t){var n=t.attr("data-target"),r;n||(n=t.attr("href"),n=n&&/#/.test(n)&&n.replace(/.*(?=#[^\s]*$)/,"")),r=n&&e(n);if(!r||!r.length)r=t.parent();return r}var t="[data-toggle=dropdown]",n=function(t){var n=e(t).on("click.dropdown.data-api",this.toggle);e("html").on("click.dropdown.data-api",function(){n.parent().removeClass("open")})};n.prototype={constructor:n,toggle:function(t){var n=e(this),s,o;if(n.is(".disabled, :disabled"))return;return s=i(n),o=s.hasClass("open"),r(),o||("ontouchstart"in document.documentElement&&e('<div class="dropdown-backdrop"/>').insertBefore(e(this)).on("click",r),s.toggleClass("open")),n.focus(),!1},keydown:function(n){var r,s,o,u,a,f;if(!/(38|40|27)/.test(n.keyCode))return;r=e(this),n.preventDefault(),n.stopPropagation();if(r.is(".disabled, :disabled"))return;u=i(r),a=u.hasClass("open");if(!a||a&&n.keyCode==27)return n.which==27&&u.find(t).focus(),r.click();s=e("[role=menu] li:not(.divider):visible a",u);if(!s.length)return;f=s.index(s.filter(":focus")),n.keyCode==38&&f>0&&f--,n.keyCode==40&&f<s.length-1&&f++,~f||(f=0),s.eq(f).focus()}};var s=e.fn.dropdown;e.fn.dropdown=function(t){return this.each(function(){var r=e(this),i=r.data("dropdown");i||r.data("dropdown",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.dropdown.Constructor=n,e.fn.dropdown.noConflict=function(){return e.fn.dropdown=s,this},e(document).on("click.dropdown.data-api",r).on("click.dropdown.data-api",".dropdown form",function(e){e.stopPropagation()}).on("click.dropdown.data-api",t,n.prototype.toggle).on("keydown.dropdown.data-api",t+", [role=menu]",n.prototype.keydown)}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=n,this.$element=e(t).delegate('[data-dismiss="modal"]',"click.dismiss.modal",e.proxy(this.hide,this)),this.options.remote&&this.$element.find(".modal-body").load(this.options.remote)};t.prototype={constructor:t,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var t=this,n=e.Event("show");this.$element.trigger(n);if(this.isShown||n.isDefaultPrevented())return;this.isShown=!0,this.escape(),this.backdrop(function(){var n=e.support.transition&&t.$element.hasClass("fade");t.$element.parent().length||t.$element.appendTo(document.body),t.$element.show(),n&&t.$element[0].offsetWidth,t.$element.addClass("in").attr("aria-hidden",!1),t.enforceFocus(),n?t.$element.one(e.support.transition.end,function(){t.$element.focus().trigger("shown")}):t.$element.focus().trigger("shown")})},hide:function(t){t&&t.preventDefault();var n=this;t=e.Event("hide"),this.$element.trigger(t);if(!this.isShown||t.isDefaultPrevented())return;this.isShown=!1,this.escape(),e(document).off("focusin.modal"),this.$element.removeClass("in").attr("aria-hidden",!0),e.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal()},enforceFocus:function(){var t=this;e(document).on("focusin.modal",function(e){t.$element[0]!==e.target&&!t.$element.has(e.target).length&&t.$element.focus()})},escape:function(){var e=this;this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.modal",function(t){t.which==27&&e.hide()}):this.isShown||this.$element.off("keyup.dismiss.modal")},hideWithTransition:function(){var t=this,n=setTimeout(function(){t.$element.off(e.support.transition.end),t.hideModal()},500);this.$element.one(e.support.transition.end,function(){clearTimeout(n),t.hideModal()})},hideModal:function(){var e=this;this.$element.hide(),this.backdrop(function(){e.removeBackdrop(),e.$element.trigger("hidden")})},removeBackdrop:function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},backdrop:function(t){var n=this,r=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var i=e.support.transition&&r;this.$backdrop=e('<div class="modal-backdrop '+r+'" />').appendTo(document.body),this.$backdrop.click(this.options.backdrop=="static"?e.proxy(this.$element[0].focus,this.$element[0]):e.proxy(this.hide,this)),i&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in");if(!t)return;i?this.$backdrop.one(e.support.transition.end,t):t()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),e.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(e.support.transition.end,t):t()):t&&t()}};var n=e.fn.modal;e.fn.modal=function(n){return this.each(function(){var r=e(this),i=r.data("modal"),s=e.extend({},e.fn.modal.defaults,r.data(),typeof n=="object"&&n);i||r.data("modal",i=new t(this,s)),typeof n=="string"?i[n]():s.show&&i.show()})},e.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},e.fn.modal.Constructor=t,e.fn.modal.noConflict=function(){return e.fn.modal=n,this},e(document).on("click.modal.data-api",'[data-toggle="modal"]',function(t){var n=e(this),r=n.attr("href"),i=e(n.attr("data-target")||r&&r.replace(/.*(?=#[^\s]+$)/,"")),s=i.data("modal")?"toggle":e.extend({remote:!/#/.test(r)&&r},i.data(),n.data());t.preventDefault(),i.modal(s).one("hide",function(){n.focus()})})}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("tooltip",e,t)};t.prototype={constructor:t,init:function(t,n,r){var i,s,o,u,a;this.type=t,this.$element=e(n),this.options=this.getOptions(r),this.enabled=!0,o=this.options.trigger.split(" ");for(a=o.length;a--;)u=o[a],u=="click"?this.$element.on("click."+this.type,this.options.selector,e.proxy(this.toggle,this)):u!="manual"&&(i=u=="hover"?"mouseenter":"focus",s=u=="hover"?"mouseleave":"blur",this.$element.on(i+"."+this.type,this.options.selector,e.proxy(this.enter,this)),this.$element.on(s+"."+this.type,this.options.selector,e.proxy(this.leave,this)));this.options.selector?this._options=e.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(t){return t=e.extend({},e.fn[this.type].defaults,this.$element.data(),t),t.delay&&typeof t.delay=="number"&&(t.delay={show:t.delay,hide:t.delay}),t},enter:function(t){var n=e.fn[this.type].defaults,r={},i;this._options&&e.each(this._options,function(e,t){n[e]!=t&&(r[e]=t)},this),i=e(t.currentTarget)[this.type](r).data(this.type);if(!i.options.delay||!i.options.delay.show)return i.show();clearTimeout(this.timeout),i.hoverState="in",this.timeout=setTimeout(function(){i.hoverState=="in"&&i.show()},i.options.delay.show)},leave:function(t){var n=e(t.currentTarget)[this.type](this._options).data(this.type);this.timeout&&clearTimeout(this.timeout);if(!n.options.delay||!n.options.delay.hide)return n.hide();n.hoverState="out",this.timeout=setTimeout(function(){n.hoverState=="out"&&n.hide()},n.options.delay.hide)},show:function(){var t,n,r,i,s,o,u=e.Event("show");if(this.hasContent()&&this.enabled){this.$element.trigger(u);if(u.isDefaultPrevented())return;t=this.tip(),this.setContent(),this.options.animation&&t.addClass("fade"),s=typeof this.options.placement=="function"?this.options.placement.call(this,t[0],this.$element[0]):this.options.placement,t.detach().css({top:0,left:0,display:"block"}),this.options.container?t.appendTo(this.options.container):t.insertAfter(this.$element),n=this.getPosition(),r=t[0].offsetWidth,i=t[0].offsetHeight;switch(s){case"bottom":o={top:n.top+n.height,left:n.left+n.width/2-r/2};break;case"top":o={top:n.top-i,left:n.left+n.width/2-r/2};break;case"left":o={top:n.top+n.height/2-i/2,left:n.left-r};break;case"right":o={top:n.top+n.height/2-i/2,left:n.left+n.width}}this.applyPlacement(o,s),this.$element.trigger("shown")}},applyPlacement:function(e,t){var n=this.tip(),r=n[0].offsetWidth,i=n[0].offsetHeight,s,o,u,a;n.offset(e).addClass(t).addClass("in"),s=n[0].offsetWidth,o=n[0].offsetHeight,t=="top"&&o!=i&&(e.top=e.top+i-o,a=!0),t=="bottom"||t=="top"?(u=0,e.left<0&&(u=e.left*-2,e.left=0,n.offset(e),s=n[0].offsetWidth,o=n[0].offsetHeight),this.replaceArrow(u-r+s,s,"left")):this.replaceArrow(o-i,o,"top"),a&&n.offset(e)},replaceArrow:function(e,t,n){this.arrow().css(n,e?50*(1-e/t)+"%":"")},setContent:function(){var e=this.tip(),t=this.getTitle();e.find(".tooltip-inner")[this.options.html?"html":"text"](t),e.removeClass("fade in top bottom left right")},hide:function(){function i(){var t=setTimeout(function(){n.off(e.support.transition.end).detach()},500);n.one(e.support.transition.end,function(){clearTimeout(t),n.detach()})}var t=this,n=this.tip(),r=e.Event("hide");this.$element.trigger(r);if(r.isDefaultPrevented())return;return n.removeClass("in"),e.support.transition&&this.$tip.hasClass("fade")?i():n.detach(),this.$element.trigger("hidden"),this},fixTitle:function(){var e=this.$element;(e.attr("title")||typeof e.attr("data-original-title")!="string")&&e.attr("data-original-title",e.attr("title")||"").attr("title","")},hasContent:function(){return this.getTitle()},getPosition:function(){var t=this.$element[0];return e.extend({},typeof t.getBoundingClientRect=="function"?t.getBoundingClientRect():{width:t.offsetWidth,height:t.offsetHeight},this.$element.offset())},getTitle:function(){var e,t=this.$element,n=this.options;return e=t.attr("data-original-title")||(typeof n.title=="function"?n.title.call(t[0]):n.title),e},tip:function(){return this.$tip=this.$tip||e(this.options.template)},arrow:function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(t){var n=t?e(t.currentTarget)[this.type](this._options).data(this.type):this;n.tip().hasClass("in")?n.hide():n.show()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}};var n=e.fn.tooltip;e.fn.tooltip=function(n){return this.each(function(){var r=e(this),i=r.data("tooltip"),s=typeof n=="object"&&n;i||r.data("tooltip",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.tooltip.Constructor=t,e.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},e.fn.tooltip.noConflict=function(){return e.fn.tooltip=n,this}}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("popover",e,t)};t.prototype=e.extend({},e.fn.tooltip.Constructor.prototype,{constructor:t,setContent:function(){var e=this.tip(),t=this.getTitle(),n=this.getContent();e.find(".popover-title")[this.options.html?"html":"text"](t),e.find(".popover-content")[this.options.html?"html":"text"](n),e.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var e,t=this.$element,n=this.options;return e=(typeof n.content=="function"?n.content.call(t[0]):n.content)||t.attr("data-content"),e},tip:function(){return this.$tip||(this.$tip=e(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}});var n=e.fn.popover;e.fn.popover=function(n){return this.each(function(){var r=e(this),i=r.data("popover"),s=typeof n=="object"&&n;i||r.data("popover",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.popover.Constructor=t,e.fn.popover.defaults=e.extend({},e.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),e.fn.popover.noConflict=function(){return e.fn.popover=n,this}}(window.jQuery),!function(e){"use strict";function t(t,n){var r=e.proxy(this.process,this),i=e(t).is("body")?e(window):e(t),s;this.options=e.extend({},e.fn.scrollspy.defaults,n),this.$scrollElement=i.on("scroll.scroll-spy.data-api",r),this.selector=(this.options.target||(s=e(t).attr("href"))&&s.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=e("body"),this.refresh(),this.process()}t.prototype={constructor:t,refresh:function(){var t=this,n;this.offsets=e([]),this.targets=e([]),n=this.$body.find(this.selector).map(function(){var n=e(this),r=n.data("target")||n.attr("href"),i=/^#\w/.test(r)&&e(r);return i&&i.length&&[[i.position().top+(!e.isWindow(t.$scrollElement.get(0))&&t.$scrollElement.scrollTop()),r]]||null}).sort(function(e,t){return e[0]-t[0]}).each(function(){t.offsets.push(this[0]),t.targets.push(this[1])})},process:function(){var e=this.$scrollElement.scrollTop()+this.options.offset,t=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,n=t-this.$scrollElement.height(),r=this.offsets,i=this.targets,s=this.activeTarget,o;if(e>=n)return s!=(o=i.last()[0])&&this.activate(o);for(o=r.length;o--;)s!=i[o]&&e>=r[o]&&(!r[o+1]||e<=r[o+1])&&this.activate(i[o])},activate:function(t){var n,r;this.activeTarget=t,e(this.selector).parent(".active").removeClass("active"),r=this.selector+'[data-target="'+t+'"],'+this.selector+'[href="'+t+'"]',n=e(r).parent("li").addClass("active"),n.parent(".dropdown-menu").length&&(n=n.closest("li.dropdown").addClass("active")),n.trigger("activate")}};var n=e.fn.scrollspy;e.fn.scrollspy=function(n){return this.each(function(){var r=e(this),i=r.data("scrollspy"),s=typeof n=="object"&&n;i||r.data("scrollspy",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.scrollspy.Constructor=t,e.fn.scrollspy.defaults={offset:10},e.fn.scrollspy.noConflict=function(){return e.fn.scrollspy=n,this},e(window).on("load",function(){e('[data-spy="scroll"]').each(function(){var t=e(this);t.scrollspy(t.data())})})}(window.jQuery),!function(e){"use strict";var t=function(t){this.element=e(t)};t.prototype={constructor:t,show:function(){var t=this.element,n=t.closest("ul:not(.dropdown-menu)"),r=t.attr("data-target"),i,s,o;r||(r=t.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,""));if(t.parent("li").hasClass("active"))return;i=n.find(".active:last a")[0],o=e.Event("show",{relatedTarget:i}),t.trigger(o);if(o.isDefaultPrevented())return;s=e(r),this.activate(t.parent("li"),n),this.activate(s,s.parent(),function(){t.trigger({type:"shown",relatedTarget:i})})},activate:function(t,n,r){function o(){i.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),t.addClass("active"),s?(t[0].offsetWidth,t.addClass("in")):t.removeClass("fade"),t.parent(".dropdown-menu")&&t.closest("li.dropdown").addClass("active"),r&&r()}var i=n.find("> .active"),s=r&&e.support.transition&&i.hasClass("fade");s?i.one(e.support.transition.end,o):o(),i.removeClass("in")}};var n=e.fn.tab;e.fn.tab=function(n){return this.each(function(){var r=e(this),i=r.data("tab");i||r.data("tab",i=new t(this)),typeof n=="string"&&i[n]()})},e.fn.tab.Constructor=t,e.fn.tab.noConflict=function(){return e.fn.tab=n,this},e(document).on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(t){t.preventDefault(),e(this).tab("show")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.typeahead.defaults,n),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.source=this.options.source,this.$menu=e(this.options.menu),this.shown=!1,this.listen()};t.prototype={constructor:t,select:function(){var e=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(e)).change(),this.hide()},updater:function(e){return e},show:function(){var t=e.extend({},this.$element.position(),{height:this.$element[0].offsetHeight});return this.$menu.insertAfter(this.$element).css({top:t.top+t.height,left:t.left}).show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(t){var n;return this.query=this.$element.val(),!this.query||this.query.length<this.options.minLength?this.shown?this.hide():this:(n=e.isFunction(this.source)?this.source(this.query,e.proxy(this.process,this)):this.source,n?this.process(n):this)},process:function(t){var n=this;return t=e.grep(t,function(e){return n.matcher(e)}),t=this.sorter(t),t.length?this.render(t.slice(0,this.options.items)).show():this.shown?this.hide():this},matcher:function(e){return~e.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(e){var t=[],n=[],r=[],i;while(i=e.shift())i.toLowerCase().indexOf(this.query.toLowerCase())?~i.indexOf(this.query)?n.push(i):r.push(i):t.push(i);return t.concat(n,r)},highlighter:function(e){var t=this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&");return e.replace(new RegExp("("+t+")","ig"),function(e,t){return"<strong>"+t+"</strong>"})},render:function(t){var n=this;return t=e(t).map(function(t,r){return t=e(n.options.item).attr("data-value",r),t.find("a").html(n.highlighter(r)),t[0]}),t.first().addClass("active"),this.$menu.html(t),this},next:function(t){var n=this.$menu.find(".active").removeClass("active"),r=n.next();r.length||(r=e(this.$menu.find("li")[0])),r.addClass("active")},prev:function(e){var t=this.$menu.find(".active").removeClass("active"),n=t.prev();n.length||(n=this.$menu.find("li").last()),n.addClass("active")},listen:function(){this.$element.on("focus",e.proxy(this.focus,this)).on("blur",e.proxy(this.blur,this)).on("keypress",e.proxy(this.keypress,this)).on("keyup",e.proxy(this.keyup,this)),this.eventSupported("keydown")&&this.$element.on("keydown",e.proxy(this.keydown,this)),this.$menu.on("click",e.proxy(this.click,this)).on("mouseenter","li",e.proxy(this.mouseenter,this)).on("mouseleave","li",e.proxy(this.mouseleave,this))},eventSupported:function(e){var t=e in this.$element;return t||(this.$element.setAttribute(e,"return;"),t=typeof this.$element[e]=="function"),t},move:function(e){if(!this.shown)return;switch(e.keyCode){case 9:case 13:case 27:e.preventDefault();break;case 38:e.preventDefault(),this.prev();break;case 40:e.preventDefault(),this.next()}e.stopPropagation()},keydown:function(t){this.suppressKeyPressRepeat=~e.inArray(t.keyCode,[40,38,9,13,27]),this.move(t)},keypress:function(e){if(this.suppressKeyPressRepeat)return;this.move(e)},keyup:function(e){switch(e.keyCode){case 40:case 38:case 16:case 17:case 18:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}e.stopPropagation(),e.preventDefault()},focus:function(e){this.focused=!0},blur:function(e){this.focused=!1,!this.mousedover&&this.shown&&this.hide()},click:function(e){e.stopPropagation(),e.preventDefault(),this.select(),this.$element.focus()},mouseenter:function(t){this.mousedover=!0,this.$menu.find(".active").removeClass("active"),e(t.currentTarget).addClass("active")},mouseleave:function(e){this.mousedover=!1,!this.focused&&this.shown&&this.hide()}};var n=e.fn.typeahead;e.fn.typeahead=function(n){return this.each(function(){var r=e(this),i=r.data("typeahead"),s=typeof n=="object"&&n;i||r.data("typeahead",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.typeahead.defaults={source:[],items:8,menu:'<ul class="typeahead dropdown-menu"></ul>',item:'<li><a href="#"></a></li>',minLength:1},e.fn.typeahead.Constructor=t,e.fn.typeahead.noConflict=function(){return e.fn.typeahead=n,this},e(document).on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(t){var n=e(this);if(n.data("typeahead"))return;n.typeahead(n.data())})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=e.extend({},e.fn.affix.defaults,n),this.$window=e(window).on("scroll.affix.data-api",e.proxy(this.checkPosition,this)).on("click.affix.data-api",e.proxy(function(){setTimeout(e.proxy(this.checkPosition,this),1)},this)),this.$element=e(t),this.checkPosition()};t.prototype.checkPosition=function(){if(!this.$element.is(":visible"))return;var t=e(document).height(),n=this.$window.scrollTop(),r=this.$element.offset(),i=this.options.offset,s=i.bottom,o=i.top,u="affix affix-top affix-bottom",a;typeof i!="object"&&(s=o=i),typeof o=="function"&&(o=i.top()),typeof s=="function"&&(s=i.bottom()),a=this.unpin!=null&&n+this.unpin<=r.top?!1:s!=null&&r.top+this.$element.height()>=t-s?"bottom":o!=null&&n<=o?"top":!1;if(this.affixed===a)return;this.affixed=a,this.unpin=a=="bottom"?r.top-n:null,this.$element.removeClass(u).addClass("affix"+(a?"-"+a:""))};var n=e.fn.affix;e.fn.affix=function(n){return this.each(function(){var r=e(this),i=r.data("affix"),s=typeof n=="object"&&n;i||r.data("affix",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.affix.Constructor=t,e.fn.affix.defaults={offset:0},e.fn.affix.noConflict=function(){return e.fn.affix=n,this},e(window).on("load",function(){e('[data-spy="affix"]').each(function(){var t=e(this),n=t.data();n.offset=n.offset||{},n.offsetBottom&&(n.offset.bottom=n.offsetBottom),n.offsetTop&&(n.offset.top=n.offsetTop),t.affix(n)})})}(window.jQuery); \ No newline at end of file diff --git a/flask_admin/static/bootstrap/bootstrap2/swatch/amelia/bootstrap.min.css b/flask_admin/static/bootstrap/bootstrap2/swatch/amelia/bootstrap.min.css deleted file mode 100644 index cc2e4779e..000000000 --- a/flask_admin/static/bootstrap/bootstrap2/swatch/amelia/bootstrap.min.css +++ /dev/null @@ -1,9 +0,0 @@ -@import url('//fonts.googleapis.com/css?family=Lobster|Cabin:400,700');/*! - * Bootstrap v2.3.2 - * - * Copyright 2013 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world by @mdo and @fat. - */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!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) ")"}.ir a:after,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}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:'Cabin',Verdana,sans-serif;font-size:14px;line-height:20px;color:#e1f0f0;background-color:#003f4d}a{color:#e8d069;text-decoration:none}a:hover,a:focus{color:#e8d069;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#aaa}a.muted:hover,a.muted:focus{color:#919191}.text-warning{color:#e1f0f0}a.text-warning:hover,a.text-warning:focus{color:#bfdfdf}.text-error{color:#e1f0f0}a.text-error:hover,a.text-error:focus{color:#bfdfdf}.text-info{color:#e1f0f0}a.text-info:hover,a.text-info:focus{color:#bfdfdf}.text-success{color:#e1f0f0}a.text-success:hover,a.text-success:focus{color:#bfdfdf}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:'Lobster',cursive;font-weight:normal;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#aaa}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #ddd}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid rgba(255,255,255,0.3);border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #aaa}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #ddd}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#aaa}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #ddd;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;font-size:12px;color:#444;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#444;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#aaa}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:'Cabin',Verdana,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid transparent;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid transparent}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#aaa;cursor:not-allowed;background-color:#fcfcfc;border-color:transparent;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#aaa}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#aaa}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#aaa}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#ddd}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#e1f0f0}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#e1f0f0}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#e1f0f0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#bfdfdf;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#e1f0f0;background-color:#df6e1e;border-color:#e1f0f0}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#e1f0f0}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#e1f0f0}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#e1f0f0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#bfdfdf;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#e1f0f0;background-color:#ad1d28;border-color:#e1f0f0}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#e1f0f0}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#e1f0f0}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#e1f0f0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#bfdfdf;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#e1f0f0;background-color:#48ca3b;border-color:#e1f0f0}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#e1f0f0}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#e1f0f0}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#e1f0f0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#bfdfdf;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#e1f0f0;background-color:#4d3a7d;border-color:#e1f0f0}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:transparent;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#fff}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#ddd;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#b8ebb3;border-color:#48ca3b}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:#1ba7b4;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #1cafbd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #1cafbd}.table .table{background-color:#003f4d}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #1cafbd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.table-bordered th,.table-bordered td{border-left:1px solid #1cafbd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topleft:0}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-topright:0}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topleft:0}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-topright:0}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#1ebccb}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:rgba(255,255,255,0.4)}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#48ca3b}.table tbody tr.error>td{background-color:#ad1d28}.table tbody tr.warning>td{background-color:#df6e1e}.table tbody tr.info>td{background-color:#4d3a7d}.table-hover tbody tr.success:hover>td{background-color:#3eb932}.table-hover tbody tr.error:hover>td{background-color:#971923}.table-hover tbody tr.warning:hover>td{background-color:#c9631b}.table-hover tbody tr.info:hover>td{background-color:#42326c}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.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;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#444;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#a41c26;background-image:-moz-linear-gradient(top,#ad1d28,#971923);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ad1d28),to(#971923));background-image:-webkit-linear-gradient(top,#ad1d28,#971923);background-image:-o-linear-gradient(top,#ad1d28,#971923);background-image:linear-gradient(to bottom,#ad1d28,#971923);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffad1d28',endColorstr='#ff971923',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#a41c26;background-image:-moz-linear-gradient(top,#ad1d28,#971923);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ad1d28),to(#971923));background-image:-webkit-linear-gradient(top,#ad1d28,#971923);background-image:-o-linear-gradient(top,#ad1d28,#971923);background-image:linear-gradient(to bottom,#ad1d28,#971923);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffad1d28',endColorstr='#ff971923',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#aaa}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#3cb9c6;border:1px solid #32a1ac;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;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:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#444;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#ddd;*background-color:#ddd;background-image:-moz-linear-gradient(top,#ddd,#ddd);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ddd),to(#ddd));background-image:-webkit-linear-gradient(top,#ddd,#ddd);background-image:-o-linear-gradient(top,#ddd,#ddd);background-image:linear-gradient(to bottom,#ddd,#ddd);background-repeat:repeat-x;border:1px solid rgba(0,0,0,0);*border:0;border-color:#ddd #ddd #b7b7b7;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:rgba(0,0,0,0);-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdddddd',endColorstr='#ffdddddd',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#444;background-color:#ddd;*background-color:#d0d0d0}.btn:active,.btn.active{background-color:#c4c4c4 \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#444;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:20px 24px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:8px 12px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:4px 8px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ad1d28;*background-color:#ad1d28;background-image:-moz-linear-gradient(top,#ad1d28,#ad1d28);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ad1d28),to(#ad1d28));background-image:-webkit-linear-gradient(top,#ad1d28,#ad1d28);background-image:-o-linear-gradient(top,#ad1d28,#ad1d28);background-image:linear-gradient(to bottom,#ad1d28,#ad1d28);background-repeat:repeat-x;border-color:#ad1d28 #ad1d28 #6b1219;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffad1d28',endColorstr='#ffad1d28',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#ad1d28;*background-color:#971923}.btn-primary:active,.btn-primary.active{background-color:#81161e \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#df6e1e;*background-color:#df6e1e;background-image:-moz-linear-gradient(top,#df6e1e,#df6e1e);background-image:-webkit-gradient(linear,0 0,0 100%,from(#df6e1e),to(#df6e1e));background-image:-webkit-linear-gradient(top,#df6e1e,#df6e1e);background-image:-o-linear-gradient(top,#df6e1e,#df6e1e);background-image:linear-gradient(to bottom,#df6e1e,#df6e1e);background-repeat:repeat-x;border-color:#df6e1e #df6e1e #9c4d15;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdf6e1e',endColorstr='#ffdf6e1e',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#df6e1e;*background-color:#c9631b}.btn-warning:active,.btn-warning.active{background-color:#b25818 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#debb27;*background-color:#debb27;background-image:-moz-linear-gradient(top,#debb27,#debb27);background-image:-webkit-gradient(linear,0 0,0 100%,from(#debb27),to(#debb27));background-image:-webkit-linear-gradient(top,#debb27,#debb27);background-image:-o-linear-gradient(top,#debb27,#debb27);background-image:linear-gradient(to bottom,#debb27,#debb27);background-repeat:repeat-x;border-color:#debb27 #debb27 #a08618;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdebb27',endColorstr='#ffdebb27',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#debb27;*background-color:#ccab1f}.btn-danger:active,.btn-danger.active{background-color:#b6991c \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#48ca3b;*background-color:#48ca3b;background-image:-moz-linear-gradient(top,#48ca3b,#48ca3b);background-image:-webkit-gradient(linear,0 0,0 100%,from(#48ca3b),to(#48ca3b));background-image:-webkit-linear-gradient(top,#48ca3b,#48ca3b);background-image:-o-linear-gradient(top,#48ca3b,#48ca3b);background-image:linear-gradient(to bottom,#48ca3b,#48ca3b);background-repeat:repeat-x;border-color:#48ca3b #48ca3b #319127;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff48ca3b',endColorstr='#ff48ca3b',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#48ca3b;*background-color:#3eb932}.btn-success:active,.btn-success.active{background-color:#38a52d \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#4d3a7d;*background-color:#4d3a7d;background-image:-moz-linear-gradient(top,#4d3a7d,#4d3a7d);background-image:-webkit-gradient(linear,0 0,0 100%,from(#4d3a7d),to(#4d3a7d));background-image:-webkit-linear-gradient(top,#4d3a7d,#4d3a7d);background-image:-o-linear-gradient(top,#4d3a7d,#4d3a7d);background-image:linear-gradient(to bottom,#4d3a7d,#4d3a7d);background-repeat:repeat-x;border-color:#4d3a7d #4d3a7d #2d2249;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4d3a7d',endColorstr='#ff4d3a7d',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#4d3a7d;*background-color:#42326c}.btn-info:active,.btn-info.active{background-color:#382a5a \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#27666d;*background-color:#27666d;background-image:-moz-linear-gradient(top,#27666d,#27666d);background-image:-webkit-gradient(linear,0 0,0 100%,from(#27666d),to(#27666d));background-image:-webkit-linear-gradient(top,#27666d,#27666d);background-image:-o-linear-gradient(top,#27666d,#27666d);background-image:linear-gradient(to bottom,#27666d,#27666d);background-repeat:repeat-x;border-color:#27666d #27666d #133135;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff27666d',endColorstr='#ff27666d',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#27666d;*background-color:#20545a}.btn-inverse:active,.btn-inverse.active{background-color:#1a4347 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#e8d069;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#e8d069;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#444;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topleft:0}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:0;border-top-right-radius:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#ddd}.btn-group.open .btn-primary.dropdown-toggle{background-color:#ad1d28}.btn-group.open .btn-warning.dropdown-toggle{background-color:#df6e1e}.btn-group.open .btn-danger.dropdown-toggle{background-color:#debb27}.btn-group.open .btn-success.dropdown-toggle{background-color:#48ca3b}.btn-group.open .btn-info.dropdown-toggle{background-color:#4d3a7d}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#27666d}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#df6e1e;border:1px solid #d2491c;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.alert,.alert h4{color:#e1f0f0}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#e1f0f0;background-color:#48ca3b;border-color:#55b932}.alert-success h4{color:#e1f0f0}.alert-danger,.alert-error{color:#e1f0f0;background-color:#ad1d28;border-color:#a01b3b}.alert-danger h4,.alert-error h4{color:#e1f0f0}.alert-info{color:#e1f0f0;background-color:#4d3a7d;border-color:#352f65}.alert-info h4{color:#e1f0f0}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#ddd}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#aaa;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#e8d069}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#ddd #ddd #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#003f4d;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#e8d069}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#e8d069;border-bottom-color:#e8d069}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#e8d069;border-bottom-color:#e8d069}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#aaa;border-color:#aaa}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#aaa}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#ddd #ddd #ddd #ddd}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#ddd #ddd #ddd #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#aaa}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:50px;padding-right:20px;padding-left:20px;background-color:#ad1d28;background-image:-moz-linear-gradient(top,#ad1d28,#ad1d28);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ad1d28),to(#ad1d28));background-image:-webkit-linear-gradient(top,#ad1d28,#ad1d28);background-image:-o-linear-gradient(top,#ad1d28,#ad1d28);background-image:linear-gradient(to bottom,#ad1d28,#ad1d28);background-repeat:repeat-x;border:1px solid #79141c;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffad1d28',endColorstr='#ffad1d28',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:15px 20px 15px;margin-left:-20px;font-size:20px;font-weight:200;color:#fff;text-shadow:0 1px 0 #ad1d28}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:50px;color:#fff}.navbar-link{color:#fff}.navbar-link:hover,.navbar-link:focus{color:#fff}.navbar .divider-vertical{height:50px;margin:0 9px;border-right:1px solid #ad1d28;border-left:1px solid #ad1d28}.navbar .btn,.navbar .btn-group{margin-top:10px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:10px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:10px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:'Cabin',Verdana,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:15px 15px 15px;color:#fff;text-decoration:none;text-shadow:0 1px 0 #ad1d28}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#fff;text-decoration:none;background-color:#d92432}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#fff;text-decoration:none;background-color:#d92432;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#971923;*background-color:#971923;background-image:-moz-linear-gradient(top,#971923,#971923);background-image:-webkit-gradient(linear,0 0,0 100%,from(#971923),to(#971923));background-image:-webkit-linear-gradient(top,#971923,#971923);background-image:-o-linear-gradient(top,#971923,#971923);background-image:linear-gradient(to bottom,#971923,#971923);background-repeat:repeat-x;border-color:#971923 #971923 #560e14;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff971923',endColorstr='#ff971923',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#971923;*background-color:#81161e}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#6b1219 \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#d92432}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#debb27;background-image:-moz-linear-gradient(top,#debb27,#debb27);background-image:-webkit-gradient(linear,0 0,0 100%,from(#debb27),to(#debb27));background-image:-webkit-linear-gradient(top,#debb27,#debb27);background-image:-o-linear-gradient(top,#debb27,#debb27);background-image:linear-gradient(to bottom,#debb27,#debb27);background-repeat:repeat-x;border-color:rgba(0,0,0,0.1);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdebb27',endColorstr='#ffdebb27',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#fff}.navbar-inverse .navbar-text{color:#fff}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:rgba(255,255,255,0.2)}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:rgba(255,255,255,0.2)}.navbar-inverse .navbar-link{color:#fff}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#debb27;border-left-color:#debb27}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:rgba(255,255,255,0.2)}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#efde96;border-color:#debb27;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#fff}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#fff}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#fff}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#444;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ccab1f;*background-color:#ccab1f;background-image:-moz-linear-gradient(top,#ccab1f,#ccab1f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ccab1f),to(#ccab1f));background-image:-webkit-linear-gradient(top,#ccab1f,#ccab1f);background-image:-o-linear-gradient(top,#ccab1f,#ccab1f);background-image:linear-gradient(to bottom,#ccab1f,#ccab1f);background-repeat:repeat-x;border-color:#ccab1f #ccab1f #8a7415;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffccab1f',endColorstr='#ffccab1f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#ccab1f;*background-color:#b6991c}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#a08618 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#aaa}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#3cb9c6;border:1px solid transparent;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:rgba(255,255,255,0.4)}.pagination ul>.active>a,.pagination ul>.active>span{color:#aaa;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#aaa;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topleft:0}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:0;border-top-right-radius:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:20px 24px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:8px 12px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:4px 8px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.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:#aaa;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1020;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.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-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#ad1d28;border-bottom:1px solid #971923;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.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{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#e8d069;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;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{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#aaa}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#e1f0f0}.label-important[href],.badge-important[href]{background-color:#bfdfdf}.label-warning,.badge-warning{background-color:#df6e1e}.label-warning[href],.badge-warning[href]{background-color:#b25818}.label-success,.badge-success{background-color:#e1f0f0}.label-success[href],.badge-success[href]{background-color:#bfdfdf}.label-info,.badge-info{background-color:#e1f0f0}.label-info[href],.badge-info[href]{background-color:#bfdfdf}.label-inverse,.badge-inverse{background-color:#444}.label-inverse[href],.badge-inverse[href]{background-color:#2b2b2b}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#e58846;background-image:-moz-linear-gradient(top,#ea9960,#df6e1e);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ea9960),to(#df6e1e));background-image:-webkit-linear-gradient(top,#ea9960,#df6e1e);background-image:-o-linear-gradient(top,#ea9960,#df6e1e);background-image:linear-gradient(to bottom,#ea9960,#df6e1e);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffea9960',endColorstr='#ffdf6e1e',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#ea9960;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;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:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#111;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#444;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#3cb9c6;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}h6{color:#e1f0f0}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-family:'Cabin',Verdana,sans-serif;color:#e1f0f0}code,pre{padding:2px;background-color:rgba(255,255,255,0.3)}blockquote{border-left-color:#1cafbd}blockquote.pull-right{border-right-color:#1cafbd}blockquote small{color:rgba(255,255,255,0.6)}.muted{color:rgba(255,255,255,0.6)}.text-warning{color:#f2e5ac}.text-error{color:#f3c4a3}.text-success{color:#b8ebb3}.text-info{color:#7be9ff}body{background-color:#0f8790;background-image:-webkit-gradient(radial,center center,0,center center,460,from(#12a5b0),to(#0f8790));background-image:-webkit-radial-gradient(circle,#12a5b0,#0f8790);background-image:-moz-radial-gradient(circle,#12a5b0,#0f8790);background-image:-o-radial-gradient(circle,#12a5b0,#0f8790);background-repeat:no-repeat}hr{border-bottom:0}.page-header{margin:30px 0 15px;border-bottom:0 solid transparent}.navbar .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar .brand{padding:15px 20px 14px;font-family:'Lobster',cursive;font-size:24px;font-weight:normal}.navbar .nav>li>a{padding-top:17px;padding-bottom:14px;text-shadow:none}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .navbar .nav>.active>a:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar .navbar-search{margin-top:10px}.navbar .navbar-search .search-query{padding-top:5px;padding-bottom:5px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar .navbar-text{margin:17px 15px 14px;line-height:20px}.navbar .btn,.navbar .btn-group{padding:4px}.navbar-inverse .dropdown-menu li>a:hover,.navbar-inverse .dropdown-menu li>a:focus,.navbar-inverse .dropdown-submenu:hover>a{background-color:#debb27;background-image:none}@media(max-width:979px){.navbar .nav-collapse .nav li>a{color:#e1f0f0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar .nav-collapse .nav li>a:hover{background-color:#d92432}.navbar .nav-collapse .dropdown-menu li>a:hover,.navbar .nav-collapse .dropdown-menu li>a:focus,.navbar .nav-collapse .dropdown-submenu:hover>a{background-image:none}.navbar .nav-collapse .navbar-form,.navbar .nav-collapse .navbar-search{border:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar .nav-collapse .navbar-search .search-query{border:2px solid #e1f0f0}.navbar .nav-collapse .nav-header{color:rgba(255,255,255,0.5)}.navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#fff!important}.navbar-inverse .nav-collapse .nav li>a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:hover{background-color:#e5c953!important}}div.subnav{margin:0 1px;background:rgba(42,99,105,0.9) none;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}div.subnav .nav>li>a{color:#e1f0f0;border-color:transparent}div.subnav .nav>li:first-child>a,div.subnav .nav>li:first-child>a:hover{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}div.subnav .nav>.active>a{color:#e1f0f0;background-color:rgba(255,255,255,0.4);border-color:transparent;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}div.subnav .nav>li>a:hover,div.subnav .nav>.active>a:hover{color:#e1f0f0;background-color:rgba(255,255,255,0.4);border-right-color:transparent}div.subnav .nav>li.open>a{background-color:rgba(255,255,255,0.4);border-color:transparent}div.subnav-fixed{top:51px;margin:0}@media(max-width:767px){div.subnav .nav>li+li>a{border-top:1px solid rgba(255,255,255,0.4)}}.nav-tabs,.nav-pills{border-color:transparent}.nav-tabs>li>a,.nav-pills>li>a{border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:0;-moz-box-shadow:0;box-shadow:0}.nav-tabs>li>a:hover,.nav-pills>li>a:hover{text-shadow:none;background-color:#8ad5dc;border-color:transparent}.nav-tabs>.active>a,.nav-pills>.active>a,.nav-tabs>.active>a:hover,.nav-pills>.active>a:hover{color:#e1f0f0;text-shadow:none;background-color:#8ad5dc;border-color:transparent}.nav-tabs>.disabled>a,.nav-pills>.disabled>a,.nav-tabs>.disabled>a:hover,.nav-pills>.disabled>a:hover{color:#ddd;background:0}.nav-tabs>.open>.dropdown-toggle,.nav-pills>.open>.dropdown-toggle,.nav-tabs>.open>.dropdown-toggle,.nav-pills>.open>.dropdown-toggle{color:#e8d069;background-color:#8ad5dc;border-color:transparent}.nav-tabs{border-bottom:1px solid rgba(255,255,255,0.5)}.nav-tabs>li>a{background-color:#3cb9c6}.nav-tabs.nav-stacked li>a:first-child,.nav-tabs.nav-stacked li>a:last-child{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked li>a,.nav-tabs.nav-stacked li>a:hover,.nav-tabs.nav-stacked li.active>a,.nav-tabs.nav-stacked li.active>a:hover{border-color:transparent}.nav-list .nav-header{color:#e1f0f0;text-shadow:none}.nav-list li>a{text-shadow:none}.nav-list li.active>a,.nav-list li>a:hover,.nav-list li.active>a:hover{text-shadow:none;background-color:#8ad5dc}.nav-list .divider{background-color:rgba(255,255,255,0.3);border-bottom:0}.breadcrumb,.pager>li>a{text-shadow:none;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.breadcrumb{background-color:#3cb9c6;background-image:none}.breadcrumb li{text-shadow:none}.breadcrumb .active{color:#fff}.breadcrumb>li>a.divider,.breadcrumb>li>span.divider{color:#ddd}.pagination ul{background-color:#3cb9c6;background-image:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.pagination ul>li>a:hover{color:#e8d069;background-color:rgba(255,255,255,0.4)}.pagination ul>li:first-child>a,.pagination ul>li:last-child>a{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>span,.pagination ul>.disabled>span:hover{color:#e1f0f0}.pagination ul>.active>a,.pagination ul>.active>a:hover,.pagination ul>.active>span,.pagination ul>.active>span:hover{color:#e1f0f0;background-color:rgba(255,255,255,0.4)}.pager li>a{background-color:#3cb9c6}.pager li>a:hover{background-color:#8ad5dc}.pager .disabled a,.pager .disabled a:hover{color:#fff;background-color:#3cb9c6}.btn{padding:12px 16px;text-shadow:none;background-color:#ddd;background-image:none;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{text-shadow:none;background-color:#d0d0d0}.btn:active,.btn.active{background-color:#b7b7b7;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn:active,.btn.active{background-color:#b7b7b7 \9}.btn-large{padding:20px 24px}.btn-small{padding:8px 12px}.btn-mini{padding:4px 8px}.btn-group .btn:first-child{margin-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group .btn:last-child,.btn-group .dropdown-toggle{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group .dropdown-toggle,.btn-group.open .dropdown-toggle,.btn.open .dropdown-toggle{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-primary{background-color:#ad1d28;border-color:transparent}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{text-shadow:none;background-color:#971923}.btn-primary:active,.btn-primary.active{background-color:#6b1219;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-primary:active,.btn-primary.active{background-color:#6b1219 \9}.btn-info{background-color:#4d3a7d;border-color:transparent}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{text-shadow:none;background-color:#42326c}.btn-info:active,.btn-info.active{background-color:#2d2249;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-info:active,.btn-info.active{background-color:#2d2249 \9}.btn-success{background-color:#48ca3b;border-color:transparent}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{text-shadow:none;background-color:#3eb932}.btn-success:active,.btn-success.active{background-color:#319127;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-success:active,.btn-success.active{background-color:#319127 \9}.btn-warning{background-color:#df6e1e;border-color:transparent}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{text-shadow:none;background-color:#c9631b}.btn-warning:active,.btn-warning.active{background-color:#9c4d15;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-warning:active,.btn-warning.active{background-color:#9c4d15 \9}.btn-danger{background-color:#debb27;border-color:transparent}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{text-shadow:none;background-color:#ccab1f}.btn-danger:active,.btn-danger.active{background-color:#a08618;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-danger:active,.btn-danger.active{background-color:#a08618 \9}.btn-inverse{background-color:#27666d;border-color:transparent}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{text-shadow:none;background-color:#20545a}.btn-inverse:active,.btn-inverse.active{background-color:#133135;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-inverse:active,.btn-inverse.active{background-color:#133135 \9}.btn-link{background-color:#ad1d28;border-color:transparent}.btn-link:hover,.btn-link:active,.btn-link.active,.btn-link.disabled,.btn-link[disabled]{text-shadow:none;background-color:#971923}.btn-link:active,.btn-link.active{background-color:#6b1219;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link:active,.btn-link.active{background-color:#6b1219 \9}.btn-small [class^="icon-"]{margin-top:1px}.add-on [class^="icon-"]{margin-left:5px}.table th,.table td,.table tbody+tbody{border-top:0 solid transparent}.table-bordered{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.table tbody tr.success td{background-color:#48ca3b}.table tbody tr.error td{background-color:#ad1d28}.table tbody tr.info td{background-color:#00bce1}legend{font-family:'Lobster',cursive}legend,label,.help-block,.input-file{color:inherit;border:0}input,textarea,.uneditable-input{padding:10px;border:0}.dropdown input{border:1px solid rgba(0,0,0,0.2)}.uneditable-input{padding-bottom:30px}select{border:0}button{margin-left:12px}input,textarea,.search-query,.uneditable-input,.input-append input,.input-append .uneditable-input,.input-prepend input,.input-prepend .uneditable-input{border-color:transparent;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.form-actions{border-top:0 solid transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#debb27}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#debb27}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#f2e5ac;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#ecd77f;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#debb27;background-color:#df6e1e;border-color:#debb27}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#df6e1e}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#df6e1e}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#f3c4a3;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#eda776;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fffefd;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fffefd;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fffefd}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#df6e1e;background-color:#ad1d28;border-color:#df6e1e}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#48ca3b}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#48ca3b}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#93e08b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#6dd563;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #def5dc;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #def5dc;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #def5dc}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#48ca3b;background-color:#48ca3b;border-color:#48ca3b}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#4d3a7d}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#4d3a7d}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#7d65b8;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#624aa0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #b8abd8;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #b8abd8;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #b8abd8}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#4d3a7d;background-color:#4d3a7d;border-color:#4d3a7d}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#f2e5ac}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#f3c4a3}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#93e08b}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#7d65b8}.input-prepend .add-on,.input-append .add-on{height:20px;padding-top:4px;color:#555;text-shadow:none;background-color:#ddd;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .btn,.input-prepend .btn{padding:4px 10px}.alert{text-shadow:none;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.alert h1,.alert h2,.alert h3,.alert h4,.alert h5,.alert h6{color:#e1f0f0}.alert-heading{color:#e1f0f0}.label,.badge{background-color:#00bce1}.label-success,.badge-success{background-color:#48ca3b}.label-important,.badge-important{background-color:#ad1d28}.label-warning,.badge-warning{background-color:#df6e1e}.label-info,.badge-info{background-color:#4d3a7d}.label-inverse,.badge-inverse{background-color:#27666d}.progress,.well,pre,code{text-shadow:none;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.well{background-image:none}.hero-unit{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.thumbnail{border:0 solid transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.progress{background-color:#27666d;background-image:none}.progress .bar{background-color:#debb27;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.progress .bar-success{background-color:#48ca3b}.progress .bar-warning{background-color:#df6e1e}.progress .bar-error{background-color:#ad1d28}.progress-danger .bar{background-color:#ad1d28;background-image:none}.progress-danger.progress-striped .bar{background-color:#ad1d28;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar{background-color:#48ca3b;background-image:none}.progress-success.progress-striped .bar{background-color:#48ca3b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar{background-color:#00bce1;background-image:none}.progress-info.progress-striped .bar{background-color:#00bce1;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.modal{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.modal-header{color:#fff;background-color:#ad1d28;border-bottom:0}.modal-body{background-color:#3cb9c6}.popover{padding:0;color:#444;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.popover .popover-title{color:#fff;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} diff --git a/flask_admin/static/bootstrap/bootstrap2/swatch/cerulean/bootstrap.min.css b/flask_admin/static/bootstrap/bootstrap2/swatch/cerulean/bootstrap.min.css deleted file mode 100644 index 9740c15e5..000000000 --- a/flask_admin/static/bootstrap/bootstrap2/swatch/cerulean/bootstrap.min.css +++ /dev/null @@ -1,9 +0,0 @@ -@import url(//fonts.googleapis.com/css?family=Telex);/*! - * Bootstrap v2.3.2 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!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) ")"}.ir a:after,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}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#555;background-color:#fff}a{color:#2fa4e7;text-decoration:none}a:hover,a:focus{color:#157ab5;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#dd5600}a.text-warning:hover,a.text-warning:focus{color:#aa4200}.text-error{color:#bd4247}a.text-error:hover,a.text-error:focus{color:#983538}.text-info{color:#178acc}a.text-info:hover,a.text-info:focus{color:#126b9e}.text-success{color:#669533}a.text-success:hover,a.text-success:focus{color:#4c6f26}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:'Telex',sans-serif;font-weight:bold;line-height:20px;color:#317eac;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #f5f5f5}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #f5f5f5;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #f5f5f5}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #f5f5f5;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#f5f5f5}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#dd5600}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#dd5600}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#dd5600;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#aa4200;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ff8d44;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ff8d44;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ff8d44}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#dd5600;background-color:#f1ceab;border-color:#dd5600}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#bd4247}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#bd4247}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#bd4247;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#983538;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d88e90;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d88e90;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d88e90}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#bd4247;background-color:#f2bdb1;border-color:#bd4247}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#669533}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#669533}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#669533;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#4c6f26;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #99ca63;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #99ca63;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #99ca63}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#669533;background-color:#d5ecbf;border-color:#669533}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#178acc}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#178acc}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#178acc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#126b9e;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #5db8ec;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #5db8ec;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #5db8ec}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#178acc;background-color:#a7dff1;border-color:#178acc}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#7b7b7b}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#f5f5f5;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#bede9c;border-color:#73a839}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.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 td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#d5ecbf}.table tbody tr.error>td{background-color:#f2bdb1}.table tbody tr.warning>td{background-color:#f1ceab}.table tbody tr.info>td{background-color:#a7dff1}.table-hover tbody tr.success:hover>td{background-color:#c8e6ab}.table-hover tbody tr.error:hover>td{background-color:#eeab9b}.table-hover tbody tr.warning:hover>td{background-color:#edc195}.table-hover tbody tr.info:hover>td{background-color:#91d7ee}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.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;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#27a0e5;background-image:-moz-linear-gradient(top,#2fa4e7,#1a99e2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#2fa4e7),to(#1a99e2));background-image:-webkit-linear-gradient(top,#2fa4e7,#1a99e2);background-image:-o-linear-gradient(top,#2fa4e7,#1a99e2);background-image:linear-gradient(to bottom,#2fa4e7,#1a99e2);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2fa4e7',endColorstr='#ff1a99e2',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#27a0e5;background-image:-moz-linear-gradient(top,#2fa4e7,#1a99e2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#2fa4e7),to(#1a99e2));background-image:-webkit-linear-gradient(top,#2fa4e7,#1a99e2);background-image:-o-linear-gradient(top,#2fa4e7,#1a99e2);background-image:linear-gradient(to bottom,#2fa4e7,#1a99e2);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2fa4e7',endColorstr='#ff1a99e2',GradientType=0)}.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;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;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:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#2f92e7;*background-color:#2f76e7;background-image:-moz-linear-gradient(top,#2fa4e7,#2f76e7);background-image:-webkit-gradient(linear,0 0,0 100%,from(#2fa4e7),to(#2f76e7));background-image:-webkit-linear-gradient(top,#2fa4e7,#2f76e7);background-image:-o-linear-gradient(top,#2fa4e7,#2f76e7);background-image:linear-gradient(to bottom,#2fa4e7,#2f76e7);background-repeat:repeat-x;border-color:#2f76e7 #2f76e7 #1553b5;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2fa4e7',endColorstr='#ff2f76e7',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#2f76e7;*background-color:#1a67e2}.btn-primary:active,.btn-primary.active{background-color:#175dcc \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#dd5600;*background-color:#dd5600;background-image:-moz-linear-gradient(top,#dd5600,#dd5600);background-image:-webkit-gradient(linear,0 0,0 100%,from(#dd5600),to(#dd5600));background-image:-webkit-linear-gradient(top,#dd5600,#dd5600);background-image:-o-linear-gradient(top,#dd5600,#dd5600);background-image:linear-gradient(to bottom,#dd5600,#dd5600);background-repeat:repeat-x;border-color:#dd5600 #dd5600 #913800;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdd5600',endColorstr='#ffdd5600',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#dd5600;*background-color:#c44c00}.btn-warning:active,.btn-warning.active{background-color:#aa4200 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#c32627;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#c71c22,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#c71c22),to(#bd362f));background-image:-webkit-linear-gradient(top,#c71c22,#bd362f);background-image:-o-linear-gradient(top,#c71c22,#bd362f);background-image:linear-gradient(to bottom,#c71c22,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffc71c22',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#65a643;*background-color:#51a351;background-image:-moz-linear-gradient(top,#73a839,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#73a839),to(#51a351));background-image:-webkit-linear-gradient(top,#73a839,#51a351);background-image:-o-linear-gradient(top,#73a839,#51a351);background-image:linear-gradient(to bottom,#73a839,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff73a839',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#6d76b3;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#9760b3,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#9760b3),to(#2f96b4));background-image:-webkit-linear-gradient(top,#9760b3,#2f96b4);background-image:-o-linear-gradient(top,#9760b3,#2f96b4);background-image:linear-gradient(to bottom,#9760b3,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff9760b3',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0f3253;*background-color:#222;background-image:-moz-linear-gradient(top,#033c73,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#033c73),to(#222));background-image:-webkit-linear-gradient(top,#033c73,#222);background-image:-o-linear-gradient(top,#033c73,#222);background-image:linear-gradient(to bottom,#033c73,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff033c73',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#2fa4e7;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#157ab5;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#2f76e7}.btn-group.open .btn-warning.dropdown-toggle{background-color:#dd5600}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#f1ceab;border:1px solid #efb99e;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#dd5600}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#669533;background-color:#d5ecbf;border-color:#d2e6ab}.alert-success h4{color:#669533}.alert-danger,.alert-error{color:#bd4247;background-color:#f2bdb1;border-color:#f0a5a4}.alert-danger h4,.alert-error h4{color:#bd4247}.alert-info{color:#178acc;background-color:#a7dff1;border-color:#88e4ec}.alert-info h4{color:#178acc}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#f5f5f5}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#2fa4e7}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#f5f5f5 #f5f5f5 #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#2fa4e7}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#2fa4e7;border-bottom-color:#2fa4e7}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#157ab5;border-bottom-color:#157ab5}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#f5f5f5 #ddd #f5f5f5 #f5f5f5}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#f5f5f5 #f5f5f5 #f5f5f5 #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:50px;padding-right:20px;padding-left:20px;background-color:#45aeea;background-image:-moz-linear-gradient(top,#54b4eb,#2fa4e7);background-image:-webkit-gradient(linear,0 0,0 100%,from(#54b4eb),to(#2fa4e7));background-image:-webkit-linear-gradient(top,#54b4eb,#2fa4e7);background-image:-o-linear-gradient(top,#54b4eb,#2fa4e7);background-image:linear-gradient(to bottom,#54b4eb,#2fa4e7);background-repeat:repeat-x;border:1px solid #1990d5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff54b4eb',endColorstr='#ff2fa4e7',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:15px 20px 15px;margin-left:-20px;font-size:20px;font-weight:200;color:#fff;text-shadow:0 1px 0 #54b4eb}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:50px;color:#f5f5f5}.navbar-link{color:#fff}.navbar-link:hover,.navbar-link:focus{color:#fff}.navbar .divider-vertical{height:50px;margin:0 9px;border-right:1px solid #54b4eb;border-left:1px solid #2fa4e7}.navbar .btn,.navbar .btn-group{margin-top:10px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:10px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:10px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:15px 15px 15px;color:#fff;text-decoration:none;text-shadow:0 1px 0 #54b4eb}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#fff;text-decoration:none;background-color:#1684c2}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#fff;text-decoration:none;background-color:#1684c2;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#2fa3e6;*background-color:#1a99e2;background-image:-moz-linear-gradient(top,#3daae9,#1a99e2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#3daae9),to(#1a99e2));background-image:-webkit-linear-gradient(top,#3daae9,#1a99e2);background-image:-o-linear-gradient(top,#3daae9,#1a99e2);background-image:linear-gradient(to bottom,#3daae9,#1a99e2);background-repeat:repeat-x;border-color:#1a99e2 #1a99e2 #126b9e;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3daae9',endColorstr='#ff1a99e2',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#1a99e2;*background-color:#178acc}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#157ab5 \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#1684c2}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#034482;background-image:-moz-linear-gradient(top,#04498c,#033c73);background-image:-webkit-gradient(linear,0 0,0 100%,from(#04498c),to(#033c73));background-image:-webkit-linear-gradient(top,#04498c,#033c73);background-image:-o-linear-gradient(top,#04498c,#033c73);background-image:linear-gradient(to bottom,#04498c,#033c73);background-repeat:repeat-x;border-color:#033464;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff04498c',endColorstr='#ff033c73',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#fff}.navbar-inverse .navbar-text{color:#fff}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:#022c55}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#022c55}.navbar-inverse .navbar-link{color:#fff}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#04498c;border-left-color:#033c73}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#022c55}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#fff;border-color:#033c73;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#999}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#999}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#999}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#033769;*background-color:#022f5a;background-image:-moz-linear-gradient(top,#033c73,#022f5a);background-image:-webkit-gradient(linear,0 0,0 100%,from(#033c73),to(#022f5a));background-image:-webkit-linear-gradient(top,#033c73,#022f5a);background-image:-o-linear-gradient(top,#033c73,#022f5a);background-image:linear-gradient(to bottom,#033c73,#022f5a);background-repeat:repeat-x;border-color:#022f5a #022f5a #000810;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff033c73',endColorstr='#ff022f5a',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#022f5a;*background-color:#022241}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#011528 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.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;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1020;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;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-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.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{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#2fa4e7;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;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{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#bd4247}.label-important[href],.badge-important[href]{background-color:#983538}.label-warning,.badge-warning{background-color:#dd5600}.label-warning[href],.badge-warning[href]{background-color:#aa4200}.label-success,.badge-success{background-color:#669533}.label-success[href],.badge-success[href]{background-color:#4c6f26}.label-info,.badge-info{background-color:#178acc}.label-info[href],.badge-info[href]{background-color:#126b9e}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#f16e1a;background-image:-moz-linear-gradient(top,#ff7d2b,#dd5600);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ff7d2b),to(#dd5600));background-image:-webkit-linear-gradient(top,#ff7d2b,#dd5600);background-image:-o-linear-gradient(top,#ff7d2b,#dd5600);background-image:linear-gradient(to bottom,#ff7d2b,#dd5600);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff7d2b',endColorstr='#ffdd5600',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#ff7d2b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;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:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#f5f5f5;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}.navbar .brand{padding:14px 20px 16px;font-family:'Telex',sans-serif;text-shadow:1px 1px 0 rgba(0,0,0,0.2)}.navbar li{line-height:20px}.navbar .nav>li>a{padding:16px 10px 14px;font-family:'Telex',sans-serif;text-shadow:1px 1px 0 rgba(0,0,0,0.2)}.navbar .search-query{line-height:normal;border:1px solid #178acc}.navbar .navbar-text{padding:19px 10px 18px;line-height:13px;color:rgba(0,0,0,0.5);text-shadow:1px 1px 0 rgba(255,255,255,0.3)}.navbar-inverse .navbar-search .search-query{color:#555}@media(max-width:979px){.navbar .nav-collapse .nav li>a{font-family:'Telex',sans-serif;font-weight:normal;color:#fff;text-shadow:1px 1px 0 rgba(0,0,0,0.2)}.navbar .nav-collapse .nav li>a:hover{background-color:#2b7cac}.navbar .nav-collapse .nav .active>a{background-color:#2b7cac;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar .nav-collapse .dropdown-menu li>a:hover,.navbar .nav-collapse .dropdown-menu li>a:focus,.navbar .nav-collapse .dropdown-submenu:hover>a{background-image:none}.navbar .nav-collapse .navbar-form,.navbar .nav-collapse .navbar-search{border:0}.navbar .nav-collapse .nav-header{color:#2b7cac}.navbar-inverse .nav-collapse .nav li>a{color:#fff}.navbar-inverse .nav-collapse .nav li>a:hover{background-color:rgba(0,0,0,0.1)}.navbar-inverse .nav-collapse .nav .active>a,.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:hover{background-color:rgba(0,0,0,0.1)!important}}div.subnav{font-family:'Telex',sans-serif;text-shadow:1px 1px 0 rgba(255,255,255,0.2)}div.subnav-fixed{top:51px}.btn{background-color:#fff;background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),color-stop(5%,#fff),to(#fff));background-image:-webkit-linear-gradient(#fff,#fff 5%,#fff);background-image:-moz-linear-gradient(top,#fff,#fff 5%,#fff);background-image:-o-linear-gradient(#fff,#fff 5%,#fff);background-image:linear-gradient(#fff,#fff 5%,#fff);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffffffff',GradientType=0);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover{background-position:0 0}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#3daae9;*background-color:#2fa4e7;background-image:-moz-linear-gradient(top,#46aeea,#2fa4e7);background-image:-webkit-gradient(linear,0 0,0 100%,from(#46aeea),to(#2fa4e7));background-image:-webkit-linear-gradient(top,#46aeea,#2fa4e7);background-image:-o-linear-gradient(top,#46aeea,#2fa4e7);background-image:linear-gradient(to bottom,#46aeea,#2fa4e7);background-repeat:repeat-x;border-color:#2fa4e7 #2fa4e7 #157ab5;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff46aeea',endColorstr='#ff2fa4e7',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#2fa4e7;*background-color:#1a99e2}.btn-primary:active,.btn-primary.active{background-color:#178acc \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#9e6ab8;*background-color:#9760b3;background-image:-moz-linear-gradient(top,#a271bb,#9760b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#a271bb),to(#9760b3));background-image:-webkit-linear-gradient(top,#a271bb,#9760b3);background-image:-o-linear-gradient(top,#a271bb,#9760b3);background-image:linear-gradient(to bottom,#a271bb,#9760b3);background-repeat:repeat-x;border-color:#9760b3 #9760b3 #6f4086;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffa271bb',endColorstr='#ff9760b3',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#9760b3;*background-color:#8b51a9}.btn-info:active,.btn-info.active{background-color:#7d4898 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#7bb33d;*background-color:#73a839;background-image:-moz-linear-gradient(top,#80bb3f,#73a839);background-image:-webkit-gradient(linear,0 0,0 100%,from(#80bb3f),to(#73a839));background-image:-webkit-linear-gradient(top,#80bb3f,#73a839);background-image:-o-linear-gradient(top,#80bb3f,#73a839);background-image:linear-gradient(to bottom,#80bb3f,#73a839);background-repeat:repeat-x;border-color:#73a839 #73a839 #4c6f26;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff80bb3f',endColorstr='#ff73a839',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#73a839;*background-color:#669533}.btn-success:active,.btn-success.active{background-color:#59822c \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ec5c00;*background-color:#dd5600;background-image:-moz-linear-gradient(top,#f76000,#dd5600);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f76000),to(#dd5600));background-image:-webkit-linear-gradient(top,#f76000,#dd5600);background-image:-o-linear-gradient(top,#f76000,#dd5600);background-image:linear-gradient(to bottom,#f76000,#dd5600);background-repeat:repeat-x;border-color:#dd5600 #dd5600 #913800;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff76000',endColorstr='#ffdd5600',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#dd5600;*background-color:#c44c00}.btn-warning:active,.btn-warning.active{background-color:#aa4200 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#d41e24;*background-color:#c71c22;background-image:-moz-linear-gradient(top,#dd1f26,#c71c22);background-image:-webkit-gradient(linear,0 0,0 100%,from(#dd1f26),to(#c71c22));background-image:-webkit-linear-gradient(top,#dd1f26,#c71c22);background-image:-o-linear-gradient(top,#dd1f26,#c71c22);background-image:linear-gradient(to bottom,#dd1f26,#c71c22);background-repeat:repeat-x;border-color:#c71c22 #c71c22 #841317;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdd1f26',endColorstr='#ffc71c22',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#c71c22;*background-color:#b1191e}.btn-danger:active,.btn-danger.active{background-color:#9a161a \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#034482;*background-color:#033c73;background-image:-moz-linear-gradient(top,#04498c,#033c73);background-image:-webkit-gradient(linear,0 0,0 100%,from(#04498c),to(#033c73));background-image:-webkit-linear-gradient(top,#04498c,#033c73);background-image:-o-linear-gradient(top,#04498c,#033c73);background-image:linear-gradient(to bottom,#04498c,#033c73);background-repeat:repeat-x;border-color:#033c73 #033c73 #011528;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff04498c',endColorstr='#ff033c73',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#033c73;*background-color:#022f5a}.btn-inverse:active,.btn-inverse.active{background-color:#022241 \9}i[class^="icon-"]{opacity:.8}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} diff --git a/flask_admin/static/bootstrap/bootstrap2/swatch/cosmo/bootstrap.min.css b/flask_admin/static/bootstrap/bootstrap2/swatch/cosmo/bootstrap.min.css deleted file mode 100644 index 1ca451d94..000000000 --- a/flask_admin/static/bootstrap/bootstrap2/swatch/cosmo/bootstrap.min.css +++ /dev/null @@ -1,9 +0,0 @@ -@import url('//fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700');/*! - * Bootstrap v2.3.2 - * - * Copyright 2013 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world by @mdo and @fat. - */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!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) ")"}.ir a:after,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}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Open Sans",Calibri,Candara,Arial,sans-serif;font-size:14px;line-height:20px;color:#555;background-color:#fff}a{color:#007fff;text-decoration:none}a:hover,a:focus{color:#06c;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#dfdfdf}a.muted:hover,a.muted:focus{color:#c6c6c6}.text-warning{color:#fff}a.text-warning:hover,a.text-warning:focus{color:#e6e6e6}.text-error{color:#fff}a.text-error:hover,a.text-error:focus{color:#e6e6e6}.text-info{color:#fff}a.text-info:hover,a.text-info:focus{color:#e6e6e6}.text-success{color:#fff}a.text-success:hover,a.text-success:focus{color:#e6e6e6}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:300;line-height:20px;color:#080808;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#dfdfdf}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #dfdfdf}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#dfdfdf}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#999;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#dfdfdf}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Open Sans",Calibri,Candara,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#bbb;vertical-align:middle;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #bbb;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #bbb}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#dfdfdf;cursor:not-allowed;background-color:#fcfcfc;border-color:#bbb;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#bbb}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#bbb}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#bbb}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#fff}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#fff}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#fff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#fff;background-color:#ff7518;border-color:#fff}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#fff}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#fff}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#fff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#fff;background-color:#ff0039;border-color:#fff}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#fff}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#fff}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#fff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#fff;background-color:#3fb618;border-color:#fff}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#fff}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#fff}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#fff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#fff;background-color:#9954bb;border-color:#fff}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#7b7b7b}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#96ed7a;border-color:#3fb618}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topleft:0}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-topright:0}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topleft:0}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-topright:0}.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:#e8f8fd}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#3fb618}.table tbody tr.error>td{background-color:#ff0039}.table tbody tr.warning>td{background-color:#ff7518}.table tbody tr.info>td{background-color:#9954bb}.table-hover tbody tr.success:hover>td{background-color:#379f15}.table-hover tbody tr.error:hover>td{background-color:#e60033}.table-hover tbody tr.warning:hover>td{background-color:#fe6600}.table-hover tbody tr.info:hover>td{background-color:#8d46b0}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.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;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#999;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#007af5;background-image:-moz-linear-gradient(top,#007fff,#0072e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#007fff),to(#0072e6));background-image:-webkit-linear-gradient(top,#007fff,#0072e6);background-image:-o-linear-gradient(top,#007fff,#0072e6);background-image:linear-gradient(to bottom,#007fff,#0072e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff007fff',endColorstr='#ff0072e6',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#007af5;background-image:-moz-linear-gradient(top,#007fff,#0072e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#007fff),to(#0072e6));background-image:-webkit-linear-gradient(top,#007fff,#0072e6);background-image:-o-linear-gradient(top,#007fff,#0072e6);background-image:linear-gradient(to bottom,#007fff,#0072e6);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff007fff',endColorstr='#ff0072e6',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#dfdfdf}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#eee;border:1px solid #dcdcdc;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.well-small{padding:9px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;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:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#999;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#dfdfdf;*background-color:#c8c8c8;background-image:-moz-linear-gradient(top,#eee,#c8c8c8);background-image:-webkit-gradient(linear,0 0,0 100%,from(#eee),to(#c8c8c8));background-image:-webkit-linear-gradient(top,#eee,#c8c8c8);background-image:-o-linear-gradient(top,#eee,#c8c8c8);background-image:linear-gradient(to bottom,#eee,#c8c8c8);background-repeat:repeat-x;border:1px solid #bbb;*border:0;border-color:#c8c8c8 #c8c8c8 #a2a2a2;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#a2a2a2;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffeeeeee',endColorstr='#ffc8c8c8',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#999;background-color:#c8c8c8;*background-color:#bbb}.btn:active,.btn.active{background-color:#aeaeae \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#999;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:22px 30px;font-size:17.5px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:2px 6px;font-size:10.5px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0f82f5;*background-color:#0072e6;background-image:-moz-linear-gradient(top,#1a8cff,#0072e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#1a8cff),to(#0072e6));background-image:-webkit-linear-gradient(top,#1a8cff,#0072e6);background-image:-o-linear-gradient(top,#1a8cff,#0072e6);background-image:linear-gradient(to bottom,#1a8cff,#0072e6);background-repeat:repeat-x;border-color:#0072e6 #0072e6 #004c99;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff1a8cff',endColorstr='#ff0072e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#0072e6;*background-color:#06c}.btn-primary:active,.btn-primary.active{background-color:#0059b3 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#fe781e;*background-color:#fe6600;background-image:-moz-linear-gradient(top,#ff8432,#fe6600);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ff8432),to(#fe6600));background-image:-webkit-linear-gradient(top,#ff8432,#fe6600);background-image:-o-linear-gradient(top,#ff8432,#fe6600);background-image:linear-gradient(to bottom,#ff8432,#fe6600);background-repeat:repeat-x;border-color:#fe6600 #fe6600 #b14700;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff8432',endColorstr='#fffe6600',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#fe6600;*background-color:#e45c00}.btn-warning:active,.btn-warning.active{background-color:#cb5200 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#f50f43;*background-color:#e60033;background-image:-moz-linear-gradient(top,#ff1a4d,#e60033);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ff1a4d),to(#e60033));background-image:-webkit-linear-gradient(top,#ff1a4d,#e60033);background-image:-o-linear-gradient(top,#ff1a4d,#e60033);background-image:linear-gradient(to bottom,#ff1a4d,#e60033);background-repeat:repeat-x;border-color:#e60033 #e60033 #902;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff1a4d',endColorstr='#ffe60033',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#e60033;*background-color:#cc002e}.btn-danger:active,.btn-danger.active{background-color:#b30028 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#41bb19;*background-color:#379f15;background-image:-moz-linear-gradient(top,#47cd1b,#379f15);background-image:-webkit-gradient(linear,0 0,0 100%,from(#47cd1b),to(#379f15));background-image:-webkit-linear-gradient(top,#47cd1b,#379f15);background-image:-o-linear-gradient(top,#47cd1b,#379f15);background-image:linear-gradient(to bottom,#47cd1b,#379f15);background-repeat:repeat-x;border-color:#379f15 #379f15 #205c0c;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff47cd1b',endColorstr='#ff379f15',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#379f15;*background-color:#2f8912}.btn-success:active,.btn-success.active{background-color:#28720f \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#9b59bb;*background-color:#8d46b0;background-image:-moz-linear-gradient(top,#a466c2,#8d46b0);background-image:-webkit-gradient(linear,0 0,0 100%,from(#a466c2),to(#8d46b0));background-image:-webkit-linear-gradient(top,#a466c2,#8d46b0);background-image:-o-linear-gradient(top,#a466c2,#8d46b0);background-image:linear-gradient(to bottom,#a466c2,#8d46b0);background-repeat:repeat-x;border-color:#8d46b0 #8d46b0 #613079;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffa466c2',endColorstr='#ff8d46b0',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#8d46b0;*background-color:#7e3f9d}.btn-info:active,.btn-info.active{background-color:#6f378b \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#080808;*background-color:#000;background-image:-moz-linear-gradient(top,#0d0d0d,#000);background-image:-webkit-gradient(linear,0 0,0 100%,from(#0d0d0d),to(#000));background-image:-webkit-linear-gradient(top,#0d0d0d,#000);background-image:-o-linear-gradient(top,#0d0d0d,#000);background-image:linear-gradient(to bottom,#0d0d0d,#000);background-repeat:repeat-x;border-color:#000 #000 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0d0d0d',endColorstr='#ff000000',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#000;*background-color:#000}.btn-inverse:active,.btn-inverse.active{background-color:#000 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#007fff;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#06c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#999;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topleft:0}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:0;border-top-right-radius:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topleft:0}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:0;border-top-right-radius:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#c8c8c8}.btn-group.open .btn-primary.dropdown-toggle{background-color:#0072e6}.btn-group.open .btn-warning.dropdown-toggle{background-color:#fe6600}.btn-group.open .btn-danger.dropdown-toggle{background-color:#e60033}.btn-group.open .btn-success.dropdown-toggle{background-color:#379f15}.btn-group.open .btn-info.dropdown-toggle{background-color:#8d46b0}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#000}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#ff7518;border:1px solid transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.alert,.alert h4{color:#fff}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#fff;background-color:#3fb618;border-color:transparent}.alert-success h4{color:#fff}.alert-danger,.alert-error{color:#fff;background-color:#ff0039;border-color:transparent}.alert-danger h4,.alert-error h4{color:#fff}.alert-info{color:#fff;background-color:#9954bb;border-color:transparent}.alert-info h4{color:#fff}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#dfdfdf;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#007fff}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#bbb;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#007fff}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#007fff;border-bottom-color:#007fff}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#06c;border-bottom-color:#06c}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#bbb;border-bottom-color:#bbb}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#dfdfdf;border-color:#dfdfdf}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#dfdfdf}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#dfdfdf}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:50px;padding-right:20px;padding-left:20px;background-color:#080808;background-image:-moz-linear-gradient(top,#080808,#080808);background-image:-webkit-gradient(linear,0 0,0 100%,from(#080808),to(#080808));background-image:-webkit-linear-gradient(top,#080808,#080808);background-image:-o-linear-gradient(top,#080808,#080808);background-image:linear-gradient(to bottom,#080808,#080808);background-repeat:repeat-x;border:1px solid transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808',endColorstr='#ff080808',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:15px 20px 15px;margin-left:-20px;font-size:20px;font-weight:200;color:#fff;text-shadow:0 1px 0 #080808}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:50px;color:#fff}.navbar-link{color:#fff}.navbar-link:hover,.navbar-link:focus{color:#bbb}.navbar .divider-vertical{height:50px;margin:0 9px;border-right:1px solid #080808;border-left:1px solid #080808}.navbar .btn,.navbar .btn-group{margin-top:10px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:10px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:10px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Open Sans",Calibri,Candara,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:15px 15px 15px;color:#fff;text-decoration:none;text-shadow:0 1px 0 #080808}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#bbb;text-decoration:none;background-color:rgba(0,0,0,0.05)}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#fff;text-decoration:none;background-color:transparent;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#000;*background-color:#000;background-image:-moz-linear-gradient(top,#000,#000);background-image:-webkit-gradient(linear,0 0,0 100%,from(#000),to(#000));background-image:-webkit-linear-gradient(top,#000,#000);background-image:-o-linear-gradient(top,#000,#000);background-image:linear-gradient(to bottom,#000,#000);background-repeat:repeat-x;border-color:#000 #000 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff000000',endColorstr='#ff000000',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#000;*background-color:#000}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#000 \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#bbb;border-bottom-color:#bbb}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:transparent}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#007fff;background-image:-moz-linear-gradient(top,#007fff,#007fff);background-image:-webkit-gradient(linear,0 0,0 100%,from(#007fff),to(#007fff));background-image:-webkit-linear-gradient(top,#007fff,#007fff);background-image:-o-linear-gradient(top,#007fff,#007fff);background-image:linear-gradient(to bottom,#007fff,#007fff);background-repeat:repeat-x;border-color:transparent;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff007fff',endColorstr='#ff007fff',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#fff}.navbar-inverse .navbar-text{color:#fff}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:rgba(0,0,0,0.05)}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#007fff}.navbar-inverse .navbar-link{color:#fff}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#007fff;border-left-color:#007fff}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#007fff}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#80bfff;border-color:#007fff;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#999}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#999}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#999}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#999;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0072e6;*background-color:#0072e6;background-image:-moz-linear-gradient(top,#0072e6,#0072e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#0072e6),to(#0072e6));background-image:-webkit-linear-gradient(top,#0072e6,#0072e6);background-image:-o-linear-gradient(top,#0072e6,#0072e6);background-image:linear-gradient(to bottom,#0072e6,#0072e6);background-repeat:repeat-x;border-color:#0072e6 #0072e6 #004c99;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0072e6',endColorstr='#ff0072e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#0072e6;*background-color:#06c}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#0059b3 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#dfdfdf}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#dfdfdf;border:1px solid transparent;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#007fff}.pagination ul>.active>a,.pagination ul>.active>span{color:#dfdfdf;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#dfdfdf;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topleft:0}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:0;border-top-right-radius:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:22px 30px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topleft:0}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:0;border-top-right-radius:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topleft:0}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:0;border-top-right-radius:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:2px 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.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:#dfdfdf;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.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-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#ff7518;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#ff7518;border-bottom:1px solid #fe6600;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.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:16px}.popover .arrow:after{border-width:15px;content:""}.popover.top .arrow{bottom:-16px;left:50%;margin-left:-16px;border-top-color:#999;border-top-color:transparent;border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-15px;border-top-color:#ff7518;border-bottom-width:0}.popover.right .arrow{top:50%;left:-16px;margin-top:-16px;border-right-color:#999;border-right-color:transparent;border-left-width:0}.popover.right .arrow:after{bottom:-15px;left:1px;border-right-color:#ff7518;border-left-width:0}.popover.bottom .arrow{top:-16px;left:50%;margin-left:-16px;border-bottom-color:#999;border-bottom-color:transparent;border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-15px;border-bottom-color:#ff7518;border-top-width:0}.popover.left .arrow{top:50%;right:-16px;margin-top:-16px;border-left-color:#999;border-left-color:transparent;border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-15px;border-left-color:#ff7518;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#007fff;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#bbb}.media,.media-body{overflow:hidden;*overflow:visible;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{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#dfdfdf}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#fff}.label-important[href],.badge-important[href]{background-color:#e6e6e6}.label-warning,.badge-warning{background-color:#ff7518}.label-warning[href],.badge-warning[href]{background-color:#e45c00}.label-success,.badge-success{background-color:#fff}.label-success[href],.badge-success[href]{background-color:#e6e6e6}.label-info,.badge-info{background-color:#fff}.label-info[href],.badge-info[href]{background-color:#e6e6e6}.label-inverse,.badge-inverse{background-color:#999}.label-inverse[href],.badge-inverse[href]{background-color:#808080}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#ff9046;background-image:-moz-linear-gradient(top,#ffa365,#ff7518);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ffa365),to(#ff7518));background-image:-webkit-linear-gradient(top,#ffa365,#ff7518);background-image:-o-linear-gradient(top,#ffa365,#ff7518);background-image:linear-gradient(to bottom,#ffa365,#ff7518);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffa365',endColorstr='#ffff7518',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#ffa365;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;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:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#080808;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#999;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}body{font-weight:300}h1{font-size:50px}h2,h3{font-size:26px}h4{font-size:14px}h5,h6{font-size:11px}blockquote{padding:10px 15px;background-color:#eee;border-left-color:#bbb}blockquote.pull-right{padding:10px 15px;border-right-color:#bbb}blockquote small{color:#bbb}.muted{color:#bbb}.text-warning{color:#ff7518}a.text-warning:hover{color:#e45c00}.text-error{color:#ff0039}a.text-error:hover{color:#cc002e}.text-info{color:#9954bb}a.text-info:hover{color:#7e3f9d}.text-success{color:#3fb618}a.text-success:hover{color:#2f8912}.navbar .navbar-inner{background-image:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar .brand:hover{color:#bbb}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{background-color:rgba(0,0,0,0.05);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#fff}.navbar .nav li.dropdown.open>.dropdown-toggle:hover,.navbar .nav li.dropdown.active>.dropdown-toggle:hover,.navbar .nav li.dropdown.open.active>.dropdown-toggle:hover{color:#eee}.navbar .navbar-search .search-query{line-height:normal}.navbar-inverse .brand,.navbar-inverse .nav>li>a{text-shadow:none}.navbar-inverse .brand:hover,.navbar-inverse .nav>.active>a,.navbar-inverse .nav>.active>a:hover,.navbar-inverse .nav>.active>a:focus{color:#fff;background-color:rgba(0,0,0,0.05);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar-inverse .navbar-search .search-query{color:#080808}div.subnav{margin:0 1px;background:#dfdfdf none;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}div.subnav .nav{background-color:transparent}div.subnav .nav>li>a{border-color:transparent}div.subnav .nav>.active>a,div.subnav .nav>.active>a:hover{color:#fff;background-color:#000;border-color:transparent;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}div.subnav-fixed{top:51px;margin:0}.nav .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover{color:#007fff}.nav-tabs>li>a{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li>a:hover{color:#fff;background-color:#007fff}.nav-tabs.nav-stacked>.active>a,.nav-tabs.nav-stacked>.active>a:hover{color:#bbb;background-color:#fff}.nav-tabs.nav-stacked>li:first-child>a,.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.tabs-below>.nav-tabs>li>a,.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-pills>li>a{color:#000;background-color:#dfdfdf;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-pills>li>a:hover{color:#fff;background-color:#000}.nav-pills>.disabled>a,.nav-pills>.disabled>a:hover{color:#999;background-color:#eee}.nav-list>li>a{color:#080808}.nav-list>li>a:hover{color:#fff;text-shadow:none;background-color:#007fff}.nav-list .nav-header{color:#080808}.nav-list .divider{background-color:#bbb;border-bottom:0}.pagination ul{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.pagination ul>li>a,.pagination ul>li>span{margin-right:6px;color:#080808}.pagination ul>li>a:hover,.pagination ul>li>span:hover{color:#fff;background-color:#080808}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{margin-right:0}.pagination ul>.active>a,.pagination ul>.active>span{color:#fff}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover{color:#999;background-color:#eee}.pager li>a,.pager li>span{color:#080808;background-color:#dfdfdf;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.pager li>a:hover,.pager li>span:hover{color:#fff;background-color:#080808}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>span{color:#999;background-color:#eee}.breadcrumb{background-color:#dfdfdf}.breadcrumb li{text-shadow:none}.breadcrumb .divider,.breadcrumb .active{color:#080808;text-shadow:none}.btn{padding:5px 12px;text-shadow:none;background-image:none;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn.disabled{box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-large{padding:22px 30px}.btn-small{padding:2px 10px}.btn-mini{padding:2px 6px}.btn-group>.btn:first-child,.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.dropdown-toggle{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.table tbody tr.success td,.table tbody tr.error td,.table tbody tr.info td,.table tbody tr.warning td{color:#fff}.table-bordered{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child,.table-bordered tfoot:last-child tr:last-child td:first-child{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"]{color:#080808}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#ff7518}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#080808;border-color:#ff7518}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#ff0039}.control-group.error input,.control-group.error select,.control-group.error textarea{color:#080808;border-color:#ff0039}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#9954bb}.control-group.info input,.control-group.info select,.control-group.info textarea{color:#080808;border-color:#9954bb}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#3fb618}.control-group.success input,.control-group.success select,.control-group.success textarea{color:#080808;border-color:#3fb618}legend{color:#080808;border-bottom:0}.form-actions{background-color:#eee;border-top:0}.dropdown-menu{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.alert{text-shadow:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.alert-heading,.alert h1,.alert h2,.alert h3,.alert h4,.alert h5,.alert h6{color:#fff}.label{min-width:80px;min-height:80px;font-weight:300;text-shadow:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.label-success{background-color:#3fb618}.label-important{background-color:#ff0039}.label-info{background-color:#9954bb}.label-inverse{background-color:#000}.badge{font-weight:300;text-shadow:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.badge-success{background-color:#3fb618}.badge-important{background-color:#ff0039}.badge-info{background-color:#9954bb}.badge-inverse{background-color:#000}.hero-unit{border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.well{border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}[class^="icon-"],[class*=" icon-"]{margin:0 2px;vertical-align:-2px}a.thumbnail{background-color:#dfdfdf}a.thumbnail:hover{background-color:#bbb;border-color:transparent}.progress{height:6px;background-color:#eee;background-image:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.progress .bar{background-color:#007fff;background-image:none}.progress-info{background-color:#9954bb}.progress-success{background-color:#3fb618}.progress-warning{background-color:#ff7518}.progress-danger{background-color:#ff0039}.modal{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.modal-header{border-bottom:0}.modal-footer{background-color:transparent;border-top:0}.popover{color:#fff;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.popover-title{color:#fff;border-bottom:0}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} diff --git a/flask_admin/static/bootstrap/bootstrap2/swatch/cyborg/bootstrap.min.css b/flask_admin/static/bootstrap/bootstrap2/swatch/cyborg/bootstrap.min.css deleted file mode 100644 index dbaf2d5b8..000000000 --- a/flask_admin/static/bootstrap/bootstrap2/swatch/cyborg/bootstrap.min.css +++ /dev/null @@ -1,9 +0,0 @@ -@import url('//fonts.googleapis.com/css?family=Droid+Sans:400,700');/*! - * Bootstrap v2.3.2 - * - * Copyright 2013 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world by @mdo and @fat. - */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!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) ")"}.ir a:after,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}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:'Droid Sans',sans-serif;font-size:14px;line-height:20px;color:#999;background-color:#060606}a{color:#33b5e5;text-decoration:none}a:hover,a:focus{color:#fff;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#adafae}a.muted:hover,a.muted:focus{color:#939695}.text-warning{color:#a47e3c}a.text-warning:hover,a.text-warning:focus{color:#7f612e}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#09c}a.text-info:hover,a.text-info:focus{color:#007399}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:normal;line-height:20px;color:#fff;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#adafae}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #222;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #adafae}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#adafae}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;font-size:12px;color:#222;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#222;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#adafae}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:'Droid Sans',sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#999;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#ccc;border:1px solid #bbb;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#ccc;border:1px solid #bbb}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#adafae;cursor:not-allowed;background-color:#c9c9c9;border-color:#bbb;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#adafae}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#adafae}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#adafae}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#555}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#a47e3c}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#a47e3c}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#7f612e;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ceae78;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ceae78;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ceae78}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#a47e3c;background-color:#eee;border-color:#a47e3c}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#eee;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#eee;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#09c}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#09c}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#09c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#007399;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #3cf;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #3cf;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #3cf}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#09c;background-color:#eee;border-color:#09c}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:transparent;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#bfbfbf}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#bf3;border-color:#690}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #222}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #222}.table .table{background-color:#060606}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #222;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #222}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:rgba(100,100,100,0.1)}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#222}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#eee}.table tbody tr.error>td{background-color:#eee}.table tbody tr.warning>td{background-color:#eee}.table tbody tr.info>td{background-color:#eee}.table-hover tbody tr.success:hover>td{background-color:#e1e1e1}.table-hover tbody tr.error:hover>td{background-color:#e1e1e1}.table-hover tbody tr.warning:hover>td{background-color:#e1e1e1}.table-hover tbody tr.info:hover>td{background-color:#e1e1e1}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.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;background-color:#131517;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:transparent;border-bottom:1px solid #222}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#999;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#2ab2e4;background-image:-moz-linear-gradient(top,#33b5e5,#1dade2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#33b5e5),to(#1dade2));background-image:-webkit-linear-gradient(top,#33b5e5,#1dade2);background-image:-o-linear-gradient(top,#33b5e5,#1dade2);background-image:linear-gradient(to bottom,#33b5e5,#1dade2);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff33b5e5',endColorstr='#ff1dade2',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#2ab2e4;background-image:-moz-linear-gradient(top,#33b5e5,#1dade2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#33b5e5),to(#1dade2));background-image:-webkit-linear-gradient(top,#33b5e5,#1dade2);background-image:-o-linear-gradient(top,#33b5e5,#1dade2);background-image:linear-gradient(to bottom,#33b5e5,#1dade2);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff33b5e5',endColorstr='#ff1dade2',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#adafae}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#000;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#131517;border:1px solid #030303;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;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:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#222;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#616161;*background-color:#595959;background-image:-moz-linear-gradient(top,#666,#595959);background-image:-webkit-gradient(linear,0 0,0 100%,from(#666),to(#595959));background-image:-webkit-linear-gradient(top,#666,#595959);background-image:-o-linear-gradient(top,#666,#595959);background-image:linear-gradient(to bottom,#666,#595959);background-repeat:repeat-x;border:1px solid rgba(0,0,0,0);*border:0;border-color:#595959 #595959 #333;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:rgba(0,0,0,0);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff666666',endColorstr='#ff595959',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#222;background-color:#595959;*background-color:#4d4d4d}.btn:active,.btn.active{background-color:#404040 \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#222;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#008ab8;*background-color:#007399;background-image:-moz-linear-gradient(top,#09c,#007399);background-image:-webkit-gradient(linear,0 0,0 100%,from(#09c),to(#007399));background-image:-webkit-linear-gradient(top,#09c,#007399);background-image:-o-linear-gradient(top,#09c,#007399);background-image:linear-gradient(to bottom,#09c,#007399);background-repeat:repeat-x;border-color:#007399 #007399 #00394d;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0099cc',endColorstr='#ff007399',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#007399;*background-color:#006080}.btn-primary:active,.btn-primary.active{background-color:#004d66 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ff9d2e;*background-color:#f80;background-image:-moz-linear-gradient(top,#ffac4d,#f80);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ffac4d),to(#f80));background-image:-webkit-linear-gradient(top,#ffac4d,#f80);background-image:-o-linear-gradient(top,#ffac4d,#f80);background-image:linear-gradient(to bottom,#ffac4d,#f80);background-repeat:repeat-x;border-color:#f80 #f80 #b35f00;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffac4d',endColorstr='#ffff8800',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f80;*background-color:#e67a00}.btn-warning:active,.btn-warning.active{background-color:#cc6d00 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#eb0000;*background-color:#c00;background-image:-moz-linear-gradient(top,#f00,#c00);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f00),to(#c00));background-image:-webkit-linear-gradient(top,#f00,#c00);background-image:-o-linear-gradient(top,#f00,#c00);background-image:linear-gradient(to bottom,#f00,#c00);background-repeat:repeat-x;border-color:#c00 #c00 #800000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff0000',endColorstr='#ffcc0000',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#c00;*background-color:#b30000}.btn-danger:active,.btn-danger.active{background-color:#900 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#7ab800;*background-color:#690;background-image:-moz-linear-gradient(top,#8c0,#690);background-image:-webkit-gradient(linear,0 0,0 100%,from(#8c0),to(#690));background-image:-webkit-linear-gradient(top,#8c0,#690);background-image:-o-linear-gradient(top,#8c0,#690);background-image:linear-gradient(to bottom,#8c0,#690);background-repeat:repeat-x;border-color:#690 #690 #334d00;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff88cc00',endColorstr='#ff669900',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#690;*background-color:#558000}.btn-success:active,.btn-success.active{background-color:#460 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#292929;*background-color:#191919;background-image:-moz-linear-gradient(top,#333,#191919);background-image:-webkit-gradient(linear,0 0,0 100%,from(#333),to(#191919));background-image:-webkit-linear-gradient(top,#333,#191919);background-image:-o-linear-gradient(top,#333,#191919);background-image:linear-gradient(to bottom,#333,#191919);background-repeat:repeat-x;border-color:#191919 #191919 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff333333',endColorstr='#ff191919',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#191919;*background-color:#0d0d0d}.btn-info:active,.btn-info.active{background-color:#000 \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#9f3fcf;*background-color:#93c;background-image:-moz-linear-gradient(top,#a347d1,#93c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#a347d1),to(#93c));background-image:-webkit-linear-gradient(top,#a347d1,#93c);background-image:-o-linear-gradient(top,#a347d1,#93c);background-image:linear-gradient(to bottom,#a347d1,#93c);background-repeat:repeat-x;border-color:#93c #93c #6b248f;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffa347d1',endColorstr='#ff9933cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#93c;*background-color:#8a2eb8}.btn-inverse:active,.btn-inverse.active{background-color:#7a29a3 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#33b5e5;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#fff;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#222;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#595959}.btn-group.open .btn-primary.dropdown-toggle{background-color:#007399}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f80}.btn-group.open .btn-danger.dropdown-toggle{background-color:#c00}.btn-group.open .btn-success.dropdown-toggle{background-color:#690}.btn-group.open .btn-info.dropdown-toggle{background-color:#191919}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#93c}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#eee;border:1px solid transparent;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#a47e3c}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#eee;border-color:#e1e1e1}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#eee;border-color:#e6e6e6}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#09c;background-color:#eee;border-color:#dcdcdc}.alert-info h4{color:#09c}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#adafae;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#33b5e5}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#999;cursor:default;background-color:#060606;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#33b5e5}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#33b5e5;border-bottom-color:#33b5e5}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#adafae;border-color:#adafae}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#adafae}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#adafae}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:50px;padding-right:20px;padding-left:20px;background-color:#020202;background-image:-moz-linear-gradient(top,#020202,#020202);background-image:-webkit-gradient(linear,0 0,0 100%,from(#020202),to(#020202));background-image:-webkit-linear-gradient(top,#020202,#020202);background-image:-o-linear-gradient(top,#020202,#020202);background-image:linear-gradient(to bottom,#020202,#020202);background-repeat:repeat-x;border:1px solid #000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff020202',endColorstr='#ff020202',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:15px 20px 15px;margin-left:-20px;font-size:20px;font-weight:200;color:#adafae;text-shadow:0 1px 0 #020202}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:50px;color:#adafae}.navbar-link{color:#adafae}.navbar-link:hover,.navbar-link:focus{color:#fff}.navbar .divider-vertical{height:50px;margin:0 9px;border-right:1px solid #020202;border-left:1px solid #020202}.navbar .btn,.navbar .btn-group{margin-top:10px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:10px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:10px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:'Droid Sans',sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:15px 15px 15px;color:#adafae;text-decoration:none;text-shadow:0 1px 0 #020202}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#fff;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#fff;text-decoration:none;background-color:#020202;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#000;*background-color:#000;background-image:-moz-linear-gradient(top,#000,#000);background-image:-webkit-gradient(linear,0 0,0 100%,from(#000),to(#000));background-image:-webkit-linear-gradient(top,#000,#000);background-image:-o-linear-gradient(top,#000,#000);background-image:linear-gradient(to bottom,#000,#000);background-repeat:repeat-x;border-color:#000 #000 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff000000',endColorstr='#ff000000',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#000;*background-color:#000}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#000 \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #131517;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #131517;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#020202}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#adafae;border-bottom-color:#adafae}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#252a30;background-image:-moz-linear-gradient(top,#252a30,#252a30);background-image:-webkit-gradient(linear,0 0,0 100%,from(#252a30),to(#252a30));background-image:-webkit-linear-gradient(top,#252a30,#252a30);background-image:-o-linear-gradient(top,#252a30,#252a30);background-image:linear-gradient(to bottom,#252a30,#252a30);background-repeat:repeat-x;border-color:transparent;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff252a30',endColorstr='#ff252a30',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#adafae;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#adafae}.navbar-inverse .navbar-text{color:#adafae}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:#242a31}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#242a31}.navbar-inverse .navbar-link{color:#adafae}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#252a30;border-left-color:#252a30}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#242a31}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#adafae;border-bottom-color:#adafae}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#5d6978;border-color:#252a30;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#fff}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#fff}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#fff}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#222;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#1a1d22;*background-color:#1a1d22;background-image:-moz-linear-gradient(top,#1a1d22,#1a1d22);background-image:-webkit-gradient(linear,0 0,0 100%,from(#1a1d22),to(#1a1d22));background-image:-webkit-linear-gradient(top,#1a1d22,#1a1d22);background-image:-o-linear-gradient(top,#1a1d22,#1a1d22);background-image:linear-gradient(to bottom,#1a1d22,#1a1d22);background-repeat:repeat-x;border-color:#1a1d22 #1a1d22 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff1a1d22',endColorstr='#ff1a1d22',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#1a1d22;*background-color:#0f1113}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#040405 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#adafae}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#060606;border:1px solid transparent;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#33b5e5}.pagination ul>.active>a,.pagination ul>.active>span{color:#adafae;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#adafae;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.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:#adafae;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1020;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#131517;-webkit-border-radius:4px;-moz-border-radius:4px;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-top-color:#131517;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#131517;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#131517;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#131517;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#131517;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#131517;border-bottom:1px solid #070809;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.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{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#131517;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#131517;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#131517;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#131517;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#33b5e5;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#999}.media,.media-body{overflow:hidden;*overflow:visible;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{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#adafae}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f80}.label-warning[href],.badge-warning[href]{background-color:#cc6d00}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#09c}.label-info[href],.badge-info[href]{background-color:#007399}.label-inverse,.badge-inverse{background-color:#222}.label-inverse[href],.badge-inverse[href]{background-color:#080808}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#ff9d2e;background-image:-moz-linear-gradient(top,#ffac4d,#f80);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ffac4d),to(#f80));background-image:-webkit-linear-gradient(top,#ffac4d,#f80);background-image:-o-linear-gradient(top,#ffac4d,#f80);background-image:linear-gradient(to bottom,#ffac4d,#f80);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffac4d',endColorstr='#ffff8800',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#ffac4d;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;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:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#020202;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#222;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#131517;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}label,input,button,select,textarea,.navbar .search-query:-moz-placeholder,.navbar .search-query::-webkit-input-placeholder{font-family:'Droid Sans',sans-serif;color:#999}code,pre{background-color:#eee}blockquote{border-left:5px solid #222}blockquote.pull-right{border-right:5px solid #222}html{min-height:100%}body{min-height:100%;background-color:#121417;background-image:-moz-linear-gradient(top,#060606,#252a30);background-image:-webkit-gradient(linear,0 0,0 100%,from(#060606),to(#252a30));background-image:-webkit-linear-gradient(top,#060606,#252a30);background-image:-o-linear-gradient(top,#060606,#252a30);background-image:linear-gradient(to bottom,#060606,#252a30);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff060606',endColorstr='#ff252a30',GradientType=0)}.page-header{border-bottom:1px solid #222}hr{border-bottom:0}.navbar .navbar-inner{border-bottom:1px solid #222;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar .brand{padding:15px 20px 15px;font-weight:normal;color:#eee;text-shadow:none}.navbar .nav>li>a{padding:15px 15px 14px;border-bottom:1px solid transparent}.navbar .nav>li>a:hover,.navbar .nav>.active>a,.navbar .nav>.active>a:hover{border-bottom:1px solid #33b5e5}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar .navbar-text{padding:15px 15px 14px;margin-bottom:1px;line-height:inherit}.navbar .divider-vertical{margin:0;border-left:1px solid #222;border-right-width:0}.navbar .search-query,.navbar .search-query:focus,.navbar .search-query.focused{line-height:normal;color:#adafae;text-shadow:none;background-color:#222;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.navbar .search-query:-moz-placeholder,.navbar .search-query:focus:-moz-placeholder,.navbar .search-query.focused:-moz-placeholder{color:#999}.navbar .search-query:-ms-input-placeholder,.navbar .search-query:focus:-ms-input-placeholder,.navbar .search-query.focused:-ms-input-placeholder{color:#999}.navbar .search-query::-webkit-input-placeholder,.navbar .search-query:focus::-webkit-input-placeholder,.navbar .search-query.focused::-webkit-input-placeholder{color:#999}@media(max-width:979px){.navbar .nav-collapse .nav li>a{font-weight:normal;color:#eee;text-shadow:none;border:0}.navbar .nav-collapse .nav li>a:hover{background-color:#33b5e5;border:0}.navbar .nav-collapse .nav .active>a{background-color:#33b5e5;border:0}.navbar .nav-collapse .dropdown-menu a:hover{background-color:#33b5e5}.navbar .nav-collapse .navbar-form,.navbar .nav-collapse .navbar-search{border-top:0;border-bottom:0}.navbar .nav-collapse .nav-header{color:rgba(128,128,128,0.6)}.navbar-inverse .nav-collapse .nav li>a:hover{background-color:#111}.navbar-inverse .nav-collapse .nav .active>a{background-color:#111}.navbar-inverse .nav-collapse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav-collapse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav-collapse .nav li.dropdown.open.active>.dropdown-toggle{background-color:#111}}div.subnav{margin:0 1px;background-color:#020202;background-image:none;border:0;border-bottom:1px solid #222}div.subnav .nav>li>a,div.subnav .nav>li:first-child>a,div.subnav .nav>li:first-child>a:hover{padding:11px 12px;color:#adafae;background-color:#020202;border:0}div.subnav .nav>li>a:hover,div.subnav .nav>li.active>a,div.subnav .nav>li.active>a:hover,div.subnav .nav>li:first-child>a:hover{padding:11px 12px;color:#fff;background:transparent;border:0;border-bottom:1px solid #33b5e5}div.subnav .nav li.nav-header{text-shadow:none}div.subnav-fixed{top:50px;margin:0}.nav-tabs{border-bottom:1px solid #222}.nav-tabs li>a:hover,.nav-tabs li.active>a,.nav-tabs li.active>a:hover{color:#fff;background-color:#33b5e5;border-color:transparent}.nav-tabs li.disabled>a{color:#999}.nav-tabs .open .dropdown-toggle{background-color:#060606;border-color:transparent}.nav-pills li>a:hover{color:#fff;background-color:#33b5e5}.nav-pills li.disabled>a{color:#999}.nav-pills .open .dropdown-toggle{background-color:#060606}.nav-pills .dropdown-menu li>a:hover{border:0}.nav-list li>a{text-shadow:none}.nav-list li>a:hover{color:#fff;background-color:#33b5e5}.nav-list .nav-header{text-shadow:none}.nav-list .divider{background-color:transparent;border-bottom:1px solid #222}.nav-stacked li>a{border:1px solid #222!important}.nav-stacked li>a:hover,.nav-stacked li.active>a{color:#fff;background-color:#33b5e5}.tabbable .nav-tabs,.tabbable .nav-tabs li.active>a{border-color:#222}.breadcrumb{font-size:14px;background-color:transparent;background-image:none;border-width:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.breadcrumb li{text-shadow:none}.breadcrumb li>a{color:#33b5e5;text-shadow:none}.pagination ul{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>span,.pagination ul>.disabled>span:hover{background-color:rgba(0,0,0,0.2)}.pager li>a,.pager li>span{background-color:#060606;border:0}.pager li>a:hover,.pager li>span:hover{background-color:#33b5e5}.pager .disabled a,.pager .disabled a:hover{background-color:#060606}.btn{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);text-shadow:none;background-color:#5c5c5c;*background-color:#4d4d4d;background-image:-moz-linear-gradient(top,#666,#4d4d4d);background-image:-webkit-gradient(linear,0 0,0 100%,from(#666),to(#4d4d4d));background-image:-webkit-linear-gradient(top,#666,#4d4d4d);background-image:-o-linear-gradient(top,#666,#4d4d4d);background-image:linear-gradient(to bottom,#666,#4d4d4d);background-repeat:repeat-x;border-color:#4d4d4d #4d4d4d #262626;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff666666',endColorstr='#ff4d4d4d',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:1px 1px 2px #111;-moz-box-shadow:1px 1px 2px #111;box-shadow:1px 1px 2px #111}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#fff;background-color:#4d4d4d;*background-color:#404040}.btn:active,.btn.active{background-color:#333 \9}.btn:hover{color:#fff;text-shadow:none}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#008ab8;*background-color:#007399;background-image:-moz-linear-gradient(top,#09c,#007399);background-image:-webkit-gradient(linear,0 0,0 100%,from(#09c),to(#007399));background-image:-webkit-linear-gradient(top,#09c,#007399);background-image:-o-linear-gradient(top,#09c,#007399);background-image:linear-gradient(to bottom,#09c,#007399);background-repeat:repeat-x;border-color:#007399 #007399 #00394d;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0099cc',endColorstr='#ff007399',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#007399;*background-color:#006080}.btn-primary:active,.btn-primary.active{background-color:#004d66 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ff961f;*background-color:#f80;background-image:-moz-linear-gradient(top,#ffa033,#f80);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ffa033),to(#f80));background-image:-webkit-linear-gradient(top,#ffa033,#f80);background-image:-o-linear-gradient(top,#ffa033,#f80);background-image:linear-gradient(to bottom,#ffa033,#f80);background-repeat:repeat-x;border-color:#f80 #f80 #b35f00;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffa033',endColorstr='#ffff8800',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f80;*background-color:#e67a00}.btn-warning:active,.btn-warning.active{background-color:#cc6d00 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#eb0000;*background-color:#c00;background-image:-moz-linear-gradient(top,#f00,#c00);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f00),to(#c00));background-image:-webkit-linear-gradient(top,#f00,#c00);background-image:-o-linear-gradient(top,#f00,#c00);background-image:linear-gradient(to bottom,#f00,#c00);background-repeat:repeat-x;border-color:#c00 #c00 #800000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff0000',endColorstr='#ffcc0000',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#c00;*background-color:#b30000}.btn-danger:active,.btn-danger.active{background-color:#900 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#7ab800;*background-color:#690;background-image:-moz-linear-gradient(top,#8c0,#690);background-image:-webkit-gradient(linear,0 0,0 100%,from(#8c0),to(#690));background-image:-webkit-linear-gradient(top,#8c0,#690);background-image:-o-linear-gradient(top,#8c0,#690);background-image:linear-gradient(to bottom,#8c0,#690);background-repeat:repeat-x;border-color:#690 #690 #334d00;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff88cc00',endColorstr='#ff669900',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#690;*background-color:#558000}.btn-success:active,.btn-success.active{background-color:#460 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#292929;*background-color:#191919;background-image:-moz-linear-gradient(top,#333,#191919);background-image:-webkit-gradient(linear,0 0,0 100%,from(#333),to(#191919));background-image:-webkit-linear-gradient(top,#333,#191919);background-image:-o-linear-gradient(top,#333,#191919);background-image:linear-gradient(to bottom,#333,#191919);background-repeat:repeat-x;border-color:#191919 #191919 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff333333',endColorstr='#ff191919',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#191919;*background-color:#0d0d0d}.btn-info:active,.btn-info.active{background-color:#000 \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#9f3fcf;*background-color:#93c;background-image:-moz-linear-gradient(top,#a347d1,#93c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#a347d1),to(#93c));background-image:-webkit-linear-gradient(top,#a347d1,#93c);background-image:-o-linear-gradient(top,#a347d1,#93c);background-image:linear-gradient(to bottom,#a347d1,#93c);background-repeat:repeat-x;border-color:#93c #93c #6b248f;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffa347d1',endColorstr='#ff9933cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#93c;*background-color:#8a2eb8}.btn-inverse:active,.btn-inverse.active{background-color:#7a29a3 \9}.btn .caret{border-top:4px solid black;opacity:.3}.btn-group>.dropdown-menu>li>a:hover{border-bottom:0}.btn.disabled,.btn[disabled]{background-color:#adafae}input,textarea,select{border-width:2px;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{color:#222}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly],.uneditable-input{border-color:#444}input:focus,textarea:focus,input.focused,textarea.focused{border-color:#52a8ec;outline:0;outline:thin dotted \9}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus,select:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}legend,label{color:#999;border-bottom:0 solid #222}.form-actions{border-top:1px solid #222}.table{-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.table tbody tr.success td{color:#fff;background-color:#690}.table tbody tr.error td{color:#fff;background-color:#c00}.table tbody tr.info td{color:#fff;background-color:#33b5e5}.table tbody tr.warning td{color:#fff;background-color:#f80}.dropdown-menu{-webkit-box-shadow:0 2px 4px rgba(0,0,0,0.8);-moz-box-shadow:0 2px 4px rgba(0,0,0,0.8);box-shadow:0 2px 4px rgba(0,0,0,0.8)}.alert,.alert .alert-heading,.alert-success,.alert-success .alert-heading,.alert-danger,.alert-error,.alert-danger .alert-heading,.alert-error .alert-heading,.alert-info,.alert-info .alert-heading{color:#eee;text-shadow:none;border:0}.alert h1,.alert h2,.alert h3,.alert h4,.alert h5,.alert h6{color:#eee}.label{color:#eee}.label,.alert{background-color:#666}.label:hover{background-color:#4d4d4d}.label-important,.alert-danger,.alert-error{background-color:#c00}.label-important:hover{background-color:#900}.label-warning,.alert-warning{background-color:#cc6d00}.label-warning:hover{background-color:#995200}.label-success,.alert-success{background-color:#5c8a00}.label-success:hover{background-color:#3a5700}.label-info,.alert-info{background-color:#007399}.label-info:hover{background-color:#004d66}.badge-inverse,.label-inverse,.alert-inverse{background-color:#7a29a3}.label-inverse:hover{background-color:#5c1f7a}.well,.hero-unit{-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.well,.hero-unit{border-top:solid 1px #2f2f2f;-webkit-box-shadow:0 2px 4px rgba(0,0,0,0.8);-moz-box-shadow:0 2px 4px rgba(0,0,0,0.8);box-shadow:0 2px 4px rgba(0,0,0,0.8)}.thumbnail{border-color:#222}.progress{background-color:#060606;background-image:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.modal{background-color:#222;border-top:solid 1px #2f2f2f;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.modal-header{border-bottom:1px solid #222}.modal-footer{background-color:#222;border-top:1px solid #222;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.footer{border-top:1px solid #222}@media(max-width:768px){div.subnav .nav>li+li>a,div.subnav .nav>li:first-child>a{border-top:1px solid #222;border-left:1px solid #222}.subnav .nav>li+li>a:hover,.subnav .nav>li:first-child>a:hover{background-color:#33b5e5;border-bottom:0}}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} diff --git a/flask_admin/static/bootstrap/bootstrap2/swatch/default/bootstrap.min.css b/flask_admin/static/bootstrap/bootstrap2/swatch/default/bootstrap.min.css deleted file mode 100644 index c10c7f417..000000000 --- a/flask_admin/static/bootstrap/bootstrap2/swatch/default/bootstrap.min.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * Bootstrap v2.3.1 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!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) ")"}.ir a:after,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}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover,a:focus{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.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 td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.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;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.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;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;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:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.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;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;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-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.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{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;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{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;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:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} diff --git a/flask_admin/static/bootstrap/bootstrap2/swatch/flatly/bootstrap.min.css b/flask_admin/static/bootstrap/bootstrap2/swatch/flatly/bootstrap.min.css deleted file mode 100644 index c6923a9d6..000000000 --- a/flask_admin/static/bootstrap/bootstrap2/swatch/flatly/bootstrap.min.css +++ /dev/null @@ -1,9 +0,0 @@ -@import url("//fonts.googleapis.com/css?family=Lato:400,700,900,400italic");/*! - * Bootstrap v2.3.2 - * - * Copyright 2013 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world by @mdo and @fat. - */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!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) ")"}.ir a:after,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}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:15px;line-height:20px;color:#2c3e50;background-color:#fff}a{color:#1abc9c;text-decoration:none}a:hover,a:focus{color:#1dd2af;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:22.5px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#b4bcc2}a.muted:hover,a.muted:focus{color:#98a3ab}.text-warning{color:#e6bb0d}a.text-warning:hover,a.text-warning:focus{color:#b6940a}.text-error{color:#e74c3c}a.text-error:hover,a.text-error:focus{color:#d62c1a}.text-info{color:#3498db}a.text-info:hover,a.text-info:focus{color:#217dbb}.text-success{color:#18bc9c}a.text-success:hover,a.text-success:focus{color:#128f76}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#b4bcc2}h1,h2,h3{line-height:40px}h1{font-size:41.25px}h2{font-size:33.75px}h3{font-size:26.25px}h4{font-size:18.75px}h5{font-size:15px}h6{font-size:12.75px}h1 small{font-size:26.25px}h2 small{font-size:18.75px}h3 small{font-size:15px}h4 small{font-size:15px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #ecf0f1}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #ecf0f1;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #b4bcc2}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #ecf0f1}blockquote p{margin-bottom:0;font-size:18.75px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#b4bcc2}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #ecf0f1;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:13px;color:#7b8a8b;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:14px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:22.5px;line-height:40px;color:#7b8a8b;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#b4bcc2}label,input,button,select,textarea{font-size:15px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:15px;line-height:20px;color:#95a5a6;vertical-align:middle;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #dce4ec;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #dce4ec}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#b4bcc2;cursor:not-allowed;background-color:#fcfcfc;border-color:#dce4ec;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#b4bcc2}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#b4bcc2}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#b4bcc2}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eaeded}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#e6bb0d}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#e6bb0d}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#e6bb0d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#b6940a;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f6d963;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f6d963;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f6d963}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#e6bb0d;background-color:#e6bb0d;border-color:#e6bb0d}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#e74c3c}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#e74c3c}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#e74c3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#d62c1a;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f29f97;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f29f97;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f29f97}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#e74c3c;background-color:#e74c3c;border-color:#e74c3c}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#18bc9c}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#18bc9c}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#18bc9c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#128f76;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #51e9cb;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #51e9cb;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #51e9cb}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#18bc9c;background-color:#18bc9c;border-color:#18bc9c}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3498db}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3498db}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3498db;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#217dbb;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #8bc4ea;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #8bc4ea;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #8bc4ea}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3498db;background-color:#3498db;border-color:#3498db}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#476481}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:15px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 6px 6px 0;-moz-border-radius:0 6px 6px 0;border-radius:0 6px 6px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:15px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#ecf0f1;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#7eefd9;border-color:#18bc9c}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:6px 0 0 6px;-moz-border-radius:6px 0 0 6px;border-radius:6px 0 0 6px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:6px 0 0 6px;-moz-border-radius:6px 0 0 6px;border-radius:6px 0 0 6px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 6px 6px 0;-moz-border-radius:0 6px 6px 0;border-radius:0 6px 6px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 6px 6px 0;-moz-border-radius:0 6px 6px 0;border-radius:0 6px 6px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 6px 6px 0;-moz-border-radius:0 6px 6px 0;border-radius:0 6px 6px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:6px 0 0 6px;-moz-border-radius:6px 0 0 6px;border-radius:6px 0 0 6px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 6px 6px 0;-moz-border-radius:0 6px 6px 0;border-radius:0 6px 6px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-topleft:6px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-moz-border-radius-topright:6px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-topleft:6px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-moz-border-radius-topright:6px}.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 td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#18bc9c}.table tbody tr.error>td{background-color:#e74c3c}.table tbody tr.warning>td{background-color:#e6bb0d}.table tbody tr.info>td{background-color:#3498db}.table-hover tbody tr.success:hover>td{background-color:#15a589}.table-hover tbody tr.error:hover>td{background-color:#e43725}.table-hover tbody tr.warning:hover>td{background-color:#cea70c}.table-hover tbody tr.info:hover>td{background-color:#258cd1}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.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;background-color:#2c3e50;border:1px solid #ccc;border:1px solid rgba(0,0,0,0);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:rgba(0,0,0,0.2);border-bottom:1px solid rgba(0,0,0,0.2)}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#fff;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#17b394;background-image:-moz-linear-gradient(top,#18bc9c,#15a589);background-image:-webkit-gradient(linear,0 0,0 100%,from(#18bc9c),to(#15a589));background-image:-webkit-linear-gradient(top,#18bc9c,#15a589);background-image:-o-linear-gradient(top,#18bc9c,#15a589);background-image:linear-gradient(to bottom,#18bc9c,#15a589);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff18bc9c',endColorstr='#ff15a589',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#17b394;background-image:-moz-linear-gradient(top,#18bc9c,#15a589);background-image:-webkit-gradient(linear,0 0,0 100%,from(#18bc9c),to(#15a589));background-image:-webkit-linear-gradient(top,#18bc9c,#15a589);background-image:-o-linear-gradient(top,#18bc9c,#15a589);background-image:linear-gradient(to bottom,#18bc9c,#15a589);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff18bc9c',endColorstr='#ff15a589',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#b4bcc2}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#080b0e;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#ecf0f1;border:1px solid #d7e0e2;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;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:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:15px;line-height:20px;color:#7b8a8b;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#bfc6cb;*background-color:#d0d5d9;background-image:-moz-linear-gradient(top,#b4bcc2,#d0d5d9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#b4bcc2),to(#d0d5d9));background-image:-webkit-linear-gradient(top,#b4bcc2,#d0d5d9);background-image:-o-linear-gradient(top,#b4bcc2,#d0d5d9);background-image:linear-gradient(to bottom,#b4bcc2,#d0d5d9);background-repeat:repeat-x;border:1px solid #ddd;*border:0;border-color:#d0d5d9 #d0d5d9 #a6afb7;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#c4c4c4;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffb4bcc2',endColorstr='#ffd0d5d9',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#7b8a8b;background-color:#d0d5d9;*background-color:#c2c9cd}.btn:active,.btn.active{background-color:#b4bcc2 \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#7b8a8b;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:18px 36px;font-size:18.75px;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 12px;font-size:12.75px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:1px 8px;font-size:11.25px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#33485d;*background-color:#3e5771;background-image:-moz-linear-gradient(top,#2c3e50,#3e5771);background-image:-webkit-gradient(linear,0 0,0 100%,from(#2c3e50),to(#3e5771));background-image:-webkit-linear-gradient(top,#2c3e50,#3e5771);background-image:-o-linear-gradient(top,#2c3e50,#3e5771);background-image:linear-gradient(to bottom,#2c3e50,#3e5771);background-repeat:repeat-x;border-color:#3e5771 #3e5771 #233140;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2c3e50',endColorstr='#ff3e5771',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#3e5771;*background-color:#354b60}.btn-primary:active,.btn-primary.active{background-color:#2c3e50 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#f4a425;*background-color:#f5b043;background-image:-moz-linear-gradient(top,#f39c12,#f5b043);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f39c12),to(#f5b043));background-image:-webkit-linear-gradient(top,#f39c12,#f5b043);background-image:-o-linear-gradient(top,#f39c12,#f5b043);background-image:linear-gradient(to bottom,#f39c12,#f5b043);background-repeat:repeat-x;border-color:#f5b043 #f5b043 #e08e0b;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff39c12',endColorstr='#fff5b043',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f5b043;*background-color:#f4a62a}.btn-warning:active,.btn-warning.active{background-color:#f39c12 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#e95d4e;*background-color:#ed7669;background-image:-moz-linear-gradient(top,#e74c3c,#ed7669);background-image:-webkit-gradient(linear,0 0,0 100%,from(#e74c3c),to(#ed7669));background-image:-webkit-linear-gradient(top,#e74c3c,#ed7669);background-image:-o-linear-gradient(top,#e74c3c,#ed7669);background-image:linear-gradient(to bottom,#e74c3c,#ed7669);background-repeat:repeat-x;border-color:#ed7669 #ed7669 #e43725;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe74c3c',endColorstr='#ffed7669',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#ed7669;*background-color:#ea6153}.btn-danger:active,.btn-danger.active{background-color:#e74c3c \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#1dccaa;*background-color:#24e3be;background-image:-moz-linear-gradient(top,#18bc9c,#24e3be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#18bc9c),to(#24e3be));background-image:-webkit-linear-gradient(top,#18bc9c,#24e3be);background-image:-o-linear-gradient(top,#18bc9c,#24e3be);background-image:linear-gradient(to bottom,#18bc9c,#24e3be);background-repeat:repeat-x;border-color:#24e3be #24e3be #15a589;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff18bc9c',endColorstr='#ff24e3be',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#24e3be;*background-color:#1bd3af}.btn-success:active,.btn-success.active{background-color:#18bc9c \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#45a1de;*background-color:#5faee3;background-image:-moz-linear-gradient(top,#3498db,#5faee3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#3498db),to(#5faee3));background-image:-webkit-linear-gradient(top,#3498db,#5faee3);background-image:-o-linear-gradient(top,#3498db,#5faee3);background-image:linear-gradient(to bottom,#3498db,#5faee3);background-repeat:repeat-x;border-color:#5faee3 #5faee3 #258cd1;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3498db',endColorstr='#ff5faee3',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#5faee3;*background-color:#4aa3df}.btn-info:active,.btn-info.active{background-color:#3498db \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#2c2c2c;*background-color:#3c3c3c;background-image:-moz-linear-gradient(top,#222,#3c3c3c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#3c3c3c));background-image:-webkit-linear-gradient(top,#222,#3c3c3c);background-image:-o-linear-gradient(top,#222,#3c3c3c);background-image:linear-gradient(to bottom,#222,#3c3c3c);background-repeat:repeat-x;border-color:#3c3c3c #3c3c3c #151515;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff3c3c3c',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#3c3c3c;*background-color:#2f2f2f}.btn-inverse:active,.btn-inverse.active{background-color:#222 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#1abc9c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#1dd2af;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#7b8a8b;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:15px}.btn-group>.btn-mini{font-size:11.25px}.btn-group>.btn-small{font-size:12.75px}.btn-group>.btn-large{font-size:18.75px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:10px;border-bottom-left-radius:10px;-webkit-border-top-left-radius:10px;border-top-left-radius:10px;-moz-border-radius-bottomleft:10px;-moz-border-radius-topleft:10px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:10px;border-top-right-radius:10px;-webkit-border-bottom-right-radius:10px;border-bottom-right-radius:10px;-moz-border-radius-topright:10px;-moz-border-radius-bottomright:10px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#d0d5d9}.btn-group.open .btn-primary.dropdown-toggle{background-color:#3e5771}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f5b043}.btn-group.open .btn-danger.dropdown-toggle{background-color:#ed7669}.btn-group.open .btn-success.dropdown-toggle{background-color:#24e3be}.btn-group.open .btn-info.dropdown-toggle{background-color:#5faee3}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#3c3c3c}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:10px 10px 0 0;-moz-border-radius:10px 10px 0 0;border-radius:10px 10px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 10px 10px;-moz-border-radius:0 0 10px 10px;border-radius:0 0 10px 10px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#e6bb0d;border:1px solid transparent;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.alert,.alert h4{color:#e6bb0d}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#18bc9c;background-color:#18bc9c;border-color:transparent}.alert-success h4{color:#18bc9c}.alert-danger,.alert-error{color:#e74c3c;background-color:#e74c3c;border-color:transparent}.alert-danger h4,.alert-error h4{color:#e74c3c}.alert-info{color:#3498db;background-color:#3498db;border-color:transparent}.alert-info h4{color:#3498db}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#ecf0f1}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#b4bcc2;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#1abc9c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#ecf0f1 #ecf0f1 #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#95a5a6;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#1abc9c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#1abc9c;border-bottom-color:#1abc9c}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#1dd2af;border-bottom-color:#1dd2af}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#95a5a6;border-bottom-color:#95a5a6}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#b4bcc2;border-color:#b4bcc2}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#b4bcc2}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#ecf0f1 #ddd #ecf0f1 #ecf0f1}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#ecf0f1 #ecf0f1 #ecf0f1 #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#b4bcc2}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:50px;padding-right:20px;padding-left:20px;background-color:#2c3e50;background-image:-moz-linear-gradient(top,#2c3e50,#2c3e50);background-image:-webkit-gradient(linear,0 0,0 100%,from(#2c3e50),to(#2c3e50));background-image:-webkit-linear-gradient(top,#2c3e50,#2c3e50);background-image:-o-linear-gradient(top,#2c3e50,#2c3e50);background-image:linear-gradient(to bottom,#2c3e50,#2c3e50);background-repeat:repeat-x;border:1px solid #233140;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2c3e50',endColorstr='#ff2c3e50',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:15px 20px 15px;margin-left:-20px;font-size:20px;font-weight:200;color:#fff;text-shadow:0 1px 0 #2c3e50}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:50px;color:#fff}.navbar-link{color:#fff}.navbar-link:hover,.navbar-link:focus{color:#1abc9c}.navbar .divider-vertical{height:50px;margin:0 9px;border-right:1px solid #2c3e50;border-left:1px solid #2c3e50}.navbar .btn,.navbar .btn-group{margin-top:10px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:10px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:10px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:15px 15px 15px;color:#fff;text-decoration:none;text-shadow:0 1px 0 #2c3e50}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#1abc9c;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#1abc9c;text-decoration:none;background-color:#233140;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#233140;*background-color:#233140;background-image:-moz-linear-gradient(top,#233140,#233140);background-image:-webkit-gradient(linear,0 0,0 100%,from(#233140),to(#233140));background-image:-webkit-linear-gradient(top,#233140,#233140);background-image:-o-linear-gradient(top,#233140,#233140);background-image:linear-gradient(to bottom,#233140,#233140);background-repeat:repeat-x;border-color:#233140 #233140 #080b0e;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff233140',endColorstr='#ff233140',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#233140;*background-color:#1a242f}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#11181f \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #2c3e50;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #2c3e50;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#1abc9c;border-bottom-color:#1abc9c}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#1abc9c;background-color:#233140}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#1abc9c;border-bottom-color:#1abc9c}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#18bc9c;background-image:-moz-linear-gradient(top,#18bc9c,#18bc9c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#18bc9c),to(#18bc9c));background-image:-webkit-linear-gradient(top,#18bc9c,#18bc9c);background-image:-o-linear-gradient(top,#18bc9c,#18bc9c);background-image:linear-gradient(to bottom,#18bc9c,#18bc9c);background-repeat:repeat-x;border-color:#15a589;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff18bc9c',endColorstr='#ff18bc9c',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#2c3e50}.navbar-inverse .brand{color:#fff}.navbar-inverse .navbar-text{color:#fff}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#2c3e50;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#2c3e50;background-color:#15a589}.navbar-inverse .navbar-link{color:#fff}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#2c3e50}.navbar-inverse .divider-vertical{border-right-color:#18bc9c;border-left-color:#18bc9c}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#2c3e50;background-color:#15a589}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#2c3e50;border-bottom-color:#2c3e50}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#2c3e50;border-bottom-color:#2c3e50}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#fff;border-color:#b4bcc2;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#95a5a6}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#95a5a6}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#95a5a6}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#7b8a8b;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#15a589;*background-color:#15a589;background-image:-moz-linear-gradient(top,#15a589,#15a589);background-image:-webkit-gradient(linear,0 0,0 100%,from(#15a589),to(#15a589));background-image:-webkit-linear-gradient(top,#15a589,#15a589);background-image:-o-linear-gradient(top,#15a589,#15a589);background-image:linear-gradient(to bottom,#15a589,#15a589);background-repeat:repeat-x;border-color:#15a589 #15a589 #0c6251;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff15a589',endColorstr='#ff15a589',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#15a589;*background-color:#128f76}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#0f7864 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#b4bcc2}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#ecf0f1}.pagination ul>.active>a,.pagination ul>.active>span{color:#b4bcc2;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#b4bcc2;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:18px 36px;font-size:18.75px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:10px;border-bottom-left-radius:10px;-webkit-border-top-left-radius:10px;border-top-left-radius:10px;-moz-border-radius-bottomleft:10px;-moz-border-radius-topleft:10px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:10px;border-top-right-radius:10px;-webkit-border-bottom-right-radius:10px;border-bottom-right-radius:10px;-moz-border-radius-topright:10px;-moz-border-radius-bottomright:10px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 12px;font-size:12.75px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:1px 8px;font-size:11.25px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.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:#b4bcc2;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#2c3e50;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.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-top-color:#2c3e50;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#2c3e50;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#2c3e50;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#2c3e50;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#2c3e50;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#2c3e50;border-bottom:1px solid #233140;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.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{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#2c3e50;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#2c3e50;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#2c3e50;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#2c3e50;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#1abc9c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#95a5a6}.media,.media-body{overflow:hidden;*overflow:visible;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{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:12.69px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#b4bcc2}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#e74c3c}.label-important[href],.badge-important[href]{background-color:#d62c1a}.label-warning,.badge-warning{background-color:#f39c12}.label-warning[href],.badge-warning[href]{background-color:#c87f0a}.label-success,.badge-success{background-color:#18bc9c}.label-success[href],.badge-success[href]{background-color:#128f76}.label-info,.badge-info{background-color:#3498db}.label-info[href],.badge-info[href]{background-color:#217dbb}.label-inverse,.badge-inverse{background-color:#7b8a8b}.label-inverse[href],.badge-inverse[href]{background-color:#636f70}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#f5ae3e;background-image:-moz-linear-gradient(top,#f7ba5b,#f39c12);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f7ba5b),to(#f39c12));background-image:-webkit-linear-gradient(top,#f7ba5b,#f39c12);background-image:-o-linear-gradient(top,#f7ba5b,#f39c12);background-image:linear-gradient(to bottom,#f7ba5b,#f39c12);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff7ba5b',endColorstr='#fff39c12',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#f7ba5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;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:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#7b8a8b;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#ecf0f1;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}h1{font-size:48px;font-weight:900}h2{font-size:36px;font-weight:700}h3{font-size:28px;font-weight:700}h4{font-size:24px;font-weight:500}h5{font-size:16px;font-weight:500}h6{font-size:13px;font-weight:500;text-transform:none}p{margin-bottom:1em}.page-header{border-bottom:0}.navbar .brand{text-shadow:none}.navbar .brand:hover{color:#1dd2af}.navbar .navbar-inner{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar .nav>li>a{text-shadow:none}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar .navbar-search .search-query{line-height:normal;border:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar .btn-navbar{background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar .btn,.navbar .btn-group{margin-top:6px}.navbar-inverse .brand:hover{color:#2c3e50}.navbar-inverse .navbar-search .search-query{line-height:normal;color:#2c3e50;border-color:transparent;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar-inverse .navbar-search .search-query:focus{padding:4px 14px;color:#2c3e50}div.subnav{background-color:#ecf0f1;background-image:none;border-color:transparent;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}div.subnav-fixed{top:50px}div.subnav .nav>li>a{color:#2c3e50;border-color:transparent;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}div.subnav .nav>.active>a,div.subnav .nav>.active>a:hover{color:#2c3e50;background-color:#cfd9db;border-color:transparent;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-list>li>a,.nav-list>.active>a,.nav-list .nav-header{text-shadow:none}.nav-list .divider{background:0;border-bottom:2px solid rgba(0,0,0,0.2)}.nav-pills .open .dropdown-toggle{background-color:#2c3e50}.pagination ul{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.pagination ul>li>a{color:#fff;background-color:#18bc9c;border-color:transparent}.pagination ul>li>a:hover{background-color:#24e3be}.pagination ul>.active>a,.pagination ul>.active>a:hover{color:#2c3e50;background-color:#ecf0f1}.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover{color:#fff;background-color:#24e3be}.pager li>a,.pager li>span{color:#fff;background-color:#18bc9c;border:0}.pager li>a:hover,.pager li>span:hover{background-color:#24e3be}.pager .disabled>a,.pager .disabled>span,.pager .disabled>a:hover,.pager .disabled>span:hover{color:#fff;background-color:#24e3be}.breadcrumb>li{text-shadow:none}.btn{padding:9px 20px;color:#fff;text-decoration:none;text-shadow:none;background-image:none;border:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;-webkit-transition:.25s;-moz-transition:.25s;transition:.25s}.btn:hover,.btn:focus{color:white;-webkit-transition:.25s;-moz-transition:.25s;transition:.25s}.btn:active,.btn.active{color:rgba(255,255,255,0.75);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn.disabled,.btn[disabled]{color:white}.btn-large{padding:18px 36px}.btn-small{padding:2px 12px}.btn-mini{padding:1px 8px}.table tbody tr.success>td,.table tbody tr.error>td,.table tbody tr.warning>td,.table tbody tr.info>td{color:#fff}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{padding:7px 6px;text-indent:1px;border:2px solid #dce4ec;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}textarea:-moz-placeholder,input[type="text"]:-moz-placeholder,input[type="password"]:-moz-placeholder,input[type="datetime"]:-moz-placeholder,input[type="datetime-local"]:-moz-placeholder,input[type="date"]:-moz-placeholder,input[type="month"]:-moz-placeholder,input[type="time"]:-moz-placeholder,input[type="week"]:-moz-placeholder,input[type="number"]:-moz-placeholder,input[type="email"]:-moz-placeholder,input[type="url"]:-moz-placeholder,input[type="search"]:-moz-placeholder,input[type="tel"]:-moz-placeholder,input[type="color"]:-moz-placeholder,.uneditable-input:-moz-placeholder{color:#acb6c0}textarea:-ms-input-placeholder,input[type="text"]:-ms-input-placeholder,input[type="password"]:-ms-input-placeholder,input[type="datetime"]:-ms-input-placeholder,input[type="datetime-local"]:-ms-input-placeholder,input[type="date"]:-ms-input-placeholder,input[type="month"]:-ms-input-placeholder,input[type="time"]:-ms-input-placeholder,input[type="week"]:-ms-input-placeholder,input[type="number"]:-ms-input-placeholder,input[type="email"]:-ms-input-placeholder,input[type="url"]:-ms-input-placeholder,input[type="search"]:-ms-input-placeholder,input[type="tel"]:-ms-input-placeholder,input[type="color"]:-ms-input-placeholder,.uneditable-input:-ms-input-placeholder{color:#acb6c0}textarea::-webkit-input-placeholder,input[type="text"]::-webkit-input-placeholder,input[type="password"]::-webkit-input-placeholder,input[type="datetime"]::-webkit-input-placeholder,input[type="datetime-local"]::-webkit-input-placeholder,input[type="date"]::-webkit-input-placeholder,input[type="month"]::-webkit-input-placeholder,input[type="time"]::-webkit-input-placeholder,input[type="week"]::-webkit-input-placeholder,input[type="number"]::-webkit-input-placeholder,input[type="email"]::-webkit-input-placeholder,input[type="url"]::-webkit-input-placeholder,input[type="search"]::-webkit-input-placeholder,input[type="tel"]::-webkit-input-placeholder,input[type="color"]::-webkit-input-placeholder,.uneditable-input::-webkit-input-placeholder{color:#acb6c0}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:#1abc9c;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:6px 0 0 6px;-moz-border-radius:6px 0 0 6px;border-radius:6px 0 0 6px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:6px 0 0 6px;-moz-border-radius:6px 0 0 6px;border-radius:6px 0 0 6px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 6px 6px 0;-moz-border-radius:0 6px 6px 0;border-radius:0 6px 6px 0}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 6px 6px 0;-moz-border-radius:0 6px 6px 0;border-radius:0 6px 6px 0}.input-prepend input,.input-append input,.input-prepend select,.input-append select,.input-prepend .uneditable-input,.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend input+.btn-group .btn,.input-append input+.btn-group .btn,.input-prepend select+.btn-group .btn,.input-append select+.btn-group .btn,.input-prepend .uneditable-input+.btn-group .btn,.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 6px 6px 0;-moz-border-radius:0 6px 6px 0;border-radius:0 6px 6px 0}.input-prepend .add-on:first-child,.input-append .add-on:first-child,.input-prepend .btn:first-child,.input-append .btn:first-child{-webkit-border-radius:6px 0 0 6px;-moz-border-radius:6px 0 0 6px;border-radius:6px 0 0 6px}.input-prepend .add-on:last-child,.input-append .add-on:last-child,.input-prepend .btn:last-child,.input-append .btn:last-child{-webkit-border-radius:0 6px 6px 0;-moz-border-radius:0 6px 6px 0;border-radius:0 6px 6px 0}.input-append .add-on,.input-prepend .add-on{padding:9px 5px;text-shadow:none;border:0}.control-group.error,.control-group.error input:focus,.control-group.error textarea:focus{border-color:#e74c3c;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.control-group.success,.control-group.success input:focus,.control-group.success textarea:focus{border-color:#2ecc71;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.control-group.warning,.control-group.warning input:focus,.control-group.warning textarea:focus{border-color:#f1c40f;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.control-group.info,.control-group.info input:focus,.control-group.info textarea:focus{border-color:#3498db;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}input[disabled],input[readonly],textarea[disabled],textarea[readonly]{color:#cad2d3;cursor:default;background-color:#eaeded;border-color:transparent}input[type="file"]{line-height:16px}legend{color:#2c3e50;border-bottom:0}.form-actions{background-color:#dde4e6;border-top:0;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.alert{color:#fff;text-shadow:none;background-color:#f39c12}.alert h1,.alert h2,.alert h3,.alert h4,.alert h5,.alert h6{color:#fff}.alert-error{background-color:#e74c3c}.alert-success{background-color:#18bc9c}.alert-info{background-color:#3498db}.label{padding:6px 10px;text-shadow:none}.badge{padding:6px 10px;text-shadow:none;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px}.well{border:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.progress{height:12px;background:#ecf0f1;border-radius:32px;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.progress .bar{background-color:#2c3e50;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.progress .bar+.bar{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.progress-striped .bar{background-color:#2c3e50;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress-success.progress-striped .bar,.progress .bar-success{background-color:#18bc9c}.progress-warning .bar,.progress-warning.progress-striped .bar,.progress .bar-warning{background-color:#e6bb0d}.progress-danger .bar,.progress-danger.progress-striped .bar,.progress .bar-danger{background-color:#e74c3c}.progress-info .bar,.progress-info.progress-striped .bar,.progress .bar-info{background-color:#3498db}.tooltip.in{opacity:1}.popover{color:#fff}.popover-title{border-bottom:2px solid rgba(0,0,0,0.2)}.modal-header{color:#fff;background-color:#2c3e50;border-bottom:0}.modal-footer{background-color:#ecf0f1;border-top:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.close{text-shadow:none}@media(max-width:767px){div.subnav .nav>li:first-child>a,div.subnav .nav>li+li>a{border-color:transparent}div.subnav .nav>li:first-child>a:hover,div.subnav .nav>li+li>a:hover{background-color:#cfd9db}div.subnav .nav>li:last-child>a{border-radius:0 0 4px 4px}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn{padding:5px}}@media(max-width:979px){.navbar .nav-collapse .nav>li>a{color:#fff}.navbar .nav-collapse .nav>li>a:hover{background-color:#18bc9c}}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} diff --git a/flask_admin/static/bootstrap/bootstrap2/swatch/img/glyphicons-halflings-white.png b/flask_admin/static/bootstrap/bootstrap2/swatch/img/glyphicons-halflings-white.png deleted file mode 100644 index 3bf6484a29d8da269f9bc874b25493a45fae3bae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8777 zcmZvC1yGz#v+m*$LXcp=A$ZWB0fL7wNbp_U*$~{_gL`my3oP#L!5tQYy99Ta`+g_q zKlj|KJ2f@c)ARJx{q*b<Rc{fZDE|-E3z8Qg5C}{9v!pTzga8NZOmrk*O`5892Z0dh z6y;PuJwHDK9$?(w-u|_L_3`o1($W%e0`}kWUyy&dCnqOQPfu4@SAgf?;o*P$z|s8t zJh1KR>bkhN_!|Wn*Vos8{TEhUT@5e;_WJsIMMcG5%>DiS&dv_N`4@J0cnAQ-#>RjZ z00W5t&tJ^l-QC*ST1-p~00u^9XJ=AUl7oW-;2a+x2k__T=grN{+1c4XK0ZL~^z^i$ zp&>vEhr@4fZWb380S18T&!0cQ3IKpHF)?v=b_NIm0Q>v<fKgXh*W25>wY7D0baZ)n z31Fa5sELUQARIVaU0nqf0XzT+fB_63aA;@<$l~wse|mcA;^G1TmX?-)e)jkGPfkuA z92@|!<>h5S_4f8QP-JRq>d&7)^Yin8l7K8gED$&_FaV?gY+wLjpoW%~7NDe=nHfMG z5DO3j{R9kv5GbssrUpO)<pElNvVjx;Inad7%}rnn)BtoiIXM{s0C>Oyv<s*i2m!7M zNCXUk1jq|?5|99_k&%%AIlu-a0ty3=KxY8j%*;&S3IIajE_Qc!f%*X_5DScgf&xH0 zumu>Vrlx>u0UKD0i;Dpm5S5dY16(DL5l{ixz|mhJU@&-OWCTb7_%}8-fE(P~+XIRO zJU|wp1|S>|J3KrLcz^+v1f&BDpd>&MAaibR4#5A_4(MucZwG9E1h4@u0P@C8;oo+g zIVj7kfJi{oV~E(NZ*h(@^<JQ`7oGGHtP>-(Q(C`Psb3KZ{N;^GB(a8NE*Vwc715!9 zr-H4Ao|T_c6+VT_JH9H+P3>iXSt!a$F`>s`jn`w9GZ_~B!{<w2b}Uz=xRP0Noee!5 zHGxHKH;uZjouChSB9)ldcOm@{14~ct04{b8>0soaiV|O_c^R2aWa%}O3jUE)WO=pa zs~_Wz08z|ieY5A%$@FcBF9^!1a}m5ks@7gjn;67N>}S~Hrm`4sM5Hh`q7&5-N{|31 z6x1{ol7Bn<k_m&K*9NkB7ANp6;_WSmra!UL^eY+pz_w5LlB(g$UY9|-AP@zsw4|7- zi|#>skoViZ<brlX21G1wL@^v%v2P&MSTZc8SKT&&Tq!~%Uw%k^(D<O<S;ewoH)@(b zb2Z<#wBV6y-?HHFVJFRg^me&@Reg!dys6F1>0GqbLa#kW`Z<Hy>)VCjt1MysKg|rT zi!?s#<KsBd5lg=VLu4^|xo0%enAx0mMXMSpk0KF_*gOS;jx!zP=@5TPN+S>#Ck>8c zpi|>$lGlw#@yMNi&V4`6OBGJ(H&7lqLlcTQ&1zWriG_fL>BnFcr~?;E93{M-xIozQ zO=EHQ#+?<}%@wbWWv23#!V70h9MOuUVaU>3kpTvYfc|LBw?&b*89~Gc9i&8tlT#kF ztpbZoAzkdB+UTy=tx%L3Z4)I{zY(Kb)eg{InobSJmNwPZt$14aS-uc4eKuY<?xyi! z`TeGpun(kP^7#~<fX0r^ExRQwveWDF;DOQbL}?LBzt>8h$dtfyxu^a%zA)<y|4;I# zFU8x7%0eT|Hd@3!T6Anh3IoHrN%@H8e6ge;3u)_$N2H&Rv2`ml6;kL~xS07C5Nzt< z>>fYI&)@ZXky?^{5>xSC?;w4r&td6vBdi%vHm4=XJH!3yL3?Ep+T5aU_>i;yr_XGq zxZfCzUU@GvnoIk+_Nd`aky>S&H!b*{A%L>?*XPAgWL(Vf(k7qUS}>Zn=U(ZfcOc{B z3*tOHH@t5Ub5D~#N7!Fxx}P2)sy{vE_l(R7$aW&CX>c|&HY+7};vUIietK%}!ph<X z*_6&Ee=)&D@nDa!y{$f<(Q`UdM+|H2ksGEhG7utFYl`Y6pD#+4LC8Hw@6|1H-x{D` zE$uaNS!i^Rx(%B(My5}1#H73>rCuh+;C@1usp;XLU<8Gq8P!rEI3<U)y>ieg#W$!= zQcZr{hp>8sF?k&Yl0?B84OneiQxef-4TEFrq3O~JAZR}yEJHA|Xkqd49tR&8oq{zP zY@>J^HBV*(gJvJZc_0VFN7Sx?H7#75E3#?N8<p*btH>Z!C+_f53YU}py<FUNWgSuj zi^M}p>ggxx1?wQi5Yb-_`I`_V*SMx5+*P^b=ec5RON-k1cIlsBLk}(HiaJyab0`CI zo0{<v3Q5P3@oM!6@v&t6RJy0OS}M??mGqk1x;(pa`FWA#n+2z37<uPHl{#HvB!^?r zm9?WOv;Tt(gt*?Pw;;%nF3|I0gDBXPM>=1_LO$~oE2%Tl_}KURuX<`+mQN_sTdM&* zkFf!Xtl^e^gTy6ON=&gTn6)$JHQq2)33R@_!#9?BLNq-Wi{U|rVX7Vny$l6#+S<va z%-r+y8D)Cm{5=IM8|<{prj)kZfIZ$NiW0)fE9{-SR)@-;NBJtHk@DI_v*mK(N0#s# z?S8~jyotdcJJAAUt_;Tr)fa|*cT)~*JZ!c_7yVpSb{r2MllfJDbfI~-7n_#K6lw4G z^Eyhsh^z8eZs2;adrfk9ip%h;IP|>Z@KvQt@VYb%<9JfapI^b9j=wa+Tqb4ei;8c5 z&1>Uz@lVFv6T4Z*YU$r4G`g=91lSeA<=GRZ!*KTWKDPR}NPUW%peCUj`Ix_LDq!8| zMH-V`Pv!a~QkTL||L@cqiTz)*G-0=ytr1KqTuFPan9y4gYD5>PleK`NZB$ev@W%t= zkp)_=lBUTLZJpAtZg;pjI;7r2y|26-N7&a(h<zryrg`J^oeC|8V|qszB+|*eQ-(Dy zbn*nJ1W|b4-1y?dTI6}3IPMw+-O0;Q@eMMtjjQ+G6QfN3ae61Yd9LfQx_UREWecK4 zMn7A~fOz)be1)Yg{2Ysl9G%s8-h-~@C;ALAL0r=<JP2uCe!T|wAywH1r;F|f_q8N( zYp^0FkyL9uj<8bK@fyTtgo+DT)14B^<SigcSJotgDV02O!M(CS6_B&^bILwyV?Ng4 zm7WQp?{l<Obhuy=22?5<oQDiM22&u4rZrRVG|L9ABfY{=95aTyd~@a$o~1P#ji`=w zBKmQqX}r3Nlk9Q|gR7)~#n6AzYk`#!R*d5x`A)hU(!1R1%^zXxNJ(kPCw4htU9^(O zP4cYV^F(I>X|`1YNM9N8{>8JAu<en5+94bD>v}hp1v`3JHT-=5lbXpbMq7X~2J5Kl zh7tyU`_AusMFZ{ej9D;Uyy;SQ!4nwgSnngsYBwdS&EO3NS*o04)*j<g2BLf;iAZ2( z7Key$cc6ey>uAYl;57c2Ly0(DEZ8IY?zSph-kyxu+D`tt@oU{32J#I{vmy=#0ySPK zA+i(A3yl)qmTz*$dZi#y9FS;$;h%bY+;StNx{_R56Otq+?pGe^T^{5d7Gs&?`_r`8 zD&dzOA|j8@3<oPyCd}SOX6AZj_;pT>A&FR5U3*eQNBf<4^4W_iS_()*8b4aaUzfk2 zzIcMWSEjm;EPZPk{j{1>oXd}pXAj!NaRm8{Sjz!D=~q3WJ@vmt6ND_?HI~|wUS1j5 z9!S1MKr7%nxoJ3k`GB^7yV~*{n~O~n6($~x5Bu{7s|JyXbAyKI4+tO(zZYMslK;Zc zzeHGVl{`iP@jfSKq>R;{+djJ9n%$%EL()Uw+sykjNQdflkJZSjqV_QDWivbZS~S{K zkE@T^Jcv)Dfm93!mf$XYnCT--_A$zo9MOkPB6&diM8MwOfV?+ApNv`moV@nqn>&lv zYbN1-M|jc~sG|yLN^1R2=`+1ih3jCshg`iP&mY$GMTcY^W^T`WOCX!{-KHmZ#GiRH zYl{|+KLn5!PCLtBy~9i}`#d^gCDDx$+GQb~uc;V#K3OgbbOG0j5{BRG-si%Bo{@lB zGIt+Ain8^C`!*S0d0OSWVO+Z8<kqm;qPrHIJ!qB8;9h5*>9}}O8aFTZ>p&k}2gGCV zh#<$gswePFxWGT$4DC^8@84_e*^KT74?7n8!$8cg=sL$OlKr&HMh@Rr5%*Wr!xoOl zo7jItnj-xYgVTX)H1=A2bD(tle<tL7^Z!nJ*fwgn&QUe>EH57#V{xAeW_ezISg5OC zg=k>hOLA^urTH_e6*vSYRqCm$J{xo}-x3@HH;bsHD1Z`Pzvsn}%cvfw%Q(}h`Dgtb z0_J^niUmoCM5$*f)6}}qi(u;cPgxfyeV<wtcQgsqG?QDyA@6XXM7siU#+0#mP~AnX z9f=bMes~9>aaVmOsG<)5`6tzU4wyhF;k|~|x>7-2hXpVBpc5k{L4M`Wbe6Q?tr^*B z`Y*>6*&R#~%JlBIitlZ^qGe3s21~h3U|&k%%jeMM;6!~UH|+0+<5V-_zDqZQN7<fD zM2vP&&BMr(%$M51tLpycNES^{gnGn-o~t&>9?n?!Aj!Nj`YMO9?j>uqI9-Tex+nJD z%e0#Yca6(zqGUR|KITa?9x-#C0!JKJHO(+fy@1!B$%ZwJwncQW7vGYv?~!^`#L~Um zOL++>4qmqW`0Chc0T23G8|vO)tK=Z2`gvS4*qpqhIJCEv9i&&$09VO8YOz|oZ+ubd zNXVdLc&p=KsSgtmIPLN69P7xYkYQ1vJ?u1g)T!6Ru`k2wkdj*wDC)VryGu2=yb0?F z>q~~e>KZ0d<sP$M^)hrN7IC)eGuv*?pAk#*4fxII<8rIx545@9E}-};{IJdo*}!V1 zkUgWQp<TD%7(QQhWkf*vd;SiT1P@}N?jaoKEV?lzqfa1pG1Y^}ikjNMM*Kb?m5(n& zOz8{+G2z7JatI<J95R%#%#ATAzlwPl$?6)w6WH~ku?(FhO)k1eRlF4I5UqR?T`Iy= z_bVtkxqs3lQGny-BS%nkzwrXhI_M|P4l_VNVoMjVRoZ*0(JkMQ#AdJLFBj%$oTBx9 z_5|g_ll0@cfLf<j;&lJ>_#7f3UgV%9MY1}vMgF{B8yfE{HL*pMyhYF)WDZ^^3vS8F zGlOhs%g_~pS3=WQ#494@jAXwOtr^Y|TnQ5zki>qRG)(oPY*f}U_=ip_{qB0!%w7~G zWE!P4p3khyW-JJnE>eECuYfI?^d366Shq!Wm#x&jA<tFBO~aWRutYg|6S!-V%dvXb zjpm3-7^fYCzbWmx*ts$8ECu=f{D#|=T{2_Q?C-SVQTSi8ey{G^D$8U&*bY{vQ$kGG zq$8)>o>=HdCllE$>DPO0N;y#4G)D2y#B@5=N=+F%Xo2n{gKcPcK2!hP*^WSXl+ut; zyLvVoY>VL{H%Kd9^i~lsb8j4>$EllrparEOJNT?Ym>vJa$(P^tOG)5aVb_5w^*&M0 zYOJ`I`}<NkH4X@iCc57jNSqY3D>9}UoSnYg#E(&yyK(tqr^@n}qU2H2DhkK-`2He% zgXr_4kpXoQHxAO9S`wEdmqGU4j=1JdG!OixdqB4PPP6<nq;ZS)73s_@N{54U_<mt# zR{@UUroZJ1=lVB~3y%RbLLE=9Mh=pj4wNruVxXLk8pKH)JVr{Hbx`P1XQ>RXA}>GM zumruUUH|ZG2$bBj)Qluj&uB=dRb)?^qomw?Z$X%#D+Q*O97eHrgVB2*mR$bFBU`*} zIem?dM)i}raTFDn@5^caxE^XFXVhBePmH9fqcTi`TLaXiueH=@06sl}>F%}h9H_e9 z>^O?LxM1EjX}NVppaO@NNQr=AtHcH-BU{yBT_vejJ#J)l^cl69Z7$sk`82Zyw7Wxt z=~J?hZm{f@W}|96FUJfy65Gk8?^{^yjhOahUMCNNpt5DJw}ZKH7b!bGiFY9y6OY&T z_N)?Jj(MuLTN36ZCJ6<obtKS{VOOSzs>I5Xy7uVlrb$o*Z%=-)kPo9s?<^Yqz~!Z* z_mP<Y8YDC3(vm~>8(unFq65XSi!$@YtieSQ!<7IEOaA9VkKI?lA`*(nURv<D`3vIl zzk?RMHDq|}aqs!Q7n{<V(L>fKL8cX}-+~uw9|_5)uC2`ZHca<BJSyCJ7L7R3^ezpJ zixdU%^Arizo-zh;Lga89_J>eX7L8aG6Ghleg@F9aG%X$#g6^yP5apnB>YTz&EfS{q z9UVfSyEIczebC)qlVu5cOoMzS_jrC|)rQlAzK7sfiW0`M8mVIohazPE9Jzn*qPt%6 zZL8RELY@L09B83@Be;x5V-IHnn$}{RAT#<2JA%ttlk#^(%u}CGze|1JY5MPhbfnYG zIw%$XfBmA-<_pKLpGKwbRF$#P;@_)ech#>vj25sv25VM$ouo)?BXdRcO{)*OwTw)G zv43W~T6ekBMtUD%5Bm>`<n0ehww;K9t*_z=^iZoM2Gjm6Wx6QTWDzOX28g|i7p-G( znPo(pGb2-Hja^(5g>^Ltv!w4~65N!Ut5twl!Agrzyq4O2Fi3pUMtCU~>9gt_=h-f% z;1&OuSu?A_sJvIvQ+dZNo3?m1%b1+s&UAx?8sUHEe_sB7zkm4R%6)<@oYB_i5>3Ip zIA+?jVdX|zL{)?TGpx+=Ta>G80}0}Ax+722$XFNJsC1gcH56{8B)*)eU#r~HrC&}` z|EWW92&;6y;3}!L5zXa385@?-D%>dSvyK;?jqU2t_R3wvBW;$!j45uQ7tyEIQv<v( zw)qBpyRhiKBMR9HV)v2ZJdk>a;Db}r&bR3kqNSh)Q_$MJ#Uj3Gj1F;)sO|%6z#@<+ zi{pbYsYS#u`X$Nf($OS+lhw>xgjos1OnF^$-I$u;qhJswhH~p|ab*nO>zBrtb0ndn zxV0uh!LN`&xckTP+JW}gznSpU492)u+`f{9Yr)js`NmfYH#Wdtradc0TnKNz@Su!e zu$9}G_=ku;%4xk}eXl>)KgpuT>_<`Ud(A^a++K&pm3LbN;gI}ku@YVrA%FJBZ5$;m zobR8}OLtW4-i+qPPLS-(7<>M{)rhiPoi@?&vDeVq5%fmZk=mDdRV>Pb-l7pP1y6|J z8I>sF+TypKV=_<SBxSgNFy@5`t70+_4F<*(g54PNEt&4u%OoVR^n+$TL)qKdP6c)n z-CoP*_kXZ4vBsj8M^2Y0nDq-^4r-wgu2Y-3fmi6ooPIXTI%UdJhw@7KgR=N+Vl3NO zcl8-&i~^e%3E1G+u&^#M&5!sI)la$uQ2y&KsaZjx^r8D68BTZd^NrAV{0u$=#SH#4 zLE2)q%<UADH&I$um|>^NwBU^>4JJq<*14GLfM2*XQzYdlqqjnE)gZsPW^E@mp&ww* zW9i>XL=uwLVZ9pO*8K>t>vdL~Ek_NUL$?LQi5sc#1Q-f6-ywKcIT8Kw?C<o*=Aa~- z*eA0Mgmu5-j8rTh^;={1$#X=Ck5Gk;@KK#haYa^sXr0^_^Q84%+WOl3?#Mc#{{d}B z>(_3pbR`e|)%9S-({if|E+hR2W!&qfQ&UiF^I!|M#xhdWsen<tq75@@WHX{+T3S~F znoMw2v{^ia4`fkd=3p<6XkL)!lsI%8iq@>v^wpKCBiuxXbnp85`{i|;BM?Ba`lqTA zyRm=UWJl&E{8JzYDHFu>*Z10-?#A8D|5jW9Ho0*CAs0fAy~MqbwYuOq9jjt9*nuHI zbDwKvh)5Ir$r!fS5|;?Dt>V+@F*v8=TJJF)TdnC#Mk>+tGDGCw;A~^PC`gUt*<(|i zB{{g{`uFehu`$fm4)&k7`u{xIV)yvA(%5SxX9MS80p2EKnL<HSdiWFiAy=3UmV-rj zc%^|o`X!t!vuYErrUzbG?ostY(qs7GE^=Z33k*P+F6r($h_?W-bHJ|GUK@Wlv9++M zG}?Z?8{_X${_c9aOXw4qfk0vTaVRH6FMOnFD?w|zo{zKKg$8wzW&yufWk&idB=+9! z^dTI@g=>t<HJ%Cd%{u~X`lRpMFg&X{m?Nw#T4cg*?z{+rC($M4z9RHV@8KoueD7_) z8T@i-6RG$5%_Y`lSjj|?wSvITK5c4g0!Uq49VAn-H<9~;vn7~hBdYuDOt2$gtNuBm zo8$Y{2lwMxZNbfb$Hm0T528Og7Jfl!35edSr>CZ>tlX>*Z6nd&6-<c}7z{sZ9V^Ux zMNgR3$iH97>Mv$5rHD*<Fmux@1NkgiA%VmyOAwal{&*L*?*@Cl?&!jtcf3KL{{|8z z_($$R;SoAei#gUO@=7)M7s~2aAxJ>db;&IBK3KH&M<+ArlGXDRdX1VVO4)&R$f4<g z`M~bg9+=(|cc^a3vB10?3GZiq$o|Zromh?lE2%m!alG4CIrvmRZHZVSM>NxXI>GBh zSv|h>5GDAI(4E`@F?En<q4iBUtn-fux#Jt=qU6#PBE4-GhP)}OK!CI;i(sJ6^VIJF zwJMEAeGKMb_^`VbA1hFYio)roSCrLG-NL5Yqhb{sh3_zt(Zg93UP*;!m?}k&V`1AB zNYPri&yVkXW8uO1geXM3Oj&$G%~#Jd%h;?JDKwrq;P+!t&4W1Z^1?Ikguvk#bK?Bx z$w5M*LxgRe=jz?UiDBbfC1I3!cjeMD*ueh4W0S*z6=TAf+ZYkG$}FGti`ipjpIK>W zS>#c&Gw6~_XL`qQG4bK`W*>hek4LX*efn6|_MY+rXkNyAuu?NxS%L7~9tD3cn7&p( zCtfqe6sjB&Q-Vs7BP5+%;#Gk};4xtwU!KY0XXbmkUy$kR9)!~?*v)qw00!+Yg^#H> zc#8*z6zZo>+(bud?K<*!QO<vKd$8TBt^HLIw%iB>4ehiTCK&PD4G&n)Tr9X_3r-we z?fI+}-G~Yn93gI6F{}Dw_SC*FLZ)5(85zp4%uubtD)J)UELLkvGk4#tw&Tuss<g@J zd3(n+h;=s-joD7pea}*kl|?T5<3W!rK}V)#HpvFL3uRc{oe_mV<z1l~^m1_TkJDu3 z;JtNs6#g&&@E09TG{#Z`zh|EKwRTiJr)s50$5?Nrhn68HAr=rV#m>a)mTD$R2&O~{ zCI3>fr-!-b@EGRI%g0L8UU%%u_<;e9439JNV;4KSxd|78v+I+8^rmM<g+mx0&Si$a zgf1uYC03KcCN)Lz!>f3f40Jb}wEszROD?xBZu>Ll3;sUIoNxDK3|j3*sam2tC@@e$ z^!;+AK>efeBJB%ALsQ{uFui)oD<x}JL&L^@dTz{b&_?*nsS;lNnoJ@(k9d5xVq$|w z<ejC>oq()2USi?n=6C3#eetz?wPswc={I<8x=(8lE4EIsUfyGNZ{|KYn1IR|=E==f z(;!A5(-2y^2xRFCSPqzHAZn5RCN_bp22T(KEtjA(rFZ%>a4@STrHZflxKoqe9Z4@^ zM*scx_y73<sFS1_?6+u!sT9fvjld*kU~edMy>?Q{<Kw(x)TAd1JfBpLz7(Nk)Jsdz zj7#eyM{0^=a(C#N_pwZ(&^&zZP@5Qw`oUBRW0i<S2ql<0tEs~>vt6?~WEl?2q*;@8 z3M*&@%l)SQmXkcUm)d@GT2#JdzhfSAP9|n#C;$E8X|pwD!r#X?0P>0ZisQ~TNqupW z*lUY~+ikD`vQb?@SAWX#r*Y+;=_|oacL$2CL$^(mV}aKO77pg}O+-=T1oLBT5sL2i z42Qth<Jh0Ysw=K%u7GarF`3bIM1>2+0@C`c+*D0*5!qy26sis<9a7>LN2{z%Qj49t z=L@x`4$ALHb*3COHoT?5S_c(Hs}g!V>W^=6Q0}zaubkDn)(lTax0+!+%B}9Vqw6{H zvL|BRM`O<@;eVi1DzM!tXtBrA20Ce@^Jz|>%X-t`vi-%WweXCh_LhI#bUg2*pcP~R z*RuTUzBKLXO~~uMd&o$v3@d0shHfUjC6c539PE6rF&;Ufa(Rw@K1*m7?f5)t`MjH0 z)_V(cajV5Am>f!kWcI@5rE8t6$S>5M=k=aRZROH6fA^jJp~2NlR4;Q2>L$7F#RT#9 z>4@1RhWG`Khy>P2j1Yx^BBL{S`niMaxlSWV-JBU0-T9zZ%>7mR3l$~QV$({o0;jTI ze5=cN^!Bc2bT|BcojXp~K#2cM>OTe*cM{Kg-j*CkiW)EGQot^}s;cy8_1_@JA0Whq zlrNr+R;Efa+`6N)s5rH*|E)nYZ3uqkk2C(E7@A|3YI`ozP~9Lexx#*1(r8luq+YPk z{J}c$<WQa$CfVIhsE>s`<i2`cEPYHzF!ZIy?L$}MhAPFqQe@_8Lh#cQAH~-zZ5p$u zZauEKr<oluR2T6z2A|B^#roi2jr3F<X4&!ZjiXo?9nIbJ4iAii=A_@&#n$TqH^#R& z{$qMQO7u^&7KEB6l{H~A;ylPsJw2kA4#E2@7dO%lsi+3{VJ4?~e4(Bz-tw&^YR9P1 zTlpCH(W_%+@#|?%RN0HM=U?pU5$E2f<RPK1fw%3KLs--hd|lj})1h|Y<6CA3NsuSI zl=<<g*vcJW=6yZY`aXe5QUB~awgg5fxlu%7u#A8=UXt61U-7wGtR{L&XvKbUf-}PL z<eXA6<<r^;=`XwtFN1~2J^$Y${#Q0Tyev?j!*Z4q^mjQ4ah)uW_s=JkrRS%l*Ut`> zPM35Fx(YWB3Z5IYnN+L_4|jaR(5iWJi2~l&xy}aU7kW?o-V*6Av2wyZTG!E2KSW2* zGRLQkQU;Oz##ie-Z4fI)WSRxn$(ZcD;TL+;^r=a4(G~H3ZhK$lSXZj?cvyY8%d9JM zzc3#pD^W_QnWy#rx#;<pgDoauRid_B6w$J6XKKeAcZHU9rH9=s!y`%~e@hGc<c#A7 zRRTR`&dt`*;~VYcVGk-~aNB!?q#4B&%52?dI@=%LQ>c&N@sqHhrnHRmj<I9Tx4aSD zVUQ}9lh=Kd&QIx0uCqYm3pFs_*L;b|$xyZks(AAwgYsH85PAL~ndH7DNUoZKBHCWu z_<;@&ed^tpoO=DG4Hem|2>#i;s%zLm6SE(n&BWpd&f7>XnjV}OlZntI70fq%8~9<7 zMYaw`E-rp49-oC1N_uZTo)Cu%RR2QWdHpzQIcNsoDp`3xfP+`gI?tVQZ4X={qU?(n zV>0ASES^Xuc;9JBji{)RnFL(Lez;8XbB1uWaMp@p?7xhXk6V#!6B@aP4Rz7-K%a>i z?fvf}va_DGUXlI#4--`A3qK7J?-HwnG7O~H2;zR~RLW)_^#La!=}+>KW#anZ{|^D3 B7G?kd diff --git a/flask_admin/static/bootstrap/bootstrap2/swatch/img/glyphicons-halflings.png b/flask_admin/static/bootstrap/bootstrap2/swatch/img/glyphicons-halflings.png deleted file mode 100644 index a9969993201f9cee63cf9f49217646347297b643..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12799 zcma*OWmH^Ivn@*S;K3nSf_t!#;0f+&pm7Po8`nk}2q8f5;M%x$<L>SdAkd9FAvlc$ zx660V9e3Ox@4WZ^?7jZ%QFGU-T~%||Ug4iK6bbQY@zBuF2$hxOw9wF=A)nUSxR_5@ zEX>HBryGrjyuOFFv$Y4<+|3H@gQfEqD<)+}a~mryD|1U9*I_FOG&F%+Ww{SJ-V2BR zjt<81Ek$}Yb*95D4RS0HCps|uLyovt;P05hchQb-u2bzLtmog&f2}1VlNhxXV);S9 zM2buBg~!q9PtF)&KGRgf3#z7B(hm5WlNClaCWFs!-P!4-u*u5+=+D|ZE9e`KvhTHT zJBnLwGM%!u&vlE%1ytJ=!xt~y_YkFLQb6bS!E+s8l7PiPGSt9xrmg?LV&&SL?J~cI zS(e9TF1?SGyh+M_p@o1dyWu7o7_6p;N6hO!;4~<t3w3SV570<|$VWNPP~TbX3|=X> z2B`I;y`;$ZdtBpvK5%oQ^p4eR2L)BH>B$FQeC*t)c`L71gXHPUa|vyu`Bnz)H$Z<N z7UVAHFsR+HLO+(tK~=M@pM7ZMPj5gkz>cXGve(}XvR!+*8a>BLV;+ryG1kt0=)ytl zNJxFUN{V7P?#|Cp85QTa@(*Q3%K-R(Pkv1N8YU*(d(Y}9?PQ(j<e|z%-Bnrh*J1R% z%JAF*cdp#Zk#h09fv12$TuGUsX=V-wgNcEGe0hhp%mK8EVPi6@!a;xi$k!wcIO|bJ zPx8DZ*0Y(ggKhnp2=Ax#f<wKp{=pA29>;NzWoEVWRD-~H$=f>j<LsfOZ;WLF*F0cm z9PSRSlSFQE>9~PN^BM2okI(gY-&_&BCV6RP&I$FnSEM3d=0fCxbxA6~l>54-upTrw zYgX@%m>jsSGi`0cQt6b8cX~+02IghVlNblR7eI;0ps}mpWUcxty1yG56C5rh%ep(X z?)#2d?C<4t-KLc*EAn>>M8%HvC1TyBSoPNg(4id~H8JwO#I)Bf;N*y6ai6K9_bA`4 z_g9(-R;qyH&6I$`b<fg~;S@}+8_8-ItZ!TS<!|pei*+CWiVH?M1CEFM{ij_eP4dL+ zsn%eDn^Kp7vLEn|Dq0`Wt&GpZ?eq^%pqXVR^PA!ZyoGLI7ihDaWiNi$M6h)PNwvHR zEcA82H5fM6RnpZ!R872>42v|0V3Z8IXN*p*8g$gE98+JpXNY+jXxU0zsR^W$#V=KP z3AEFp@OL}WqwOfsV<)A^UTF4&HF1vQecz?LWE@p^Z2){=KEC_3Iopx_eS42>DeiDG zWMXGbYfG~W7C8s@@m<_?#Gqk;!&)_Key@^0xJxrJahv{B&{^!>TV7TEDZlP|$=ZCz zmX=ZWtt4QZK<Y>x**)lQQoW8y-XLiOQy#T`2t}p6l*S`68ojyH@UXJ-b~@tN`WpjF z%7%Yzv807gsO!v=!(2uR)16!&U5~VPrPHtGzUU?2w(b1Xchq}(5<TwC<%h0ow%K}h zTlz}37c^dc?7rEmt7Zy9#q|V+5bE1c06?X{e~%TDZ!@uG_uU!n6VJy=odWKS?p#j? zn;v){i#`+1X;Ls^(9p!?42vli(fu1D-%nf?-3VKCs1JT^-;{Pg82EGZ&|T}A#wtP( zR^df|3P4JZ0|weuCV=JopL6MLvYycbd;-Xx_r)Hm1~(2>Ed^G|SD7IG+kvgyVksU) z(0R)SW1V(>&q2nM%Z!C9=;pTg!(8pPSc%H01urXmQI6Gi^dkYCYfu6b4^tW))b^U+ z$2K&iOgN_OU7n#GC2jgiXU{caO5hZt0(>k+c^(r><#m|#J^s?zA6pi;^#*rp&;aqL zRcZi0Q4HhVX3$ybclxo4FFJW*`IV`)Bj_L3rQe?5{wLJh168Ve1jZv+f1D}f0S$N= zm4i|9cEWz&C9~ZI3q*gwWH^<6sBWuphgy@S3Qy?MJiL>gwd|E<2h9-$3;gT9V~S6r z)cAcmE0KXOwDA5eJ02-75d~f?3;n7a9d_xPBJaO;Z)#@s7gk5$Qn(Fc^w@9c5W0zY z59is0?Mt^@Rolcn{4%)Ioat(kxQH6}hIykSA)zht=9F_W*D#<}N(k&&;k;&gKkWIL z0Of*sP=X(Uyu$Pw;?F@?j{}=>{aSHFcii#78FC^6JGrg-)!)MV4AKz>pXnhVgTgx8 z1&5Y=>|8RGA6++FrSy=__k_imx|z-EI@foKi>tK0Hq2LetjUotCgk2QFXaej!BWYL zJc{fv(&qA7UUJ|AXL<Te#svgLe$GRVt~C0`%AZ+-=S0D^On=i42k@^tJ-LZGdLpRi zdrV5?>c5z*_NW#yWzKtl(c8mEW{A>5Hj^gfZ^HC9lQNQ?RowXjmuCj4!!54Us1=hY z0{@-phvC}yls!PmA~_z>Y&n&IW9FQcj}9(OLO-t^NN$c0o}YksCUWt|DV(MJB%%Sr zdf}8!9ylU2TW!=T{?)g-ojAMKc>3pW;KiZ7f0;&g)k}K^#HBhE5ot)%oxq$*$W@b# zg4p<<e2}@}ZtI091*fR6EHmhc2JFT&S+9NWaDJ!A80$GFF7R`A%xl6?3MWwFH)kiY zKkO7P(Y}AIYl!b@wU{Hfoy`qG`h+F#SJJ{&-s<{+@b9bRRm+2<>Ou`ME|Kd1WHK@8 zzLD+0(NHWa`B{em3Ye?@aVsEi>y#0XVZfaFuq#;X5C3{*ikRx7UY4FF{ZtNHNO?A_ z#Q?hwRv~D8fPEc%B5E-ZMI&TAmikl||EERumQCRh7p;)>fdZMxvKq;ky0}7IjhJph zW*uuu*<F&)uV|73Nr>(Y6)S;Od--8uR^R#sb$cmFCnPcj9PPCWhPN;n`i1Q#Qn>ii z{WR|0>8F`vf&#E(c2NsoH=I7Cd-FV|%(7a`i}gZw4N~QFFG2WtS^H%@c?%9UZ+kez z;PwGgg_r6V>Kn5n(nZ40P4qMyrCP3bDkJp@hp6&X3>gzC>=f@Hsen<%I~7W+x@}b> z0}Et*vx_50-q@PIV=(3&Tbm}}QRo*FP2@)A#XX-8jYspIhah`9ukPBr)$8>Tmtg&R z?JBoH17?+1@Y@r>anoKPQ}F8o9?vhcG79Cjv^V6ct709VOQwg{c0Q#rBSsSmK3Q;O zBpNihl3S0_IGVE)^`#94#j~$;<ISbQ+zLM8Q_sWpD4<&Sicl|!a~&A@PH`UFRr4^t zSjAA>7+u870yWiV$@={|GrBmuz4b)*bCOPkaN0{6$MvazOEBxFdKZDlbVvv{8_*kJ zfE6C`4&Kkz<5u%dEdStd85-5UHG5IOWbo8i9azgg#zw-(P1AA049hddAB*UdG3Vn0 zX`OgM+EM|<+KhJ<=k?z~WA5waVj?T9eBdfJGebVifBKS1u<$#vl^<Wg*!!OoyJ@GG z%+_%2Ex-A(=Z(Bs6q~agBwBL+Pcns5yTYUCI_zEv3JOnOB;7f=h8xGf|IQl+Qw37# z{BhR?wjaFo)FpPNNRkn616I`fE=rl+<Vv=sXw)oTB*nsxZd}^hq|lwuLq2tPYK9Ch zP~rW|kx{-S+q;ojdznAWu9)x>BvSg)xsnT5Aw_ZY#}v*LXO#htB>f}x3qDdDHoFeb zAq7;0CW;XJ`d&G*9V)@H&739DpfWYzdQt+Kx_E1K#Cg1EMtFa8eQRk_JuUdHD*2;W zR~XFnl!L2A?48O;_iqCVr1oxEXvOIiN_9CUVTZs3C~P+11}ebyTRLACiJuMIG#`xP zKlC|E(S@QvN+%pBc6vPiQS8KgQAUh75C0<L{Rx=;M-*LCs2Bp<jfOoZepIeH1&E9@ zECcRp6~TSaxo9}VYr%Om){SqtW<MPRfw2-K1_c9&KORpSyh3Z*9=_y`d-Pn0_zAw+ z=kYI%Xg`=LN{&qw<HTtk2MKE0r;WoX$l}>a2xcPQDD$}*bM&z~g8+=9ltmkT$;c;s z5_=8%i0H^fEAOQbHXf0;?D<BP;<HVQI1JZt*v)6RAq&gagO^!F$spXEh)>N5z-5+1 zDxj50yYkz4ox9p$HbZ|H?8ukAbLE^P$@h}L%i6QVcY>)i!w=hkv2zvrduut%!8>6b zcus3bh1w~L804EZ*s96?GB&<V5y;va8bgv&LhJ<YYLxjoJ6PJ;r2T$n2GZZ+&blBq zN@;fP%v^kz^?uH{Kpq(Ih{eCW5OnE5%HakzY6sMl!wfw!(lBl{oyDuNM|bEKU#YtR zTTK?n-{?&5Szx)y^~WKl(fG>F7c5?m?|t$-tp2rKMy>F*=4;w*jW}^;8v`st&8)c; z2Ct2{)?S(Z;@_mjAEjb8x=qAQvx=}S6l9?~H?PmP`-xu;ME*B8sm|!h@BX4>u(xg_ zIHmQzp4Tgf*J}Y=8STR5_s)GKcmgV!<zLBv<JCu*R*$7_b_L{9GvwPbpvkT@1&MS$ zijYfuLM?Pa-BA2}iX9A(2K)AF@cP6QkvvCLyswdDf?LI~tZ|qKPtWR#^oamFBRcUk zs5b$Sc+=%VrL*7Ba(pp>$JKTg@LO402{{Wrg>#D4-L%vjmtJ4r?p&$F!o-BOf7ej~ z6)BuK^^g1b#(E>$s`t3i13{6-mmSp7{;QkeG5v}GAN&lM2lQT$@(aQCcFP(%UyZbF z#$HLTqGT^@F#A29b0HqiJ<ZOKS1P#S0IU6AksffR*wx4ca5r>sRJAlh8kngU`BDI6 zJUE~&!cQ*&f95Ot$#mxU5+*^$qg_DWNdfu+1irglB7yDglzH()2!@#rpu)^3S8weW z_FE$=j^GTY*|5SH95O8o8W9FluYwB=2PwtbW|JG6kcV^dMVmX(wG+Otj;E$%gfu^K z!t~<3??8=()WQSycsBKy24>NjRtuZ>zxJIED;YXaU<x|u=Vd7uuZ|>z$@0z4rl+TW zWxmvM$%4jYIpO>j5k1t1&}1VKM~s!<EQ6q8U;EP6<gFYZ!m%POxUBC$P89e*7OnrM zdWQA)CjX#LYDI-i*mnQZr;sN<6@SPOXNM}9Rp_hcE;y>eLsCVQ`TTjn3JRXZD~>GM z$-IT~(Y)flNqDkC%DfbxaV9?QuWCV&-U1yzrV@0jRhE;)ZO0=r-{s@W?HOFbRHDDV zq;eLo+wOW;nI|#mNf(J?RImB9{YSO2Y`9825Lz#u4(nk3)RGv3X8B(A$TsontJ8L! z9JP^eWxtKC?G8^xAZa1HECx*rp35s!^%;&@Jyk)NexVc)@U4$^<D$wmm?XpH-Sg4* z8B^w;<H>X1Dag6`WKs|(HhZ#rzO2KEw3xh~-0<;|zcs0L>OcO#YYX{S<TTw)*(lZC zIx888OkDY0a@=pFP3fhTGE0#kua@EqJ8hp4VSNt-Xfx&Iq8mr)#UbJIBdW*?_9fdi z7f!0)Iy{xeM7LDi+*QJ?BdGeD5e0(0aSm&GvjQ!V6CD0we*R)~MbsZ|>N8m6`9pp+ zQG@q$I)T?aoe#AoR@%om_#z=c@ych!bj~lV13Qi-xg$i$hXEAB#l=t7QWENGbma4L zbBf*X*4oNYZUd_;1{Ln_ZeAwQv4z?n9$eoxJeI?lU9^!AB2Y~AwOSq67dT9ADZ)s@ zCRYS7W$Zpkdx$3T>7$I%3EI2ik~m!f7&$Djpt6kZqDWZJ-G{*_eXs*B8$1R4+I}Kf zqniwCI64r;>h2Lu{0c(#Atn)%E8&)=0S4BMhq9$`vu|Ct;^ur~gL`bD>J@l)P$q_A zO7b3HGOUG`vgH{}&&Agr<FnKy|IF(G1iR*`GW247VX<aAlJ2F?Q<={Aib+`}_HyE* zujP5~Z9@I2PBhiOY}cNA6jXAuIimavj#$XIs@HezE!U24{*GtAdHFvr(O>Fy%K^>? z>wf**coZ2vdSDcNYSm~dZ(vk6&m6bVKmVgrx-X<>{QzA!)2*L+HLTQz$e8UcB&Djq zl)-%s$ZtUN-R!4ZiG=L0#_P=BbUyH+YPmFl_ogkkQ$=s@T1v}rNnZ^eMaqJ|quc+6 z*ygceDOrldsL30w`H;rNu+I<VKUrjL=bDy~WtS;;K#ThRGVRMNFq&Gco*pd+ChOJI zqAbbk-&kSt%3!MCpue~I%|gblH{=P#-)jqQC%xCp|J^jUO>jlS+G~p&0SawXCA1+D zC%cZtjUkLNq%FadtHE?O(yQTP486A{1x<{krq#rpauNQaeyhM3*i0%tBpQHQo-u)x z{0{&KS`>}vf2_}b160XZO2$b)cyrHq7ZSeiSbRvaxnKUH{Q`-P(nL&^fcF2){vhN- zbX&WEjP7?b4A%0y6n_=m%l00uZ+}mCYO(!x?j$+O$*TqoD_Q5EoyDJ?w?^UIa491H zE}87(bR`X;@u#3Qy~9wWdWQIg1`cXrk$x9=ccR|RY1~%{fAJ@uq@J3e872x0v$hmv ze_KcL(wM|n0EOp;t{hKoohYyDmYO;!`7^Lx;0k=PWPGZpI>V5qYlzjSL_(%|mud50 z7#{p97s`U|Sn$WYF>-i{i4`kzlrV6a<}=72q2sAT7Zh{>P%*6B;Zl;~0xWymt10Mo zl5{bmR(wJefJpNGK=fSRP|mpCI-)Nf6?Pv==FcFmpSwF1%CTOucV{yqxSyx4Zws3O z8hr5Uyd%ezIO7?PnEO0T%af#KOiXD$e?V&OX-B|ZX-YsgSs%sv-6U+sLPuz{D4bq| zpd&|o5tNCmpT>(uIbRf?8c}d3IpOb3sn6>_dr*26R#ev<_~vi)wleW$P<Wyn_7n0- zl)LIgF0z;$xTz(0JgW0t|K0{|pl+d7{+{fAW)lB*Qg({z1~qrplnmDSP!2>X|5)$_ z+_|=pi(0D(AB_sjQ;sQQSM&AWqzDO1@NHw;C9cPdXRKRI#@nUW)CgFxzQ1nyd!+h& zcjU!U=&u|>@}R(9D$%lu2TlV>@I2-n@fCr5Pr<dtPlfA<Z*`%$WS?W!M7-X@Sw}lf zu7sLkI`BK6gTBwv0nqdk^SqiGBO}U16-Ky}DlzfpVxxnEAc|MG(;#A7b;H&MP*riE zHr?l)sap(Q`P6U_@Ov18QJwI7yr|=6Y+TbD2PUEPfsh&V{s?8AA2dT>ZNVyKWR7hm zWjoy^<!R*J%IXEk=E5cj6b=;i9u3uQuMH4{qOT^=OGnt_=n2>p7v8m#$qN0K#8jT- zq`mSirDZDa1Jxm;Rg3<Jf$!Bj9`<kE;Sz+T_M)m3-f__2l^&CsYnIwV?+%t2FG{Ta zI-67-X7Fu-xbrdN@cn6z3_k9VZ?2i{<ie%nx)UUiUTLNtHEK)0HD_qUYpV0X30}z? zM!*@omRu>rAPhC)LcI4@-RvKT+@9&KsR3b0_0zuM!Fg7u>oF>3bzOxZPU&$ab$Z9@ zY)f7<va9`_LvY6!5H@PMYi?(=yM97@*rbrsB=oh`t5ydnN2A;15DysI3n?zsE3{ZX zq+yK*u5H1rVq8mwv!|dvE&PWazz!0^LY7dozu5qaS3Q5~q}uAQUJN5WW+A&wvpho? z=!z1Q9;>pKh22I7ZykL{YsdjcqeN++=0a}elQM-4;Q)(`Ep3|VFHqnXOh14`!Bus& z9w%*EWK6AiAM{s$6~SEQS;A>ey$#`7)khZvamem{P?>k)5&7Sl&&NXKk}o!%vd;-! zpo2p-_h^b$D<fdz<@`H3n|HeSVR76K@6|_9&-VHAVO=;`v1rN8I|9P)PS7vp83efu z`yTr9OVLz|?h*IHce7sdT@Ktb#!>NBO>{h4JdGB=D>fvGIYN8v&XsfxU~VaefL?q} z3ekM?<wNDtI4J<DC6XBgM26Nv#0iut=ZwA#^>iOKkCzQHkBkhg=hD!@&(L}FcHKoa zbZ7)H1C|lHjwEb@tu=n^OvdHOo7o+W`0-y3KdP#bb~wM=Vr_gyoEq|#B?$&d$tals ziIs-&7isBpvS|CjC|7C&3I0SE?~`a%g~$PI%;au^cUp@ER3?mn-|vyu!$7MV6(uvt z+CcGuM(Ku2&G0tcRCo7#D$Dirfqef2qPOE5I)oCGzmR5G!o#Q~(k~)c=LpIfrhHQk zeAva6MilEifE7rgP1M7AyWmLOXK}i8?=z<j)TsCg#MI>2;N=no)`IGm#y%aGE>-FN zyXCp0Sln{IsfOBuCdE*#@CQof%jzuU*jkR*Su3?5t}F(#g0BD0Zzu|1MDes8U7f9; z$JBg|mqTXt`muZ8=Z`3wx$uizZG_7>GI7tcfOHW`C2bKxNOR)XAwRkLOaHS4xwlH4 zDpU29#6wLXI;H?0Se`SRa&I_QmI{zo7p%uveBZ0KZKd9H6@U?YGArbfm)D*^5=&Rp z`k{35?Z5GbZnv>z@NmJ%+sx=1WanWg)8r}C_>EGR8mk(NR$pW<-l8OTU^_u3M@gwS z7}GGa1)`z5G|DZirw;FB@VhH7Dq*0qc=|9lLe{w2#`g+_nt<uBB~iQoK%j+BR{KW$ zxUoEE;u<56rl_>>_%o<~9(VZe=zI*SSz4w43-_o>4E4`M@NPKTWZuQJs)?KXbWp1M zimd5F;?AP(LWcaI-^Sl{`~>tmxsQB9Y$Xi*{Zr#py_+I$vx7@NY`S?HFfS!hUiz$a z{>!&e1(16T!Om)m)&k1W#*d#GslD^4!TwiF2WjFBvi=Ms!ADT)ArEW6zfVuIXcXVk z>AHjPADW+mJzY`_Ieq(s?jbk4iD2Rb8*V3t6?I+E06(K8H!!xnDzO%GB;Z$N-{M|B zeT`jo%9)s%op*XZKDd6*)-^lWO{#RaIGFdBH+;XXjI(8RxpBc~azG1H^2v7c^bkFE zZ<!d@6;Xr=zrz^$h_Zbcf~Z$lrrBw0nL?BbB`hkkx&01qcs_@(`dj5M$3rI2JKgsr zS^x~?G~LTF&PL>CVPE+E*Q=FSe8Vm&6|^3ki{9~qafiMAf7i4APZg>b%&5>nT@pHH z%O*pOv(77<h_P}M1fVl@bA%;8!%G$2v2^1K;a|J|258iaFK<JsY+PvseEryJp$5<! z9lXGNp5qrv`T=s~_@3Ry-B6o<m;T-lQtjLZ)m`X2mKrN#6`?5SI5G#qCc`>?ZiT{W zBibx}Q12tRc7Py1NcZTp`Q4ey%T_nj@<r4RLoFiQ1cOG!U!@-f&DrHzjFreg6r@E| zvE{2Q=kFJS$gwo*FVtl=epg~LzgZ(&E7V*y3ct|~AGvI-3JcYr{%DF#=;?cH6~ge- zxOld^6>1WKg5Fz_Rjl4wlJQj)rtp8yL3r!S<K<bid;Q+mY&EMZN}!KaieT~EVI>hy zvZvnmh!tH4T6Js-?vI0<-rzzl{mgT*S0d_7^AU_8gBg^03o-J=p(1o6kww2hx|!%T z-jqp}m^G*W?$!R#M%Ef?&2jYxmx+lXWZszpI4d$p<r;|3!?@3AW<2Zgi0<hN9ff)N z(zo6I+-$9Bx*(c$-bk0EGqBsb91nmH7yrN`CVj(QCaD{RJgvV-JPkoBQAwGD;nyzn z*I;L?L=(3oeAQ<rjW4NvWy!bHdLOHMjezGb#Hb+lSX`#>UN`(S)|*c^CgdwY>Fa>> zgGBJhwe8y#Xd*q0=@SLEgPF>+Qe4?%E*v{a`||luZ~&dqMBrRfJ{SDMaJ!s_;cSJp zSqZHXIdc@@XteNySUZs^9SG7xK`8=NBN<V=E)OCgg+S0s%X@m8dOqs;y*2U#C_D)u z81;Mt5p^uC3PVJP@9PH9!<3b5IE^n;kwm}NvP7!(7^P%;1DOYVJumd1Eg9zSvb@M< z=8_n~reVNX{Rwy18un@y&;emesWi1XQooSmDu!<kFo)-HRP5pn?;0r-+4i~5mY$28 z(;>M)fRVOjw)D^)w%L2OPkTQ$Tel-J)GD3=YXy+F4in(ILy*A3m@3o73uv?JC}Q>f zr<Ie&tGbM^0N<roTuDj*?S_O(I}B&He=e8Pl8`tjGg-O~5%TUI<1yQ05r*$Oc2#s# z8%FWrdDtn79-cwa2pX4M_-JFx9zK7mChDM?zK(~_K9>Y&8SWmesiba0|3X-jmlMT3 z*ST|_U@O=i*sM_*48G)dgXqlwoFp5G6qSM3&%_f_*<qxyINw1$We6It<0I>n!P<uj z?87vdPOI3mk{cGX^R<>iT>?cNI)fAUkA{qWnqdMi+aNK_yVQ&lx4UZknAc9FIzVk% zo6JmFH~c{_tK!gt4+o2>)zoP{sR}!!vfRjI=13!z<fc;{t9y2@_q+%poab^!jwREr z2+#Zf9d~36snX-iZ(5U>5}ijMFQ4a4?QIg-BE4T6!#%?d&L;`j5=a`4is>U;%@Rd~ zXC<xcC%fK=hCSNPW&)8o$8W+KO-SU#5LbV{{RyL+099LpC;6!uxU&{MmE<Y{b<h52 z$81YnCmIWu(0dlOntRk)&>~H7eGQhhYWhMPWf9znDbYIgwud(6$W3e>$W4$~d%qoJ z+JE`1g$qJ%>b|z*xCKenmpV$0pM=Gl-Y*LT8K+P)2X#;XYEFF4mRb<YTI|Oo*wqC5 z0h9Vcyd1-aYw_k;tVodW95W2hdEX}FLSrp|R+GE56fkm-P)-t$V)|A=l7x|mefFZC zXMAilrJt8o)%dz@>c~jj?DM@(1e`nL=F4Syv)TKIePQUz)bZ<lVCgA$*!Fmgxl6o% zjdFR@&JKgonL5u$SS;U)hR2JO%(X!<3`;2ma}g7i__wVr1m~_yKAfNhm3c!NlBG8F zi*)rX!5cY!j#B&Bh5F)#rbPS@4QDD~@ulB?(x|5|p4JWn*dAG|<;_kq<4J3{W|V%$ zFux+io?Ym>?Bi3@G@HO$Aps1DvDGkYF50O$_welu^cL7;vPiMGho74$;4fDqKbE{U zd1h{;LfM#Fb|Z&uH~Rm_J)R~Vy4b;1?tW_A)Iz#S_=F|~pISaVkCnQ0&u%Yz%o#|! zS-TSg87LUfFSs{tTuM3$!06ZzH&MFtG)X-l7>3)V?Txuj2HyG*5u;EY2_5vU0ujA? zHXh5G%6e3y7v?AjhyX79pnRBVr}RmPmtrxoB7lkxEzChX^(vKd+sLh?SBic=Q)5nA zdz7Mw3_iA>;T^_Kl~?1|5t%GZ;ki_+i>Q~Q1EVdKZ)$Sh3LM@ea&D~{2HOG++7*wF zAC6jW4>fa~!Vp5+$Z{<)Qxb|<doy+ePfu6oC(7$`&WuO0q0$+a9a%yz_{5phPWBz7 zW*;>{unMgCv2)@%3j=7)Zc%U<^i|SAF88s!A^+Xs!OASYT%7;Jx?olg_6NFP1475N z#0s<@E~FI}#LNQ{?B1;t+N$2k*`K$Hxb%#8tRQi*Z#No0J}Pl;HWb){l7{A8(pu#@ zfE<FZzTROa?{|??!(1M&=4t#qdoS<^Na+oYIxC;QnUK0am@X-v$)ut<3yca1@z&t9 zM)d{X_R6>-OTvEreoz1+p`9sUI%<waswQ*s(MUS7r-ADfL?@KW0)mbJ;|S&qT$0vX z+3A>Y{e5L-oTP_^NkgpYhZjp&ykinnW;(fu1;ttpSsgYM8ABX4dHe_HxU+%M(D=~) zYM}XUJ5guZ;=_ZcOsC`_{CiU$zN3$+x&5C`vX-V3`8&RjlBs^rf00MNYZW+jCd~7N z%{jJuUUwY(M`8$`B>K&_48!Li682ZaRknMgQ3~dnlp8C?__!P2z@=Auv;T^$yrsNy zCARmaA@^Yo2sS%2$`031-+h9K<HTVTe5)EQvp!MW(iadmCJS1wSbK_@ufo=dlOY}z zCO9zVYKg|I&o<%8Sb*|F!S|!19op-p&g=TZ%N9@L#(UmyHRFj))9t+gQpBfbTesf- za`2nVU~8Sd4Kd<Xb>MZsIHfB>s@}>Y(z988e!`%4=EDoAQ0kbk>+lCoK60Mx9P!~I zlq~wf7kcm_NFImt3ZYlE(b3O1K^QWiFb$V^a2Jlwvm(!XYx<`i@ZMS3UwFt{;x+-v zhx{m=m;4dgvkKp5{*lfSN3o^keSpp9{hlXj%=}e_7Ou{Yiw(J@NXuh*;pL6@$HsfB zh?v+r^cp@jQ4E<vE>spC#RqpwPY(}_SS$wZ{S959`C25777&sgtNh%XTCo9VHJC-G z;;wi9{-iv+ETiY;K9qvlEc04f;ZnUP>cUL_T*ms``EtGoP^B#Q>n2dSrbAg8a>*Lg zd0EJ^=tdW~7fbcLFsqryFEcy*-<UjNQKPSE=_Pn2>8!?;n%;F+8i{eZyCDaiYxghr z$8k>L|2&-!lhvuVdk!r-kpSFl`5F5d4DJr%M4-qOy3<bq6e{+%w<EWihn1$%KzFfu z`LKHky~)zdoi4^H8U?2zL}?l1u6MD%jgB7&*;Qf>gdmQb<G$UVN?JmKSKB~L!OR=i zI@^y#3#{3i>qF1=aBtRM<!CT741&i5jO+s2lsMXtwRPLCm;Sn!-GpQ>7)c_Ae?$b8 zQg4c8*KQ{XJmL)1c7#0Yn0#PTMEs4-IH<W7>Pjkn0!=;JdhMXqzMLeh`yOylXROP- zl#z3+fwM9l3%VN(6R77ua*uI9%hO7l7{+Hcbr(peh;afUK?B4EC09J{-u{mv)+u#? zdKVBCPt`eU@IzL)OXA`E<o1(5;mC6=k@-!Ol2~E}J9hOE??)KsP;2EQ2{Z(0gwv}f z!It<n&*dKHQo4x|g+0u^h~lZ5Ov4IC#Tfq*CptilVN;HXz`iK4{1F;tZh8So5XLY* zXxgB;G7CZ#<Iv1X4e=NIfHyT;2#ek12;Y}7qA*ja41jVbduyrB$HRMX3i4#!N49oM z=DRz&*@5P2{)@K+w!!IcW58;P<<)I=(H60m7Iz@T{w1f<%~zS?f9pR^Y*#fpT<Noz z19vhe>bu`Xp?u0m%h&X41}FNfnJ*g1!1wcbbpo%F4x!-#R9ft!8{5`Ho}04?FI#Kg zL|k`tF1t_`ywdy8(wnTut>HND(qNnq%Sq=AvvZbXnLx|mJhi!*&lwG2g|edBdVgLy zjvVTKHAx(+&P;P#2Xobo7_RttUi)Nllc}}hX>|N?-u5g7VJ-NNdwYcaOG?NK=5)}` zMtOL;o|i0mSKm(UI_7BL_^6HnVOTkuPI6y@ZLR(H?c1cr-_ouSLp{5!bx^DiKd*Yb z{K78Ci<l%%epWQ$#NR9uIf5|S3KV`ZTJ$&qJ6`ry!VhqBuPs(j#jC&+5r^-xzR6fB zK27~T)ZekimVRRz-lpCAJu2yR?1~gIvHR5a1NYj$*q3Netl55}ts!oix2<m^q4oKA zx&s$GFeBD?)7%@b7gCQPQkbzcY-#e<IqbmH&`NOUj{m_7zrJE%0%MGK`P$ftHCCyA z#QEOkdexcb5q+aRNqFbL{IkS#hFvjjH9v~WbirfMFFJD$DOv0$f8V^PmC)h@B?4Tt zm|Lni^t};e&92Z{h%k-#j#z#sF&$u2EIp%nX3YhhH9Z@UzRMIVYuCt&$V#l>&Twup zTKm)ioN|wcYy%Qnwb)Izb<b#d)i{+1p{kvKer6Fm8jK>H>W!;Ah5Zdm_jRY`+VRJ2 zhkspZ9hbK3iQD91A$d!0*-1i#%x81|s+SPRmD}d~<1p6!A13(!vABP<Z{iwC7e4%~ z_Ln8-%lvcLY32-Y@1SO1*q92_(j#+rhCS=CLMntrY3Mry$(OvuZNSYRrU>2kNgqEG z?AMgl^P+iRoIY(9@_I?n1829lGvAsRnHwS~|5vD2+Zi53j<5N4wNn0{q>>jF9*bI) zL$kMXM-awNOElF>{?Jr^tOz1glbwaD-<Z?hQEA3Pbch{-zrz(GmD@~J*ag^+fZsaw zY>M0OKOlTeW3C!1ZyxRbB>8JDof(O&R1bh%3x#>y2~<>OXO#IIedH0Q`(&&?eo-c~ z>*Ah#3~09unym~UC-UFqqI>{dmUD$Y4@evG#ORLI*{ZM)J<p{vwhmRDEF0r$s4y_e z=sJVWn|ZM-lg`hKmi%p5C*Kde*o`ZFJEf1Ej+^5AxXqpoV)MlQbue7)^k_qkb+e;` zWde0R#5(=H5cM$dK9LAsdS=Yk0oGNTPVR(|j6Ls{ih2+`6_F=VxMEkqB<u_yrMn-7 zem-jG!zg{VfBK=QGIg$ZuYze9uWx?aDxho7OdK|L{6b`Vwt6C>l=e1it!XzY($S3V zLG!Y6fCjE>x6r@5FG1n|8ompSZaJ>9)q6jqU;XxCQk9zV(?C9<V#w?Lf%1Im<}?28 z%fv0sO4GSZ%zfKH*&?O&xk<I#mt_{KWN@l7yB^%JPt=7^LfPgcr~mEkBmfFP7Db0M zd#E!M<3epZs@^{m3?RG}!71NRBMkEamf~hxD%`6taJAN-7_P+KIU~cqcmswNPF@u0 zBEd?J2tVMNdm+C_OO1xnDaP<CvO06_?;7EsCcbdr{cefhRUYuKyPaC&4Q})>+i*>w z21+KYt1gXX&0`x3E)hS7I5}snbBzox9C@Xzcr|{B8Hw;SY1$}&BoYKXH^hpjW-RgJ z-Fb}tannKCv>y~^`r|(1Q9;+sZlYf3XPSX|^gR01UFtu$B*R;$sPZdIZShRr>|b@J z;#G{EdoY+O;REEjQ}X7_YzWL<b@Mth=4xckE^wJmIQPsUfw>O+Ey3>a_KDe1CjSe| z6arqcEZ)CX!8r(si`dqbF$uu&pnf^Np{1f*TdJ<q2__L6D@tfPK*~rzVm(OhYZi{~ zO7D1Cy0z3WdT1AOu^h7D1_(%nFOYSW(8K@CEF1cpVqIf7{ZixjH(=6Z%>`r2;@SaZ z#hb4xlaCA@Pwqj#LlUEe5L{I$k(Zj$d3(~)u(F%&xb8={N9hKxlZIO1ABsM{Mt|)2 zJ^t9Id;?%4PfR4&Ph9B9cFK~@tG3wlFW-0<w~5R`uK#F{bA6_apO|PKuT2G1V=wh! zZWPJWbbu)nGiWn?;_;mE<K|T11{jR4I#*v{H=AUuEc3+UXA@7uIuDpTy`jcYhUz%o zBA}z0OR6}0Iqx8Rc?*~((>fXZS_L4U*EiAA%+`h%q2^6BCC;t0iO<j7`ENmUd8a;m zq?b}^r<Irhn?t82<3YNwQO;C@tCYRR<pR}s5&giTT+nc?H}mtH3ZX|EFpV#H_g4in z8Tbrg7JdfQvFh#<ovHft;`1YsxU2!leoc~Y)qNFc1mAL8P2+9584$1X7q1nBToy)y z$s4}XIl~zQ7=m5m-cT@n8wijJJ$|#uxO(nL+IWs9qk?i9%s#W2ZxqfW`jt6{wIS^q z*iUq6jHCeqca?Re1w*!C)k-nH(eV#(PnPU`?~ov%Y+nj9)j3~WBrKHnC<W0QlTNC* z<u_q0O?_PoEKdE%)ty@V5F=^-=y+E`(D|T`;&Jjf?_7CST84~oRyM!RwLEZ{ZM@iY zIB{U~Ge+IK^?H|Bpj8js3(0P2EU%fWNhAH!9B5rA(2TXL071s~i2t!VlQfp=S*6A2 zkt-CN_z|1uc9QB1_^Gpz5);n_@pEbj*T#DvuqJuuKb_PutQhcu6?7{m7g7o;mzZA9 zf{W$DK$@&k565^Y7M*vmK#vF0i(Zb4TM%~5g7C?du<oAbjjU>4V=s4Qug{M|iDV@s zC7|ef-dxiR7T&Mpre!%hiUhHM%3Qxi$Lzw6&(Tvlx9QA_7LhYq<(o~=Y>3ka-zrQa zhGpfFK@)#)rtfz61w35^sN1=IFw&Oc!Nah+8@qhJ0UEGr;JplaxOGI82OVqZHsqfX ze1}r{jy;G?&}Da}a7>S<aX|!tNbjGLu?E#M_FQ+tx7QwU!f|T#|0pGw8beze%W}X8 zTh%o9Dbrk*KF8LN?^<3buL7%?KbkRMr_jMII=xY`U$vl5f0r@#H-|^ToExGU<wfLd zXr+GANZ(jz6qI7<1HwuGyQ7H^naJ1E$XxZfl>CDsFDuzusee<BvkaOnN;I1*%q9kj z^#m2ll1tq&oMv5g`}?0u!-DOva7&B0@Z!bH=K`f(k?GfNkG{%)>CKof|Dz2BPsP8? zY;a)Tkr2P~0^2BeO?wnzF_<l4Nvqf<W`7QjWtJDSw)B?FOMa{8DG?kxHAQnVhPF5z zxnU_-^up4Prel^ed-PkB1+y((Pnm`A;p#0KHiAU@r9|EKB!f~*!CI?=fpguhu1lxJ zNfwd#_vJ<v;}^GGOcxE|6OXh~-#_DXMEuzGXcF>Ul-ekY=-w26VnU%U3f19Z-pj&2 z4J_a|o4Dci+MO)mPQIM>kdPG1<w<ic`+WErB>xydiR9@#<n}&^Z@zb@F^w%zU4>8m zh27D7GF{p|a{8({Q-Pr-;#jV{2zHR><r}G)UYxpAdB=!PS*(C~*1H#i#3#T1$j2)t z81k%ZC~^7K<oMng7XOD4<}b)aGe_1j<vxx~;=~OWNZThvqsq&|9D#PlGC$L88fM!1 ziqq3RXQ^4C*>lGoFtIfIpoMo?exuQyX_A;;l0AP4!)JEM$EwMInZkj+8*IHP4vKRd zKx_l-i*>A*C@{u%ct`y~s6MWAfO{@FPIX&sg8H{GMDc{4M3%$@c8&RAlw0-R<4DO3 trJqdc$mBpWeznn?E0M$F`|3v=`3%T2A17h;rxP7$%JLd=6(2u;`(N3pt&so# diff --git a/flask_admin/static/bootstrap/bootstrap2/swatch/journal/bootstrap.min.css b/flask_admin/static/bootstrap/bootstrap2/swatch/journal/bootstrap.min.css deleted file mode 100644 index f310a5592..000000000 --- a/flask_admin/static/bootstrap/bootstrap2/swatch/journal/bootstrap.min.css +++ /dev/null @@ -1,9 +0,0 @@ -@import url('//fonts.googleapis.com/css?family=News+Cycle:400,700');/*! - * Bootstrap v2.3.2 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!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) ")"}.ir a:after,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}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:Georgia,"Times New Roman",Times,serif;font-size:14px;line-height:20px;color:#777;background-color:#fff}a{color:#777;text-decoration:none}a:hover,a:focus{color:#777;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#bbb}a.muted:hover,a.muted:focus{color:#a2a2a2}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:"News Cycle","Arial Narrow Bold",sans-serif;font-weight:bold;line-height:20px;color:#000;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#bbb}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #bbb}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#bbb}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;font-size:12px;color:#777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#777;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#bbb}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:Georgia,"Times New Roman",Times,serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#999;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#bbb;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#bbb}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#bbb}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#bbb}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#eee;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#9d9d9d}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#85e8a2;border-color:#22b24c}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f5f5f5}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#eee}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.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;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#eee;border-bottom:1px solid #eee}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#000;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#000;text-decoration:none;background-color:#e9e9e9;background-image:-moz-linear-gradient(top,#eee,#e1e1e1);background-image:-webkit-gradient(linear,0 0,0 100%,from(#eee),to(#e1e1e1));background-image:-webkit-linear-gradient(top,#eee,#e1e1e1);background-image:-o-linear-gradient(top,#eee,#e1e1e1);background-image:linear-gradient(to bottom,#eee,#e1e1e1);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffeeeeee',endColorstr='#ffe1e1e1',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#000;text-decoration:none;background-color:#e9e9e9;background-image:-moz-linear-gradient(top,#eee,#e1e1e1);background-image:-webkit-gradient(linear,0 0,0 100%,from(#eee),to(#e1e1e1));background-image:-webkit-linear-gradient(top,#eee,#e1e1e1);background-image:-o-linear-gradient(top,#eee,#e1e1e1);background-image:linear-gradient(to bottom,#eee,#e1e1e1);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffeeeeee',endColorstr='#ffe1e1e1',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#bbb}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#000}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#eee;border:1px solid #dcdcdc;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;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:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#777;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #d9d9d9;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#bfbfbf;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#777;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#777;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#7f7f7f;*background-color:#777;background-image:-moz-linear-gradient(top,#848484,#777);background-image:-webkit-gradient(linear,0 0,0 100%,from(#848484),to(#777));background-image:-webkit-linear-gradient(top,#848484,#777);background-image:-o-linear-gradient(top,#848484,#777);background-image:linear-gradient(to bottom,#848484,#777);background-repeat:repeat-x;border-color:#777 #777 #515151;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff848484',endColorstr='#ff777777',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#777;*background-color:#6a6a6a}.btn-primary:active,.btn-primary.active{background-color:#5e5e5e \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ff8e1f;*background-color:#ff7f00;background-image:-moz-linear-gradient(top,#f93,#ff7f00);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f93),to(#ff7f00));background-image:-webkit-linear-gradient(top,#f93,#ff7f00);background-image:-o-linear-gradient(top,#f93,#ff7f00);background-image:linear-gradient(to bottom,#f93,#ff7f00);background-repeat:repeat-x;border-color:#ff7f00 #ff7f00 #b35900;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff9933',endColorstr='#ffff7f00',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#ff7f00;*background-color:#e67200}.btn-warning:active,.btn-warning.active{background-color:#c60 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#eb0000;*background-color:#c00;background-image:-moz-linear-gradient(top,#f00,#c00);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f00),to(#c00));background-image:-webkit-linear-gradient(top,#f00,#c00);background-image:-o-linear-gradient(top,#f00,#c00);background-image:linear-gradient(to bottom,#f00,#c00);background-repeat:repeat-x;border-color:#c00 #c00 #800000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff0000',endColorstr='#ffcc0000',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#c00;*background-color:#b30000}.btn-danger:active,.btn-danger.active{background-color:#900 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#24bf51;*background-color:#22b24c;background-image:-moz-linear-gradient(top,#26c755,#22b24c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#26c755),to(#22b24c));background-image:-webkit-linear-gradient(top,#26c755,#22b24c);background-image:-o-linear-gradient(top,#26c755,#22b24c);background-image:linear-gradient(to bottom,#26c755,#22b24c);background-repeat:repeat-x;border-color:#22b24c #22b24c #167231;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff26c755',endColorstr='#ff22b24c',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#22b24c;*background-color:#1e9d43}.btn-success:active,.btn-success.active{background-color:#1a873a \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#376ea4;*background-color:#369;background-image:-moz-linear-gradient(top,#3973ac,#369);background-image:-webkit-gradient(linear,0 0,0 100%,from(#3973ac),to(#369));background-image:-webkit-linear-gradient(top,#3973ac,#369);background-image:-o-linear-gradient(top,#3973ac,#369);background-image:linear-gradient(to bottom,#3973ac,#369);background-repeat:repeat-x;border-color:#369 #369 #204060;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3973ac',endColorstr='#ff336699',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#369;*background-color:#2d5986}.btn-info:active,.btn-info.active{background-color:#264c73 \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#7f7f7f;*background-color:#777;background-image:-moz-linear-gradient(top,#848484,#777);background-image:-webkit-gradient(linear,0 0,0 100%,from(#848484),to(#777));background-image:-webkit-linear-gradient(top,#848484,#777);background-image:-o-linear-gradient(top,#848484,#777);background-image:linear-gradient(to bottom,#848484,#777);background-repeat:repeat-x;border-color:#777 #777 #515151;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff848484',endColorstr='#ff777777',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#777;*background-color:#6a6a6a}.btn-inverse:active,.btn-inverse.active{background-color:#5e5e5e \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#777;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#777;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#777;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#777}.btn-group.open .btn-warning.dropdown-toggle{background-color:#ff7f00}.btn-group.open .btn-danger.dropdown-toggle{background-color:#c00}.btn-group.open .btn-success.dropdown-toggle{background-color:#22b24c}.btn-group.open .btn-info.dropdown-toggle{background-color:#369}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#777}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#bbb;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#777}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#999;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#777}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#777;border-bottom-color:#777}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#777;border-bottom-color:#777}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#bbb;border-color:#bbb}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#bbb}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#bbb}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:60px;padding-right:20px;padding-left:20px;background-color:#fff;background-image:-moz-linear-gradient(top,#fff,#fff);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#fff));background-image:-webkit-linear-gradient(top,#fff,#fff);background-image:-o-linear-gradient(top,#fff,#fff);background-image:linear-gradient(to bottom,#fff,#fff);background-repeat:repeat-x;border:1px solid #e0e0e0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffffffff',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:20px 20px 20px;margin-left:-20px;font-size:20px;font-weight:200;color:#000;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:60px;color:#777}.navbar-link{color:#000}.navbar-link:hover,.navbar-link:focus{color:#000}.navbar .divider-vertical{height:60px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #fff}.navbar .btn,.navbar .btn-group{margin-top:15px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:15px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:15px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"News Cycle","Arial Narrow Bold",sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:20px 15px 20px;color:#000;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#000;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#000;text-decoration:none;background-color:transparent;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#f2f2f2;*background-color:#f2f2f2;background-image:-moz-linear-gradient(top,#f2f2f2,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#f2f2f2,#f2f2f2);background-image:-o-linear-gradient(top,#f2f2f2,#f2f2f2);background-image:linear-gradient(to bottom,#f2f2f2,#f2f2f2);background-repeat:repeat-x;border-color:#f2f2f2 #f2f2f2 #ccc;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#fff2f2f2',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#f2f2f2;*background-color:#e5e5e5}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#d9d9d9 \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#000;border-bottom-color:#000}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#000;background-color:transparent}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#000;border-bottom-color:#000}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#000;border-bottom-color:#000}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#bbb;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#bbb}.navbar-inverse .navbar-text{color:#bbb}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#bbb}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#bbb;border-bottom-color:#bbb}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#777;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#bbb}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#eee}.pagination ul>.active>a,.pagination ul>.active>span{color:#bbb;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#bbb;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.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:#bbb;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1020;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;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-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.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{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#777;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#999}.media,.media-body{overflow:hidden;*overflow:visible;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{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#bbb}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#ff7f00}.label-warning[href],.badge-warning[href]{background-color:#c60}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#777}.label-inverse[href],.badge-inverse[href]{background-color:#5e5e5e}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#ff962e;background-image:-moz-linear-gradient(top,#ffa54d,#ff7f00);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ffa54d),to(#ff7f00));background-image:-webkit-linear-gradient(top,#ffa54d,#ff7f00);background-image:-o-linear-gradient(top,#ffa54d,#ff7f00);background-image:linear-gradient(to bottom,#ffa54d,#ff7f00);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffa54d',endColorstr='#ffff7f00',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#ffa54d;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;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:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#777;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:#000}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}h1,h2,h3,h4,h5,h6{margin:0 0 10px;line-height:1.2}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:#000}h1{font-size:48px}h2{font-size:36px}h3{font-size:28px}h4{font-size:20px}h5{font-size:13px}p>a,address>a,.breadcrumb a,abbr[title]{text-decoration:none;border-bottom:1px dotted}p>a:hover,address>a:hover,.breadcrumb a:hover,abbr[title]:hover{text-decoration:none;border-bottom:1px solid}code,pre{background-color:#eee;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.page-header{border-bottom:2px solid #eee}hr{border-bottom:1px solid #eee}.navbar{font-family:"News Cycle","Arial Narrow Bold",sans-serif;font-weight:bold}.navbar .navbar-inner{border-bottom:2px solid #eee;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar .brand{padding:19px 20px 21px;font-size:24px;font-weight:bold;text-shadow:none;text-transform:uppercase}.navbar .nav>li>a{padding:20px 10px 20px;font-size:18px;text-shadow:none;text-transform:uppercase}.navbar .nav>.active>a{background-color:transparent}.navbar .navbar-text{padding-right:10px;padding-left:10px;margin-top:20px;font-size:18px;line-height:20px}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar .divider-vertical{border-right-color:#eee;border-left-color:#eee}.navbar .dropdown-menu{top:85%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar .dropdown-menu a{font-size:15px;font-weight:bold}.navbar .navbar-search .search-query,.navbar .navbar-search .search-query:hover{color:#777;border:2px solid #eee}.navbar .navbar-search .search-query:-moz-placeholder,.navbar .navbar-search .search-query:hover:-moz-placeholder{color:#999}.navbar .navbar-search .search-query:-ms-input-placeholder,.navbar .navbar-search .search-query:hover:-ms-input-placeholder{color:#999}.navbar .navbar-search .search-query::-webkit-input-placeholder,.navbar .navbar-search .search-query:hover::-webkit-input-placeholder{color:#999}@media(max-width:979px){.nav-collapse .navbar-form,.nav-collapse .navbar-search{margin-bottom:0;border-top:2px solid #eee;border-bottom:2px solid #eee}.navbar .nav-collapse .nav li>a{color:#000}.navbar .nav-collapse .nav li>a:hover{background-color:#eee}.navbar .nav-collapse .navbar-text{margin-top:0}.navbar-inverse .nav-collapse .nav li>a{color:#bbb}.navbar-inverse .nav-collapse .nav li>a:hover{background-color:#111;background-image:none}}div.subnav{height:54px;margin:0 1px;background:#fff none;border:2px solid #eee;border-right:0;border-left:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}div.subnav.subnav-fixed{top:61px;margin:0;border-top:0}div.subnav .nav>li>a,div.subnav .nav>li:first-child>a,div.subnav .nav>li.active>a{padding:20px 15px;font-family:"News Cycle","Arial Narrow Bold",sans-serif;font-size:15px;font-weight:bold;color:#000;background-color:transparent;border-right:0;border-left:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}div.subnav .nav>li>a:hover,div.subnav .nav>li:first-child>a:hover,div.subnav .nav>li.active>a:hover{padding:20px 15px;color:#000;background-color:transparent;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}div.subnav li.dropdown>.dropdown-toggle .caret,div.subnav li.dropdown>.dropdown-toggle:hover .caret,div.subnav li.dropdown.open>.dropdown-toggle .caret{border-top-color:#000;border-bottom-color:#000;opacity:1}div.subnav li.dropdown.open .dropdown-toggle,div.subnav li.dropdown.open .dropdown-toggle:hover{color:#000;background-color:#fff}[class^="icon-"],[class*=" icon-"]{vertical-align:baseline}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#141414;*background-color:#000;background-image:-moz-linear-gradient(top,#222,#000);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#000));background-image:-webkit-linear-gradient(top,#222,#000);background-image:-o-linear-gradient(top,#222,#000);background-image:linear-gradient(to bottom,#222,#000);background-repeat:repeat-x;border-color:#000 #000 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff000000',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#000;*background-color:#000}.btn-inverse:active,.btn-inverse.active{background-color:#000 \9}.table-bordered{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}legend{font-family:"News Cycle","Arial Narrow Bold",sans-serif;font-weight:bold;color:#000;border-bottom:2px solid #eee}.well{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.hero-unit{padding:30px 60px;border:1px solid rgba(0,0,0,0.05);-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.hero-unit h1{margin:0 0 10px;line-height:1.2}.modal{background:#fff;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.modal-header{border-bottom:0}.modal-footer{background:transparent;border-top:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.close,.close:hover{border-bottom:0}@media(max-width:768px){div.subnav{height:auto}div.subnav .nav>li.active>a{border-top:0}div.subnav .nav>li:hover>a,div.subnav .nav>li:first-child:hover>a,div.subnav .nav>li.active:hover>a,div.subnav .nav>li.dropdown.open .dropdown-toggle,div.subnav .nav>li.dropdown.open .dropdown-toggle:hover{background-color:#eee}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover{border-color:#e5e5e5}}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} diff --git a/flask_admin/static/bootstrap/bootstrap2/swatch/readable/bootstrap.min.css b/flask_admin/static/bootstrap/bootstrap2/swatch/readable/bootstrap.min.css deleted file mode 100644 index 0efc48fb6..000000000 --- a/flask_admin/static/bootstrap/bootstrap2/swatch/readable/bootstrap.min.css +++ /dev/null @@ -1,9 +0,0 @@ -@import url('//fonts.googleapis.com/css?family=Lora:400,700,400italic,700italic');/*! - * Bootstrap v2.3.2 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:36px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!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) ")"}.ir a:after,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}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Lora",Georgia,"Times New Roman",Times,serif;font-size:17px;line-height:26px;color:#333;background-color:#f6f6f6}a{color:#e78b24;text-decoration:none}a:hover,a:focus{color:#da7e18;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:36px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 13px}.lead{margin-bottom:26px;font-size:25.5px;font-weight:200;line-height:39px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#e78b24}a.text-warning:hover,a.text-warning:focus{color:#c37115}.text-error{color:#9c0001}a.text-error:hover,a.text-error:focus{color:#690001}.text-info{color:#0063ac}a.text-info:hover,a.text-info:focus{color:#004679}.text-success{color:#1c9b47}a.text-success:hover,a.text-success:focus{color:#147033}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:13px 0;font-family:inherit;font-weight:bold;line-height:26px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:52px}h1{font-size:46.75px}h2{font-size:38.25px}h3{font-size:29.75px}h4{font-size:21.25px}h5{font-size:17px}h6{font-size:14.45px}h1 small{font-size:29.75px}h2 small{font-size:21.25px}h3 small{font-size:17px}h4 small{font-size:17px}.page-header{padding-bottom:12px;margin:26px 0 39px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 13px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:26px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:26px}dt,dd{line-height:26px}dt{font-weight:bold}dd{margin-left:13px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:26px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 26px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:21.25px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:26px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:26px;font-style:normal;line-height:26px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:15px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:12.5px;margin:0 0 13px;font-size:16px;line-height:26px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:26px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 26px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:26px;font-size:25.5px;line-height:52px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:19.5px;color:#999}label,input,button,select,textarea{font-size:17px;font-weight:normal;line-height:26px}input,button,select,textarea{font-family:"Lora",Georgia,"Times New Roman",Times,serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:26px;padding:4px 6px;margin-bottom:13px;font-size:17px;line-height:26px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:36px;*margin-top:4px;line-height:36px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:26px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#e78b24}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#e78b24}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#e78b24;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#c37115;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f1bc80;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f1bc80;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f1bc80}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#e78b24;background-color:#fcf8e3;border-color:#e78b24}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#9c0001}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#9c0001}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#9c0001;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#690001;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ff0305;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ff0305;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ff0305}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#9c0001;background-color:#f2dede;border-color:#9c0001}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#1c9b47}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#1c9b47}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#1c9b47;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#147033;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #40dd75;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #40dd75;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #40dd75}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#1c9b47;background-color:#dff0d8;border-color:#1c9b47}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#0063ac}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#0063ac}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#0063ac;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#004679;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #139bff;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #139bff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #139bff}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#0063ac;background-color:#d9edf7;border-color:#0063ac}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:25px 20px 26px;margin-top:26px;margin-bottom:26px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:13px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:13px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:17px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:26px;min-width:16px;padding:4px 5px;font-size:17px;font-weight:normal;line-height:26px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#6ce495;border-color:#1c9b47}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:13px}legend+.control-group{margin-top:26px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:26px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:13px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:26px}.table th,.table td{padding:8px;line-height:26px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#f6f6f6}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.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 td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.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;background-color:#f6f6f6;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:12px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:26px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#e2861f;background-image:-moz-linear-gradient(top,#e78b24,#da7e18);background-image:-webkit-gradient(linear,0 0,0 100%,from(#e78b24),to(#da7e18));background-image:-webkit-linear-gradient(top,#e78b24,#da7e18);background-image:-o-linear-gradient(top,#e78b24,#da7e18);background-image:linear-gradient(to bottom,#e78b24,#da7e18);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe78b24',endColorstr='#ffda7e18',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#e2861f;background-image:-moz-linear-gradient(top,#e78b24,#da7e18);background-image:-webkit-gradient(linear,0 0,0 100%,from(#e78b24),to(#da7e18));background-image:-webkit-linear-gradient(top,#e78b24,#da7e18);background-image:-o-linear-gradient(top,#e78b24,#da7e18);background-image:linear-gradient(to bottom,#e78b24,#da7e18);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe78b24',endColorstr='#ffda7e18',GradientType=0)}.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;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#c3c3c3;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#fefefe;border:1px solid #ececec;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:26px;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:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:17px;line-height:26px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#e9e9e9;*background-color:#e1e1e1;background-image:-moz-linear-gradient(top,#eee,#e1e1e1);background-image:-webkit-gradient(linear,0 0,0 100%,from(#eee),to(#e1e1e1));background-image:-webkit-linear-gradient(top,#eee,#e1e1e1);background-image:-o-linear-gradient(top,#eee,#e1e1e1);background-image:linear-gradient(to bottom,#eee,#e1e1e1);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e1e1e1 #e1e1e1 #bbb;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffeeeeee',endColorstr='#ffe1e1e1',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e1e1e1;*background-color:#d4d4d4}.btn:active,.btn.active{background-color:#c8c8c8 \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:21.25px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:14.45px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:12.75px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#e99232;*background-color:#e78b24;background-image:-moz-linear-gradient(top,#ea973b,#e78b24);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ea973b),to(#e78b24));background-image:-webkit-linear-gradient(top,#ea973b,#e78b24);background-image:-o-linear-gradient(top,#ea973b,#e78b24);background-image:linear-gradient(to bottom,#ea973b,#e78b24);background-repeat:repeat-x;border-color:#e78b24 #e78b24 #ac6413;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffea973b',endColorstr='#ffe78b24',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#e78b24;*background-color:#da7e18}.btn-primary:active,.btn-primary.active{background-color:#c37115 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#f8d91c;*background-color:#f8d60d;background-image:-moz-linear-gradient(top,#f9da26,#f8d60d);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f9da26),to(#f8d60d));background-image:-webkit-linear-gradient(top,#f9da26,#f8d60d);background-image:-o-linear-gradient(top,#f9da26,#f8d60d);background-image:linear-gradient(to bottom,#f9da26,#f8d60d);background-repeat:repeat-x;border-color:#f8d60d #f8d60d #b39a05;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9da26',endColorstr='#fff8d60d',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f8d60d;*background-color:#e5c507}.btn-warning:active,.btn-warning.active{background-color:#ccaf06 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ab0001;*background-color:#9c0001;background-image:-moz-linear-gradient(top,#b60001,#9c0001);background-image:-webkit-gradient(linear,0 0,0 100%,from(#b60001),to(#9c0001));background-image:-webkit-linear-gradient(top,#b60001,#9c0001);background-image:-o-linear-gradient(top,#b60001,#9c0001);background-image:linear-gradient(to bottom,#b60001,#9c0001);background-repeat:repeat-x;border-color:#9c0001 #9c0001 #500001;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffb60001',endColorstr='#ff9c0001',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#9c0001;*background-color:#830001}.btn-danger:active,.btn-danger.active{background-color:#690001 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#1ea84d;*background-color:#1c9b47;background-image:-moz-linear-gradient(top,#20b151,#1c9b47);background-image:-webkit-gradient(linear,0 0,0 100%,from(#20b151),to(#1c9b47));background-image:-webkit-linear-gradient(top,#20b151,#1c9b47);background-image:-o-linear-gradient(top,#20b151,#1c9b47);background-image:linear-gradient(to bottom,#20b151,#1c9b47);background-repeat:repeat-x;border-color:#1c9b47 #1c9b47 #105a29;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff20b151',endColorstr='#ff1c9b47',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#1c9b47;*background-color:#18853d}.btn-success:active,.btn-success.active{background-color:#147033 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006cbb;*background-color:#0063ac;background-image:-moz-linear-gradient(top,#0072c6,#0063ac);background-image:-webkit-gradient(linear,0 0,0 100%,from(#0072c6),to(#0063ac));background-image:-webkit-linear-gradient(top,#0072c6,#0063ac);background-image:-o-linear-gradient(top,#0072c6,#0063ac);background-image:linear-gradient(to bottom,#0072c6,#0063ac);background-repeat:repeat-x;border-color:#0063ac #0063ac #003760;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0072c6',endColorstr='#ff0063ac',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#0063ac;*background-color:#005493}.btn-info:active,.btn-info.active{background-color:#004679 \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#3b3b3b;*background-color:#333;background-image:-moz-linear-gradient(top,#404040,#333);background-image:-webkit-gradient(linear,0 0,0 100%,from(#404040),to(#333));background-image:-webkit-linear-gradient(top,#404040,#333);background-image:-o-linear-gradient(top,#404040,#333);background-image:linear-gradient(to bottom,#404040,#333);background-repeat:repeat-x;border-color:#333 #333 #0d0d0d;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff404040',endColorstr='#ff333333',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#333;*background-color:#262626}.btn-inverse:active,.btn-inverse.active{background-color:#1a1a1a \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#e78b24;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#da7e18;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:13px;margin-bottom:13px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:17px}.btn-group>.btn-mini{font-size:12.75px}.btn-group>.btn-small{font-size:14.45px}.btn-group>.btn-large{font-size:21.25px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e1e1e1}.btn-group.open .btn-primary.dropdown-toggle{background-color:#e78b24}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f8d60d}.btn-group.open .btn-danger.dropdown-toggle{background-color:#9c0001}.btn-group.open .btn-success.dropdown-toggle{background-color:#1c9b47}.btn-group.open .btn-info.dropdown-toggle{background-color:#0063ac}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#333}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:26px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#e78b24}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:26px}.alert-success{color:#1c9b47;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#1c9b47}.alert-danger,.alert-error{color:#9c0001;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#9c0001}.alert-info{color:#0063ac;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#0063ac}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:26px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:26px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#e78b24}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:12px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:26px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#f6f6f6;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#e78b24}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#e78b24;border-bottom-color:#e78b24}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#da7e18;border-bottom-color:#da7e18}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:26px;overflow:visible}.navbar-inner{min-height:60px;padding-right:20px;padding-left:20px;background-color:#f6f6f6;background-image:-moz-linear-gradient(top,#f6f6f6,#f6f6f6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f6f6f6),to(#f6f6f6));background-image:-webkit-linear-gradient(top,#f6f6f6,#f6f6f6);background-image:-o-linear-gradient(top,#f6f6f6,#f6f6f6);background-image:linear-gradient(to bottom,#f6f6f6,#f6f6f6);background-repeat:repeat-x;border:1px solid #d7d7d7;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff6f6f6',endColorstr='#fff6f6f6',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:17px 20px 17px;margin-left:-20px;font-size:20px;font-weight:200;color:#333;text-shadow:0 1px 0 #f6f6f6}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:60px;color:#333}.navbar-link{color:#333}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:60px;margin:0 9px;border-right:1px solid #f6f6f6;border-left:1px solid #f6f6f6}.navbar .btn,.navbar .btn-group{margin-top:15px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:15px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:15px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:17px 15px 17px;color:#333;text-decoration:none;text-shadow:0 1px 0 #f6f6f6}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#333;text-decoration:none;background-color:#e9e9e9;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#e9e9e9;*background-color:#e9e9e9;background-image:-moz-linear-gradient(top,#e9e9e9,#e9e9e9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#e9e9e9),to(#e9e9e9));background-image:-webkit-linear-gradient(top,#e9e9e9,#e9e9e9);background-image:-o-linear-gradient(top,#e9e9e9,#e9e9e9);background-image:linear-gradient(to bottom,#e9e9e9,#e9e9e9);background-repeat:repeat-x;border-color:#e9e9e9 #e9e9e9 #c3c3c3;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe9e9e9',endColorstr='#ffe9e9e9',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e9e9e9;*background-color:#dcdcdc}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#d0d0d0 \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #f6f6f6;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #f6f6f6;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#333;background-color:#e9e9e9}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#333;border-bottom-color:#333}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#333;background-image:-moz-linear-gradient(top,#333,#333);background-image:-webkit-gradient(linear,0 0,0 100%,from(#333),to(#333));background-image:-webkit-linear-gradient(top,#333,#333);background-image:-o-linear-gradient(top,#333,#333);background-image:linear-gradient(to bottom,#333,#333);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff333333',endColorstr='#ff333333',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#333}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#333;border-left-color:#333}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#333}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#737373;border-color:#333;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#262626;*background-color:#262626;background-image:-moz-linear-gradient(top,#262626,#262626);background-image:-webkit-gradient(linear,0 0,0 100%,from(#262626),to(#262626));background-image:-webkit-linear-gradient(top,#262626,#262626);background-image:-o-linear-gradient(top,#262626,#262626);background-image:linear-gradient(to bottom,#262626,#262626);background-repeat:repeat-x;border-color:#262626 #262626 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff262626',endColorstr='#ff262626',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#262626;*background-color:#1a1a1a}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#0d0d0d \9}.breadcrumb{padding:8px 15px;margin:0 0 26px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:26px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:26px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:21.25px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:14.45px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:12.75px}.pager{margin:26px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.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;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;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-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.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{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:26px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:26px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#e78b24;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;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{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:14.382px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#9c0001}.label-important[href],.badge-important[href]{background-color:#690001}.label-warning,.badge-warning{background-color:#e78b24}.label-warning[href],.badge-warning[href]{background-color:#c37115}.label-success,.badge-success{background-color:#1c9b47}.label-success[href],.badge-success[href]{background-color:#147033}.label-info,.badge-info{background-color:#0063ac}.label-info[href],.badge-info[href]{background-color:#004679}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:26px;margin-bottom:26px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#eca14d;background-image:-moz-linear-gradient(top,#efb069,#e78b24);background-image:-webkit-gradient(linear,0 0,0 100%,from(#efb069),to(#e78b24));background-image:-webkit-linear-gradient(top,#efb069,#e78b24);background-image:-o-linear-gradient(top,#efb069,#e78b24);background-image:linear-gradient(to bottom,#efb069,#e78b24);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffefb069',endColorstr='#ffe78b24',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#efb069;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:26px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:26px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;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:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:26px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:39px;color:inherit;background-color:#fefefe;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:39px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}div.subnav .nav>li>a,div.subnav .nav>.active>a,div.subnav .nav>.active>a:hover{color:#333}div.subnav-fixed{top:61px}.hero-unit h1,.hero-unit h2,.hero-unit h3,.hero-unit h4,.hero-unit h5,.hero-unit h6{margin:13px 0}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} diff --git a/flask_admin/static/bootstrap/bootstrap2/swatch/simplex/bootstrap.min.css b/flask_admin/static/bootstrap/bootstrap2/swatch/simplex/bootstrap.min.css deleted file mode 100644 index a3e828f3c..000000000 --- a/flask_admin/static/bootstrap/bootstrap2/swatch/simplex/bootstrap.min.css +++ /dev/null @@ -1,9 +0,0 @@ -@import url('//fonts.googleapis.com/css?family=Josefin+Sans:300,400,700');/*! - * Bootstrap v2.3.2 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!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) ")"}.ir a:after,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}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#555;background-color:#f7f7f7}a{color:#d9230f;text-decoration:none}a:hover,a:focus{color:#d9230f;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#d9831f}a.text-warning:hover,a.text-warning:focus{color:#ac6819}.text-error{color:#d9230f}a.text-error:hover,a.text-error:focus{color:#a91b0c}.text-info{color:#029acf}a.text-info:hover,a.text-info:focus{color:#02749c}.text-success{color:#3d9400}a.text-success:hover,a.text-success:focus{color:#286100}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:"Josefin Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#d9831f}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#d9831f}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#d9831f;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#ac6819;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ebb473;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ebb473;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ebb473}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#d9831f;background-color:#fcf8e3;border-color:#d9831f}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#d9230f}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#d9230f}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#d9230f;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#a91b0c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f46a5a;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f46a5a;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f46a5a}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#d9230f;background-color:#f2dede;border-color:#d9230f}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#3d9400}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#3d9400}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#3d9400;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#286100;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67fa00;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67fa00;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67fa00}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#3d9400;background-color:#dff0d8;border-color:#3d9400}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#029acf}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#029acf}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#029acf;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#02749c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #3acbfd;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #3acbfd;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #3acbfd}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#029acf;background-color:#d9edf7;border-color:#029acf}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#7b7b7b}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#84ff2e;border-color:#3d9400}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#f7f7f7}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topleft:0}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-topright:0}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topleft:0}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-topright:0}.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 td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.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;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#555;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#555;text-decoration:none;background-color:#f9e3e0;background-image:-moz-linear-gradient(top,#fbebe9,#f7d7d3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbebe9),to(#f7d7d3));background-image:-webkit-linear-gradient(top,#fbebe9,#f7d7d3);background-image:-o-linear-gradient(top,#fbebe9,#f7d7d3);background-image:linear-gradient(to bottom,#fbebe9,#f7d7d3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbebe9',endColorstr='#fff7d7d3',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#555;text-decoration:none;background-color:#cf210e;background-image:-moz-linear-gradient(top,#d9230f,#c11f0d);background-image:-webkit-gradient(linear,0 0,0 100%,from(#d9230f),to(#c11f0d));background-image:-webkit-linear-gradient(top,#d9230f,#c11f0d);background-image:-o-linear-gradient(top,#d9230f,#c11f0d);background-image:linear-gradient(to bottom,#d9230f,#c11f0d);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9230f',endColorstr='#ffc11f0d',GradientType=0)}.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;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#555}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#fff;border:1px solid #ededed;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;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:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#e62611;*background-color:#d9230f;background-image:-moz-linear-gradient(top,#ef2913,#d9230f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ef2913),to(#d9230f));background-image:-webkit-linear-gradient(top,#ef2913,#d9230f);background-image:-o-linear-gradient(top,#ef2913,#d9230f);background-image:linear-gradient(to bottom,#ef2913,#d9230f);background-repeat:repeat-x;border-color:#d9230f #d9230f #91170a;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffef2913',endColorstr='#ffd9230f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#d9230f;*background-color:#c11f0d}.btn-primary:active,.btn-primary.active{background-color:#a91b0c \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ffce36;*background-color:#ffca27;background-image:-moz-linear-gradient(top,#ffd041,#ffca27);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ffd041),to(#ffca27));background-image:-webkit-linear-gradient(top,#ffd041,#ffca27);background-image:-o-linear-gradient(top,#ffd041,#ffca27);background-image:linear-gradient(to bottom,#ffd041,#ffca27);background-repeat:repeat-x;border-color:#ffca27 #ffca27 #d9a400;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffd041',endColorstr='#ffffca27',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#ffca27;*background-color:#ffc40d}.btn-warning:active,.btn-warning.active{background-color:#f3b700 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#e62611;*background-color:#d9230f;background-image:-moz-linear-gradient(top,#ef2913,#d9230f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ef2913),to(#d9230f));background-image:-webkit-linear-gradient(top,#ef2913,#d9230f);background-image:-o-linear-gradient(top,#ef2913,#d9230f);background-image:linear-gradient(to bottom,#ef2913,#d9230f);background-repeat:repeat-x;border-color:#d9230f #d9230f #91170a;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffef2913',endColorstr='#ffd9230f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#d9230f;*background-color:#c11f0d}.btn-danger:active,.btn-danger.active{background-color:#a91b0c \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#43a300;*background-color:#3d9400;background-image:-moz-linear-gradient(top,#48ae00,#3d9400);background-image:-webkit-gradient(linear,0 0,0 100%,from(#48ae00),to(#3d9400));background-image:-webkit-linear-gradient(top,#48ae00,#3d9400);background-image:-o-linear-gradient(top,#48ae00,#3d9400);background-image:linear-gradient(to bottom,#48ae00,#3d9400);background-repeat:repeat-x;border-color:#3d9400 #3d9400 #1d4800;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff48ae00',endColorstr='#ff3d9400',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#3d9400;*background-color:#327b00}.btn-success:active,.btn-success.active{background-color:#286100 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#68c5e1;*background-color:#5bc0de;background-image:-moz-linear-gradient(top,#70c8e2,#5bc0de);background-image:-webkit-gradient(linear,0 0,0 100%,from(#70c8e2),to(#5bc0de));background-image:-webkit-linear-gradient(top,#70c8e2,#5bc0de);background-image:-o-linear-gradient(top,#70c8e2,#5bc0de);background-image:linear-gradient(to bottom,#70c8e2,#5bc0de);background-repeat:repeat-x;border-color:#5bc0de #5bc0de #28a1c5;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff70c8e2',endColorstr='#ff5bc0de',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#5bc0de;*background-color:#46b8da}.btn-info:active,.btn-info.active{background-color:#31b0d5 \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#454545;*background-color:#2c2c2c;background-image:-moz-linear-gradient(top,#555,#2c2c2c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#555),to(#2c2c2c));background-image:-webkit-linear-gradient(top,#555,#2c2c2c);background-image:-o-linear-gradient(top,#555,#2c2c2c);background-image:linear-gradient(to bottom,#555,#2c2c2c);background-repeat:repeat-x;border-color:#2c2c2c #2c2c2c #060606;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff555555',endColorstr='#ff2c2c2c',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#2c2c2c;*background-color:#1f1f1f}.btn-inverse:active,.btn-inverse.active{background-color:#121212 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#d9230f;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#d9230f;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topleft:0}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:0;border-top-right-radius:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#d9230f}.btn-group.open .btn-warning.dropdown-toggle{background-color:#ffca27}.btn-group.open .btn-danger.dropdown-toggle{background-color:#d9230f}.btn-group.open .btn-success.dropdown-toggle{background-color:#3d9400}.btn-group.open .btn-info.dropdown-toggle{background-color:#5bc0de}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#2c2c2c}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.alert,.alert h4{color:#d9831f}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#3d9400;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#3d9400}.alert-danger,.alert-error{color:#d9230f;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#d9230f}.alert-info{color:#029acf;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#029acf}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#d9230f}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#f7f7f7;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#d9230f}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#d9230f;border-bottom-color:#d9230f}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#d9230f;border-bottom-color:#d9230f}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fefefe;background-image:-moz-linear-gradient(top,#fefefe,#fefefe);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fefefe),to(#fefefe));background-image:-webkit-linear-gradient(top,#fefefe,#fefefe);background-image:-o-linear-gradient(top,#fefefe,#fefefe);background-image:linear-gradient(to bottom,#fefefe,#fefefe);background-repeat:repeat-x;border:1px solid #dfdfdf;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffefefe',endColorstr='#fffefefe',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:inherit;text-shadow:0 1px 0 #fefefe}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#555}.navbar-link{color:#555}.navbar-link:hover,.navbar-link:focus{color:#d9230f}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fefefe;border-left:1px solid #fefefe}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#555;text-decoration:none;text-shadow:0 1px 0 #fefefe}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#d9230f;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#d9230f;text-decoration:none;background-color:#fefefe;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#f1f1f1;*background-color:#f1f1f1;background-image:-moz-linear-gradient(top,#f1f1f1,#f1f1f1);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f1f1f1),to(#f1f1f1));background-image:-webkit-linear-gradient(top,#f1f1f1,#f1f1f1);background-image:-o-linear-gradient(top,#f1f1f1,#f1f1f1);background-image:linear-gradient(to bottom,#f1f1f1,#f1f1f1);background-repeat:repeat-x;border-color:#f1f1f1 #f1f1f1 #cbcbcb;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff1f1f1',endColorstr='#fff1f1f1',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#f1f1f1;*background-color:#e4e4e4}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#d8d8d8 \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#d9230f;border-bottom-color:#d9230f}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#d9230f;background-color:#fefefe}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#d9230f;border-bottom-color:#d9230f}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#e62914;background-image:-moz-linear-gradient(top,#ef2d18,#d9230f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ef2d18),to(#d9230f));background-image:-webkit-linear-gradient(top,#ef2d18,#d9230f);background-image:-o-linear-gradient(top,#ef2d18,#d9230f);background-image:linear-gradient(to bottom,#ef2d18,#d9230f);background-repeat:repeat-x;border-color:#f03621;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffef2d18',endColorstr='#ffd9230f',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#fff}.navbar-inverse .navbar-text{color:#fff}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#d9230f}.navbar-inverse .navbar-link{color:#fff}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#ef2d18;border-left-color:#d9230f}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#d9230f}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#f57f72;border-color:#d9230f;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#fff}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#fff}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#fff}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#d2220f;*background-color:#c11f0d;background-image:-moz-linear-gradient(top,#de240f,#c11f0d);background-image:-webkit-gradient(linear,0 0,0 100%,from(#de240f),to(#c11f0d));background-image:-webkit-linear-gradient(top,#de240f,#c11f0d);background-image:-o-linear-gradient(top,#de240f,#c11f0d);background-image:linear-gradient(to bottom,#de240f,#c11f0d);background-repeat:repeat-x;border-color:#c11f0d #c11f0d #7a1408;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffde240f',endColorstr='#ffc11f0d',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#c11f0d;*background-color:#a91b0c}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#91170a \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#fbebe9}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topleft:0}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:0;border-top-right-radius:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.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;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.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-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.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{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#d9230f;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;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{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#d9230f}.label-important[href],.badge-important[href]{background-color:#a91b0c}.label-warning,.badge-warning{background-color:#d9831f}.label-warning[href],.badge-warning[href]{background-color:#ac6819}.label-success,.badge-success{background-color:#3d9400}.label-success[href],.badge-success[href]{background-color:#286100}.label-info,.badge-info{background-color:#029acf}.label-info[href],.badge-info[href]{background-color:#02749c}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#e29944;background-image:-moz-linear-gradient(top,#e8a75d,#d9831f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#e8a75d),to(#d9831f));background-image:-webkit-linear-gradient(top,#e8a75d,#d9831f);background-image:-o-linear-gradient(top,#e8a75d,#d9831f);background-image:linear-gradient(to bottom,#e8a75d,#d9831f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8a75d',endColorstr='#ffd9831f',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#e8a75d;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;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:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#2c2c2c;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}hr{border-bottom:0}.navbar .navbar-inner{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar .brand{padding:12px 20px 8px;font-family:"Josefin Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:bold}.navbar .brand:hover{color:#d9230f}.navbar .nav>li>a{padding:13px 15px 6px;font-family:"Josefin Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:bold;text-shadow:none}.navbar .nav>li>a:hover{text-decoration:none}.navbar .nav .active>a,.navbar .nav .active>a:hover{background-color:transparent}.navbar .navbar-text{padding:13px 15px 7px;font-family:"Josefin Sans","Helvetica Neue",Helvetica,Arial,sans-serif;line-height:19px;color:#999}.navbar .divider-vertical{height:39px;background-color:#eee}.navbar .navbar-search{margin-top:5px}.navbar .navbar-search input[type="text"]{margin-bottom:5px}.navbar .dropdown-menu a{font-family:"Josefin Sans","Helvetica Neue",Helvetica,Arial,sans-serif}.navbar-inverse .navbar-inner{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar-inverse .brand:hover{color:#fff}@media(max-width:979px){.navbar .nav-collapse .nav li>a{color:#555}.navbar .nav-collapse .nav li>a:hover{background-color:#fbebe9;background-image:none}.navbar .nav-collapse .nav .active>a{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar .nav-collapse .navbar-form,.navbar .nav-collapse .navbar-search{border-top:1px solid rgba(128,128,128,0.3);border-bottom:1px solid rgba(128,128,128,0.3)}.navbar-inverse .nav-collapse .nav li>a{color:#fff}.navbar-inverse .nav-collapse .nav li>a:hover{background-color:rgba(255,255,255,0.1)!important}.navbar-inverse .nav-collapse .nav-header{color:rgba(255,255,255,0.7)}}div.subnav{font-family:"Josefin Sans","Helvetica Neue",Helvetica,Arial,sans-serif;background-color:#fefefe;background-image:none;border-bottom:1px solid transparent;-webkit-box-shadow:1px 1px 1px rgba(0,0,0,0.2);-moz-box-shadow:1px 1px 1px rgba(0,0,0,0.2);box-shadow:1px 1px 1px rgba(0,0,0,0.2)}div.subnav.subnav-fixed{top:41px;-webkit-box-shadow:inset 0 5px #fff,1px 1px 1px rgba(0,0,0,0.2);-moz-box-shadow:inset 0 5px #fff,1px 1px 1px rgba(0,0,0,0.2);box-shadow:inset 0 5px #fff,1px 1px 1px rgba(0,0,0,0.2)}div.subnav .nav>li>a{padding:14px 12px 10px;font-weight:bold;color:#555;border-right-color:transparent;border-left-color:transparent}div.subnav .nav>li>a:hover{color:#d9230f;background-color:transparent}div.subnav .nav>li.active>a,div.subnav .nav>li.active>a:hover{color:#d9230f;background-color:transparent;border-right-color:transparent;border-left-color:transparent;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav .nav-header{font-size:13px;font-weight:normal;text-transform:none}.nav-tabs>li>a{color:#555;background-color:#efefef;border:1px solid #ccc}.nav-tabs>li>a:hover{color:#d9230f;background-color:#fbebe9;border:1px solid #ccc}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover{background-color:#f7f7f7}.nav-tabs>li.disabled>a:hover{color:#999;background-color:#efefef}.nav-tabs .dropdown .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555;opacity:1}.nav-tabs .dropdown:hover .dropdown-toggle .caret{border-top-color:#d9230f;border-bottom-color:#d9230f}.nav-tabs .dropdown.open .dropdown-toggle{color:#d9230f;background-color:#fbebe9;border-color:#ccc}.nav-tabs .dropdown.open .dropdown-toggle .caret,.nav-tabs .dropdown.open .dropdown-toggle:hover .caret{border-top-color:#d9230f;border-bottom-color:#d9230f;opacity:1}.nav-tabs .dropdown-menu{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs .dropdown-menu a{padding:8px 15px 3px}.tabbable .nav-tabs>li>a,.tabbable .nav-tabs>li>a:hover{border:1px solid #ccc}.tabbable .nav-tabs>li.active>a{border-bottom:1px solid transparent}.tabbable.tabs-below>.nav-tabs>li.active>a,.tabbable.tabs-left>.nav-tabs>li.active>a,.tabbable.tabs-right>.nav-tabs>li.active>a{border-bottom:1px solid #ccc}.nav-pills li>a{color:#555}.nav-pills li>a:hover{color:#d9230f;background-color:#fbebe9}.nav-pills li.active>a,.nav-pills li.active>a:hover{color:#d9230f;background-color:#fbebe9}.nav-pills>li.disabled>a:hover{color:#999}.nav-pills .dropdown .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555;opacity:1}.nav-pills .dropdown .dropdown-toggle:hover .caret{border-top-color:#d9230f;border-bottom-color:#d9230f}.nav-pills .dropdown.open .dropdown-toggle,.nav-pills .dropdown.open:hover .dropdown-toggle{color:#d9230f;background-color:#fbebe9}.nav-pills .dropdown.open .dropdown-toggle .caret,.nav-pills .dropdown.open:hover .dropdown-toggle .caret{border-top-color:#d9230f;border-bottom-color:#d9230f}.nav-list li>a{color:#555}.nav-list li>a:hover{color:#d9230f;background-color:#fbebe9}.nav-list li.active>a,.nav-list li.active>a:hover{color:#d9230f;background-color:#fbebe9}.breadcrumb{background-color:#fff;border:0 solid transparent;-webkit-box-shadow:1px 1px 1px rgba(0,0,0,0.2),-1px -1px 0 rgba(0,0,0,0.1);-moz-box-shadow:1px 1px 1px rgba(0,0,0,0.2),-1px -1px 0 rgba(0,0,0,0.1);box-shadow:1px 1px 1px rgba(0,0,0,0.2),-1px -1px 0 rgba(0,0,0,0.1)}.breadcrumb li{padding-top:2px;text-shadow:none}.breadcrumb .active{color:#555}.breadcrumb a{text-shadow:none}.breadcrumb a:hover{text-decoration:none}.pagination ul>li>a,.pagination ul>li>span{padding:2px 14px 0;color:#555}.pagination ul>li>a:hover,.pagination ul>li>span:hover{color:#d9230f;background-color:#fbebe9}.pagination ul>.active>a,.pagination ul>.active>span{color:#d9230f;background-color:#fbebe9}.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>span,.pagination ul>.disabled>span:hover{color:#555;background-color:transparent}.btn{padding-top:.6em;font-family:"Josefin Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:bold}legend{font-family:"Josefin Sans","Helvetica Neue",Helvetica,Arial,sans-serif;border-bottom:1px solid #ddd}.navbar-search .search-query{color:#555;background-color:#f7f7f7;border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.help-inline,.help-block{font-size:13px}.input-append .btn,.input-prepend .btn{line-height:16px}.label{padding:6px 12px;margin-right:1px;margin-left:1px}i[class^="icon-"]{vertical-align:-2px;opacity:.5}.well{border:0;-webkit-box-shadow:1px 1px 1px rgba(0,0,0,0.2),-1px -1px 0 rgba(0,0,0,0.1);-moz-box-shadow:1px 1px 1px rgba(0,0,0,0.2),-1px -1px 0 rgba(0,0,0,0.1);box-shadow:1px 1px 1px rgba(0,0,0,0.2),-1px -1px 0 rgba(0,0,0,0.1)}.hero-unit{background-color:#fefefe;-webkit-box-shadow:1px 1px 1px rgba(0,0,0,0.2),-1px -1px 0 rgba(0,0,0,0.1);-moz-box-shadow:1px 1px 1px rgba(0,0,0,0.2),-1px -1px 0 rgba(0,0,0,0.1);box-shadow:1px 1px 1px rgba(0,0,0,0.2),-1px -1px 0 rgba(0,0,0,0.1)}.thumbnail{padding:10px;background-color:#fff}.progress{background-color:#e3e3e3;background-image:-moz-linear-gradient(top,#e0e0e0,#e8e8e8);background-image:-webkit-gradient(linear,0 0,0 100%,from(#e0e0e0),to(#e8e8e8));background-image:-webkit-linear-gradient(top,#e0e0e0,#e8e8e8);background-image:-o-linear-gradient(top,#e0e0e0,#e8e8e8);background-image:linear-gradient(to bottom,#e0e0e0,#e8e8e8);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe0e0e0',endColorstr='#ffe8e8e8',GradientType=0)}.modal-header{border-bottom:0}.modal-header,.modal-body{background-color:#fefefe}.modal-footer{background-color:#f7f7f7}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} diff --git a/flask_admin/static/bootstrap/bootstrap2/swatch/slate/bootstrap.min.css b/flask_admin/static/bootstrap/bootstrap2/swatch/slate/bootstrap.min.css deleted file mode 100644 index 40746a2af..000000000 --- a/flask_admin/static/bootstrap/bootstrap2/swatch/slate/bootstrap.min.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * Bootstrap v2.3.2 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:31px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!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) ")"}.ir a:after,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}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:21px;color:#c8c8c8;background-color:#272b30}a{color:#fff;text-decoration:none}a:hover,a:focus{color:#fff;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:31px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10.5px}.lead{margin-bottom:21px;font-size:21px;font-weight:200;line-height:31.5px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#7a8288}a.muted:hover,a.muted:focus{color:#62686d}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10.5px 0;font-family:inherit;font-weight:bold;line-height:21px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#7a8288}h1,h2,h3{line-height:42px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9.5px;margin:21px 0 31.5px;border-bottom:1px solid #bbbfc2}ul,ol{padding:0;margin:0 0 10.5px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:21px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:21px}dt,dd{line-height:21px}dt{font-weight:bold}dd{margin-left:10.5px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:21px 0;border:0;border-top:1px solid #1c1e22;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #7a8288}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 21px;border-left:5px solid #bbbfc2}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:21px;color:#7a8288}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #bbbfc2;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:21px;font-style:normal;line-height:21px}code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;font-size:12px;color:#3a3f44;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:10px;margin:0 0 10.5px;font-size:13px;line-height:21px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:21px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 21px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:21px;font-size:21px;line-height:42px;color:#3a3f44;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15.75px;color:#7a8288}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:21px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:21px;padding:4px 6px;margin-bottom:10.5px;font-size:14px;line-height:21px;color:#52575c;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:31px;*margin-top:4px;line-height:31px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#7a8288;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#7a8288}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#7a8288}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#7a8288}.radio,.checkbox{min-height:21px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#bbbfc2}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:20px 20px 21px;margin-top:21px;margin-bottom:21px;background-color:#202328;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#eee}.help-block{display:block;margin-bottom:10.5px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10.5px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:21px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:21px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#bbbfc2;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#d1eed1;border-color:#62c462}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10.5px}legend+.control-group{margin-top:21px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:21px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10.5px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:21px}.table th,.table td{padding:8px;line-height:21px;text-align:left;vertical-align:top;border-top:1px solid #1c1e22}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #1c1e22}.table .table{background-color:#272b30}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #1c1e22;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #1c1e22}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#2e3236}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#3a3f44}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.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;background-color:#3a3f44;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9.5px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:transparent;border-bottom:1px solid #1c1e22}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:21px;color:#7a8288;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#22262a;background-image:-moz-linear-gradient(top,#272b30,#1c1e22);background-image:-webkit-gradient(linear,0 0,0 100%,from(#272b30),to(#1c1e22));background-image:-webkit-linear-gradient(top,#272b30,#1c1e22);background-image:-o-linear-gradient(top,#272b30,#1c1e22);background-image:linear-gradient(to bottom,#272b30,#1c1e22);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff272b30',endColorstr='#ff1c1e22',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#22262a;background-image:-moz-linear-gradient(top,#272b30,#1c1e22);background-image:-webkit-gradient(linear,0 0,0 100%,from(#272b30),to(#1c1e22));background-image:-webkit-linear-gradient(top,#272b30,#1c1e22);background-image:-o-linear-gradient(top,#272b30,#1c1e22);background-image:linear-gradient(to bottom,#272b30,#1c1e22);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff272b30',endColorstr='#ff1c1e22',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#7a8288}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#0b0c0d;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#202328;border:1px solid #101214;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:21px;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:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:21px;color:#3a3f44;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#3a3f44;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#3a3f44;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#bbbec2;*background-color:#bbbdc2;background-image:-moz-linear-gradient(top,#bbbfc2,#bbbdc2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#bbbfc2),to(#bbbdc2));background-image:-webkit-linear-gradient(top,#bbbfc2,#bbbdc2);background-image:-o-linear-gradient(top,#bbbfc2,#bbbdc2);background-image:linear-gradient(to bottom,#bbbfc2,#bbbdc2);background-repeat:repeat-x;border-color:#bbbdc2 #bbbdc2 #93969e;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffbbbfc2',endColorstr='#ffbbbdc2',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#bbbdc2;*background-color:#aeb0b6}.btn-primary:active,.btn-primary.active{background-color:#a0a3aa \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#41454a;*background-color:#272b30;background-image:-moz-linear-gradient(top,#52575c,#272b30);background-image:-webkit-gradient(linear,0 0,0 100%,from(#52575c),to(#272b30));background-image:-webkit-linear-gradient(top,#52575c,#272b30);background-image:-o-linear-gradient(top,#52575c,#272b30);background-image:linear-gradient(to bottom,#52575c,#272b30);background-repeat:repeat-x;border-color:#272b30 #272b30 #050506;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff52575c',endColorstr='#ff272b30',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#272b30;*background-color:#1c1e22}.btn-inverse:active,.btn-inverse.active{background-color:#101214 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#fff;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#fff;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#3a3f44;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10.5px;margin-bottom:10.5px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#bbbdc2}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#272b30}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:21px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:21px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:21px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#bbbfc2}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:21px;color:#7a8288;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#fff}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9.5px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:21px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#bbbfc2 #bbbfc2 #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#52575c;cursor:default;background-color:#272b30;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#fff}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#fff;border-bottom-color:#fff}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#52575c;border-bottom-color:#52575c}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#7a8288;border-color:#7a8288}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#7a8288}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#bbbfc2 #ddd #bbbfc2 #bbbfc2}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#bbbfc2 #bbbfc2 #bbbfc2 #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#7a8288}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:21px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#32373c;background-image:-moz-linear-gradient(top,#3a3f44,#272b30);background-image:-webkit-gradient(linear,0 0,0 100%,from(#3a3f44),to(#272b30));background-image:-webkit-linear-gradient(top,#3a3f44,#272b30);background-image:-o-linear-gradient(top,#3a3f44,#272b30);background-image:linear-gradient(to bottom,#3a3f44,#272b30);background-repeat:repeat-x;border:1px solid #0c0d0e;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3a3f44',endColorstr='#ff272b30',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:9.5px 20px 9.5px;margin-left:-20px;font-size:20px;font-weight:200;color:#bbbfc2;text-shadow:0 1px 0 #3a3f44}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#c8c8c8}.navbar-link{color:#c8c8c8}.navbar-link:hover,.navbar-link:focus{color:#fff}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #3a3f44;border-left:1px solid #272b30}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:9.5px 15px 9.5px;color:#c8c8c8;text-decoration:none;text-shadow:0 1px 0 #3a3f44}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#fff;text-decoration:none;background-color:#3a3f44}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#fff;text-decoration:none;background-color:#272b30;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#272a2e;*background-color:#1c1e22;background-image:-moz-linear-gradient(top,#2e3236,#1c1e22);background-image:-webkit-gradient(linear,0 0,0 100%,from(#2e3236),to(#1c1e22));background-image:-webkit-linear-gradient(top,#2e3236,#1c1e22);background-image:-o-linear-gradient(top,#2e3236,#1c1e22);background-image:linear-gradient(to bottom,#2e3236,#1c1e22);background-repeat:repeat-x;border-color:#1c1e22 #1c1e22 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2e3236',endColorstr='#ff1c1e22',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#1c1e22;*background-color:#101214}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#050506 \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #3a3f44;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #3a3f44;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#272b30}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#c8c8c8;border-bottom-color:#c8c8c8}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1e2125;background-image:-moz-linear-gradient(top,#272b30,#101214);background-image:-webkit-gradient(linear,0 0,0 100%,from(#272b30),to(#101214));background-image:-webkit-linear-gradient(top,#272b30,#101214);background-image:-o-linear-gradient(top,#272b30,#101214);background-image:linear-gradient(to bottom,#272b30,#101214);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff272b30',endColorstr='#ff101214',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#7a8288;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#7a8288}.navbar-inverse .navbar-text{color:#7a8288}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#101214}.navbar-inverse .navbar-link{color:#7a8288}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#272b30;border-left-color:#101214}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#101214}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#7a8288;border-bottom-color:#7a8288}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#49515a;border-color:#101214;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#3a3f44;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#121417;*background-color:#050506;background-image:-moz-linear-gradient(top,#1c1e22,#050506);background-image:-webkit-gradient(linear,0 0,0 100%,from(#1c1e22),to(#050506));background-image:-webkit-linear-gradient(top,#1c1e22,#050506);background-image:-o-linear-gradient(top,#1c1e22,#050506);background-image:linear-gradient(to bottom,#1c1e22,#050506);background-repeat:repeat-x;border-color:#050506 #050506 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff1c1e22',endColorstr='#ff050506',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#050506;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 21px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#7a8288}.pagination{margin:21px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:21px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#7a8288;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#7a8288;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:21px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.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:#7a8288;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#3a3f44;-webkit-border-radius:4px;-moz-border-radius:4px;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-top-color:#3a3f44;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#3a3f44;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#3a3f44;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#3a3f44;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#3a3f44;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#41474c;border-bottom:1px solid #353a3e;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.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{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#3a3f44;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#3a3f44;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#3a3f44;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#3a3f44;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:21px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:21px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#fff;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#52575c}.media,.media-body{overflow:hidden;*overflow:visible;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{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#7a8288}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#3a3f44}.label-inverse[href],.badge-inverse[href]{background-color:#232628}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:21px;margin-bottom:21px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:21px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:21px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;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:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#272b30;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#3a3f44;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:21px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:31.5px;color:inherit;background-color:#202328;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:31.5px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}h1,h2,h3,h4,h5,h6{text-shadow:-1px -1px 0 rgba(0,0,0,0.3)}code,pre{text-shadow:none;background-color:#f7f7f7;border:1px solid #1c1e22}legend,.page-header{border-bottom:1px solid #1c1e22}hr{border-bottom:0}.navbar .navbar-inner{background-color:#3a3f44;background-image:-webkit-gradient(linear,0 0,0 100%,from(#52575c),color-stop(70%,#3a3f44),to(#3a3f44));background-image:-webkit-linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-image:-moz-linear-gradient(top,#52575c,#3a3f44 70%,#3a3f44);background-image:-o-linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-image:linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff52575c',endColorstr='#ff3a3f44',GradientType=0)}.navbar .brand{font-weight:bold;text-shadow:1px 1px 1px rgba(0,0,0,0.3);border-right:1px solid #2e3134}.navbar .navbar-text{padding:0 15px;font-weight:bold}.navbar .nav>li>a{text-shadow:1px 1px 1px rgba(0,0,0,0.3);border-right:1px solid rgba(0,0,0,0.2);border-left:1px solid rgba(255,255,255,0.1)}.navbar .nav>li>a:hover{background-color:#3a3f44;background-image:-moz-linear-gradient(280deg,#272b30,#3a3f44);background-image:-webkit-linear-gradient(280deg,#272b30,#3a3f44);background-image:-o-linear-gradient(280deg,#272b30,#3a3f44);background-image:linear-gradient(280deg,#272b30,#3a3f44);background-repeat:repeat-x;border-right:1px solid transparent;border-left:1px solid transparent}.navbar .nav>li.active>a,.navbar .nav>li.active>a:hover{color:#bbbfc2;background-color:#3a3f44;background-color:#43494f;background-image:-moz-linear-gradient(280deg,#30353b,#43494f);background-image:-webkit-linear-gradient(280deg,#30353b,#43494f);background-image:-o-linear-gradient(280deg,#30353b,#43494f);background-image:linear-gradient(280deg,#30353b,#43494f);background-repeat:repeat-x;border-right:1px solid #2e3134}.navbar .navbar-search .search-query{border:1px solid #2e3134}.navbar .btn,.navbar .btn-group{margin:4px 0}.navbar .divider-vertical{background-color:transparent;border-right:0}.navbar .dropdown-menu::after{border-bottom:6px solid #3a3f44}.navbar-inverse .navbar-inner{background-color:#151719;background-image:-webkit-gradient(linear,0 0,0 100%,from(#202328),color-stop(70%,#151719),to(#151719));background-image:-webkit-linear-gradient(#202328,#151719 70%,#151719);background-image:-moz-linear-gradient(top,#202328,#151719 70%,#151719);background-image:-o-linear-gradient(#202328,#151719 70%,#151719);background-image:linear-gradient(#202328,#151719 70%,#151719);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff202328',endColorstr='#ff151719',GradientType=0)}.navbar-inverse .nav li>a{background-color:transparent;background-image:none}.navbar-inverse .nav li>a:hover,.navbar-inverse .nav li.active>a,.navbar-inverse .nav li.active>a:hover{background-color:#1c1e22;background-image:-moz-linear-gradient(280deg,#101214,#1c1e22);background-image:-webkit-linear-gradient(280deg,#101214,#1c1e22);background-image:-o-linear-gradient(280deg,#101214,#1c1e22);background-image:linear-gradient(280deg,#101214,#1c1e22);background-repeat:repeat-x}@media(max-width:979px){.navbar .nav-collapse .nav li>a,.navbar .nav-collapse .nav li>a:hover,.navbar .nav-collapse .nav .active>a,.navbar .nav-collapse .nav .active>a:hover{color:#bbbfc2;background-color:transparent;background-image:none;border:1px solid transparent;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar .nav-collapse .nav li>a:hover,.navbar .nav-collapse .nav .active>a:hover{background-color:#272b30}.navbar .nav-collapse .navbar-form,.navbar .nav-collapse .navbar-search{border-color:transparent;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar .nav-collapse .nav-header{color:#7a8288}.navbar-inverse .nav-collapse .nav li>a:hover,.navbar-inverse .nav-collapse .nav .active>a:hover{background-color:#272b30!important}}div.subnav{margin:0 1px;background-color:#3a3f44;background-image:-webkit-gradient(linear,0 0,0 100%,from(#52575c),color-stop(70%,#3a3f44),to(#3a3f44));background-image:-webkit-linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-image:-moz-linear-gradient(top,#52575c,#3a3f44 70%,#3a3f44);background-image:-o-linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-image:linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-repeat:no-repeat;border:1px solid transparent;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff52575c',endColorstr='#ff3a3f44',GradientType=0);-webkit-box-shadow:'0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1)';-moz-box-shadow:'0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1)';box-shadow:'0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1)'}div.subnav .nav>li>a{color:#bbbfc2;text-shadow:1px 1px 1px rgba(0,0,0,0.3);border-right:1px solid #2e3134;border-left:1px solid #52575c}div.subnav .nav>li>a:hover{color:#bbbfc2;background-color:#3a3f44;background-image:-moz-linear-gradient(280deg,#272b30,#3a3f44);background-image:-webkit-linear-gradient(280deg,#272b30,#3a3f44);background-image:-o-linear-gradient(280deg,#272b30,#3a3f44);background-image:linear-gradient(280deg,#272b30,#3a3f44);background-repeat:repeat-x;border-right:1px solid transparent;border-left:1px solid transparent}div.subnav .nav>li.active>a,div.subnav .nav>li.active>a:hover{color:#bbbfc2;background-color:#3a3f44;background-color:#43494f;background-image:-moz-linear-gradient(280deg,#30353b,#43494f);background-image:-webkit-linear-gradient(280deg,#30353b,#43494f);background-image:-o-linear-gradient(280deg,#30353b,#43494f);background-image:linear-gradient(280deg,#30353b,#43494f);background-repeat:repeat-x;border-right:1px solid #2e3134}div.subnav .nav>li:first-child>a,div.subnav .nav>li:first-child>a:hover{border-left:1px solid transparent}div.subnav .nav>li.active:last-child>a,div.subnav .nav>li:last-child>a:hover{border-right:1px solid #2e3134}div.subnav .open .dropdown-toggle{border-right:1px solid #2e3134;border-left:1px solid #52575c}div.subnav.subnav-fixed{top:40px;margin:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}div.subnav.subnav-fixed .nav>li.active:first-child>a,div.subnav.subnav-fixed .nav>li:first-child>a:hover{border-left:1px solid #2e3134}.nav .nav-header{text-shadow:-1px -1px 0 rgba(0,0,0,0.3)}.nav>li>a{font-weight:bold;color:#7a8288;text-shadow:1px 1px 1px rgba(0,0,0,0.3);background-color:#3a3f44;background-image:-webkit-gradient(linear,0 0,0 100%,from(#52575c),color-stop(70%,#3a3f44),to(#3a3f44));background-image:-webkit-linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-image:-moz-linear-gradient(top,#52575c,#3a3f44 70%,#3a3f44);background-image:-o-linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-image:linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-repeat:no-repeat;border:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff52575c',endColorstr='#ff3a3f44',GradientType=0);-webkit-box-shadow:'0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1)';-moz-box-shadow:'0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1)';box-shadow:'0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1)'}.nav li.active>a,.nav li.active>a:hover{color:#fff;background-color:transparent;border:0}.nav>li.disabled>a,.nav>li.disabled>a:hover{color:#52575c}.nav li>a:hover{color:#bbbfc2;background-color:transparent}.nav-list{background-color:#3a3f44;-webkit-box-shadow:1px 1px 1px rgba(0,0,0,0.4);-moz-box-shadow:1px 1px 1px rgba(0,0,0,0.4);box-shadow:1px 1px 1px rgba(0,0,0,0.4)}.nav-list li>a{text-shadow:-1px -1px 0 rgba(0,0,0,0.3);background-image:none}.nav-list .nav-header{color:#52575c;text-shadow:-1px -1px 0 rgba(0,0,0,0.3)}.nav-list .divider{background-color:transparent;border-bottom:1px solid #1c1e22}.nav-tabs{border-bottom:0}.tabs-below .nav-tabs{border-top:0}.tabs-left .nav-tabs{border-right:0}.tabs-right .nav-tabs{border-left:none}.nav-tabs.nav-stacked li>a,.nav-tabs.nav-stacked li>a:hover{background-image:none;border:1px solid #1c1e22}.nav-tabs.nav-stacked li>a:hover,.nav-tabs.nav-stacked .active>a,.nav-tabs.nav-stacked .active>a:hover{color:#fff;background-color:#202328}.breadcrumb{background-color:#3a3f44;background-image:-webkit-gradient(linear,0 0,0 100%,from(#52575c),color-stop(70%,#3a3f44),to(#3a3f44));background-image:-webkit-linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-image:-moz-linear-gradient(top,#52575c,#3a3f44 70%,#3a3f44);background-image:-o-linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-image:linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-repeat:no-repeat;border:1px solid transparent;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff52575c',endColorstr='#ff3a3f44',GradientType=0);-webkit-box-shadow:'0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1)';-moz-box-shadow:'0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1)';box-shadow:'0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1)'}.breadcrumb a{font-weight:bold;color:#bbbfc2}.breadcrumb li{font-weight:bold;color:#7a8288;text-shadow:1px 1px 1px rgba(0,0,0,0.3)}.pagination ul{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.pagination ul>li>a,.pagination ul>li>span{font-weight:bold;color:#bbbfc2;text-shadow:1px 1px 1px rgba(0,0,0,0.3);background-color:#3a3f44;background-image:-webkit-gradient(linear,0 0,0 100%,from(#52575c),color-stop(70%,#3a3f44),to(#3a3f44));background-image:-webkit-linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-image:-moz-linear-gradient(top,#52575c,#3a3f44 70%,#3a3f44);background-image:-o-linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-image:linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-repeat:no-repeat;border-top:0;border-right:1px solid #2e3134;border-bottom:0;border-left:1px solid #52575c;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff52575c',endColorstr='#ff3a3f44',GradientType=0);-webkit-box-shadow:'0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1)';-moz-box-shadow:'0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1)';box-shadow:'0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1)'}.pagination ul>li>a:hover,.pagination ul>li>span:hover{background-color:#3a3f44;background-image:-moz-linear-gradient(280deg,#272b30,#3a3f44);background-image:-webkit-linear-gradient(280deg,#272b30,#3a3f44);background-image:-o-linear-gradient(280deg,#272b30,#3a3f44);background-image:linear-gradient(280deg,#272b30,#3a3f44);background-repeat:repeat-x;border-left:1px solid transparent}.pagination ul>.active>a,.pagination ul>.active>a:hover,.pagination ul>.active>span,.pagination ul>.active>span:hover{color:#bbbfc2;background-color:#3a3f44;background-color:#43494f;background-image:-moz-linear-gradient(280deg,#30353b,#43494f);background-image:-webkit-linear-gradient(280deg,#30353b,#43494f);background-image:-o-linear-gradient(280deg,#30353b,#43494f);background-image:linear-gradient(280deg,#30353b,#43494f);background-repeat:repeat-x;border-left:1px solid transparent}.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>span,.pagination ul>.disabled>span:hover{background-color:#52575c;background-image:-webkit-gradient(linear,0 0,0 100%,from(#7a8288),color-stop(70%,#52575c),to(#52575c));background-image:-webkit-linear-gradient(#7a8288,#52575c 70%,#52575c);background-image:-moz-linear-gradient(top,#7a8288,#52575c 70%,#52575c);background-image:-o-linear-gradient(#7a8288,#52575c 70%,#52575c);background-image:linear-gradient(#7a8288,#52575c 70%,#52575c);background-repeat:no-repeat;border-top:0;border-right:1px solid #2e3134;border-bottom:0;border-left:1px solid #52575c;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff7a8288',endColorstr='#ff52575c',GradientType=0)}.pager li>a,.pager li>span{background-color:#3a3f44;background-image:-webkit-gradient(linear,0 0,0 100%,from(#52575c),color-stop(70%,#3a3f44),to(#3a3f44));background-image:-webkit-linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-image:-moz-linear-gradient(top,#52575c,#3a3f44 70%,#3a3f44);background-image:-o-linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-image:linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-repeat:no-repeat;border:1px solid transparent;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff52575c',endColorstr='#ff3a3f44',GradientType=0);-webkit-box-shadow:'0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1)';-moz-box-shadow:'0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1)';box-shadow:'0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1)'}.pager li>a:hover,.pager li>span:hover{background-color:#3a3f44;background-image:-moz-linear-gradient(280deg,#272b30,#3a3f44);background-image:-webkit-linear-gradient(280deg,#272b30,#3a3f44);background-image:-o-linear-gradient(280deg,#272b30,#3a3f44);background-image:linear-gradient(280deg,#272b30,#3a3f44);background-repeat:repeat-x;border:1px solid transparent}.pager .disabled a,.pager .disabled a:hover{background-color:transparent;background-color:#3a3f44;background-image:-webkit-gradient(linear,0 0,0 100%,from(#52575c),color-stop(70%,#3a3f44),to(#3a3f44));background-image:-webkit-linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-image:-moz-linear-gradient(top,#52575c,#3a3f44 70%,#3a3f44);background-image:-o-linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-image:linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff52575c',endColorstr='#ff3a3f44',GradientType=0)}.btn{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#484d51;*background-color:#3a3e41;background-image:-moz-linear-gradient(top,#52575c,#3a3e41);background-image:-webkit-gradient(linear,0 0,0 100%,from(#52575c),to(#3a3e41));background-image:-webkit-linear-gradient(top,#52575c,#3a3e41);background-image:-o-linear-gradient(top,#52575c,#3a3e41);background-image:linear-gradient(to bottom,#52575c,#3a3e41);background-repeat:repeat-x;border:1px solid #272b30;border-color:#3a3e41 #3a3e41 #161719;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff52575c',endColorstr='#ff3a3e41',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#fff;background-color:#3a3e41;*background-color:#2e3134}.btn:active,.btn.active{background-color:#222426 \9}.btn,.btn:hover{font-weight:bold;color:#fff;text-shadow:-1px -1px 1px rgba(0,0,0,0.3)}.btn-primary{color:#fff;color:#3a3f44;text-shadow:0 -1px 0 rgba(0,0,0,0.25);text-shadow:1px 1px 1px rgba(255,255,255,0.3);background-color:#bbbec2;*background-color:#bbbdc2;background-image:-moz-linear-gradient(top,#bbbfc2,#bbbdc2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#bbbfc2),to(#bbbdc2));background-image:-webkit-linear-gradient(top,#bbbfc2,#bbbdc2);background-image:-o-linear-gradient(top,#bbbfc2,#bbbdc2);background-image:linear-gradient(to bottom,#bbbfc2,#bbbdc2);background-repeat:repeat-x;border-color:#bbbdc2 #bbbdc2 #93959e;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffbbbfc2',endColorstr='#ffbbbdc2',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#bbbdc2;*background-color:#aeb0b6}.btn-primary:active,.btn-primary.active{background-color:#a0a2aa \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#41454a;*background-color:#272b30;background-image:-moz-linear-gradient(top,#52575c,#272b30);background-image:-webkit-gradient(linear,0 0,0 100%,from(#52575c),to(#272b30));background-image:-webkit-linear-gradient(top,#52575c,#272b30);background-image:-o-linear-gradient(top,#52575c,#272b30);background-image:linear-gradient(to bottom,#52575c,#272b30);background-repeat:repeat-x;border-color:#272b30 #272b30 #050506;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff52575c',endColorstr='#ff272b30',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#272b30;*background-color:#1c1e22}.btn-inverse:active,.btn-inverse.active{background-color:#101214 \9}.caret{border-top-color:#fff}.table tbody tr.success td{background-color:#468847}.table tbody tr.error td{background-color:#b94a48}.table tbody tr.info td{background-color:#3a87ad}label,input,button,select,textarea,legend{color:#c8c8c8}legend,label{text-shadow:-1px -1px 0 rgba(0,0,0,0.3)}.input-prepend .add-on,.input-append .add-on{text-shadow:none;vertical-align:top;background-color:#52575c;border-top:1px solid #7a8288;border-right:1px solid #3a3f44;border-bottom:1px solid #3a3f44;border-left:1px solid #7a8288}.input-append .btn,.input-prepend .btn{padding:5px 14px;margin-top:-1px}.uneditable-input,input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{color:#bbbfc2}.form-actions{border-top:0}.dropdown-menu{-webkit-box-shadow:0 5px 5px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 5px rgba(0,0,0,0.2);box-shadow:0 5px 5px rgba(0,0,0,0.2)}.dropdown.open .dropdown-toggle{color:#bbbfc2;background-color:#3a3f44}.dropdown-submenu>a::after{border-left-color:#fff}.label,.alert{color:rgba(255,255,255,0.9);text-shadow:-1px -1px 0 rgba(0,0,0,0.3);-webkit-box-shadow:1px 1px 1px rgba(0,0,0,0.3);-moz-box-shadow:1px 1px 1px rgba(0,0,0,0.3);box-shadow:1px 1px 1px rgba(0,0,0,0.3)}.alert{background-color:#f89406;border-color:#f89406}.alert .alert-heading{color:rgba(255,255,255,0.9);text-shadow:-1px -1px 0 rgba(0,0,0,0.4)}.alert-success{background-color:#468847;border-color:#468847}.alert-error{background-color:#b94a48;border-color:#b94a48}.alert-info{background-color:#3a87ad;border-color:#3a87ad}.well,.hero-unit{-webkit-box-shadow:inset 1px 1px 1px rgba(0,0,0,0.5);-moz-box-shadow:inset 1px 1px 1px rgba(0,0,0,0.5);box-shadow:inset 1px 1px 1px rgba(0,0,0,0.5)}.thumbnail,a.thumbnail:hover{border:1px solid #1c1e22}.progress{background-color:#202328;background-image:-moz-linear-gradient(top,#202328,#202328);background-image:-webkit-gradient(linear,0 0,0 100%,from(#202328),to(#202328));background-image:-webkit-linear-gradient(top,#202328,#202328);background-image:-o-linear-gradient(top,#202328,#202328);background-image:linear-gradient(to bottom,#202328,#202328);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff202328',endColorstr='#ff202328',GradientType=0);-webkit-box-shadow:inset 1px 1px 1px rgba(0,0,0,0.5);-moz-box-shadow:inset 1px 1px 1px rgba(0,0,0,0.5);box-shadow:inset 1px 1px 1px rgba(0,0,0,0.5)}.footer{border-top:1px solid #1c1e22}.footer p{color:#c8c8c8}.modal{background-color:#2e3236}.modal-header{border-bottom:0}.modal-body{border-bottom:1px solid #1c1e22}.modal-footer{background-color:#272b30;border-top:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}@media(max-width:979px){.navbar .brand{border-right:0}}@media(max-width:768px){div.subnav .nav>li+li>a{border-top:1px solid transparent}}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} diff --git a/flask_admin/static/bootstrap/bootstrap2/swatch/spacelab/bootstrap.min.css b/flask_admin/static/bootstrap/bootstrap2/swatch/spacelab/bootstrap.min.css deleted file mode 100644 index 1075a4640..000000000 --- a/flask_admin/static/bootstrap/bootstrap2/swatch/spacelab/bootstrap.min.css +++ /dev/null @@ -1,9 +0,0 @@ -@import url('//fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700');/*! - * Bootstrap v2.3.2 - * - * Copyright 2013 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world by @mdo and @fat. - */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:31px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!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) ")"}.ir a:after,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}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:15px;line-height:21px;color:#666;background-color:#fff}a{color:#09d;text-decoration:none}a:hover,a:focus{color:#09d;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:31px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10.5px}.lead{margin-bottom:21px;font-size:22.5px;font-weight:200;line-height:31.5px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#ccc}a.muted:hover,a.muted:focus{color:#b3b3b3}.text-warning{color:#fff}a.text-warning:hover,a.text-warning:focus{color:#e6e6e6}.text-error{color:#fff}a.text-error:hover,a.text-error:focus{color:#e6e6e6}.text-info{color:#fff}a.text-info:hover,a.text-info:focus{color:#e6e6e6}.text-success{color:#fff}a.text-success:hover,a.text-success:focus{color:#e6e6e6}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10.5px 0;font-family:inherit;font-weight:normal;line-height:21px;color:#2d2d2d;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#ccc}h1,h2,h3{line-height:42px}h1{font-size:41.25px}h2{font-size:33.75px}h3{font-size:26.25px}h4{font-size:18.75px}h5{font-size:15px}h6{font-size:12.75px}h1 small{font-size:26.25px}h2 small{font-size:18.75px}h3 small{font-size:15px}h4 small{font-size:15px}.page-header{padding-bottom:9.5px;margin:21px 0 31.5px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10.5px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:21px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:21px}dt,dd{line-height:21px}dt{font-weight:bold}dd{margin-left:10.5px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:21px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #ccc}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 21px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:18.75px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:21px;color:#ccc}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:21px;font-style:normal;line-height:21px}code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;font-size:13px;color:#434848;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:10px;margin:0 0 10.5px;font-size:14px;line-height:21px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:21px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 21px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:21px;font-size:22.5px;line-height:42px;color:#434848;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15.75px;color:#ccc}label,input,button,select,textarea{font-size:15px;font-weight:normal;line-height:21px}input,button,select,textarea{font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:21px;padding:4px 6px;margin-bottom:10.5px;font-size:15px;line-height:21px;color:#666;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:31px;*margin-top:4px;line-height:31px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#ccc;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#ccc}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#ccc}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#ccc}.radio,.checkbox{min-height:21px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#fff}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#fff}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#fff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#fff;background-color:#d47500;border-color:#fff}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#fff}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#fff}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#fff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#fff;background-color:#cd0200;border-color:#fff}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#fff}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#fff}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#fff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#fff;background-color:#3cb521;border-color:#fff}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#fff}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#fff}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#fff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#fff;background-color:#3399f3;border-color:#fff}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:20px 20px 21px;margin-top:21px;margin-bottom:21px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#8c8c8c}.help-block{display:block;margin-bottom:10.5px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10.5px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:15px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:21px;min-width:16px;padding:4px 5px;font-size:15px;font-weight:normal;line-height:21px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#98e986;border-color:#3cb521}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10.5px}legend+.control-group{margin-top:21px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:21px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10.5px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:21px}.table th,.table td{padding:8px;line-height:21px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.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 td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#3cb521}.table tbody tr.error>td{background-color:#cd0200}.table tbody tr.warning>td{background-color:#d47500}.table tbody tr.info>td{background-color:#3399f3}.table-hover tbody tr.success:hover>td{background-color:#359f1d}.table-hover tbody tr.error:hover>td{background-color:#b40200}.table-hover tbody tr.warning:hover>td{background-color:#bb6700}.table-hover tbody tr.info:hover>td{background-color:#1b8df2}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.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;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9.5px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:rgba(0,0,0,0.1);border-bottom:1px solid rgba(255,255,255,0.5)}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:21px;color:#666;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#0092d3;background-image:-moz-linear-gradient(top,#09d,#0087c4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#09d),to(#0087c4));background-image:-webkit-linear-gradient(top,#09d,#0087c4);background-image:-o-linear-gradient(top,#09d,#0087c4);background-image:linear-gradient(to bottom,#09d,#0087c4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0099dd',endColorstr='#ff0087c4',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#0092d3;background-image:-moz-linear-gradient(top,#09d,#0087c4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#09d),to(#0087c4));background-image:-webkit-linear-gradient(top,#09d,#0087c4);background-image:-o-linear-gradient(top,#09d,#0087c4);background-image:linear-gradient(to bottom,#09d,#0087c4);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0099dd',endColorstr='#ff0087c4',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#ccc}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#eee;border:1px solid #dcdcdc;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:21px;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:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:15px;line-height:21px;color:#434848;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f8f8f8;*background-color:#eee;background-image:-moz-linear-gradient(top,#fff,#eee);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#eee));background-image:-webkit-linear-gradient(top,#fff,#eee);background-image:-o-linear-gradient(top,#fff,#eee);background-image:linear-gradient(to bottom,#fff,#eee);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#eee #eee #c8c8c8;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffeeeeee',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#434848;background-color:#eee;*background-color:#e1e1e1}.btn:active,.btn.active{background-color:#d5d5d5 \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#434848;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:18.75px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:12.75px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:11.25px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0aaaf1;*background-color:#09d;background-image:-moz-linear-gradient(top,#11b6ff,#09d);background-image:-webkit-gradient(linear,0 0,0 100%,from(#11b6ff),to(#09d));background-image:-webkit-linear-gradient(top,#11b6ff,#09d);background-image:-o-linear-gradient(top,#11b6ff,#09d);background-image:linear-gradient(to bottom,#11b6ff,#09d);background-repeat:repeat-x;border-color:#09d #09d #006491;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff11b6ff',endColorstr='#ff0099dd',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#09d;*background-color:#0087c4}.btn-primary:active,.btn-primary.active{background-color:#0076aa \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ee8505;*background-color:#d47500;background-image:-moz-linear-gradient(top,#ff9008,#d47500);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ff9008),to(#d47500));background-image:-webkit-linear-gradient(top,#ff9008,#d47500);background-image:-o-linear-gradient(top,#ff9008,#d47500);background-image:linear-gradient(to bottom,#ff9008,#d47500);background-repeat:repeat-x;border-color:#d47500 #d47500 #884b00;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff9008',endColorstr='#ffd47500',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#d47500;*background-color:#bb6700}.btn-warning:active,.btn-warning.active{background-color:#a15900 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#eb0301;*background-color:#cd0200;background-image:-moz-linear-gradient(top,#ff0301,#cd0200);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ff0301),to(#cd0200));background-image:-webkit-linear-gradient(top,#ff0301,#cd0200);background-image:-o-linear-gradient(top,#ff0301,#cd0200);background-image:linear-gradient(to bottom,#ff0301,#cd0200);background-repeat:repeat-x;border-color:#cd0200 #cd0200 #810100;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff0301',endColorstr='#ffcd0200',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#cd0200;*background-color:#b40200}.btn-danger:active,.btn-danger.active{background-color:#9a0200 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#47cb2a;*background-color:#3cb521;background-image:-moz-linear-gradient(top,#4fd930,#3cb521);background-image:-webkit-gradient(linear,0 0,0 100%,from(#4fd930),to(#3cb521));background-image:-webkit-linear-gradient(top,#4fd930,#3cb521);background-image:-o-linear-gradient(top,#4fd930,#3cb521);background-image:linear-gradient(to bottom,#4fd930,#3cb521);background-repeat:repeat-x;border-color:#3cb521 #3cb521 #277415;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4fd930',endColorstr='#ff3cb521',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#3cb521;*background-color:#359f1d}.btn-success:active,.btn-success.active{background-color:#2e8a19 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#436c98;*background-color:#3a5d83;background-image:-moz-linear-gradient(top,#4a76a6,#3a5d83);background-image:-webkit-gradient(linear,0 0,0 100%,from(#4a76a6),to(#3a5d83));background-image:-webkit-linear-gradient(top,#4a76a6,#3a5d83);background-image:-o-linear-gradient(top,#4a76a6,#3a5d83);background-image:linear-gradient(to bottom,#4a76a6,#3a5d83);background-repeat:repeat-x;border-color:#3a5d83 #3a5d83 #23374e;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4a76a6',endColorstr='#ff3a5d83',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#3a5d83;*background-color:#325071}.btn-info:active,.btn-info.active{background-color:#2a4460 \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#848a94;*background-color:#6c737e;background-image:-moz-linear-gradient(top,#949aa3,#6c737e);background-image:-webkit-gradient(linear,0 0,0 100%,from(#949aa3),to(#6c737e));background-image:-webkit-linear-gradient(top,#949aa3,#6c737e);background-image:-o-linear-gradient(top,#949aa3,#6c737e);background-image:linear-gradient(to bottom,#949aa3,#6c737e);background-repeat:repeat-x;border-color:#6c737e #6c737e #494d55;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff949aa3',endColorstr='#ff6c737e',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#6c737e;*background-color:#606670}.btn-inverse:active,.btn-inverse.active{background-color:#545a63 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#09d;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#09d;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#434848;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10.5px;margin-bottom:10.5px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:15px}.btn-group>.btn-mini{font-size:11.25px}.btn-group>.btn-small{font-size:12.75px}.btn-group>.btn-large{font-size:18.75px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#eee}.btn-group.open .btn-primary.dropdown-toggle{background-color:#09d}.btn-group.open .btn-warning.dropdown-toggle{background-color:#d47500}.btn-group.open .btn-danger.dropdown-toggle{background-color:#cd0200}.btn-group.open .btn-success.dropdown-toggle{background-color:#3cb521}.btn-group.open .btn-info.dropdown-toggle{background-color:#3a5d83}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#6c737e}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:21px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#d47500;border:1px solid #c54c00;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#fff}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:21px}.alert-success{color:#fff;background-color:#3cb521;border-color:#4b9f1d}.alert-success h4{color:#fff}.alert-danger,.alert-error{color:#fff;background-color:#cd0200;border-color:#be001e}.alert-danger h4,.alert-error h4{color:#fff}.alert-info{color:#fff;background-color:#3399f3;border-color:#11adf1}.alert-info h4{color:#fff}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:21px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:21px;color:#ccc;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#09d}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9.5px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:21px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#666;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#09d}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#09d;border-bottom-color:#09d}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#09d;border-bottom-color:#09d}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#666;border-bottom-color:#666}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#ccc;border-color:#ccc}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#ccc}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#ccc}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:21px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#e9e9e9;background-image:-moz-linear-gradient(top,#eee,#e1e1e1);background-image:-webkit-gradient(linear,0 0,0 100%,from(#eee),to(#e1e1e1));background-image:-webkit-linear-gradient(top,#eee,#e1e1e1);background-image:-o-linear-gradient(top,#eee,#e1e1e1);background-image:linear-gradient(to bottom,#eee,#e1e1e1);background-repeat:repeat-x;border:1px solid #ccc;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffeeeeee',endColorstr='#ffe1e1e1',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:9.5px 20px 9.5px;margin-left:-20px;font-size:20px;font-weight:200;color:#666;text-shadow:0 1px 0 #eee}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#666}.navbar-link{color:#666}.navbar-link:hover,.navbar-link:focus{color:#09d}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #eee;border-left:1px solid #e1e1e1}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:9.5px 15px 9.5px;color:#666;text-decoration:none;text-shadow:0 1px 0 #eee}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#09d;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#09d;text-decoration:none;background-color:transparent;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#dcdcdc;*background-color:#d4d4d4;background-image:-moz-linear-gradient(top,#e1e1e1,#d4d4d4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#e1e1e1),to(#d4d4d4));background-image:-webkit-linear-gradient(top,#e1e1e1,#d4d4d4);background-image:-o-linear-gradient(top,#e1e1e1,#d4d4d4);background-image:linear-gradient(to bottom,#e1e1e1,#d4d4d4);background-repeat:repeat-x;border-color:#d4d4d4 #d4d4d4 #aeaeae;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe1e1e1',endColorstr='#ffd4d4d4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#d4d4d4;*background-color:#c8c8c8}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#bbb \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#09d;border-bottom-color:#09d}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#09d;background-color:transparent}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#666;border-bottom-color:#666}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#09d;border-bottom-color:#09d}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#7c828d;background-image:-moz-linear-gradient(top,#868d97,#6c737e);background-image:-webkit-gradient(linear,0 0,0 100%,from(#868d97),to(#6c737e));background-image:-webkit-linear-gradient(top,#868d97,#6c737e);background-image:-o-linear-gradient(top,#868d97,#6c737e);background-image:linear-gradient(to bottom,#868d97,#6c737e);background-repeat:repeat-x;border-color:#656b76;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff868d97',endColorstr='#ff6c737e',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#ccc;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#ccc}.navbar-inverse .navbar-text{color:#ccc}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#6c737e}.navbar-inverse .navbar-link{color:#ccc}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#868d97;border-left-color:#6c737e}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#6c737e}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#ccc;border-bottom-color:#ccc}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#afb3ba;border-color:#6c737e;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#eee}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#eee}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#eee}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#434848;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#6f7681;*background-color:#606670;background-image:-moz-linear-gradient(top,#78808b,#606670);background-image:-webkit-gradient(linear,0 0,0 100%,from(#78808b),to(#606670));background-image:-webkit-linear-gradient(top,#78808b,#606670);background-image:-o-linear-gradient(top,#78808b,#606670);background-image:linear-gradient(to bottom,#78808b,#606670);background-repeat:repeat-x;border-color:#606670 #606670 #3d4147;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff78808b',endColorstr='#ff606670',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#606670;*background-color:#545a63}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#494d55 \9}.breadcrumb{padding:8px 15px;margin:0 0 21px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#ccc}.pagination{margin:21px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:21px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#ccc;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#ccc;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:18.75px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:12.75px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:11.25px}.pager{margin:21px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.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:#ccc;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;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-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.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{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:21px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:21px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#09d;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#666}.media,.media-body{overflow:hidden;*overflow:visible;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{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:12.69px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#ccc}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#fff}.label-important[href],.badge-important[href]{background-color:#e6e6e6}.label-warning,.badge-warning{background-color:#d47500}.label-warning[href],.badge-warning[href]{background-color:#a15900}.label-success,.badge-success{background-color:#fff}.label-success[href],.badge-success[href]{background-color:#e6e6e6}.label-info,.badge-info{background-color:#fff}.label-info[href],.badge-info[href]{background-color:#e6e6e6}.label-inverse,.badge-inverse{background-color:#434848}.label-inverse[href],.badge-inverse[href]{background-color:#2a2e2e}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:21px;margin-bottom:21px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#ee8c14;background-image:-moz-linear-gradient(top,#ff9c21,#d47500);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ff9c21),to(#d47500));background-image:-webkit-linear-gradient(top,#ff9c21,#d47500);background-image:-o-linear-gradient(top,#ff9c21,#d47500);background-image:linear-gradient(to bottom,#ff9c21,#d47500);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff9c21',endColorstr='#ffd47500',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#ff9c21;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:21px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:21px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;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:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#2d2d2d;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#434848;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:21px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:31.5px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:#2d2d2d}.hero-unit li{line-height:31.5px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}.text-warning{color:#d47500}a.text-warning:hover,a.text-warning:focus{color:#a15900}.text-error{color:#cd0200}a.text-error:hover,a.text-error:focus{color:#9a0200}.text-info{color:#3399f3}a.text-info:hover,a.text-info:focus{color:#0e80e5}.text-success{color:#3cb521}a.text-success:hover,a.text-success:focus{color:#2e8a19}.navbar .brand{text-shadow:0 1px 0 rgba(255,255,255,0.3);-webkit-transition:color ease-in-out .2s;-moz-transition:color ease-in-out .2s;-o-transition:color ease-in-out .2s;transition:color ease-in-out .2s}.navbar .brand:hover{color:#09d;-webkit-transition:color ease-in-out .2s;-moz-transition:color ease-in-out .2s;-o-transition:color ease-in-out .2s;transition:color ease-in-out .2s}.navbar .nav>li>a{padding:11px 10px 8px;text-shadow:0 1px 0 rgba(255,255,255,0.3);-webkit-transition:color ease-in-out .2s;-moz-transition:color ease-in-out .2s;-o-transition:color ease-in-out .2s;transition:color ease-in-out .2s}.navbar .nav>li>a:hover{-webkit-transition:color ease-in-out .2s;-moz-transition:color ease-in-out .2s;-o-transition:color ease-in-out .2s;transition:color ease-in-out .2s}.navbar .navbar-text{padding:11px 10px 8px;line-height:inherit}.navbar .navbar-search .search-query,.navbar .navbar-search .search-query:hover{margin-bottom:0;line-height:normal;color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.5);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.5);box-shadow:inset 0 1px 2px rgba(0,0,0,0.5)}.navbar .navbar-search .search-query:-moz-placeholder,.navbar .navbar-search .search-query:hover:-moz-placeholder{color:#ccc}.navbar .navbar-search .search-query:-ms-input-placeholder,.navbar .navbar-search .search-query:hover:-ms-input-placeholder{color:#ccc}.navbar .navbar-search .search-query::-webkit-input-placeholder,.navbar .navbar-search .search-query:hover::-webkit-input-placeholder{color:#ccc}.navbar .navbar-search .search-query:focus,.navbar .navbar-search .search-query:hover:focus,.navbar .navbar-search .search-query.focused,.navbar .navbar-search .search-query:hover.focused{color:#666;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.5);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.5);box-shadow:inset 0 1px 2px rgba(0,0,0,0.5)}.navbar-inverse .brand{text-shadow:-1px -1px 0 rgba(0,0,0,0.3)}.navbar-inverse .brand:hover{color:#fff}.navbar-inverse .nav>li>a{text-shadow:-1px -1px 0 rgba(0,0,0,0.3)}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown:hover>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open:hover>.dropdown-toggle .caret{border-top-color:#fff}.navbar-inverse .navbar-search .search-query,.navbar-inverse .navbar-search .search-query:hover{color:#fff}.navbar-inverse .navbar-search .search-query:-moz-placeholder,.navbar-inverse .navbar-search .search-query:hover:-moz-placeholder{color:#eee}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder,.navbar-inverse .navbar-search .search-query:hover:-ms-input-placeholder{color:#eee}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder,.navbar-inverse .navbar-search .search-query:hover::-webkit-input-placeholder{color:#eee}@media(max-width:979px){.navbar .nav-collapse .nav li>a:hover{color:#fff;text-shadow:none;background-color:#09d}.navbar .nav-collapse .navbar-search{border-top:0;border-bottom:0}.navbar-inverse .nav-collapse .nav li>a{color:#ccc!important}.navbar-inverse .nav-collapse .nav li>a:hover{background-color:#09d!important}.navbar-inverse .nav-collapse .nav-header{color:#eee}}div.subnav .nav>li>a{color:#666;-webkit-transition:color ease-in-out .2s;-moz-transition:color ease-in-out .2s;-o-transition:color ease-in-out .2s;transition:color ease-in-out .2s}div.subnav .nav>li>a:hover{color:#09d;border-left-color:#ccc;-webkit-transition:color ease-in-out .2s;-moz-transition:color ease-in-out .2s;-o-transition:color ease-in-out .2s;transition:color ease-in-out .2s}div.subnav .nav>li.active>a{color:#666}div.subnav .nav>li.active>a:hover{color:#666}div.subnav .nav>li.dropdown>.dropdown-toggle{background-color:transparent}div.subnav .nav>li.dropdown.open>.dropdown-toggle{color:#666;border-right:1px solid #e5e5e5;border-left:1px solid whiteSmoke}div.subnav .nav>li.dropdown.open>.dropdown-toggle:hover{color:#09d}div.subnav-fixed{top:41px}.nav>li>a:hover,.nav>li>a:focus{background-color:rgba(0,0,0,0.05)}.nav>li.dropdown>.dropdown-toggle .caret,.nav>li.dropdown.active>.dropdown-toggle .caret,.nav>li.dropdown.open>.dropdown-toggle .caret,.nav>li.dropdown.open.active>.dropdown-toggle .caret{border-top:4px solid #666;border-top-color:#666;opacity:1}.nav>li.dropdown>.dropdown-toggle:hover .caret,.nav>li.dropdown.active>.dropdown-toggle:hover .caret,.nav>li.dropdown.open>.dropdown-toggle:hover .caret,.nav>li.dropdown.open.active>.dropdown-toggle:hover .caret{border-top:4px solid #09d;border-top-color:#09d}.nav-list .divider{background-color:rgba(0,0,0,0.1);border-bottom-color:rgba(255,255,255,0.5)}[class^="icon-"],[class*=" icon-"]{margin-top:4px}.table tbody tr.success>td,.table tbody tr.error>td,.table tbody tr.info>td{color:#fff}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#e29235}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#e29235}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#e29235;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#c7781d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #efc28e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #efc28e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #efc28e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#e29235;background-color:#d47500;border-color:#e29235}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#c00}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#c00}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#c00;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#900;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f33;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f33;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f33}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#c00;background-color:#cd0200;border-color:#c00}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#2ba949}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#2ba949}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#2ba949;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#218037;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #63d77e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #63d77e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #63d77e}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#2ba949;background-color:#3cb521;border-color:#2ba949}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3399f3}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3399f3}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3399f3;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#0e80e5;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #93c9f9;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #93c9f9;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #93c9f9}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3399f3;background-color:#3399f3;border-color:#3399f3}.alert{text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.alert h1,.alert h2,.alert h3,.alert h4,.alert h5,.alert h6{font-weight:bold;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.alert a{color:#fff;text-decoration:underline}.label-important,.badge-important{background-color:#cd0200}.label-warning,.badge-warning{background-color:#d47500}.label-success,.badge-success{background-color:#3cb521}.label-info,.badge-info{background-color:#3399f3}.hero-unit{border:1px solid rgba(0,0,0,0.1)}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} diff --git a/flask_admin/static/bootstrap/bootstrap2/swatch/spruce/bootstrap.min.css b/flask_admin/static/bootstrap/bootstrap2/swatch/spruce/bootstrap.min.css deleted file mode 100644 index a8180a35c..000000000 --- a/flask_admin/static/bootstrap/bootstrap2/swatch/spruce/bootstrap.min.css +++ /dev/null @@ -1,9 +0,0 @@ -@import url(//fonts.googleapis.com/css?family=Crete+Round);/*! - * Bootstrap v2.3.2 - * - * Copyright 2013 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world by @mdo and @fat. - */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:31px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!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) ")"}.ir a:after,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}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:Georgia,"Times New Roman",Times,serif;font-size:15px;line-height:21px;color:#555;background-color:#fff}a{color:#028d79;text-decoration:none}a:hover,a:focus{color:#028d79;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:31px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10.5px}.lead{margin-bottom:21px;font-size:22.5px;font-weight:200;line-height:31.5px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#fff}a.text-warning:hover,a.text-warning:focus{color:#e6e6e6}.text-error{color:#fff}a.text-error:hover,a.text-error:focus{color:#e6e6e6}.text-info{color:#fff}a.text-info:hover,a.text-info:focus{color:#e6e6e6}.text-success{color:#fff}a.text-success:hover,a.text-success:focus{color:#e6e6e6}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10.5px 0;font-family:'Crete Round',serif;font-weight:normal;line-height:21px;color:#333;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:42px}h1{font-size:41.25px}h2{font-size:33.75px}h3{font-size:26.25px}h4{font-size:18.75px}h5{font-size:15px}h6{font-size:12.75px}h1 small{font-size:26.25px}h2 small{font-size:18.75px}h3 small{font-size:15px}h4 small{font-size:15px}.page-header{padding-bottom:9.5px;margin:21px 0 31.5px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10.5px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:21px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:21px}dt,dd{line-height:21px}dt{font-weight:bold}dd{margin-left:10.5px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:21px 0;border:0;border-top:1px solid #999;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 21px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:18.75px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:21px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:21px;font-style:normal;line-height:21px}code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;font-size:13px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:10px;margin:0 0 10.5px;font-size:14px;line-height:21px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:21px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 21px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:21px;font-size:22.5px;line-height:42px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15.75px;color:#999}label,input,button,select,textarea{font-size:15px;font-weight:normal;line-height:21px}input,button,select,textarea{font-family:Georgia,"Times New Roman",Times,serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:21px;padding:4px 6px;margin-bottom:10.5px;font-size:15px;line-height:21px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:31px;*margin-top:4px;line-height:31px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#ccc}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#ccc}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#ccc}.radio,.checkbox{min-height:21px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#fff}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#fff}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#fff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#fff;background-color:#f26522;border-color:#fff}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#fff}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#fff}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#fff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#fff;background-color:#d14432;border-color:#fff}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#fff}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#fff}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#fff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#fff;background-color:#24c00b;border-color:#fff}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#fff}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#fff}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#fff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#fff;background-color:#185af9;border-color:#fff}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:20px 20px 21px;margin-top:21px;margin-bottom:21px;background-color:transparent;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#7b7b7b}.help-block{display:block;margin-bottom:10.5px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10.5px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:15px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:21px;min-width:16px;padding:4px 5px;font-size:15px;font-weight:normal;line-height:21px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#03f2d0;border-color:#015b4e}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10.5px}legend+.control-group{margin-top:21px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:21px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10.5px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:#f7f7f7;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:21px}.table th,.table td{padding:8px;line-height:21px;text-align:left;vertical-align:top;border-top:1px solid #999}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #999}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #999;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #999}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#eaeaea}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#ddd}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#24c00b}.table tbody tr.error>td{background-color:#d14432}.table tbody tr.warning>td{background-color:#f26522}.table tbody tr.info>td{background-color:#185af9}.table-hover tbody tr.success:hover>td{background-color:#1fa80a}.table-hover tbody tr.error:hover>td{background-color:#bf3c2b}.table-hover tbody tr.warning:hover>td{background-color:#ed560e}.table-hover tbody tr.info:hover>td{background-color:#064bf1}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.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;background-color:#002425;border:1px solid #ccc;border:1px solid transparent;*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9.5px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:transparent;border-bottom:1px solid #999}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:21px;color:#fff;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#015145;background-image:-moz-linear-gradient(top,#015b4e,#014238);background-image:-webkit-gradient(linear,0 0,0 100%,from(#015b4e),to(#014238));background-image:-webkit-linear-gradient(top,#015b4e,#014238);background-image:-o-linear-gradient(top,#015b4e,#014238);background-image:linear-gradient(to bottom,#015b4e,#014238);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff015b4e',endColorstr='#ff014238',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#015145;background-image:-moz-linear-gradient(top,#015b4e,#014238);background-image:-webkit-gradient(linear,0 0,0 100%,from(#015b4e),to(#014238));background-image:-webkit-linear-gradient(top,#015b4e,#014238);background-image:-o-linear-gradient(top,#015b4e,#014238);background-image:linear-gradient(to bottom,#015b4e,#014238);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff015b4e',endColorstr='#ff014238',GradientType=0)}.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;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#000;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#ddd;border:1px solid #cbcbcb;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:21px;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:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:15px;line-height:21px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #d9d9d9;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#bfbfbf;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:18.75px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:12.75px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:11.25px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#016a5b;*background-color:#015b4e;background-image:-moz-linear-gradient(top,#017464,#015b4e);background-image:-webkit-gradient(linear,0 0,0 100%,from(#017464),to(#015b4e));background-image:-webkit-linear-gradient(top,#017464,#015b4e);background-image:-o-linear-gradient(top,#017464,#015b4e);background-image:linear-gradient(to bottom,#017464,#015b4e);background-repeat:repeat-x;border-color:#015b4e #015b4e #000f0d;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff017464',endColorstr='#ff015b4e',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#015b4e;*background-color:#014238}.btn-primary:active,.btn-primary.active{background-color:#002923 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#f36f30;*background-color:#f26522;background-image:-moz-linear-gradient(top,#f3763a,#f26522);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f3763a),to(#f26522));background-image:-webkit-linear-gradient(top,#f3763a,#f26522);background-image:-o-linear-gradient(top,#f3763a,#f26522);background-image:linear-gradient(to bottom,#f3763a,#f26522);background-repeat:repeat-x;border-color:#f26522 #f26522 #bc440b;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff3763a',endColorstr='#fff26522',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f26522;*background-color:#ed560e}.btn-warning:active,.btn-warning.active{background-color:#d44d0d \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#d44f3e;*background-color:#d14432;background-image:-moz-linear-gradient(top,#d65747,#d14432);background-image:-webkit-gradient(linear,0 0,0 100%,from(#d65747),to(#d14432));background-image:-webkit-linear-gradient(top,#d65747,#d14432);background-image:-o-linear-gradient(top,#d65747,#d14432);background-image:linear-gradient(to bottom,#d65747,#d14432);background-repeat:repeat-x;border-color:#d14432 #d14432 #952f21;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd65747',endColorstr='#ffd14432',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#d14432;*background-color:#bf3c2b}.btn-danger:active,.btn-danger.active{background-color:#aa3526 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0065b4;*background-color:#005ca4;background-image:-moz-linear-gradient(top,#006bbe,#005ca4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#006bbe),to(#005ca4));background-image:-webkit-linear-gradient(top,#006bbe,#005ca4);background-image:-o-linear-gradient(top,#006bbe,#005ca4);background-image:linear-gradient(to bottom,#006bbe,#005ca4);background-repeat:repeat-x;border-color:#005ca4 #005ca4 #003158;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff006bbe',endColorstr='#ff005ca4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#005ca4;*background-color:#004e8b}.btn-success:active,.btn-success.active{background-color:#004071 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#32a0c0;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#34a7c8,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#34a7c8),to(#2f96b4));background-image:-webkit-linear-gradient(top,#34a7c8,#2f96b4);background-image:-o-linear-gradient(top,#34a7c8,#2f96b4);background-image:linear-gradient(to bottom,#34a7c8,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff34a7c8',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#505050;*background-color:#484848;background-image:-moz-linear-gradient(top,#555,#484848);background-image:-webkit-gradient(linear,0 0,0 100%,from(#555),to(#484848));background-image:-webkit-linear-gradient(top,#555,#484848);background-image:-o-linear-gradient(top,#555,#484848);background-image:linear-gradient(to bottom,#555,#484848);background-repeat:repeat-x;border-color:#484848 #484848 #222;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff555555',endColorstr='#ff484848',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#484848;*background-color:#3c3c3c}.btn-inverse:active,.btn-inverse.active{background-color:#2f2f2f \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#028d79;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#028d79;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10.5px;margin-bottom:10.5px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:15px}.btn-group>.btn-mini{font-size:11.25px}.btn-group>.btn-small{font-size:12.75px}.btn-group>.btn-large{font-size:18.75px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#015b4e}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f26522}.btn-group.open .btn-danger.dropdown-toggle{background-color:#d14432}.btn-group.open .btn-success.dropdown-toggle{background-color:#005ca4}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#484848}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:21px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#f26522;border:1px solid #f13614;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#fff}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:21px}.alert-success{color:#fff;background-color:#24c00b;border-color:#3aa80a}.alert-success h4{color:#fff}.alert-danger,.alert-error{color:#fff;background-color:#d14432;border-color:#c72d35}.alert-danger h4,.alert-error h4{color:#fff}.alert-info{color:#fff;background-color:#185af9;border-color:#066ee7}.alert-info h4{color:#fff}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:21px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:21px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#028d79}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9.5px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:21px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#028d79}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#028d79;border-bottom-color:#028d79}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#028d79;border-bottom-color:#028d79}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:21px;overflow:visible}.navbar-inner{min-height:55px;padding-right:20px;padding-left:20px;background-color:#013435;background-image:-moz-linear-gradient(top,#013435,#013435);background-image:-webkit-gradient(linear,0 0,0 100%,from(#013435),to(#013435));background-image:-webkit-linear-gradient(top,#013435,#013435);background-image:-o-linear-gradient(top,#013435,#013435);background-image:linear-gradient(to bottom,#013435,#013435);background-repeat:repeat-x;border:1px solid #011b1c;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff013435',endColorstr='#ff013435',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:17px 20px 17px;margin-left:-20px;font-size:20px;font-weight:200;color:#fff;text-shadow:0 1px 0 #013435}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:55px;color:#999}.navbar-link{color:#fff}.navbar-link:hover,.navbar-link:focus{color:#fff}.navbar .divider-vertical{height:55px;margin:0 9px;border-right:1px solid #013435;border-left:1px solid #013435}.navbar .btn,.navbar .btn-group{margin-top:12.5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:12.5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:12.5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:17px 15px 17px;color:#fff;text-decoration:none;text-shadow:0 1px 0 #013435}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#fff;text-decoration:none;background-color:#002425}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#fff;text-decoration:none;background-color:#002425;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#011b1c;*background-color:#011b1c;background-image:-moz-linear-gradient(top,#011b1c,#011b1c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#011b1c),to(#011b1c));background-image:-webkit-linear-gradient(top,#011b1c,#011b1c);background-image:-o-linear-gradient(top,#011b1c,#011b1c);background-image:linear-gradient(to bottom,#011b1c,#011b1c);background-repeat:repeat-x;border-color:#011b1c #011b1c #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff011b1c',endColorstr='#ff011b1c',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#011b1c;*background-color:#000303}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#000 \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:transparent;content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #002425;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:transparent}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #002425;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#002425}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#eaeaea,#ddd);background-image:-webkit-gradient(linear,0 0,0 100%,from(#eaeaea),to(#ddd));background-image:-webkit-linear-gradient(top,#eaeaea,#ddd);background-image:-o-linear-gradient(top,#eaeaea,#ddd);background-image:linear-gradient(to bottom,#eaeaea,#ddd);background-repeat:repeat-x;border-color:#d0d0d0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffeaeaea',endColorstr='#ffdddddd',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#333;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#333}.navbar-inverse .brand{color:#333}.navbar-inverse .navbar-text{color:#555}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#333;background-color:#cbcbcb}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#333;background-color:#cbcbcb}.navbar-inverse .navbar-link{color:#333}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#333}.navbar-inverse .divider-vertical{border-right-color:#eaeaea;border-left-color:#ddd}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#333;background-color:#cbcbcb}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#333;border-bottom-color:#333}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#333;border-bottom-color:#333}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#fff;border-color:#ddd;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#555}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#555}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#555}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#d8d8d8;*background-color:#d0d0d0;background-image:-moz-linear-gradient(top,#ddd,#d0d0d0);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ddd),to(#d0d0d0));background-image:-webkit-linear-gradient(top,#ddd,#d0d0d0);background-image:-o-linear-gradient(top,#ddd,#d0d0d0);background-image:linear-gradient(to bottom,#ddd,#d0d0d0);background-repeat:repeat-x;border-color:#d0d0d0 #d0d0d0 #aaa;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdddddd',endColorstr='#ffd0d0d0',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#d0d0d0;*background-color:#c3c3c3}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#b7b7b7 \9}.breadcrumb{padding:8px 15px;margin:0 0 21px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:21px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:21px;text-decoration:none;background-color:#e6e6e6;border:1px solid transparent;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#a2cdb5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:18.75px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:12.75px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:11.25px}.pager{margin:21px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.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;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;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-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#015b4e;border-bottom:1px solid #014238;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.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{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:21px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:21px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#028d79;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;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{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:12.69px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#fff}.label-important[href],.badge-important[href]{background-color:#e6e6e6}.label-warning,.badge-warning{background-color:#f26522}.label-warning[href],.badge-warning[href]{background-color:#d44d0d}.label-success,.badge-success{background-color:#fff}.label-success[href],.badge-success[href]{background-color:#e6e6e6}.label-info,.badge-info{background-color:#fff}.label-info[href],.badge-info[href]{background-color:#e6e6e6}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:21px;margin-bottom:21px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#f5834d;background-image:-moz-linear-gradient(top,#f6976a,#f26522);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f6976a),to(#f26522));background-image:-webkit-linear-gradient(top,#f6976a,#f26522);background-image:-o-linear-gradient(top,#f6976a,#f26522);background-image:linear-gradient(to bottom,#f6976a,#f26522);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff6976a',endColorstr='#fff26522',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#f6976a;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:21px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:21px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;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:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:21px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:31.5px;color:inherit;background-color:#ddd;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:#333}.hero-unit li{line-height:31.5px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-family:Georgia,"Times New Roman",Times,serif;color:#333}.muted{color:#999}.jumbotron h1{font-weight:normal!important}.text-warning{color:#f26522}.text-error{color:#d14432}.text-success{color:#015b4e}.text-info{color:#004e8b}.page-header{padding-bottom:5px;border-bottom:0}.page-header h1{margin-bottom:0}hr{border-bottom:0}blockquote{border-left:2px solid #333}blockquote.pull-right{border-right:2px solid #333}blockquote small{color:#013435}.navbar .navbar-inner{background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar .brand{padding:18px 20px 16px;font-family:'Crete Round',serif;font-size:26px;font-weight:normal}.navbar .brand:hover{background-color:#002425}.navbar .nav>li>a{padding:20px 20px 14px;font-family:'Crete Round',serif;font-size:20px;font-weight:normal;text-shadow:none}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar .navbar-text{margin:19px 20px 0;font-family:'Crete Round',serif;font-size:20px;font-weight:normal;line-height:inherit}.navbar .divider-vertical{border-color:rgba(0,0,0,0.2)}.navbar .btn-navbar{margin-top:14px}.navbar .navbar-form,.navbar .navbar-search{margin-top:12px;line-height:normal;border-color:transparent;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar .navbar-search .search-query{line-height:normal;color:#fff;background-color:rgba(255,255,255,0.4);border-color:transparent}.navbar .dropdown-menu li>a{font-family:'Crete Round',serif;font-weight:normal}.navbar .nav>li>.dropdown-menu::before,.navbar .nav>li>.dropdown-menu::after{border-bottom:0}.navbar-inverse .navbar-search .search-query{color:#555}.navbar-inverse .dropdown-menu{background-color:#cbcbcb}.navbar-inverse .dropdown-menu li>a{color:#333}.navbar-inverse .dropdown-menu li>a:hover{background-color:#ddd}.navbar-inverse .dropdown-menu .divider{border-bottom:1px solid rgba(0,0,0,0.2)}.navbar-inverse .dropdown-menu .nav-header{color:#555}@media(max-width:979px){.navbar .nav-collapse .nav li>a{color:#fff}.navbar .nav-collapse .nav li>a:hover{background-color:#002425}.navbar-inverse .nav-collapse .nav li>a:hover{background-color:rgba(0,0,0,0.06)!important}.nav-collapse .navbar-form,.nav-collapse .navbar-search{border:none!important;-webkit-box-shadow:none!important;-moz-box-shadow:none!important;box-shadow:none!important}}div.subnav{background:#015b4e none;border-color:transparent}div.subnav .nav>li>a{padding:12px 12px 10px;font-family:'Crete Round',serif;font-weight:normal;color:#fff;background-color:transparent;border-color:transparent}div.subnav .nav>li>a:hover,div.subnav .nav>.active>a,div.subnav .nav>.active>a:hover,div.subnav .dropdown.open .dropdown-toggle,div.subnav .dropdown.open.active .dropdown-toggle:hover{color:#fff;background-color:#002425;border-color:transparent;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}div.subnav.subnav-fixed{top:55px}.nav .nav-header{color:#333}.nav .disabled>a,.nav .disabled>a:hover{color:#fff;background-color:#028d79}.nav-tabs{border-color:transparent}.nav-tabs>li>a{color:#fff;background-color:#015b4e}.nav-tabs>li>a:hover{background-color:#013435;border-color:transparent}.nav-tabs .active>a,.nav-tabs .active>a:hover{color:#fff;background-color:#013435;border-color:transparent}.nav-tabs.nav-stacked>li>a{border-color:transparent}.nav-tabs.nav-stacked>li>a:hover{border-color:transparent}.nav-tabs .open .dropdown-toggle,.nav-tabs .active.open .dropdown-toggle{background-color:#013435}.nav-pills>li>a{color:#fff;background-color:#015b4e}.nav-pills>li>a:hover{background-color:#013435;border-color:transparent}.nav-pills .active>a,.nav-pills .active>a:hover{color:#fff;background-color:#013435;border-color:transparent}.nav-pills .open .dropdown-toggle,.nav-pills .active.open .dropdown-toggle{background-color:#013435}.tabbable .nav-tabs,.tabbable .nav-tabs>li>a,.tabbable .nav-tabs>li>a:hover,.tabbable .nav-tabs>li.active>a,.tabbable .nav-tabs>li.active>a:hover{border-color:transparent}.nav-list .nav-header,.nav-list li>a{text-shadow:none}.nav-list li>a:hover{color:#fff;background-color:#015b4e}.nav-list li.active>a,.nav-list li.active>a:hover{text-shadow:none;background-color:#013435}.nav-list .divider{background-color:transparent;border-bottom:1px solid #999}.breadcrumb{background-color:#015b4e;background-image:none;border-color:transparent;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.breadcrumb li{color:#fff;text-shadow:none}.breadcrumb li a{color:#fff;text-decoration:underline}.breadcrumb li a:hover{color:#fff}.breadcrumb li .divider{color:#fff}.breadcrumb .active{color:#fff}.pagination ul{background-color:#015b4e;background-image:none;border-color:transparent;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.pagination ul>li>a,.pagination ul>li>span{color:#fff;background-color:#015b4e;border-color:transparent}.pagination ul>li>a:hover,.pagination ul>li>span:hover{color:#fff;background-color:#013435}.pagination ul>.active>a,.pagination ul>.active>span{color:#fff;background-color:#013435}.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>span,.pagination ul>.disabled>span:hover{color:#fff;background-color:#028d79}.pager li>a,.pager li>span{color:#fff;background-color:#015b4e;border:0}.pager li>a:hover,.pager li>span:hover{background-color:#013435}.pager .disabled a,.pager .disabled a:hover{color:#fff;background-color:#028d79}.btn{font-family:'Crete Round',serif;font-weight:normal;text-shadow:none}.btn-large{font-size:18px}.btn-group .dropdown-toggle{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.table th,.table-striped tbody tr:nth-child(odd) th{color:#fff;background-color:#015b4e}.table tbody tr.success td{background-color:#b5eeaa}.table tbody tr.error td{background-color:#eeb8b8}.table tbody tr.info td{background-color:#aee2ee}legend{font-family:'Crete Round',serif;font-weight:normal;color:#333;border-bottom:0}label,.help-block,input[type="file"]{color:#333}input,textarea,select{color:#555}.uneditable-input{color:#555}.form-actions{border-top:0}.control-group.warning .control-label,.control-group.error .control-label,.control-group.success .control-label,.control-group.info .control-label{color:#555}.control-group.error .help-block,.control-group.error .help-inline{color:#d14432}.control-group.error input,.control-group.error select,.control-group.error textarea{color:#555;border:1px solid #d14432}.control-group.success .help-block,.control-group.success .help-inline{color:#015b4e}.control-group.success input,.control-group.success select,.control-group.success textarea{color:#555;border:1px solid #015b4e}.control-group.warning .help-block,.control-group.warning .help-inline{color:#f26522}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#555;border:1px solid #f26522}.control-group.info .help-block,.control-group.info .help-inline{color:#2f96b4}.control-group.info input,.control-group.info select,.control-group.info textarea{color:#555;border:1px solid #2f96b4}.alert{text-shadow:none;border:0}.alert h1,.alert h2,.alert h3,.alert h4,.alert h5,.alert h6{font-weight:bold;color:#fff}.alert-heading{font-family:Georgia,"Times New Roman",Times,serif;color:inherit}.badge,.label{text-shadow:none;background-color:#015b4e}.badge-success,.label-success{background-color:#006bbe}.badge-warning,.label-warning{background-color:#f3763a}.badge-important,.label-important{background-color:#d65747}.badge-info,.label-info{background-color:#34a7c8}.badge-inverse,.label-inverse{background-color:#555}.well{border:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.hero-unit{border:0}.thumbnail{border:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.dropdown-menu .nav-header{color:#fff;text-shadow:none}.dropdown-menu li>a:hover,.dropdown-menu li>a:focus,.dropdown-submenu:hover>a{background-image:none}.progress{background-color:#d5d5d5;background-image:none}[class^="icon-"],[class*=" icon-"]{vertical-align:baseline}.modal-header{padding:12px 15px 6px;color:#fff;background-color:#015b4e}.modal-header h1,.modal-header h2,.modal-header h3,.modal-header h4,.modal-header h5,.modal-header h6{color:#fff}.modal-body,.modal-footer{border:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.modal-body label,.modal-footer label{color:#555}.modal-footer{background-color:#ddd}.popover-title{color:#fff}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} diff --git a/flask_admin/static/bootstrap/bootstrap2/swatch/superhero/bootstrap.min.css b/flask_admin/static/bootstrap/bootstrap2/swatch/superhero/bootstrap.min.css deleted file mode 100644 index d6e10c5b0..000000000 --- a/flask_admin/static/bootstrap/bootstrap2/swatch/superhero/bootstrap.min.css +++ /dev/null @@ -1,9 +0,0 @@ -@import url('//fonts.googleapis.com/css?family=Oswald|Noticia+Text');/*! - * Bootstrap v2.3.2 - * - * Copyright 2013 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world by @mdo and @fat. - */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!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) ")"}.ir a:after,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}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:Georgia,Utopia,Palatino,'Palatino Linotype',serif;font-size:15px;line-height:20px;color:#ece9d7;background-color:#2a333c}a{color:#e36b23;text-decoration:none}a:hover,a:focus{color:#e36b23;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:22.5px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:'Oswald',sans-serif;font-weight:bold;line-height:20px;color:#e36b23;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:41.25px}h2{font-size:33.75px}h3{font-size:26.25px}h4{font-size:18.75px}h5{font-size:15px}h6{font-size:12.75px}h1 small{font-size:26.25px}h2 small{font-size:18.75px}h3 small{font-size:15px}h4 small{font-size:15px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid transparent;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:18.75px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;font-size:13px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:14px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:22.5px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:15px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:Georgia,Utopia,Palatino,'Palatino Linotype',serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:15px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:transparent;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#fff}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:15px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:15px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#abe081;border-color:#5da028}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:#3f4956;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid transparent}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid transparent}.table .table{background-color:#2a333c}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid transparent;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid transparent}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#45515f}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#505e6e}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.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;background-color:#5a6a7d;border:1px solid #ccc;border:1px solid transparent;*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:transparent;border-bottom:1px solid #45515f}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#ece9d7;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#dc6620;background-image:-moz-linear-gradient(top,#e36b23,#d25f1b);background-image:-webkit-gradient(linear,0 0,0 100%,from(#e36b23),to(#d25f1b));background-image:-webkit-linear-gradient(top,#e36b23,#d25f1b);background-image:-o-linear-gradient(top,#e36b23,#d25f1b);background-image:linear-gradient(to bottom,#e36b23,#d25f1b);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe36b23',endColorstr='#ffd25f1b',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#dc6620;background-image:-moz-linear-gradient(top,#e36b23,#d25f1b);background-image:-webkit-gradient(linear,0 0,0 100%,from(#e36b23),to(#d25f1b));background-image:-webkit-linear-gradient(top,#e36b23,#d25f1b);background-image:-o-linear-gradient(top,#e36b23,#d25f1b);background-image:linear-gradient(to bottom,#e36b23,#d25f1b);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe36b23',endColorstr='#ffd25f1b',GradientType=0)}.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;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#303841;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#45515f;border:1px solid #363f4a;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;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:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:15px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:18.75px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:12.75px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:11.25px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#e37e23;*background-color:#e39b23;background-image:-moz-linear-gradient(top,#e36b23,#e39b23);background-image:-webkit-gradient(linear,0 0,0 100%,from(#e36b23),to(#e39b23));background-image:-webkit-linear-gradient(top,#e36b23,#e39b23);background-image:-o-linear-gradient(top,#e36b23,#e39b23);background-image:linear-gradient(to bottom,#e36b23,#e39b23);background-repeat:repeat-x;border-color:#e39b23 #e39b23 #a56f15;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe36b23',endColorstr='#ffe39b23',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#e39b23;*background-color:#d28d1b}.btn-primary:active,.btn-primary.active{background-color:#bb7e18 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#e8864c;*background-color:#e36b23;background-image:-moz-linear-gradient(top,#ec9967,#e36b23);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ec9967),to(#e36b23));background-image:-webkit-linear-gradient(top,#ec9967,#e36b23);background-image:-o-linear-gradient(top,#ec9967,#e36b23);background-image:linear-gradient(to bottom,#ec9967,#e36b23);background-repeat:repeat-x;border-color:#e36b23 #e36b23 #a54b15;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffec9967',endColorstr='#ffe36b23',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#e36b23;*background-color:#d25f1b}.btn-warning:active,.btn-warning.active{background-color:#bb5518 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#414141;*background-color:#222;background-image:-moz-linear-gradient(top,#555,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#555),to(#222));background-image:-webkit-linear-gradient(top,#555,#222);background-image:-o-linear-gradient(top,#555,#222);background-image:linear-gradient(to bottom,#555,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff555555',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#e36b23;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#e36b23;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:15px}.btn-group>.btn-mini{font-size:11.25px}.btn-group>.btn-small{font-size:12.75px}.btn-group>.btn-large{font-size:18.75px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#e39b23}.btn-group.open .btn-warning.dropdown-toggle{background-color:#e36b23}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#e36b23}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#2a333c;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#e36b23}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#e36b23;border-bottom-color:#e36b23}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#e36b23;border-bottom-color:#e36b23}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:70px;padding-right:20px;padding-left:20px;background-color:#2a333c;background-image:-moz-linear-gradient(top,#2a333c,#2a333c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#2a333c),to(#2a333c));background-image:-webkit-linear-gradient(top,#2a333c,#2a333c);background-image:-o-linear-gradient(top,#2a333c,#2a333c);background-image:linear-gradient(to bottom,#2a333c,#2a333c);background-repeat:repeat-x;border:1px solid #20262d;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a333c',endColorstr='#ff2a333c',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:25px 20px 25px;margin-left:-20px;font-size:20px;font-weight:200;color:#e36b23;text-shadow:0 1px 0 #2a333c}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:70px;color:#999}.navbar-link{color:#e36b23}.navbar-link:hover,.navbar-link:focus{color:#e36b23}.navbar .divider-vertical{height:70px;margin:0 9px;border-right:1px solid #2a333c;border-left:1px solid #2a333c}.navbar .btn,.navbar .btn-group{margin-top:20px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:20px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:20px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:25px 15px 25px;color:#e36b23;text-decoration:none;text-shadow:0 1px 0 #2a333c}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#e36b23;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#e36b23;text-decoration:none;background-color:#2a333c;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#20262d;*background-color:#20262d;background-image:-moz-linear-gradient(top,#20262d,#20262d);background-image:-webkit-gradient(linear,0 0,0 100%,from(#20262d),to(#20262d));background-image:-webkit-linear-gradient(top,#20262d,#20262d);background-image:-o-linear-gradient(top,#20262d,#20262d);background-image:linear-gradient(to bottom,#20262d,#20262d);background-repeat:repeat-x;border-color:#20262d #20262d #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff20262d',endColorstr='#ff20262d',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#20262d;*background-color:#151a1e}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#0b0d0f \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:transparent;content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #5a6a7d;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:transparent}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #5a6a7d;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#e36b23;border-bottom-color:#e36b23}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#e36b23;background-color:#2a333c}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#e36b23;border-bottom-color:#e36b23}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#e36b23;border-bottom-color:#e36b23}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#45515f;background-image:-moz-linear-gradient(top,#45515f,#45515f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#45515f),to(#45515f));background-image:-webkit-linear-gradient(top,#45515f,#45515f);background-image:-o-linear-gradient(top,#45515f,#45515f);background-image:linear-gradient(to bottom,#45515f,#45515f);background-repeat:repeat-x;border-color:#20262d;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff45515f',endColorstr='#ff45515f',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#e36b23;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#e36b23}.navbar-inverse .brand{color:#e36b23}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#e36b23;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#e36b23;background-color:#45515f}.navbar-inverse .navbar-link{color:#e36b23}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#e36b23}.navbar-inverse .divider-vertical{border-right-color:#45515f;border-left-color:#45515f}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#e36b23;background-color:#45515f}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#e36b23;border-bottom-color:#e36b23}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#e36b23;border-bottom-color:#e36b23}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#e36b23;border-bottom-color:#e36b23}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#fff;border-color:#45515f;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#999}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#999}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#999}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#3a4450;*background-color:#3a4450;background-image:-moz-linear-gradient(top,#3a4450,#3a4450);background-image:-webkit-gradient(linear,0 0,0 100%,from(#3a4450),to(#3a4450));background-image:-webkit-linear-gradient(top,#3a4450,#3a4450);background-image:-o-linear-gradient(top,#3a4450,#3a4450);background-image:linear-gradient(to bottom,#3a4450,#3a4450);background-repeat:repeat-x;border-color:#3a4450 #3a4450 #1a1f24;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3a4450',endColorstr='#ff3a4450',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#3a4450;*background-color:#303841}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#252b33 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#45515f;border:1px solid transparent;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#e36b23}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:18.75px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:12.75px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:11.25px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.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;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;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-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#45515f;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#3f4956;border-bottom:1px solid #343d47;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.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{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#45515f;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#45515f;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#45515f;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#45515f;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#e36b23;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;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{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:12.69px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#e36b23}.label-warning[href],.badge-warning[href]{background-color:#bb5518}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#e8864c;background-image:-moz-linear-gradient(top,#ec9967,#e36b23);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ec9967),to(#e36b23));background-image:-webkit-linear-gradient(top,#ec9967,#e36b23);background-image:-o-linear-gradient(top,#ec9967,#e36b23);background-image:linear-gradient(to bottom,#ec9967,#e36b23);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffec9967',endColorstr='#ffe36b23',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#ec9967;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;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:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#45515f;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,h6{font-family:'Oswald',sans-serif;color:#e36b23;text-shadow:-1px 1px 0 #612c0c}h1,h2{text-shadow:-2px 2px 0 #612c0c}h1{line-height:55px}code,pre{color:#ece9d7;background-color:#566577;border:0}.page-header{border-bottom:0}blockquote{border-left:5px solid #45515f}blockquote.pull-right{border-right:5px solid #45515f}.navbar .navbar-inner{background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar .brand{padding:25px 20px 15px;font-family:'Oswald',sans-serif;font-size:30px;text-shadow:-2px 2px 0 #612c0c}.navbar .nav>li>a{padding:23px 20px 13px;font-family:'Oswald',sans-serif;font-size:22px;line-height:30px;text-shadow:-2px 2px 0 #612c0c}.navbar .brand:hover,.navbar .nav>li>a:hover,.navbar .nav>li.active>a:hover,.navbar .nav>li.dropdown.open>a,.navbar .nav>li.dropdown.open>a:hover{position:relative;top:1px;left:-1px;color:#e36b23;text-shadow:-1px 1px 0 #612c0c}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar .navbar-text{padding:23px 20px 13px;font-family:'Oswald',sans-serif;font-size:22px;line-height:30px;text-shadow:-2px 2px 0 #555}.navbar .navbar-search{margin-top:24px}.navbar .navbar-search .search-query{font-family:Georgia,Utopia,Palatino,'Palatino Linotype',serif;font-size:15px;line-height:20px;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar.navbar-inverse .navbar-search .search-query{color:#2a333c}.navbar .divider-vertical{height:70px}.navbar .nav .dropdown-toggle .caret,.navbar .nav .open.dropdown .caret{margin-top:14px;border-top-color:#ece9d7}.navbar .dropdown-menu::before{border:0}.navbar .dropdown-menu::after{left:20px;border-right:7px solid transparent;border-bottom:7px solid #5a6a7d;border-left:7px solid transparent}.navbar [class^="icon-"],.navbar [class*=" icon-"]{vertical-align:20%}.navbar .btn-navbar{background-color:#45515f;border-color:transparent}@media(max-width:979px){.navbar .nav-collapse{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.navbar .nav-collapse .nav li>a{color:#e36b23}.navbar .nav-collapse .nav li>a:hover{background-color:#5a6a7d!important;background-image:none}.navbar .nav-collapse .navbar-form,.navbar .nav-collapse .navbar-search{border-top:0;border-bottom:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar .nav-collapse .nav-header{color:#ece9d7}}div.subnav{margin:0 1px;background:#45515f none;border:0}div.subnav .nav>li>a,div.subnav .nav>li.active>a{color:#ece9d7;border-color:transparent}div.subnav .nav>li>a:hover,div.subnav .nav>li.active>a:hover{background-color:#5a6a7d;border-color:transparent}div.subnav .nav>li.active>a,div.subnav .nav>li.active>a:hover{color:#fff;background:#e36b23 none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}div.subnav.subnav-fixed{top:71px;margin:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}div.subnav.subnav-fixed .nav>li>a,div.subnav.subnav-fixed .nav>li>a:hover,div.subnav.subnav-fixed .nav>li.active>a,div.subnav.subnav-fixed .nav>li.active>a:hover{border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}div.subnav.subnav-fixed .nav>li>a:hover,div.subnav.subnav-fixed .nav>li.active>a:hover{color:#fff}div.subnav .nav>.active>a .caret,div.subnav .nav>.active>a:hover .caret{border-top-color:#ece9d7}.nav .nav-header{color:#ece9d7;text-shadow:none}.nav-list{padding:0 15px}.nav-list>li>a,.nav-list>.nav-header{color:#ece9d7;text-shadow:none}.nav-list .active>a,.nav-list .active>a:hover{color:#fff;text-shadow:none}.nav-list li>a:hover{background-color:#5a6a7d}.nav-tabs,.nav-tabs.nav-stacked>li>a{border-color:transparent}.nav-tabs>li>a{color:#ece9d7;background-color:#45515f}.nav-tabs li.active>a,.nav-tabs li.active>a:hover,.nav-tabs.nav-stacked>li.active>a:hover{color:#fff;background-color:#e36b23;border-color:transparent}.nav-tabs li>a:hover,.nav-tabs.nav-stacked>li>a:hover{background-color:#5a6a7d;border-color:transparent}.nav-tabs li.disabled>a:hover{background-color:#45515f}.nav-pills>li>a{color:#ece9d7;background-color:#45515f}.nav-pills>li>a:hover{background-color:#5a6a7d;border-color:transparent}.nav-pills>.disabled>a:hover{background-color:#45515f}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>.open.active>a:hover{background-color:#5a6a7d;border-color:transparent}.nav-pills .dropdown .caret,.nav-pills .dropdown:hover .caret{border-top-color:#ece9d7}.dropdown.open .dropdown-menu>li>a:hover,.dropdown.open .dropdown-menu>li.active>a:hover{color:#fff;background-color:#e36b23}.tabbable .nav-tabs,.tabbable .nav-tabs>li.active>a,.tabbable .nav-tabs>li>a:hover,.tabbable .nav-tabs>li.active>a:hover{border-color:transparent}.breadcrumb{background-color:#45515f;background-image:none;border:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.breadcrumb li{text-shadow:none}.breadcrumb .divider{color:#ece9d7}.pagination ul{background-image:none;border-color:transparent}.pagination ul>li>a,.pagination ul>li>span{color:#ece9d7;border:0}.pagination ul>li>a:hover{background:#5a6a7d}.pagination ul>.active>a,.pagination ul>.active>a:hover,.pagination ul>.active>span,.pagination ul>.active>span:hover{color:#fff;background-color:#e36b23}.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>span,.pagination ul>.disabled>span:hover{background:#3a4450}.pager li>a,.pager li>span{color:#ece9d7;background-color:#45515f;border:0}.pager li>a:hover,.pager li>span:hover{background:#5a6a7d}.pager .disabled a,.pager .disabled a:hover{background-color:#45515f}.btn,.btn:hover{text-shadow:none;background-image:none;border:0;-webkit-box-shadow:-2px 2px 0 rgba(0,0,0,0.2);-moz-box-shadow:-2px 2px 0 rgba(0,0,0,0.2);box-shadow:-2px 2px 0 rgba(0,0,0,0.2)}.btn-warning{background-color:#e6c92e}.btn-primary,.btn-primary:hover{-webkit-box-shadow:-2px 2px 0 #612c0c;-moz-box-shadow:-2px 2px 0 #612c0c;box-shadow:-2px 2px 0 #612c0c}.btn-warning,.btn-warning:hover{-webkit-box-shadow:-2px 2px 0 #6e5f0d;-moz-box-shadow:-2px 2px 0 #6e5f0d;box-shadow:-2px 2px 0 #6e5f0d}.btn-danger,.btn-danger:hover{-webkit-box-shadow:-2px 2px 0 #9f1411;-moz-box-shadow:-2px 2px 0 #9f1411;box-shadow:-2px 2px 0 #9f1411}.btn-success,.btn-success:hover{-webkit-box-shadow:-2px 2px 0 #276627;-moz-box-shadow:-2px 2px 0 #276627;box-shadow:-2px 2px 0 #276627}.btn-info,.btn-info:hover{-webkit-box-shadow:-2px 2px 0 #124a5b;-moz-box-shadow:-2px 2px 0 #124a5b;box-shadow:-2px 2px 0 #124a5b}.btn-inverse,.btn-inverse:hover{-webkit-box-shadow:-2px 2px 0 #121212;-moz-box-shadow:-2px 2px 0 #121212;box-shadow:-2px 2px 0 #121212}.btn.dropdown-toggle,.btn.dropdown-toggle:hover{-webkit-box-shadow:0 2px 0 #333;-moz-box-shadow:0 2px 0 #333;box-shadow:0 2px 0 #333}.btn-primary.dropdown-toggle,.btn-primary.dropdown-toggle:hover{-webkit-box-shadow:0 2px 0 #612c0c;-moz-box-shadow:0 2px 0 #612c0c;box-shadow:0 2px 0 #612c0c}.btn-warning.dropdown-toggle,.btn-warning.dropdown-toggle:hover{-webkit-box-shadow:0 2px 0 #6e5f0d;-moz-box-shadow:0 2px 0 #6e5f0d;box-shadow:0 2px 0 #6e5f0d}.btn-danger.dropdown-toggle,.btn-danger.dropdown-toggle:hover{-webkit-box-shadow:0 2px 0 #9f1411;-moz-box-shadow:0 2px 0 #9f1411;box-shadow:0 2px 0 #9f1411}.btn-success.dropdown-toggle,.btn-success.dropdown-toggle:hover{-webkit-box-shadow:0 2px 0 #276627;-moz-box-shadow:0 2px 0 #276627;box-shadow:0 2px 0 #276627}.btn-info.dropdown-toggle,.btn-info.dropdown-toggle:hover{-webkit-box-shadow:0 2px 0 #124a5b;-moz-box-shadow:0 2px 0 #124a5b;box-shadow:0 2px 0 #124a5b}.btn-inverse.dropdown-toggle,.btn-inverse.dropdown-toggle:hover{-webkit-box-shadow:0 2px 0 #121212;-moz-box-shadow:0 2px 0 #121212;box-shadow:0 2px 0 #121212}.btn.active,.btn:active{position:relative;top:1px;left:-1px;-webkit-box-shadow:-1px 1px 0 #333;-moz-box-shadow:-1px 1px 0 #333;box-shadow:-1px 1px 0 #333}.btn.disabled,.btn.disabled.active,.btn.disabled:active,.btn[disabled]{top:0;left:0;text-shadow:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}[class^="icon-"],[class*=" icon-"]{vertical-align:-13%}.table,.table-striped tbody>tr>td:first-child,.table-striped tbody>tr>td:last-child{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,button,select,textarea{font-family:'Noticia Text',serif}legend{font-family:'Oswald',sans-serif;color:#e36b23;text-shadow:-2px 2px 0 #612c0c;border-bottom:0}label{line-height:15px;color:#ece9d7}.help-block{color:#ece9d7;opacity:.6}.form-actions{border-top:0}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#ceae78}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#ceae78}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#ceae78;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #e9dbc3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #e9dbc3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #e9dbc3}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#ceae78;background-color:#fcf8e3;border-color:#ceae78}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#c76e6d}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#c76e6d}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#c76e6d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #e3b7b7;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #e3b7b7;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #e3b7b7}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#c76e6d;background-color:#f2dede;border-color:#c76e6d}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#58a959}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#58a959}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#58a959;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #9bcc9c;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #9bcc9c;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #9bcc9c}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#58a959;background-color:#dff0d8;border-color:#58a959}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn{color:#2a333c}.dropdown .caret{margin-top:14px;border-top:6px solid #5a6a7d;border-right:6px solid transparent;border-left:6px solid transparent;opacity:1}.label,.badge{color:#ece9d7;background-color:#45515f}.label-important,.badge-important{background-color:#b94a48}.label-warning,.badge-warning{background-color:#e36b23}.label-success,.badge-success{background-color:#468847}.label-info,.badge-info{background-color:#3a87ad}.label-inverse,.badge-inverse{background-color:#555}.alert{color:#ece9d7;text-shadow:none;background-color:#45515f;border:0}.alert .alert-heading{color:#e36b23}.alert-success{background-color:#468847}.alert-danger,.alert-error{background-color:#b94a48}.alert-info{background-color:#3a87ad}.well,.hero-unit{border:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.hero-unit h1{line-height:2em;color:#e36b23}.progress{background-color:#20262d;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.progress .bar{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.thumbnail{background:#45515f;border:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.modal{background-color:transparent}.modal-header,.modal-body,.modal-footer{background-color:#2a333c;border:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.modal-header{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.modal-footer{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}@media(max-width:768px){div.subnav .nav>li:first-child>a,div.subnav .nav>li:first-child>a:hover,div.subnav .nav>li.active:first-child>a,div.subnav .nav>li.active:first-child>a:hover{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}div.subnav .nav>li:last-child>a,div.subnav .nav>li:last-child>a:hover,div.subnav .nav>li.active:last-child>a,div.subnav .nav>li.active:last-child>a:hover{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} diff --git a/flask_admin/static/bootstrap/bootstrap2/swatch/united/bootstrap.min.css b/flask_admin/static/bootstrap/bootstrap2/swatch/united/bootstrap.min.css deleted file mode 100644 index 29cb6b617..000000000 --- a/flask_admin/static/bootstrap/bootstrap2/swatch/united/bootstrap.min.css +++ /dev/null @@ -1,9 +0,0 @@ -@import url(//fonts.googleapis.com/css?family=Ubuntu);/*! - * Bootstrap v2.3.2 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!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) ")"}.ir a:after,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}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:'Ubuntu',Tahoma,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#dd4814;text-decoration:none}a:hover,a:focus{color:#97310e;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#eca918}a.text-warning:hover,a.text-warning:focus{color:#c18910}.text-error{color:#df382c}a.text-error:hover,a.text-error:focus{color:#bc271c}.text-info{color:#772953}a.text-info:hover,a.text-info:focus{color:#511c39}.text-success{color:#38b44a}a.text-success:hover,a.text-success:focus{color:#2c8d3a}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #f5f5f5}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #f5f5f5;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #f5f5f5}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #f5f5f5;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:'Ubuntu',Tahoma,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#f5f5f5}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#eca918}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#eca918}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#eca918;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#c18910;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f4cc76;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f4cc76;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f4cc76}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#eca918;background-color:#fcefd4;border-color:#eca918}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#df382c}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#df382c}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#df382c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#bc271c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ec8c85;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ec8c85;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ec8c85}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#df382c;background-color:#fadfdd;border-color:#df382c}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#38b44a}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#38b44a}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#38b44a;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#2c8d3a;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7cd689;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7cd689;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7cd689}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#38b44a;background-color:#caeecf;border-color:#38b44a}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#772953}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#772953}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#772953;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#511c39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #bf4788;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #bf4788;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #bf4788}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#772953;background-color:#e7b8d1;border-color:#772953}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:transparent;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#f5f5f5;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a3e2ac;border-color:#38b44a}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.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 td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#caeecf}.table tbody tr.error>td{background-color:#fadfdd}.table tbody tr.warning>td{background-color:#fcefd4}.table tbody tr.info>td{background-color:#e7b8d1}.table-hover tbody tr.success:hover>td{background-color:#b6e8bd}.table-hover tbody tr.error:hover>td{background-color:#f7cac7}.table-hover tbody tr.warning:hover>td{background-color:#fae6bd}.table-hover tbody tr.info:hover>td{background-color:#e0a5c5}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.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;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#dd4814;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#d44513;background-image:-moz-linear-gradient(top,#dd4814,#c64012);background-image:-webkit-gradient(linear,0 0,0 100%,from(#dd4814),to(#c64012));background-image:-webkit-linear-gradient(top,#dd4814,#c64012);background-image:-o-linear-gradient(top,#dd4814,#c64012);background-image:linear-gradient(to bottom,#dd4814,#c64012);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdd4814',endColorstr='#ffc64012',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#d44513;background-image:-moz-linear-gradient(top,#dd4814,#c64012);background-image:-webkit-gradient(linear,0 0,0 100%,from(#dd4814),to(#c64012));background-image:-webkit-linear-gradient(top,#dd4814,#c64012);background-image:-o-linear-gradient(top,#dd4814,#c64012);background-image:linear-gradient(to bottom,#dd4814,#c64012);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdd4814',endColorstr='#ffc64012',GradientType=0)}.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;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;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:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#dd5c14;*background-color:#dd7a14;background-image:-moz-linear-gradient(top,#dd4814,#dd7a14);background-image:-webkit-gradient(linear,0 0,0 100%,from(#dd4814),to(#dd7a14));background-image:-webkit-linear-gradient(top,#dd4814,#dd7a14);background-image:-o-linear-gradient(top,#dd4814,#dd7a14);background-image:linear-gradient(to bottom,#dd4814,#dd7a14);background-repeat:repeat-x;border-color:#dd7a14 #dd7a14 #97530e;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdd4814',endColorstr='#ffdd7a14',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#dd7a14;*background-color:#c66d12}.btn-primary:active,.btn-primary.active{background-color:#ae6010 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#e86537;*background-color:#dd4814;background-image:-moz-linear-gradient(top,#ef784e,#dd4814);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ef784e),to(#dd4814));background-image:-webkit-linear-gradient(top,#ef784e,#dd4814);background-image:-o-linear-gradient(top,#ef784e,#dd4814);background-image:linear-gradient(to bottom,#ef784e,#dd4814);background-repeat:repeat-x;border-color:#dd4814 #dd4814 #97310e;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffef784e',endColorstr='#ffdd4814',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#dd4814;*background-color:#c64012}.btn-warning:active,.btn-warning.active{background-color:#ae3910 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#99356b;*background-color:#772953;background-image:-moz-linear-gradient(top,#b03d7b,#772953);background-image:-webkit-gradient(linear,0 0,0 100%,from(#b03d7b),to(#772953));background-image:-webkit-linear-gradient(top,#b03d7b,#772953);background-image:-o-linear-gradient(top,#b03d7b,#772953);background-image:linear-gradient(to bottom,#b03d7b,#772953);background-repeat:repeat-x;border-color:#772953 #772953 #3e152b;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffb03d7b',endColorstr='#ff772953',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#772953;*background-color:#642246}.btn-info:active,.btn-info.active{background-color:#511c39 \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#414141;*background-color:#222;background-image:-moz-linear-gradient(top,#555,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#555),to(#222));background-image:-webkit-linear-gradient(top,#555,#222);background-image:-o-linear-gradient(top,#555,#222);background-image:linear-gradient(to bottom,#555,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff555555',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#dd4814;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#97310e;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#dd7a14}.btn-group.open .btn-warning.dropdown-toggle{background-color:#dd4814}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#772953}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcefd4;border:1px solid #fae1c6;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#eca918}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#38b44a;background-color:#caeecf;border-color:#b7e8b6}.alert-success h4{color:#38b44a}.alert-danger,.alert-error{color:#df382c;background-color:#fadfdd;border-color:#f8d0d4}.alert-danger h4,.alert-error h4{color:#df382c}.alert-info{color:#772953;background-color:#e7b8d1;border-color:#de9ecb}.alert-info h4{color:#772953}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#f5f5f5}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#dd4814}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#f5f5f5 #f5f5f5 #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#dd4814}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#dd4814;border-bottom-color:#dd4814}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#97310e;border-bottom-color:#97310e}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#f5f5f5 #ddd #f5f5f5 #f5f5f5}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#f5f5f5 #f5f5f5 #f5f5f5 #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#d44413;background-image:-moz-linear-gradient(top,#ce4213,#dd4814);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ce4213),to(#dd4814));background-image:-webkit-linear-gradient(top,#ce4213,#dd4814);background-image:-o-linear-gradient(top,#ce4213,#dd4814);background-image:linear-gradient(to bottom,#ce4213,#dd4814);background-repeat:repeat-x;border:1px solid #c64012;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffce4213',endColorstr='#ffdd4814',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#fff;text-shadow:0 1px 0 #ce4213}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#fff}.navbar-link{color:#fff}.navbar-link:hover,.navbar-link:focus{color:#fff}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #ce4213;border-left:1px solid #dd4814}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:'Ubuntu',Tahoma,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#fff;text-decoration:none;text-shadow:0 1px 0 #ce4213}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#fff;text-decoration:none;background-color:#a5360f}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#fff;text-decoration:none;background-color:#a5360f;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#bd3d11;*background-color:#c64012;background-image:-moz-linear-gradient(top,#b73b11,#c64012);background-image:-webkit-gradient(linear,0 0,0 100%,from(#b73b11),to(#c64012));background-image:-webkit-linear-gradient(top,#b73b11,#c64012);background-image:-o-linear-gradient(top,#b73b11,#c64012);background-image:linear-gradient(to bottom,#b73b11,#c64012);background-repeat:repeat-x;border-color:#c64012 #c64012 #7f2a0c;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffb73b11',endColorstr='#ffc64012',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#c64012;*background-color:#ae3910}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#97310e \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#a5360f}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#802c59;background-image:-moz-linear-gradient(top,#862e5e,#772953);background-image:-webkit-gradient(linear,0 0,0 100%,from(#862e5e),to(#772953));background-image:-webkit-linear-gradient(top,#862e5e,#772953);background-image:-o-linear-gradient(top,#862e5e,#772953);background-image:linear-gradient(to bottom,#862e5e,#772953);background-repeat:repeat-x;border-color:#642246;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff862e5e',endColorstr='#ff772953',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#fff}.navbar-inverse .navbar-text{color:#fff}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:#591f3e}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#591f3e}.navbar-inverse .navbar-link{color:#fff}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#862e5e;border-left-color:#772953}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#591f3e}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#c65a94;border-color:#772953;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#eee}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#eee}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#eee}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#6d264c;*background-color:#642246;background-image:-moz-linear-gradient(top,#732850,#642246);background-image:-webkit-gradient(linear,0 0,0 100%,from(#732850),to(#642246));background-image:-webkit-linear-gradient(top,#732850,#642246);background-image:-o-linear-gradient(top,#732850,#642246);background-image:linear-gradient(to bottom,#732850,#642246);background-repeat:repeat-x;border-color:#642246 #642246 #2b0f1e;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff732850',endColorstr='#ff642246',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#642246;*background-color:#511c39}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#3e152b \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.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;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;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-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.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{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#dd4814;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;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{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#df382c}.label-important[href],.badge-important[href]{background-color:#bc271c}.label-warning,.badge-warning{background-color:#dd4814}.label-warning[href],.badge-warning[href]{background-color:#ae3910}.label-success,.badge-success{background-color:#38b44a}.label-success[href],.badge-success[href]{background-color:#2c8d3a}.label-info,.badge-info{background-color:#772953}.label-info[href],.badge-info[href]{background-color:#511c39}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#e86537;background-image:-moz-linear-gradient(top,#ef784e,#dd4814);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ef784e),to(#dd4814));background-image:-webkit-linear-gradient(top,#ef784e,#dd4814);background-image:-o-linear-gradient(top,#ef784e,#dd4814);background-image:linear-gradient(to bottom,#ef784e,#dd4814);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffef784e',endColorstr='#ffdd4814',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#ef784e;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;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:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#f5f5f5;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}.navbar .nav>li>a{border-right:1px solid rgba(0,0,0,0.2);border-left:1px solid rgba(255,255,255,0.1)}.navbar .nav>li>a:hover{border-left:1px solid rgba(0,0,0,0.2)}.navbar .nav>.active>a,.navbar .nav>.active>a:hover{border-left:1px solid rgba(0,0,0,0.2)}.navbar .divider-vertical{background-color:inherit;border-right:1px solid rgba(0,0,0,0.2)}.navbar .navbar-text{padding:9px 10px 11px;line-height:19px;color:#fff}.navbar .navbar-search .search-query{margin-bottom:3px;border:1px solid #97310e}@media(max-width:979px){.navbar .nav-collapse .nav li>a{color:#fff;border-right:0 solid #dd4814;border-left:0 solid #dd4814}.navbar .nav-collapse .nav li>a:hover{background-color:rgba(0,0,0,0.3)!important;background-image:none}.navbar .nav-collapse .navbar-form,.navbar .nav-collapse .navbar-search{border-top:0 solid #dd4814;border-bottom:0 solid #dd4814;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar .nav-collapse .nav-header{color:#f5f5f5}}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover{border-right:1px solid #c03d14;border-left:1px solid #e6633a}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#e86537;*background-color:#dd4814;background-image:-moz-linear-gradient(top,#ef784e,#dd4814);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ef784e),to(#dd4814));background-image:-webkit-linear-gradient(top,#ef784e,#dd4814);background-image:-o-linear-gradient(top,#ef784e,#dd4814);background-image:linear-gradient(to bottom,#ef784e,#dd4814);background-repeat:repeat-x;border-color:#dd4814 #dd4814 #97310e;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffef784e',endColorstr='#ffdd4814',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#dd4814;*background-color:#c64012}.btn-primary:active,.btn-primary.active{background-color:#ae3910 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#f3c768;*background-color:#efb73e;background-image:-moz-linear-gradient(top,#f5d185,#efb73e);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5d185),to(#efb73e));background-image:-webkit-linear-gradient(top,#f5d185,#efb73e);background-image:-o-linear-gradient(top,#f5d185,#efb73e);background-image:linear-gradient(to bottom,#f5d185,#efb73e);background-repeat:repeat-x;border-color:#efb73e #efb73e #cf9311;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5d185',endColorstr='#ffefb73e',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#efb73e;*background-color:#edae26}.btn-warning:active,.btn-warning.active{background-color:#e7a413 \9}.alert{text-shadow:none}.hero-unit{border:1px solid rgba(0,0,0,0.05);-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.hero-unit h1{line-height:1.6em}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} diff --git a/flask_admin/static/vendor/bootstrap-daterangepicker/daterangepicker-bs2.css b/flask_admin/static/vendor/bootstrap-daterangepicker/daterangepicker-bs2.css deleted file mode 100644 index 870e17625..000000000 --- a/flask_admin/static/vendor/bootstrap-daterangepicker/daterangepicker-bs2.css +++ /dev/null @@ -1,303 +0,0 @@ -/*! - * Stylesheet for the Date Range Picker, for use with Bootstrap 2.x - * - * Copyright 2013-2015 Dan Grossman ( http://www.dangrossman.info ) - * Licensed under the MIT license. See http://www.opensource.org/licenses/mit-license.php - * - * Built for http://www.improvely.com - */ - -.daterangepicker.dropdown-menu { - max-width: none; - z-index: 3000; -} - -.daterangepicker.opensleft .ranges, .daterangepicker.opensleft .calendar { - float: left; - margin: 4px; -} - -.daterangepicker.opensright .ranges, .daterangepicker.opensright .calendar, -.daterangepicker.openscenter .ranges, .daterangepicker.openscenter .calendar { - float: right; - margin: 4px; -} - -.daterangepicker .ranges { - width: 160px; - text-align: left; -} - -.daterangepicker .ranges .range_inputs>div { - float: left; -} - -.daterangepicker .ranges .range_inputs>div:nth-child(2) { - padding-left: 11px; -} - -.daterangepicker .calendar { - display: none; - max-width: 250px; -} -.daterangepicker.show-calendar .calendar { - display: block; -} - -.daterangepicker .calendar.single .calendar-date { - border: none; -} - -.daterangepicker .calendar th, .daterangepicker .calendar td { - font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; - white-space: nowrap; - text-align: center; -} - -.daterangepicker .daterangepicker_start_input label, -.daterangepicker .daterangepicker_end_input label { - color: #333; - font-size: 11px; - margin-bottom: 2px; - text-transform: uppercase; - text-shadow: 1px 1px 0 #fff; -} - -.daterangepicker .ranges input { - font-size: 11px; -} - -.daterangepicker .ranges ul { - list-style: none; - margin: 0; - padding: 0; -} - -.daterangepicker .ranges li { - font-size: 13px; - background: #f5f5f5; - border: 1px solid #f5f5f5; - color: #08c; - padding: 3px 12px; - margin-bottom: 8px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; - cursor: pointer; -} - -.daterangepicker .ranges li.active, .daterangepicker .ranges li:hover { - background: #08c; - border: 1px solid #08c; - color: #fff; -} - -.daterangepicker .calendar-date { - border: 1px solid #ddd; - padding: 4px; - border-radius: 4px; - background: #fff; -} - -.daterangepicker .calendar-time { - text-align: center; - margin: 8px auto 0 auto; - line-height: 30px; -} - -.daterangepicker { - position: absolute; - background: #fff; - top: 100px; - left: 20px; - padding: 4px; - margin-top: 1px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.daterangepicker.opensleft:before { - position: absolute; - top: -7px; - right: 9px; - display: inline-block; - border-right: 7px solid transparent; - border-bottom: 7px solid #ccc; - border-left: 7px solid transparent; - border-bottom-color: rgba(0, 0, 0, 0.2); - content: ''; -} - -.daterangepicker.opensleft:after { - position: absolute; - top: -6px; - right: 10px; - display: inline-block; - border-right: 6px solid transparent; - border-bottom: 6px solid #fff; - border-left: 6px solid transparent; - content: ''; -} - -.daterangepicker.openscenter:before { - position: absolute; - top: -7px; - left: 0; - right: 0; - width: 0; - margin-left: auto; - margin-right: auto; - display: inline-block; - border-right: 7px solid transparent; - border-bottom: 7px solid #ccc; - border-left: 7px solid transparent; - border-bottom-color: rgba(0, 0, 0, 0.2); - content: ''; -} - -.daterangepicker.openscenter:after { - position: absolute; - top: -6px; - left: 0; - right: 0; - width: 0; - margin-left: auto; - margin-right: auto; - display: inline-block; - border-right: 6px solid transparent; - border-bottom: 6px solid #fff; - border-left: 6px solid transparent; - content: ''; -} - -.daterangepicker.opensright:before { - position: absolute; - top: -7px; - left: 9px; - display: inline-block; - border-right: 7px solid transparent; - border-bottom: 7px solid #ccc; - border-left: 7px solid transparent; - border-bottom-color: rgba(0, 0, 0, 0.2); - content: ''; -} - -.daterangepicker.opensright:after { - position: absolute; - top: -6px; - left: 10px; - display: inline-block; - border-right: 6px solid transparent; - border-bottom: 6px solid #fff; - border-left: 6px solid transparent; - content: ''; -} - -.daterangepicker.dropup{ - margin-top: -5px; -} -.daterangepicker.dropup:before{ - top: initial; - bottom:-7px; - border-bottom: initial; - border-top: 7px solid #ccc; -} -.daterangepicker.dropup:after{ - top: initial; - bottom:-6px; - border-bottom: initial; - border-top: 6px solid #fff; -} - -.daterangepicker table { - width: 100%; - margin: 0; -} - -.daterangepicker td, .daterangepicker th { - text-align: center; - width: 20px; - height: 20px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - cursor: pointer; - white-space: nowrap; -} - -.daterangepicker td.off { - color: #999; -} - -.daterangepicker td.disabled, .daterangepicker option.disabled { - color: #999; -} - -.daterangepicker td.available:hover, .daterangepicker td.available.today, .daterangepicker th.available:hover { - background: #eee; -} - -.daterangepicker td.in-range { - background: #ebf4f8; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.daterangepicker td.today.active, .daterangepicker td.active, .daterangepicker td.active:hover { - background-color: #006dcc; - background-image: -moz-linear-gradient(top, #0088cc, #0044cc); - background-image: -ms-linear-gradient(top, #0088cc, #0044cc); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); - background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); - background-image: -o-linear-gradient(top, #0088cc, #0044cc); - background-image: linear-gradient(top, #0088cc, #0044cc); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0); - border-color: #0044cc #0044cc #002a80; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} - -.daterangepicker td.week, .daterangepicker th.week { - font-size: 80%; - color: #ccc; -} - -.daterangepicker select.monthselect, .daterangepicker select.yearselect { - font-size: 12px; - padding: 1px; - height: auto; - margin: 0; - cursor: default; -} - -.daterangepicker select.monthselect { - margin-right: 2%; - width: 56%; -} - -.daterangepicker select.yearselect { - width: 40%; -} - -.daterangepicker select.hourselect, .daterangepicker select.minuteselect, .daterangepicker select.secondselect, .daterangepicker select.ampmselect { - width: 60px; - margin-bottom: 0; -} - -.daterangepicker_start_input { - float: left; -} - -.daterangepicker_end_input { - float: left; - padding-left: 11px -} - -.daterangepicker th.month { - width: auto; -} diff --git a/flask_admin/static/vendor/x-editable/css/bootstrap2-editable.css b/flask_admin/static/vendor/x-editable/css/bootstrap2-editable.css deleted file mode 100755 index eaef0de96..000000000 --- a/flask_admin/static/vendor/x-editable/css/bootstrap2-editable.css +++ /dev/null @@ -1,663 +0,0 @@ -/*! X-editable - v1.5.1 -* In-place editing with Twitter Bootstrap, jQuery UI or pure jQuery -* http://github.com/vitalets/x-editable -* Copyright (c) 2013 Vitaliy Potapov; Licensed MIT */ -.editableform { - margin-bottom: 0; /* overwrites bootstrap margin */ -} - -.editableform .control-group { - margin-bottom: 0; /* overwrites bootstrap margin */ - white-space: nowrap; /* prevent wrapping buttons on new line */ - line-height: 20px; /* overwriting bootstrap line-height. See #133 */ -} - -/* - BS3 width:1005 for inputs breaks editable form in popup - See: https://github.com/vitalets/x-editable/issues/393 -*/ -.editableform .form-control { - width: auto; -} - -.editable-buttons { - display: inline-block; /* should be inline to take effect of parent's white-space: nowrap */ - vertical-align: top; - margin-left: 7px; - /* inline-block emulation for IE7*/ - zoom: 1; - *display: inline; -} - -.editable-buttons.editable-buttons-bottom { - display: block; - margin-top: 7px; - margin-left: 0; -} - -.editable-input { - vertical-align: top; - display: inline-block; /* should be inline to take effect of parent's white-space: nowrap */ - width: auto; /* bootstrap-responsive has width: 100% that breakes layout */ - white-space: normal; /* reset white-space decalred in parent*/ - /* display-inline emulation for IE7*/ - zoom: 1; - *display: inline; -} - -.editable-buttons .editable-cancel { - margin-left: 7px; -} - -/*for jquery-ui buttons need set height to look more pretty*/ -.editable-buttons button.ui-button-icon-only { - height: 24px; - width: 30px; -} - -.editableform-loading { - background: url('../img/loading.gif') center center no-repeat; - height: 25px; - width: auto; - min-width: 25px; -} - -.editable-inline .editableform-loading { - background-position: left 5px; -} - - .editable-error-block { - max-width: 300px; - margin: 5px 0 0 0; - width: auto; - white-space: normal; -} - -/*add padding for jquery ui*/ -.editable-error-block.ui-state-error { - padding: 3px; -} - -.editable-error { - color: red; -} - -/* ---- For specific types ---- */ - -.editableform .editable-date { - padding: 0; - margin: 0; - float: left; -} - -/* move datepicker icon to center of add-on button. See https://github.com/vitalets/x-editable/issues/183 */ -.editable-inline .add-on .icon-th { - margin-top: 3px; - margin-left: 1px; -} - - -/* checklist vertical alignment */ -.editable-checklist label input[type="checkbox"], -.editable-checklist label span { - vertical-align: middle; - margin: 0; -} - -.editable-checklist label { - white-space: nowrap; -} - -/* set exact width of textarea to fit buttons toolbar */ -.editable-wysihtml5 { - width: 566px; - height: 250px; -} - -/* clear button shown as link in date inputs */ -.editable-clear { - clear: both; - font-size: 0.9em; - text-decoration: none; - text-align: right; -} - -/* IOS-style clear button for text inputs */ -.editable-clear-x { - background: url('../img/clear.png') center center no-repeat; - display: block; - width: 13px; - height: 13px; - position: absolute; - opacity: 0.6; - z-index: 100; - - top: 50%; - right: 6px; - margin-top: -6px; - -} - -.editable-clear-x:hover { - opacity: 1; -} - -.editable-pre-wrapped { - white-space: pre-wrap; -} -.editable-container.editable-popup { - max-width: none !important; /* without this rule poshytip/tooltip does not stretch */ -} - -.editable-container.popover { - width: auto; /* without this rule popover does not stretch */ -} - -.editable-container.editable-inline { - display: inline-block; - vertical-align: middle; - width: auto; - /* inline-block emulation for IE7*/ - zoom: 1; - *display: inline; -} - -.editable-container.ui-widget { - font-size: inherit; /* jqueryui widget font 1.1em too big, overwrite it */ - z-index: 9990; /* should be less than select2 dropdown z-index to close dropdown first when click */ -} -.editable-click, -a.editable-click, -a.editable-click:hover { - text-decoration: none; - border-bottom: dashed 1px #0088cc; -} - -.editable-click.editable-disabled, -a.editable-click.editable-disabled, -a.editable-click.editable-disabled:hover { - color: #585858; - cursor: default; - border-bottom: none; -} - -.editable-empty, .editable-empty:hover, .editable-empty:focus{ - font-style: italic; - color: #DD1144; - /* border-bottom: none; */ - text-decoration: none; -} - -.editable-unsaved { - font-weight: bold; -} - -.editable-unsaved:after { -/* content: '*'*/ -} - -.editable-bg-transition { - -webkit-transition: background-color 1400ms ease-out; - -moz-transition: background-color 1400ms ease-out; - -o-transition: background-color 1400ms ease-out; - -ms-transition: background-color 1400ms ease-out; - transition: background-color 1400ms ease-out; -} - -/*see https://github.com/vitalets/x-editable/issues/139 */ -.form-horizontal .editable -{ - padding-top: 5px; - display:inline-block; -} - - -/*! - * Datepicker for Bootstrap - * - * Copyright 2012 Stefan Petre - * Improvements by Andrew Rowls - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - */ -.datepicker { - padding: 4px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - direction: ltr; - /*.dow { - border-top: 1px solid #ddd !important; - }*/ - -} -.datepicker-inline { - width: 220px; -} -.datepicker.datepicker-rtl { - direction: rtl; -} -.datepicker.datepicker-rtl table tr td span { - float: right; -} -.datepicker-dropdown { - top: 0; - left: 0; -} -.datepicker-dropdown:before { - content: ''; - display: inline-block; - border-left: 7px solid transparent; - border-right: 7px solid transparent; - border-bottom: 7px solid #ccc; - border-bottom-color: rgba(0, 0, 0, 0.2); - position: absolute; - top: -7px; - left: 6px; -} -.datepicker-dropdown:after { - content: ''; - display: inline-block; - border-left: 6px solid transparent; - border-right: 6px solid transparent; - border-bottom: 6px solid #ffffff; - position: absolute; - top: -6px; - left: 7px; -} -.datepicker > div { - display: none; -} -.datepicker.days div.datepicker-days { - display: block; -} -.datepicker.months div.datepicker-months { - display: block; -} -.datepicker.years div.datepicker-years { - display: block; -} -.datepicker table { - margin: 0; -} -.datepicker td, -.datepicker th { - text-align: center; - width: 20px; - height: 20px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - border: none; -} -.table-striped .datepicker table tr td, -.table-striped .datepicker table tr th { - background-color: transparent; -} -.datepicker table tr td.day:hover { - background: #eeeeee; - cursor: pointer; -} -.datepicker table tr td.old, -.datepicker table tr td.new { - color: #999999; -} -.datepicker table tr td.disabled, -.datepicker table tr td.disabled:hover { - background: none; - color: #999999; - cursor: default; -} -.datepicker table tr td.today, -.datepicker table tr td.today:hover, -.datepicker table tr td.today.disabled, -.datepicker table tr td.today.disabled:hover { - background-color: #fde19a; - background-image: -moz-linear-gradient(top, #fdd49a, #fdf59a); - background-image: -ms-linear-gradient(top, #fdd49a, #fdf59a); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fdd49a), to(#fdf59a)); - background-image: -webkit-linear-gradient(top, #fdd49a, #fdf59a); - background-image: -o-linear-gradient(top, #fdd49a, #fdf59a); - background-image: linear-gradient(top, #fdd49a, #fdf59a); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0); - border-color: #fdf59a #fdf59a #fbed50; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); - color: #000; -} -.datepicker table tr td.today:hover, -.datepicker table tr td.today:hover:hover, -.datepicker table tr td.today.disabled:hover, -.datepicker table tr td.today.disabled:hover:hover, -.datepicker table tr td.today:active, -.datepicker table tr td.today:hover:active, -.datepicker table tr td.today.disabled:active, -.datepicker table tr td.today.disabled:hover:active, -.datepicker table tr td.today.active, -.datepicker table tr td.today:hover.active, -.datepicker table tr td.today.disabled.active, -.datepicker table tr td.today.disabled:hover.active, -.datepicker table tr td.today.disabled, -.datepicker table tr td.today:hover.disabled, -.datepicker table tr td.today.disabled.disabled, -.datepicker table tr td.today.disabled:hover.disabled, -.datepicker table tr td.today[disabled], -.datepicker table tr td.today:hover[disabled], -.datepicker table tr td.today.disabled[disabled], -.datepicker table tr td.today.disabled:hover[disabled] { - background-color: #fdf59a; -} -.datepicker table tr td.today:active, -.datepicker table tr td.today:hover:active, -.datepicker table tr td.today.disabled:active, -.datepicker table tr td.today.disabled:hover:active, -.datepicker table tr td.today.active, -.datepicker table tr td.today:hover.active, -.datepicker table tr td.today.disabled.active, -.datepicker table tr td.today.disabled:hover.active { - background-color: #fbf069 \9; -} -.datepicker table tr td.today:hover:hover { - color: #000; -} -.datepicker table tr td.today.active:hover { - color: #fff; -} -.datepicker table tr td.range, -.datepicker table tr td.range:hover, -.datepicker table tr td.range.disabled, -.datepicker table tr td.range.disabled:hover { - background: #eeeeee; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.datepicker table tr td.range.today, -.datepicker table tr td.range.today:hover, -.datepicker table tr td.range.today.disabled, -.datepicker table tr td.range.today.disabled:hover { - background-color: #f3d17a; - background-image: -moz-linear-gradient(top, #f3c17a, #f3e97a); - background-image: -ms-linear-gradient(top, #f3c17a, #f3e97a); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f3c17a), to(#f3e97a)); - background-image: -webkit-linear-gradient(top, #f3c17a, #f3e97a); - background-image: -o-linear-gradient(top, #f3c17a, #f3e97a); - background-image: linear-gradient(top, #f3c17a, #f3e97a); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3c17a', endColorstr='#f3e97a', GradientType=0); - border-color: #f3e97a #f3e97a #edde34; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.datepicker table tr td.range.today:hover, -.datepicker table tr td.range.today:hover:hover, -.datepicker table tr td.range.today.disabled:hover, -.datepicker table tr td.range.today.disabled:hover:hover, -.datepicker table tr td.range.today:active, -.datepicker table tr td.range.today:hover:active, -.datepicker table tr td.range.today.disabled:active, -.datepicker table tr td.range.today.disabled:hover:active, -.datepicker table tr td.range.today.active, -.datepicker table tr td.range.today:hover.active, -.datepicker table tr td.range.today.disabled.active, -.datepicker table tr td.range.today.disabled:hover.active, -.datepicker table tr td.range.today.disabled, -.datepicker table tr td.range.today:hover.disabled, -.datepicker table tr td.range.today.disabled.disabled, -.datepicker table tr td.range.today.disabled:hover.disabled, -.datepicker table tr td.range.today[disabled], -.datepicker table tr td.range.today:hover[disabled], -.datepicker table tr td.range.today.disabled[disabled], -.datepicker table tr td.range.today.disabled:hover[disabled] { - background-color: #f3e97a; -} -.datepicker table tr td.range.today:active, -.datepicker table tr td.range.today:hover:active, -.datepicker table tr td.range.today.disabled:active, -.datepicker table tr td.range.today.disabled:hover:active, -.datepicker table tr td.range.today.active, -.datepicker table tr td.range.today:hover.active, -.datepicker table tr td.range.today.disabled.active, -.datepicker table tr td.range.today.disabled:hover.active { - background-color: #efe24b \9; -} -.datepicker table tr td.selected, -.datepicker table tr td.selected:hover, -.datepicker table tr td.selected.disabled, -.datepicker table tr td.selected.disabled:hover { - background-color: #9e9e9e; - background-image: -moz-linear-gradient(top, #b3b3b3, #808080); - background-image: -ms-linear-gradient(top, #b3b3b3, #808080); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#b3b3b3), to(#808080)); - background-image: -webkit-linear-gradient(top, #b3b3b3, #808080); - background-image: -o-linear-gradient(top, #b3b3b3, #808080); - background-image: linear-gradient(top, #b3b3b3, #808080); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#b3b3b3', endColorstr='#808080', GradientType=0); - border-color: #808080 #808080 #595959; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} -.datepicker table tr td.selected:hover, -.datepicker table tr td.selected:hover:hover, -.datepicker table tr td.selected.disabled:hover, -.datepicker table tr td.selected.disabled:hover:hover, -.datepicker table tr td.selected:active, -.datepicker table tr td.selected:hover:active, -.datepicker table tr td.selected.disabled:active, -.datepicker table tr td.selected.disabled:hover:active, -.datepicker table tr td.selected.active, -.datepicker table tr td.selected:hover.active, -.datepicker table tr td.selected.disabled.active, -.datepicker table tr td.selected.disabled:hover.active, -.datepicker table tr td.selected.disabled, -.datepicker table tr td.selected:hover.disabled, -.datepicker table tr td.selected.disabled.disabled, -.datepicker table tr td.selected.disabled:hover.disabled, -.datepicker table tr td.selected[disabled], -.datepicker table tr td.selected:hover[disabled], -.datepicker table tr td.selected.disabled[disabled], -.datepicker table tr td.selected.disabled:hover[disabled] { - background-color: #808080; -} -.datepicker table tr td.selected:active, -.datepicker table tr td.selected:hover:active, -.datepicker table tr td.selected.disabled:active, -.datepicker table tr td.selected.disabled:hover:active, -.datepicker table tr td.selected.active, -.datepicker table tr td.selected:hover.active, -.datepicker table tr td.selected.disabled.active, -.datepicker table tr td.selected.disabled:hover.active { - background-color: #666666 \9; -} -.datepicker table tr td.active, -.datepicker table tr td.active:hover, -.datepicker table tr td.active.disabled, -.datepicker table tr td.active.disabled:hover { - background-color: #006dcc; - background-image: -moz-linear-gradient(top, #0088cc, #0044cc); - background-image: -ms-linear-gradient(top, #0088cc, #0044cc); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); - background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); - background-image: -o-linear-gradient(top, #0088cc, #0044cc); - background-image: linear-gradient(top, #0088cc, #0044cc); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0); - border-color: #0044cc #0044cc #002a80; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} -.datepicker table tr td.active:hover, -.datepicker table tr td.active:hover:hover, -.datepicker table tr td.active.disabled:hover, -.datepicker table tr td.active.disabled:hover:hover, -.datepicker table tr td.active:active, -.datepicker table tr td.active:hover:active, -.datepicker table tr td.active.disabled:active, -.datepicker table tr td.active.disabled:hover:active, -.datepicker table tr td.active.active, -.datepicker table tr td.active:hover.active, -.datepicker table tr td.active.disabled.active, -.datepicker table tr td.active.disabled:hover.active, -.datepicker table tr td.active.disabled, -.datepicker table tr td.active:hover.disabled, -.datepicker table tr td.active.disabled.disabled, -.datepicker table tr td.active.disabled:hover.disabled, -.datepicker table tr td.active[disabled], -.datepicker table tr td.active:hover[disabled], -.datepicker table tr td.active.disabled[disabled], -.datepicker table tr td.active.disabled:hover[disabled] { - background-color: #0044cc; -} -.datepicker table tr td.active:active, -.datepicker table tr td.active:hover:active, -.datepicker table tr td.active.disabled:active, -.datepicker table tr td.active.disabled:hover:active, -.datepicker table tr td.active.active, -.datepicker table tr td.active:hover.active, -.datepicker table tr td.active.disabled.active, -.datepicker table tr td.active.disabled:hover.active { - background-color: #003399 \9; -} -.datepicker table tr td span { - display: block; - width: 23%; - height: 54px; - line-height: 54px; - float: left; - margin: 1%; - cursor: pointer; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.datepicker table tr td span:hover { - background: #eeeeee; -} -.datepicker table tr td span.disabled, -.datepicker table tr td span.disabled:hover { - background: none; - color: #999999; - cursor: default; -} -.datepicker table tr td span.active, -.datepicker table tr td span.active:hover, -.datepicker table tr td span.active.disabled, -.datepicker table tr td span.active.disabled:hover { - background-color: #006dcc; - background-image: -moz-linear-gradient(top, #0088cc, #0044cc); - background-image: -ms-linear-gradient(top, #0088cc, #0044cc); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); - background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); - background-image: -o-linear-gradient(top, #0088cc, #0044cc); - background-image: linear-gradient(top, #0088cc, #0044cc); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0); - border-color: #0044cc #0044cc #002a80; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} -.datepicker table tr td span.active:hover, -.datepicker table tr td span.active:hover:hover, -.datepicker table tr td span.active.disabled:hover, -.datepicker table tr td span.active.disabled:hover:hover, -.datepicker table tr td span.active:active, -.datepicker table tr td span.active:hover:active, -.datepicker table tr td span.active.disabled:active, -.datepicker table tr td span.active.disabled:hover:active, -.datepicker table tr td span.active.active, -.datepicker table tr td span.active:hover.active, -.datepicker table tr td span.active.disabled.active, -.datepicker table tr td span.active.disabled:hover.active, -.datepicker table tr td span.active.disabled, -.datepicker table tr td span.active:hover.disabled, -.datepicker table tr td span.active.disabled.disabled, -.datepicker table tr td span.active.disabled:hover.disabled, -.datepicker table tr td span.active[disabled], -.datepicker table tr td span.active:hover[disabled], -.datepicker table tr td span.active.disabled[disabled], -.datepicker table tr td span.active.disabled:hover[disabled] { - background-color: #0044cc; -} -.datepicker table tr td span.active:active, -.datepicker table tr td span.active:hover:active, -.datepicker table tr td span.active.disabled:active, -.datepicker table tr td span.active.disabled:hover:active, -.datepicker table tr td span.active.active, -.datepicker table tr td span.active:hover.active, -.datepicker table tr td span.active.disabled.active, -.datepicker table tr td span.active.disabled:hover.active { - background-color: #003399 \9; -} -.datepicker table tr td span.old, -.datepicker table tr td span.new { - color: #999999; -} -.datepicker th.datepicker-switch { - width: 145px; -} -.datepicker thead tr:first-child th, -.datepicker tfoot tr th { - cursor: pointer; -} -.datepicker thead tr:first-child th:hover, -.datepicker tfoot tr th:hover { - background: #eeeeee; -} -.datepicker .cw { - font-size: 10px; - width: 12px; - padding: 0 2px 0 5px; - vertical-align: middle; -} -.datepicker thead tr:first-child th.cw { - cursor: default; - background-color: transparent; -} -.input-append.date .add-on i, -.input-prepend.date .add-on i { - display: block; - cursor: pointer; - width: 16px; - height: 16px; -} -.input-daterange input { - text-align: center; -} -.input-daterange input:first-child { - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} -.input-daterange input:last-child { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.input-daterange .add-on { - display: inline-block; - width: auto; - min-width: 16px; - height: 18px; - padding: 4px 5px; - font-weight: normal; - line-height: 18px; - text-align: center; - text-shadow: 0 1px 0 #ffffff; - vertical-align: middle; - background-color: #eeeeee; - border: 1px solid #ccc; - margin-left: -5px; - margin-right: -5px; -} diff --git a/flask_admin/static/vendor/x-editable/js/bootstrap2-editable.min.js b/flask_admin/static/vendor/x-editable/js/bootstrap2-editable.min.js deleted file mode 100755 index 372f8b008..000000000 --- a/flask_admin/static/vendor/x-editable/js/bootstrap2-editable.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! X-editable - v1.5.1 -* In-place editing with Twitter Bootstrap, jQuery UI or pure jQuery -* http://github.com/vitalets/x-editable -* Copyright (c) 2013 Vitaliy Potapov; Licensed MIT */ -!function(a){"use strict";var b=function(b,c){this.options=a.extend({},a.fn.editableform.defaults,c),this.$div=a(b),this.options.scope||(this.options.scope=this)};b.prototype={constructor:b,initInput:function(){this.input=this.options.input,this.value=this.input.str2value(this.options.value),this.input.prerender()},initTemplate:function(){this.$form=a(a.fn.editableform.template)},initButtons:function(){var b=this.$form.find(".editable-buttons");b.append(a.fn.editableform.buttons),"bottom"===this.options.showbuttons&&b.addClass("editable-buttons-bottom")},render:function(){this.$loading=a(a.fn.editableform.loading),this.$div.empty().append(this.$loading),this.initTemplate(),this.options.showbuttons?this.initButtons():this.$form.find(".editable-buttons").remove(),this.showLoading(),this.isSaving=!1,this.$div.triggerHandler("rendering"),this.initInput(),this.$form.find("div.editable-input").append(this.input.$tpl),this.$div.append(this.$form),a.when(this.input.render()).then(a.proxy(function(){if(this.options.showbuttons||this.input.autosubmit(),this.$form.find(".editable-cancel").click(a.proxy(this.cancel,this)),this.input.error)this.error(this.input.error),this.$form.find(".editable-submit").attr("disabled",!0),this.input.$input.attr("disabled",!0),this.$form.submit(function(a){a.preventDefault()});else{this.error(!1),this.input.$input.removeAttr("disabled"),this.$form.find(".editable-submit").removeAttr("disabled");var b=null===this.value||void 0===this.value||""===this.value?this.options.defaultValue:this.value;this.input.value2input(b),this.$form.submit(a.proxy(this.submit,this))}this.$div.triggerHandler("rendered"),this.showForm(),this.input.postrender&&this.input.postrender()},this))},cancel:function(){this.$div.triggerHandler("cancel")},showLoading:function(){var a,b;this.$form?(a=this.$form.outerWidth(),b=this.$form.outerHeight(),a&&this.$loading.width(a),b&&this.$loading.height(b),this.$form.hide()):(a=this.$loading.parent().width(),a&&this.$loading.width(a)),this.$loading.show()},showForm:function(a){this.$loading.hide(),this.$form.show(),a!==!1&&this.input.activate(),this.$div.triggerHandler("show")},error:function(b){var c,d=this.$form.find(".control-group"),e=this.$form.find(".editable-error-block");if(b===!1)d.removeClass(a.fn.editableform.errorGroupClass),e.removeClass(a.fn.editableform.errorBlockClass).empty().hide();else{if(b){c=(""+b).split("\n");for(var f=0;f<c.length;f++)c[f]=a("<div>").text(c[f]).html();b=c.join("<br>")}d.addClass(a.fn.editableform.errorGroupClass),e.addClass(a.fn.editableform.errorBlockClass).html(b).show()}},submit:function(b){b.stopPropagation(),b.preventDefault();var c=this.input.input2value(),d=this.validate(c);if("object"===a.type(d)&&void 0!==d.newValue){if(c=d.newValue,this.input.value2input(c),"string"==typeof d.msg)return this.error(d.msg),this.showForm(),void 0}else if(d)return this.error(d),this.showForm(),void 0;if(!this.options.savenochange&&this.input.value2str(c)==this.input.value2str(this.value))return this.$div.triggerHandler("nochange"),void 0;var e=this.input.value2submit(c);this.isSaving=!0,a.when(this.save(e)).done(a.proxy(function(a){this.isSaving=!1;var b="function"==typeof this.options.success?this.options.success.call(this.options.scope,a,c):null;return b===!1?(this.error(!1),this.showForm(!1),void 0):"string"==typeof b?(this.error(b),this.showForm(),void 0):(b&&"object"==typeof b&&b.hasOwnProperty("newValue")&&(c=b.newValue),this.error(!1),this.value=c,this.$div.triggerHandler("save",{newValue:c,submitValue:e,response:a}),void 0)},this)).fail(a.proxy(function(a){this.isSaving=!1;var b;b="function"==typeof this.options.error?this.options.error.call(this.options.scope,a,c):"string"==typeof a?a:a.responseText||a.statusText||"Unknown error!",this.error(b),this.showForm()},this))},save:function(b){this.options.pk=a.fn.editableutils.tryParseJson(this.options.pk,!0);var c,d="function"==typeof this.options.pk?this.options.pk.call(this.options.scope):this.options.pk,e=!!("function"==typeof this.options.url||this.options.url&&("always"===this.options.send||"auto"===this.options.send&&null!==d&&void 0!==d));return e?(this.showLoading(),c={name:this.options.name||"",value:b,pk:d},"function"==typeof this.options.params?c=this.options.params.call(this.options.scope,c):(this.options.params=a.fn.editableutils.tryParseJson(this.options.params,!0),a.extend(c,this.options.params)),"function"==typeof this.options.url?this.options.url.call(this.options.scope,c):a.ajax(a.extend({url:this.options.url,data:c,type:"POST"},this.options.ajaxOptions))):void 0},validate:function(a){return void 0===a&&(a=this.value),"function"==typeof this.options.validate?this.options.validate.call(this.options.scope,a):void 0},option:function(a,b){a in this.options&&(this.options[a]=b),"value"===a&&this.setValue(b)},setValue:function(a,b){this.value=b?this.input.str2value(a):a,this.$form&&this.$form.is(":visible")&&this.input.value2input(this.value)}},a.fn.editableform=function(c){var d=arguments;return this.each(function(){var e=a(this),f=e.data("editableform"),g="object"==typeof c&&c;f||e.data("editableform",f=new b(this,g)),"string"==typeof c&&f[c].apply(f,Array.prototype.slice.call(d,1))})},a.fn.editableform.Constructor=b,a.fn.editableform.defaults={type:"text",url:null,params:null,name:null,pk:null,value:null,defaultValue:null,send:"auto",validate:null,success:null,error:null,ajaxOptions:null,showbuttons:!0,scope:null,savenochange:!1},a.fn.editableform.template='<form class="form-inline editableform"><div class="control-group"><div><div class="editable-input"></div><div class="editable-buttons"></div></div><div class="editable-error-block"></div></div></form>',a.fn.editableform.loading='<div class="editableform-loading"></div>',a.fn.editableform.buttons='<button type="submit" class="editable-submit">ok</button><button type="button" class="editable-cancel">cancel</button>',a.fn.editableform.errorGroupClass=null,a.fn.editableform.errorBlockClass="editable-error",a.fn.editableform.engine="jquery"}(window.jQuery),function(a){"use strict";a.fn.editableutils={inherit:function(a,b){var c=function(){};c.prototype=b.prototype,a.prototype=new c,a.prototype.constructor=a,a.superclass=b.prototype},setCursorPosition:function(a,b){if(a.setSelectionRange)a.setSelectionRange(b,b);else if(a.createTextRange){var c=a.createTextRange();c.collapse(!0),c.moveEnd("character",b),c.moveStart("character",b),c.select()}},tryParseJson:function(a,b){if("string"==typeof a&&a.length&&a.match(/^[\{\[].*[\}\]]$/))if(b)try{a=new Function("return "+a)()}catch(c){}finally{return a}else a=new Function("return "+a)();return a},sliceObj:function(b,c,d){var e,f,g={};if(!a.isArray(c)||!c.length)return g;for(var h=0;h<c.length;h++)e=c[h],b.hasOwnProperty(e)&&(g[e]=b[e]),d!==!0&&(f=e.toLowerCase(),b.hasOwnProperty(f)&&(g[e]=b[f]));return g},getConfigData:function(b){var c={};return a.each(b.data(),function(a,b){("object"!=typeof b||b&&"object"==typeof b&&(b.constructor===Object||b.constructor===Array))&&(c[a]=b)}),c},objectKeys:function(a){if(Object.keys)return Object.keys(a);if(a!==Object(a))throw new TypeError("Object.keys called on a non-object");var b,c=[];for(b in a)Object.prototype.hasOwnProperty.call(a,b)&&c.push(b);return c},escape:function(b){return a("<div>").text(b).html()},itemsByValue:function(b,c,d){if(!c||null===b)return[];if("function"!=typeof d){var e=d||"value";d=function(a){return a[e]}}var f=a.isArray(b),g=[],h=this;return a.each(c,function(c,e){if(e.children)g=g.concat(h.itemsByValue(b,e.children,d));else if(f)a.grep(b,function(a){return a==(e&&"object"==typeof e?d(e):e)}).length&&g.push(e);else{var i=e&&"object"==typeof e?d(e):e;b==i&&g.push(e)}}),g},createInput:function(b){var c,d,e,f=b.type;return"date"===f&&("inline"===b.mode?a.fn.editabletypes.datefield?f="datefield":a.fn.editabletypes.dateuifield&&(f="dateuifield"):a.fn.editabletypes.date?f="date":a.fn.editabletypes.dateui&&(f="dateui"),"date"!==f||a.fn.editabletypes.date||(f="combodate")),"datetime"===f&&"inline"===b.mode&&(f="datetimefield"),"wysihtml5"!==f||a.fn.editabletypes[f]||(f="textarea"),"function"==typeof a.fn.editabletypes[f]?(c=a.fn.editabletypes[f],d=this.sliceObj(b,this.objectKeys(c.defaults)),e=new c(d)):(a.error("Unknown type: "+f),!1)},supportsTransitions:function(){var a=document.body||document.documentElement,b=a.style,c="transition",d=["Moz","Webkit","Khtml","O","ms"];if("string"==typeof b[c])return!0;c=c.charAt(0).toUpperCase()+c.substr(1);for(var e=0;e<d.length;e++)if("string"==typeof b[d[e]+c])return!0;return!1}}}(window.jQuery),function(a){"use strict";var b=function(a,b){this.init(a,b)},c=function(a,b){this.init(a,b)};b.prototype={containerName:null,containerDataName:null,innerCss:null,containerClass:"editable-container editable-popup",defaults:{},init:function(c,d){this.$element=a(c),this.options=a.extend({},a.fn.editableContainer.defaults,d),this.splitOptions(),this.formOptions.scope=this.$element[0],this.initContainer(),this.delayedHide=!1,this.$element.on("destroyed",a.proxy(function(){this.destroy()},this)),a(document).data("editable-handlers-attached")||(a(document).on("keyup.editable",function(b){27===b.which&&a(".editable-open").editableContainer("hide")}),a(document).on("click.editable",function(c){var d,e=a(c.target),f=[".editable-container",".ui-datepicker-header",".datepicker",".modal-backdrop",".bootstrap-wysihtml5-insert-image-modal",".bootstrap-wysihtml5-insert-link-modal"];if(a.contains(document.documentElement,c.target)&&!e.is(document)){for(d=0;d<f.length;d++)if(e.is(f[d])||e.parents(f[d]).length)return;b.prototype.closeOthers(c.target)}}),a(document).data("editable-handlers-attached",!0))},splitOptions:function(){if(this.containerOptions={},this.formOptions={},!a.fn[this.containerName])throw new Error(this.containerName+" not found. Have you included corresponding js file?");for(var b in this.options)b in this.defaults?this.containerOptions[b]=this.options[b]:this.formOptions[b]=this.options[b]},tip:function(){return this.container()?this.container().$tip:null},container:function(){var a;return this.containerDataName&&(a=this.$element.data(this.containerDataName))?a:a=this.$element.data(this.containerName)},call:function(){this.$element[this.containerName].apply(this.$element,arguments)},initContainer:function(){this.call(this.containerOptions)},renderForm:function(){this.$form.editableform(this.formOptions).on({save:a.proxy(this.save,this),nochange:a.proxy(function(){this.hide("nochange")},this),cancel:a.proxy(function(){this.hide("cancel")},this),show:a.proxy(function(){this.delayedHide?(this.hide(this.delayedHide.reason),this.delayedHide=!1):this.setPosition()},this),rendering:a.proxy(this.setPosition,this),resize:a.proxy(this.setPosition,this),rendered:a.proxy(function(){this.$element.triggerHandler("shown",a(this.options.scope).data("editable"))},this)}).editableform("render")},show:function(b){this.$element.addClass("editable-open"),b!==!1&&this.closeOthers(this.$element[0]),this.innerShow(),this.tip().addClass(this.containerClass),this.$form,this.$form=a("<div>"),this.tip().is(this.innerCss)?this.tip().append(this.$form):this.tip().find(this.innerCss).append(this.$form),this.renderForm()},hide:function(a){if(this.tip()&&this.tip().is(":visible")&&this.$element.hasClass("editable-open")){if(this.$form.data("editableform").isSaving)return this.delayedHide={reason:a},void 0;this.delayedHide=!1,this.$element.removeClass("editable-open"),this.innerHide(),this.$element.triggerHandler("hidden",a||"manual")}},innerShow:function(){},innerHide:function(){},toggle:function(a){this.container()&&this.tip()&&this.tip().is(":visible")?this.hide():this.show(a)},setPosition:function(){},save:function(a,b){this.$element.triggerHandler("save",b),this.hide("save")},option:function(a,b){this.options[a]=b,a in this.containerOptions?(this.containerOptions[a]=b,this.setContainerOption(a,b)):(this.formOptions[a]=b,this.$form&&this.$form.editableform("option",a,b))},setContainerOption:function(a,b){this.call("option",a,b)},destroy:function(){this.hide(),this.innerDestroy(),this.$element.off("destroyed"),this.$element.removeData("editableContainer")},innerDestroy:function(){},closeOthers:function(b){a(".editable-open").each(function(c,d){if(d!==b&&!a(d).find(b).length){var e=a(d),f=e.data("editableContainer");f&&("cancel"===f.options.onblur?e.data("editableContainer").hide("onblur"):"submit"===f.options.onblur&&e.data("editableContainer").tip().find("form").submit())}})},activate:function(){this.tip&&this.tip().is(":visible")&&this.$form&&this.$form.data("editableform").input.activate()}},a.fn.editableContainer=function(d){var e=arguments;return this.each(function(){var f=a(this),g="editableContainer",h=f.data(g),i="object"==typeof d&&d,j="inline"===i.mode?c:b;h||f.data(g,h=new j(this,i)),"string"==typeof d&&h[d].apply(h,Array.prototype.slice.call(e,1))})},a.fn.editableContainer.Popup=b,a.fn.editableContainer.Inline=c,a.fn.editableContainer.defaults={value:null,placement:"top",autohide:!0,onblur:"cancel",anim:!1,mode:"popup"},jQuery.event.special.destroyed={remove:function(a){a.handler&&a.handler()}}}(window.jQuery),function(a){"use strict";a.extend(a.fn.editableContainer.Inline.prototype,a.fn.editableContainer.Popup.prototype,{containerName:"editableform",innerCss:".editable-inline",containerClass:"editable-container editable-inline",initContainer:function(){this.$tip=a("<span></span>"),this.options.anim||(this.options.anim=0)},splitOptions:function(){this.containerOptions={},this.formOptions=this.options},tip:function(){return this.$tip},innerShow:function(){this.$element.hide(),this.tip().insertAfter(this.$element).show()},innerHide:function(){this.$tip.hide(this.options.anim,a.proxy(function(){this.$element.show(),this.innerDestroy()},this))},innerDestroy:function(){this.tip()&&this.tip().empty().remove()}})}(window.jQuery),function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.editable.defaults,c,a.fn.editableutils.getConfigData(this.$element)),this.options.selector?this.initLive():this.init(),this.options.highlight&&!a.fn.editableutils.supportsTransitions()&&(this.options.highlight=!1)};b.prototype={constructor:b,init:function(){var b,c=!1;if(this.options.name=this.options.name||this.$element.attr("id"),this.options.scope=this.$element[0],this.input=a.fn.editableutils.createInput(this.options),this.input){switch(void 0===this.options.value||null===this.options.value?(this.value=this.input.html2value(a.trim(this.$element.html())),c=!0):(this.options.value=a.fn.editableutils.tryParseJson(this.options.value,!0),this.value="string"==typeof this.options.value?this.input.str2value(this.options.value):this.options.value),this.$element.addClass("editable"),"textarea"===this.input.type&&this.$element.addClass("editable-pre-wrapped"),"manual"!==this.options.toggle?(this.$element.addClass("editable-click"),this.$element.on(this.options.toggle+".editable",a.proxy(function(a){if(this.options.disabled||a.preventDefault(),"mouseenter"===this.options.toggle)this.show();else{var b="click"!==this.options.toggle;this.toggle(b)}},this))):this.$element.attr("tabindex",-1),"function"==typeof this.options.display&&(this.options.autotext="always"),this.options.autotext){case"always":b=!0;break;case"auto":b=!a.trim(this.$element.text()).length&&null!==this.value&&void 0!==this.value&&!c;break;default:b=!1}a.when(b?this.render():!0).then(a.proxy(function(){this.options.disabled?this.disable():this.enable(),this.$element.triggerHandler("init",this)},this))}},initLive:function(){var b=this.options.selector;this.options.selector=!1,this.options.autotext="never",this.$element.on(this.options.toggle+".editable",b,a.proxy(function(b){var c=a(b.target);c.data("editable")||(c.hasClass(this.options.emptyclass)&&c.empty(),c.editable(this.options).trigger(b))},this))},render:function(a){return this.options.display!==!1?this.input.value2htmlFinal?this.input.value2html(this.value,this.$element[0],this.options.display,a):"function"==typeof this.options.display?this.options.display.call(this.$element[0],this.value,a):this.input.value2html(this.value,this.$element[0]):void 0},enable:function(){this.options.disabled=!1,this.$element.removeClass("editable-disabled"),this.handleEmpty(this.isEmpty),"manual"!==this.options.toggle&&"-1"===this.$element.attr("tabindex")&&this.$element.removeAttr("tabindex")},disable:function(){this.options.disabled=!0,this.hide(),this.$element.addClass("editable-disabled"),this.handleEmpty(this.isEmpty),this.$element.attr("tabindex",-1)},toggleDisabled:function(){this.options.disabled?this.enable():this.disable()},option:function(b,c){return b&&"object"==typeof b?(a.each(b,a.proxy(function(b,c){this.option(a.trim(b),c)},this)),void 0):(this.options[b]=c,"disabled"===b?c?this.disable():this.enable():("value"===b&&this.setValue(c),this.container&&this.container.option(b,c),this.input.option&&this.input.option(b,c),void 0))},handleEmpty:function(b){this.options.display!==!1&&(this.isEmpty=void 0!==b?b:"function"==typeof this.input.isEmpty?this.input.isEmpty(this.$element):""===a.trim(this.$element.html()),this.options.disabled?this.isEmpty&&(this.$element.empty(),this.options.emptyclass&&this.$element.removeClass(this.options.emptyclass)):this.isEmpty?(this.$element.html(this.options.emptytext),this.options.emptyclass&&this.$element.addClass(this.options.emptyclass)):this.options.emptyclass&&this.$element.removeClass(this.options.emptyclass))},show:function(b){if(!this.options.disabled){if(this.container){if(this.container.tip().is(":visible"))return}else{var c=a.extend({},this.options,{value:this.value,input:this.input});this.$element.editableContainer(c),this.$element.on("save.internal",a.proxy(this.save,this)),this.container=this.$element.data("editableContainer")}this.container.show(b)}},hide:function(){this.container&&this.container.hide()},toggle:function(a){this.container&&this.container.tip().is(":visible")?this.hide():this.show(a)},save:function(a,b){if(this.options.unsavedclass){var c=!1;c=c||"function"==typeof this.options.url,c=c||this.options.display===!1,c=c||void 0!==b.response,c=c||this.options.savenochange&&this.input.value2str(this.value)!==this.input.value2str(b.newValue),c?this.$element.removeClass(this.options.unsavedclass):this.$element.addClass(this.options.unsavedclass)}if(this.options.highlight){var d=this.$element,e=d.css("background-color");d.css("background-color",this.options.highlight),setTimeout(function(){"transparent"===e&&(e=""),d.css("background-color",e),d.addClass("editable-bg-transition"),setTimeout(function(){d.removeClass("editable-bg-transition")},1700)},10)}this.setValue(b.newValue,!1,b.response)},validate:function(){return"function"==typeof this.options.validate?this.options.validate.call(this,this.value):void 0},setValue:function(b,c,d){this.value=c?this.input.str2value(b):b,this.container&&this.container.option("value",this.value),a.when(this.render(d)).then(a.proxy(function(){this.handleEmpty()},this))},activate:function(){this.container&&this.container.activate()},destroy:function(){this.disable(),this.container&&this.container.destroy(),this.input.destroy(),"manual"!==this.options.toggle&&(this.$element.removeClass("editable-click"),this.$element.off(this.options.toggle+".editable")),this.$element.off("save.internal"),this.$element.removeClass("editable editable-open editable-disabled"),this.$element.removeData("editable")}},a.fn.editable=function(c){var d={},e=arguments,f="editable";switch(c){case"validate":return this.each(function(){var b,c=a(this),e=c.data(f);e&&(b=e.validate())&&(d[e.options.name]=b)}),d;case"getValue":return 2===arguments.length&&arguments[1]===!0?d=this.eq(0).data(f).value:this.each(function(){var b=a(this),c=b.data(f);c&&void 0!==c.value&&null!==c.value&&(d[c.options.name]=c.input.value2submit(c.value))}),d;case"submit":var g=arguments[1]||{},h=this,i=this.editable("validate");if(a.isEmptyObject(i)){var j={};if(1===h.length){var k=h.data("editable"),l={name:k.options.name||"",value:k.input.value2submit(k.value),pk:"function"==typeof k.options.pk?k.options.pk.call(k.options.scope):k.options.pk};"function"==typeof k.options.params?l=k.options.params.call(k.options.scope,l):(k.options.params=a.fn.editableutils.tryParseJson(k.options.params,!0),a.extend(l,k.options.params)),j={url:k.options.url,data:l,type:"POST"},g.success=g.success||k.options.success,g.error=g.error||k.options.error}else{var m=this.editable("getValue");j={url:g.url,data:m,type:"POST"}}j.success="function"==typeof g.success?function(a){g.success.call(h,a,g)}:a.noop,j.error="function"==typeof g.error?function(){g.error.apply(h,arguments)}:a.noop,g.ajaxOptions&&a.extend(j,g.ajaxOptions),g.data&&a.extend(j.data,g.data),a.ajax(j)}else"function"==typeof g.error&&g.error.call(h,i);return this}return this.each(function(){var d=a(this),g=d.data(f),h="object"==typeof c&&c;return h&&h.selector?(g=new b(this,h),void 0):(g||d.data(f,g=new b(this,h)),"string"==typeof c&&g[c].apply(g,Array.prototype.slice.call(e,1)),void 0)})},a.fn.editable.defaults={type:"text",disabled:!1,toggle:"click",emptytext:"Empty",autotext:"auto",value:null,display:null,emptyclass:"editable-empty",unsavedclass:"editable-unsaved",selector:null,highlight:"#FFFF80"}}(window.jQuery),function(a){"use strict";a.fn.editabletypes={};var b=function(){};b.prototype={init:function(b,c,d){this.type=b,this.options=a.extend({},d,c)},prerender:function(){this.$tpl=a(this.options.tpl),this.$input=this.$tpl,this.$clear=null,this.error=null},render:function(){},value2html:function(b,c){a(c)[this.options.escape?"text":"html"](a.trim(b))},html2value:function(b){return a("<div>").html(b).text()},value2str:function(a){return a},str2value:function(a){return a},value2submit:function(a){return a},value2input:function(a){this.$input.val(a)},input2value:function(){return this.$input.val()},activate:function(){this.$input.is(":visible")&&this.$input.focus()},clear:function(){this.$input.val(null)},escape:function(b){return a("<div>").text(b).html()},autosubmit:function(){},destroy:function(){},setClass:function(){this.options.inputclass&&this.$input.addClass(this.options.inputclass)},setAttr:function(a){void 0!==this.options[a]&&null!==this.options[a]&&this.$input.attr(a,this.options[a])},option:function(a,b){this.options[a]=b}},b.defaults={tpl:"",inputclass:null,escape:!0,scope:null,showbuttons:!0},a.extend(a.fn.editabletypes,{abstractinput:b})}(window.jQuery),function(a){"use strict";var b=function(){};a.fn.editableutils.inherit(b,a.fn.editabletypes.abstractinput),a.extend(b.prototype,{render:function(){var b=a.Deferred();return this.error=null,this.onSourceReady(function(){this.renderList(),b.resolve()},function(){this.error=this.options.sourceError,b.resolve()}),b.promise()},html2value:function(){return null},value2html:function(b,c,d,e){var f=a.Deferred(),g=function(){"function"==typeof d?d.call(c,b,this.sourceData,e):this.value2htmlFinal(b,c),f.resolve()};return null===b?g.call(this):this.onSourceReady(g,function(){f.resolve()}),f.promise()},onSourceReady:function(b,c){var d;if(a.isFunction(this.options.source)?(d=this.options.source.call(this.options.scope),this.sourceData=null):d=this.options.source,this.options.sourceCache&&a.isArray(this.sourceData))return b.call(this),void 0;try{d=a.fn.editableutils.tryParseJson(d,!1)}catch(e){return c.call(this),void 0}if("string"==typeof d){if(this.options.sourceCache){var f,g=d;if(a(document).data(g)||a(document).data(g,{}),f=a(document).data(g),f.loading===!1&&f.sourceData)return this.sourceData=f.sourceData,this.doPrepend(),b.call(this),void 0;if(f.loading===!0)return f.callbacks.push(a.proxy(function(){this.sourceData=f.sourceData,this.doPrepend(),b.call(this)},this)),f.err_callbacks.push(a.proxy(c,this)),void 0;f.loading=!0,f.callbacks=[],f.err_callbacks=[]}var h=a.extend({url:d,type:"get",cache:!1,dataType:"json",success:a.proxy(function(d){f&&(f.loading=!1),this.sourceData=this.makeArray(d),a.isArray(this.sourceData)?(f&&(f.sourceData=this.sourceData,a.each(f.callbacks,function(){this.call()})),this.doPrepend(),b.call(this)):(c.call(this),f&&a.each(f.err_callbacks,function(){this.call()}))},this),error:a.proxy(function(){c.call(this),f&&(f.loading=!1,a.each(f.err_callbacks,function(){this.call()}))},this)},this.options.sourceOptions);a.ajax(h)}else this.sourceData=this.makeArray(d),a.isArray(this.sourceData)?(this.doPrepend(),b.call(this)):c.call(this)},doPrepend:function(){null!==this.options.prepend&&void 0!==this.options.prepend&&(a.isArray(this.prependData)||(a.isFunction(this.options.prepend)&&(this.options.prepend=this.options.prepend.call(this.options.scope)),this.options.prepend=a.fn.editableutils.tryParseJson(this.options.prepend,!0),"string"==typeof this.options.prepend&&(this.options.prepend={"":this.options.prepend}),this.prependData=this.makeArray(this.options.prepend)),a.isArray(this.prependData)&&a.isArray(this.sourceData)&&(this.sourceData=this.prependData.concat(this.sourceData)))},renderList:function(){},value2htmlFinal:function(){},makeArray:function(b){var c,d,e,f,g=[];if(!b||"string"==typeof b)return null;if(a.isArray(b)){f=function(a,b){return d={value:a,text:b},c++>=2?!1:void 0};for(var h=0;h<b.length;h++)e=b[h],"object"==typeof e?(c=0,a.each(e,f),1===c?g.push(d):c>1&&(e.children&&(e.children=this.makeArray(e.children)),g.push(e))):g.push({value:e,text:e})}else a.each(b,function(a,b){g.push({value:a,text:b})});return g},option:function(a,b){this.options[a]=b,"source"===a&&(this.sourceData=null),"prepend"===a&&(this.prependData=null)}}),b.defaults=a.extend({},a.fn.editabletypes.abstractinput.defaults,{source:null,prepend:!1,sourceError:"Error when loading list",sourceCache:!0,sourceOptions:null}),a.fn.editabletypes.list=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("text",a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.abstractinput),a.extend(b.prototype,{render:function(){this.renderClear(),this.setClass(),this.setAttr("placeholder")},activate:function(){this.$input.is(":visible")&&(this.$input.focus(),a.fn.editableutils.setCursorPosition(this.$input.get(0),this.$input.val().length),this.toggleClear&&this.toggleClear())},renderClear:function(){this.options.clear&&(this.$clear=a('<span class="editable-clear-x"></span>'),this.$input.after(this.$clear).css("padding-right",24).keyup(a.proxy(function(b){if(!~a.inArray(b.keyCode,[40,38,9,13,27])){clearTimeout(this.t);var c=this;this.t=setTimeout(function(){c.toggleClear(b)},100)}},this)).parent().css("position","relative"),this.$clear.click(a.proxy(this.clear,this)))},postrender:function(){},toggleClear:function(){if(this.$clear){var a=this.$input.val().length,b=this.$clear.is(":visible");a&&!b&&this.$clear.show(),!a&&b&&this.$clear.hide()}},clear:function(){this.$clear.hide(),this.$input.val("").focus()}}),b.defaults=a.extend({},a.fn.editabletypes.abstractinput.defaults,{tpl:'<input type="text">',placeholder:null,clear:!0}),a.fn.editabletypes.text=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("textarea",a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.abstractinput),a.extend(b.prototype,{render:function(){this.setClass(),this.setAttr("placeholder"),this.setAttr("rows"),this.$input.keydown(function(b){b.ctrlKey&&13===b.which&&a(this).closest("form").submit()})},activate:function(){a.fn.editabletypes.text.prototype.activate.call(this)}}),b.defaults=a.extend({},a.fn.editabletypes.abstractinput.defaults,{tpl:"<textarea></textarea>",inputclass:"input-large",placeholder:null,rows:7}),a.fn.editabletypes.textarea=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("select",a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.list),a.extend(b.prototype,{renderList:function(){this.$input.empty();var b=function(c,d){var e;if(a.isArray(d))for(var f=0;f<d.length;f++)e={},d[f].children?(e.label=d[f].text,c.append(b(a("<optgroup>",e),d[f].children))):(e.value=d[f].value,d[f].disabled&&(e.disabled=!0),c.append(a("<option>",e).text(d[f].text)));return c};b(this.$input,this.sourceData),this.setClass(),this.$input.on("keydown.editable",function(b){13===b.which&&a(this).closest("form").submit()})},value2htmlFinal:function(b,c){var d="",e=a.fn.editableutils.itemsByValue(b,this.sourceData);e.length&&(d=e[0].text),a.fn.editabletypes.abstractinput.prototype.value2html.call(this,d,c)},autosubmit:function(){this.$input.off("keydown.editable").on("change.editable",function(){a(this).closest("form").submit()})}}),b.defaults=a.extend({},a.fn.editabletypes.list.defaults,{tpl:"<select></select>"}),a.fn.editabletypes.select=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("checklist",a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.list),a.extend(b.prototype,{renderList:function(){var b;if(this.$tpl.empty(),a.isArray(this.sourceData)){for(var c=0;c<this.sourceData.length;c++)b=a("<label>").append(a("<input>",{type:"checkbox",value:this.sourceData[c].value})).append(a("<span>").text(" "+this.sourceData[c].text)),a("<div>").append(b).appendTo(this.$tpl);this.$input=this.$tpl.find('input[type="checkbox"]'),this.setClass()}},value2str:function(b){return a.isArray(b)?b.sort().join(a.trim(this.options.separator)):""},str2value:function(b){var c,d=null;return"string"==typeof b&&b.length?(c=new RegExp("\\s*"+a.trim(this.options.separator)+"\\s*"),d=b.split(c)):d=a.isArray(b)?b:[b],d},value2input:function(b){this.$input.prop("checked",!1),a.isArray(b)&&b.length&&this.$input.each(function(c,d){var e=a(d);a.each(b,function(a,b){e.val()==b&&e.prop("checked",!0)})})},input2value:function(){var b=[];return this.$input.filter(":checked").each(function(c,d){b.push(a(d).val())}),b},value2htmlFinal:function(b,c){var d=[],e=a.fn.editableutils.itemsByValue(b,this.sourceData),f=this.options.escape;e.length?(a.each(e,function(b,c){var e=f?a.fn.editableutils.escape(c.text):c.text;d.push(e)}),a(c).html(d.join("<br>"))):a(c).empty()},activate:function(){this.$input.first().focus()},autosubmit:function(){this.$input.on("keydown",function(b){13===b.which&&a(this).closest("form").submit()})}}),b.defaults=a.extend({},a.fn.editabletypes.list.defaults,{tpl:'<div class="editable-checklist"></div>',inputclass:null,separator:","}),a.fn.editabletypes.checklist=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("password",a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.text),a.extend(b.prototype,{value2html:function(b,c){b?a(c).text("[hidden]"):a(c).empty()},html2value:function(){return null}}),b.defaults=a.extend({},a.fn.editabletypes.text.defaults,{tpl:'<input type="password">'}),a.fn.editabletypes.password=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("email",a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.text),b.defaults=a.extend({},a.fn.editabletypes.text.defaults,{tpl:'<input type="email">'}),a.fn.editabletypes.email=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("url",a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.text),b.defaults=a.extend({},a.fn.editabletypes.text.defaults,{tpl:'<input type="url">'}),a.fn.editabletypes.url=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("tel",a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.text),b.defaults=a.extend({},a.fn.editabletypes.text.defaults,{tpl:'<input type="tel">'}),a.fn.editabletypes.tel=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("number",a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.text),a.extend(b.prototype,{render:function(){b.superclass.render.call(this),this.setAttr("min"),this.setAttr("max"),this.setAttr("step")},postrender:function(){this.$clear&&this.$clear.css({right:24})}}),b.defaults=a.extend({},a.fn.editabletypes.text.defaults,{tpl:'<input type="number">',inputclass:"input-mini",min:null,max:null,step:null}),a.fn.editabletypes.number=b}(window.jQuery),function(a){"use strict"; -var b=function(a){this.init("range",a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.number),a.extend(b.prototype,{render:function(){this.$input=this.$tpl.filter("input"),this.setClass(),this.setAttr("min"),this.setAttr("max"),this.setAttr("step"),this.$input.on("input",function(){a(this).siblings("output").text(a(this).val())})},activate:function(){this.$input.focus()}}),b.defaults=a.extend({},a.fn.editabletypes.number.defaults,{tpl:'<input type="range"><output style="width: 30px; display: inline-block"></output>',inputclass:"input-medium"}),a.fn.editabletypes.range=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("time",a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.abstractinput),a.extend(b.prototype,{render:function(){this.setClass()}}),b.defaults=a.extend({},a.fn.editabletypes.abstractinput.defaults,{tpl:'<input type="time">'}),a.fn.editabletypes.time=b}(window.jQuery),function(a){"use strict";var b=function(c){if(this.init("select2",c,b.defaults),c.select2=c.select2||{},this.sourceData=null,c.placeholder&&(c.select2.placeholder=c.placeholder),!c.select2.tags&&c.source){var d=c.source;a.isFunction(c.source)&&(d=c.source.call(c.scope)),"string"==typeof d?(c.select2.ajax=c.select2.ajax||{},c.select2.ajax.data||(c.select2.ajax.data=function(a){return{query:a}}),c.select2.ajax.results||(c.select2.ajax.results=function(a){return{results:a}}),c.select2.ajax.url=d):(this.sourceData=this.convertSource(d),c.select2.data=this.sourceData)}if(this.options.select2=a.extend({},b.defaults.select2,c.select2),this.isMultiple=this.options.select2.tags||this.options.select2.multiple,this.isRemote="ajax"in this.options.select2,this.idFunc=this.options.select2.id,"function"!=typeof this.idFunc){var e=this.idFunc||"id";this.idFunc=function(a){return a[e]}}this.formatSelection=this.options.select2.formatSelection,"function"!=typeof this.formatSelection&&(this.formatSelection=function(a){return a.text})};a.fn.editableutils.inherit(b,a.fn.editabletypes.abstractinput),a.extend(b.prototype,{render:function(){this.setClass(),this.isRemote&&this.$input.on("select2-loaded",a.proxy(function(a){this.sourceData=a.items.results},this)),this.isMultiple&&this.$input.on("change",function(){a(this).closest("form").parent().triggerHandler("resize")})},value2html:function(c,d){var e,f="",g=this;this.options.select2.tags?e=c:this.sourceData&&(e=a.fn.editableutils.itemsByValue(c,this.sourceData,this.idFunc)),a.isArray(e)?(f=[],a.each(e,function(a,b){f.push(b&&"object"==typeof b?g.formatSelection(b):b)})):e&&(f=g.formatSelection(e)),f=a.isArray(f)?f.join(this.options.viewseparator):f,b.superclass.value2html.call(this,f,d)},html2value:function(a){return this.options.select2.tags?this.str2value(a,this.options.viewseparator):null},value2input:function(b){if(a.isArray(b)&&(b=b.join(this.getSeparator())),this.$input.data("select2")?this.$input.val(b).trigger("change",!0):(this.$input.val(b),this.$input.select2(this.options.select2)),this.isRemote&&!this.isMultiple&&!this.options.select2.initSelection){var c=this.options.select2.id,d=this.options.select2.formatSelection;if(!c&&!d){var e=a(this.options.scope);if(!e.data("editable").isEmpty){var f={id:b,text:e.text()};this.$input.select2("data",f)}}}},input2value:function(){return this.$input.select2("val")},str2value:function(b,c){if("string"!=typeof b||!this.isMultiple)return b;c=c||this.getSeparator();var d,e,f;if(null===b||b.length<1)return null;for(d=b.split(c),e=0,f=d.length;f>e;e+=1)d[e]=a.trim(d[e]);return d},autosubmit:function(){this.$input.on("change",function(b,c){c||a(this).closest("form").submit()})},getSeparator:function(){return this.options.select2.separator||a.fn.select2.defaults.separator},convertSource:function(b){if(a.isArray(b)&&b.length&&void 0!==b[0].value)for(var c=0;c<b.length;c++)void 0!==b[c].value&&(b[c].id=b[c].value,delete b[c].value);return b},destroy:function(){this.$input.data("select2")&&this.$input.select2("destroy")}}),b.defaults=a.extend({},a.fn.editabletypes.abstractinput.defaults,{tpl:'<input type="hidden">',select2:null,placeholder:null,source:null,viewseparator:", "}),a.fn.editabletypes.select2=b}(window.jQuery),function(a){var b=function(b,c){return this.$element=a(b),this.$element.is("input")?(this.options=a.extend({},a.fn.combodate.defaults,c,this.$element.data()),this.init(),void 0):(a.error("Combodate should be applied to INPUT element"),void 0)};b.prototype={constructor:b,init:function(){this.map={day:["D","date"],month:["M","month"],year:["Y","year"],hour:["[Hh]","hours"],minute:["m","minutes"],second:["s","seconds"],ampm:["[Aa]",""]},this.$widget=a('<span class="combodate"></span>').html(this.getTemplate()),this.initCombos(),this.$widget.on("change","select",a.proxy(function(b){this.$element.val(this.getValue()).change(),this.options.smartDays&&(a(b.target).is(".month")||a(b.target).is(".year"))&&this.fillCombo("day")},this)),this.$widget.find("select").css("width","auto"),this.$element.hide().after(this.$widget),this.setValue(this.$element.val()||this.options.value)},getTemplate:function(){var b=this.options.template;return a.each(this.map,function(a,c){c=c[0];var d=new RegExp(c+"+"),e=c.length>1?c.substring(1,2):c;b=b.replace(d,"{"+e+"}")}),b=b.replace(/ /g," "),a.each(this.map,function(a,c){c=c[0];var d=c.length>1?c.substring(1,2):c;b=b.replace("{"+d+"}",'<select class="'+a+'"></select>')}),b},initCombos:function(){for(var a in this.map){var b=this.$widget.find("."+a);this["$"+a]=b.length?b:null,this.fillCombo(a)}},fillCombo:function(a){var b=this["$"+a];if(b){var c="fill"+a.charAt(0).toUpperCase()+a.slice(1),d=this[c](),e=b.val();b.empty();for(var f=0;f<d.length;f++)b.append('<option value="'+d[f][0]+'">'+d[f][1]+"</option>");b.val(e)}},fillCommon:function(a){var b,c=[];if("name"===this.options.firstItem){b=moment.relativeTime||moment.langData()._relativeTime;var d="function"==typeof b[a]?b[a](1,!0,a,!1):b[a];d=d.split(" ").reverse()[0],c.push(["",d])}else"empty"===this.options.firstItem&&c.push(["",""]);return c},fillDay:function(){var a,b,c=this.fillCommon("d"),d=-1!==this.options.template.indexOf("DD"),e=31;if(this.options.smartDays&&this.$month&&this.$year){var f=parseInt(this.$month.val(),10),g=parseInt(this.$year.val(),10);isNaN(f)||isNaN(g)||(e=moment([g,f]).daysInMonth())}for(b=1;e>=b;b++)a=d?this.leadZero(b):b,c.push([b,a]);return c},fillMonth:function(){var a,b,c=this.fillCommon("M"),d=-1!==this.options.template.indexOf("MMMM"),e=-1!==this.options.template.indexOf("MMM"),f=-1!==this.options.template.indexOf("MM");for(b=0;11>=b;b++)a=d?moment().date(1).month(b).format("MMMM"):e?moment().date(1).month(b).format("MMM"):f?this.leadZero(b+1):b+1,c.push([b,a]);return c},fillYear:function(){var a,b,c=[],d=-1!==this.options.template.indexOf("YYYY");for(b=this.options.maxYear;b>=this.options.minYear;b--)a=d?b:(b+"").substring(2),c[this.options.yearDescending?"push":"unshift"]([b,a]);return c=this.fillCommon("y").concat(c)},fillHour:function(){var a,b,c=this.fillCommon("h"),d=-1!==this.options.template.indexOf("h"),e=(-1!==this.options.template.indexOf("H"),-1!==this.options.template.toLowerCase().indexOf("hh")),f=d?1:0,g=d?12:23;for(b=f;g>=b;b++)a=e?this.leadZero(b):b,c.push([b,a]);return c},fillMinute:function(){var a,b,c=this.fillCommon("m"),d=-1!==this.options.template.indexOf("mm");for(b=0;59>=b;b+=this.options.minuteStep)a=d?this.leadZero(b):b,c.push([b,a]);return c},fillSecond:function(){var a,b,c=this.fillCommon("s"),d=-1!==this.options.template.indexOf("ss");for(b=0;59>=b;b+=this.options.secondStep)a=d?this.leadZero(b):b,c.push([b,a]);return c},fillAmpm:function(){var a=-1!==this.options.template.indexOf("a"),b=(-1!==this.options.template.indexOf("A"),[["am",a?"am":"AM"],["pm",a?"pm":"PM"]]);return b},getValue:function(b){var c,d={},e=this,f=!1;return a.each(this.map,function(a){if("ampm"!==a){var b="day"===a?1:0;return d[a]=e["$"+a]?parseInt(e["$"+a].val(),10):b,isNaN(d[a])?(f=!0,!1):void 0}}),f?"":(this.$ampm&&(d.hour=12===d.hour?"am"===this.$ampm.val()?0:12:"am"===this.$ampm.val()?d.hour:d.hour+12),c=moment([d.year,d.month,d.day,d.hour,d.minute,d.second]),this.highlight(c),b=void 0===b?this.options.format:b,null===b?c.isValid()?c:null:c.isValid()?c.format(b):"")},setValue:function(b){function c(b,c){var d={};return b.children("option").each(function(b,e){var f,g=a(e).attr("value");""!==g&&(f=Math.abs(g-c),("undefined"==typeof d.distance||f<d.distance)&&(d={value:g,distance:f}))}),d.value}if(b){var d="string"==typeof b?moment(b,this.options.format):moment(b),e=this,f={};d.isValid()&&(a.each(this.map,function(a,b){"ampm"!==a&&(f[a]=d[b[1]]())}),this.$ampm&&(f.hour>=12?(f.ampm="pm",f.hour>12&&(f.hour-=12)):(f.ampm="am",0===f.hour&&(f.hour=12))),a.each(f,function(a,b){e["$"+a]&&("minute"===a&&e.options.minuteStep>1&&e.options.roundTime&&(b=c(e["$"+a],b)),"second"===a&&e.options.secondStep>1&&e.options.roundTime&&(b=c(e["$"+a],b)),e["$"+a].val(b))}),this.options.smartDays&&this.fillCombo("day"),this.$element.val(d.format(this.options.format)).change())}},highlight:function(a){a.isValid()?this.options.errorClass?this.$widget.removeClass(this.options.errorClass):this.$widget.find("select").css("border-color",this.borderColor):this.options.errorClass?this.$widget.addClass(this.options.errorClass):(this.borderColor||(this.borderColor=this.$widget.find("select").css("border-color")),this.$widget.find("select").css("border-color","red"))},leadZero:function(a){return 9>=a?"0"+a:a},destroy:function(){this.$widget.remove(),this.$element.removeData("combodate").show()}},a.fn.combodate=function(c){var d,e=Array.apply(null,arguments);return e.shift(),"getValue"===c&&this.length&&(d=this.eq(0).data("combodate"))?d.getValue.apply(d,e):this.each(function(){var d=a(this),f=d.data("combodate"),g="object"==typeof c&&c;f||d.data("combodate",f=new b(this,g)),"string"==typeof c&&"function"==typeof f[c]&&f[c].apply(f,e)})},a.fn.combodate.defaults={format:"DD-MM-YYYY HH:mm",template:"D / MMM / YYYY H : mm",value:null,minYear:1970,maxYear:2015,yearDescending:!0,minuteStep:5,secondStep:1,firstItem:"empty",errorClass:null,roundTime:!0,smartDays:!1}}(window.jQuery),function(a){"use strict";var b=function(c){this.init("combodate",c,b.defaults),this.options.viewformat||(this.options.viewformat=this.options.format),c.combodate=a.fn.editableutils.tryParseJson(c.combodate,!0),this.options.combodate=a.extend({},b.defaults.combodate,c.combodate,{format:this.options.format,template:this.options.template})};a.fn.editableutils.inherit(b,a.fn.editabletypes.abstractinput),a.extend(b.prototype,{render:function(){this.$input.combodate(this.options.combodate),"bs3"===a.fn.editableform.engine&&this.$input.siblings().find("select").addClass("form-control"),this.options.inputclass&&this.$input.siblings().find("select").addClass(this.options.inputclass)},value2html:function(a,c){var d=a?a.format(this.options.viewformat):"";b.superclass.value2html.call(this,d,c)},html2value:function(a){return a?moment(a,this.options.viewformat):null},value2str:function(a){return a?a.format(this.options.format):""},str2value:function(a){return a?moment(a,this.options.format):null},value2submit:function(a){return this.value2str(a)},value2input:function(a){this.$input.combodate("setValue",a)},input2value:function(){return this.$input.combodate("getValue",null)},activate:function(){this.$input.siblings(".combodate").find("select").eq(0).focus()},autosubmit:function(){}}),b.defaults=a.extend({},a.fn.editabletypes.abstractinput.defaults,{tpl:'<input type="text">',inputclass:null,format:"YYYY-MM-DD",viewformat:null,template:"D / MMM / YYYY",combodate:null}),a.fn.editabletypes.combodate=b}(window.jQuery),function(a){"use strict";var b=a.fn.editableform.Constructor.prototype.initInput;a.extend(a.fn.editableform.Constructor.prototype,{initTemplate:function(){this.$form=a(a.fn.editableform.template),this.$form.find(".editable-error-block").addClass("help-block")},initInput:function(){b.apply(this);var c=null===this.input.options.inputclass||this.input.options.inputclass===!1,d="input-medium",e="text,select,textarea,password,email,url,tel,number,range,time".split(",");~a.inArray(this.input.type,e)&&c&&(this.input.options.inputclass=d,this.input.$input.addClass(d))}}),a.fn.editableform.buttons='<button type="submit" class="btn btn-primary editable-submit"><i class="icon-ok icon-white"></i></button><button type="button" class="btn editable-cancel"><i class="icon-remove"></i></button>',a.fn.editableform.errorGroupClass="error",a.fn.editableform.errorBlockClass=null,a.fn.editableform.engine="bs2"}(window.jQuery),function(a){"use strict";a.extend(a.fn.editableContainer.Popup.prototype,{containerName:"popover",innerCss:a.fn.popover&&a(a.fn.popover.defaults.template).find("p").length?".popover-content p":".popover-content",defaults:a.fn.popover.defaults,initContainer:function(){a.extend(this.containerOptions,{trigger:"manual",selector:!1,content:" ",template:this.defaults.template});var b;this.$element.data("template")&&(b=this.$element.data("template"),this.$element.removeData("template")),this.call(this.containerOptions),b&&this.$element.data("template",b)},innerShow:function(){this.call("show")},innerHide:function(){this.call("hide")},innerDestroy:function(){this.call("destroy")},setContainerOption:function(a,b){this.container().options[a]=b},setPosition:function(){!function(){var b,c,d,e,f,g,h,i,j,k,l=this.tip();switch(f="function"==typeof this.options.placement?this.options.placement.call(this,l[0],this.$element[0]):this.options.placement,b=/in/.test(f),l.removeClass("top right bottom left").css({top:0,left:0,display:"block"}),c=this.getPosition(b),d=l[0].offsetWidth,e=l[0].offsetHeight,f=b?f.split(" ")[1]:f,i={top:c.top+c.height,left:c.left+c.width/2-d/2},h={top:c.top-e,left:c.left+c.width/2-d/2},j={top:c.top+c.height/2-e/2,left:c.left-d},k={top:c.top+c.height/2-e/2,left:c.left+c.width},f){case"bottom":i.top+e>a(window).scrollTop()+a(window).height()&&(f=h.top>a(window).scrollTop()?"top":k.left+d<a(window).scrollLeft()+a(window).width()?"right":j.left>a(window).scrollLeft()?"left":"right");break;case"top":h.top<a(window).scrollTop()&&(f=i.top+e<a(window).scrollTop()+a(window).height()?"bottom":k.left+d<a(window).scrollLeft()+a(window).width()?"right":j.left>a(window).scrollLeft()?"left":"right");break;case"left":j.left<a(window).scrollLeft()&&(f=k.left+d<a(window).scrollLeft()+a(window).width()?"right":h.top>a(window).scrollTop()?"top":h.top>a(window).scrollTop()?"bottom":"right");break;case"right":k.left+d>a(window).scrollLeft()+a(window).width()&&(j.left>a(window).scrollLeft()?f="left":h.top>a(window).scrollTop()?f="top":h.top>a(window).scrollTop()&&(f="bottom"))}switch(f){case"bottom":g=i;break;case"top":g=h;break;case"left":g=j;break;case"right":g=k}l.offset(g).addClass(f).addClass("in")}.call(this.container())}})}(window.jQuery),function(a){function b(){return new Date(Date.UTC.apply(Date,arguments))}function c(b,c){var d,e=a(b).data(),f={},g=new RegExp("^"+c.toLowerCase()+"([A-Z])"),c=new RegExp("^"+c.toLowerCase());for(var h in e)c.test(h)&&(d=h.replace(g,function(a,b){return b.toLowerCase()}),f[d]=e[h]);return f}function d(b){var c={};if(k[b]||(b=b.split("-")[0],k[b])){var d=k[b];return a.each(j,function(a,b){b in d&&(c[b]=d[b])}),c}}var e=function(b,c){this._process_options(c),this.element=a(b),this.isInline=!1,this.isInput=this.element.is("input"),this.component=this.element.is(".date")?this.element.find(".add-on, .btn"):!1,this.hasInput=this.component&&this.element.find("input").length,this.component&&0===this.component.length&&(this.component=!1),this.picker=a(l.template),this._buildEvents(),this._attachEvents(),this.isInline?this.picker.addClass("datepicker-inline").appendTo(this.element):this.picker.addClass("datepicker-dropdown dropdown-menu"),this.o.rtl&&(this.picker.addClass("datepicker-rtl"),this.picker.find(".prev i, .next i").toggleClass("icon-arrow-left icon-arrow-right")),this.viewMode=this.o.startView,this.o.calendarWeeks&&this.picker.find("tfoot th.today").attr("colspan",function(a,b){return parseInt(b)+1}),this._allow_update=!1,this.setStartDate(this.o.startDate),this.setEndDate(this.o.endDate),this.setDaysOfWeekDisabled(this.o.daysOfWeekDisabled),this.fillDow(),this.fillMonths(),this._allow_update=!0,this.update(),this.showMode(),this.isInline&&this.show()};e.prototype={constructor:e,_process_options:function(b){this._o=a.extend({},this._o,b);var c=this.o=a.extend({},this._o),d=c.language;switch(k[d]||(d=d.split("-")[0],k[d]||(d=i.language)),c.language=d,c.startView){case 2:case"decade":c.startView=2;break;case 1:case"year":c.startView=1;break;default:c.startView=0}switch(c.minViewMode){case 1:case"months":c.minViewMode=1;break;case 2:case"years":c.minViewMode=2;break;default:c.minViewMode=0}c.startView=Math.max(c.startView,c.minViewMode),c.weekStart%=7,c.weekEnd=(c.weekStart+6)%7;var e=l.parseFormat(c.format);c.startDate!==-1/0&&(c.startDate=l.parseDate(c.startDate,e,c.language)),1/0!==c.endDate&&(c.endDate=l.parseDate(c.endDate,e,c.language)),c.daysOfWeekDisabled=c.daysOfWeekDisabled||[],a.isArray(c.daysOfWeekDisabled)||(c.daysOfWeekDisabled=c.daysOfWeekDisabled.split(/[,\s]*/)),c.daysOfWeekDisabled=a.map(c.daysOfWeekDisabled,function(a){return parseInt(a,10)})},_events:[],_secondaryEvents:[],_applyEvents:function(a){for(var b,c,d=0;d<a.length;d++)b=a[d][0],c=a[d][1],b.on(c)},_unapplyEvents:function(a){for(var b,c,d=0;d<a.length;d++)b=a[d][0],c=a[d][1],b.off(c)},_buildEvents:function(){this.isInput?this._events=[[this.element,{focus:a.proxy(this.show,this),keyup:a.proxy(this.update,this),keydown:a.proxy(this.keydown,this)}]]:this.component&&this.hasInput?this._events=[[this.element.find("input"),{focus:a.proxy(this.show,this),keyup:a.proxy(this.update,this),keydown:a.proxy(this.keydown,this)}],[this.component,{click:a.proxy(this.show,this)}]]:this.element.is("div")?this.isInline=!0:this._events=[[this.element,{click:a.proxy(this.show,this)}]],this._secondaryEvents=[[this.picker,{click:a.proxy(this.click,this)}],[a(window),{resize:a.proxy(this.place,this)}],[a(document),{mousedown:a.proxy(function(a){this.element.is(a.target)||this.element.find(a.target).size()||this.picker.is(a.target)||this.picker.find(a.target).size()||this.hide()},this)}]]},_attachEvents:function(){this._detachEvents(),this._applyEvents(this._events)},_detachEvents:function(){this._unapplyEvents(this._events)},_attachSecondaryEvents:function(){this._detachSecondaryEvents(),this._applyEvents(this._secondaryEvents)},_detachSecondaryEvents:function(){this._unapplyEvents(this._secondaryEvents)},_trigger:function(b,c){var d=c||this.date,e=new Date(d.getTime()+6e4*d.getTimezoneOffset());this.element.trigger({type:b,date:e,format:a.proxy(function(a){var b=a||this.o.format;return l.formatDate(d,b,this.o.language)},this)})},show:function(a){this.isInline||this.picker.appendTo("body"),this.picker.show(),this.height=this.component?this.component.outerHeight():this.element.outerHeight(),this.place(),this._attachSecondaryEvents(),a&&a.preventDefault(),this._trigger("show")},hide:function(){this.isInline||this.picker.is(":visible")&&(this.picker.hide().detach(),this._detachSecondaryEvents(),this.viewMode=this.o.startView,this.showMode(),this.o.forceParse&&(this.isInput&&this.element.val()||this.hasInput&&this.element.find("input").val())&&this.setValue(),this._trigger("hide"))},remove:function(){this.hide(),this._detachEvents(),this._detachSecondaryEvents(),this.picker.remove(),delete this.element.data().datepicker,this.isInput||delete this.element.data().date},getDate:function(){var a=this.getUTCDate();return new Date(a.getTime()+6e4*a.getTimezoneOffset())},getUTCDate:function(){return this.date},setDate:function(a){this.setUTCDate(new Date(a.getTime()-6e4*a.getTimezoneOffset()))},setUTCDate:function(a){this.date=a,this.setValue()},setValue:function(){var a=this.getFormattedDate();this.isInput?this.element.val(a):this.component&&this.element.find("input").val(a)},getFormattedDate:function(a){return void 0===a&&(a=this.o.format),l.formatDate(this.date,a,this.o.language)},setStartDate:function(a){this._process_options({startDate:a}),this.update(),this.updateNavArrows()},setEndDate:function(a){this._process_options({endDate:a}),this.update(),this.updateNavArrows()},setDaysOfWeekDisabled:function(a){this._process_options({daysOfWeekDisabled:a}),this.update(),this.updateNavArrows()},place:function(){if(!this.isInline){var b=parseInt(this.element.parents().filter(function(){return"auto"!=a(this).css("z-index")}).first().css("z-index"))+10,c=this.component?this.component.parent().offset():this.element.offset(),d=this.component?this.component.outerHeight(!0):this.element.outerHeight(!0);this.picker.css({top:c.top+d,left:c.left,zIndex:b})}},_allow_update:!0,update:function(){if(this._allow_update){var a,b=!1;arguments&&arguments.length&&("string"==typeof arguments[0]||arguments[0]instanceof Date)?(a=arguments[0],b=!0):(a=this.isInput?this.element.val():this.element.data("date")||this.element.find("input").val(),delete this.element.data().date),this.date=l.parseDate(a,this.o.format,this.o.language),b&&this.setValue(),this.viewDate=this.date<this.o.startDate?new Date(this.o.startDate):this.date>this.o.endDate?new Date(this.o.endDate):new Date(this.date),this.fill()}},fillDow:function(){var a=this.o.weekStart,b="<tr>";if(this.o.calendarWeeks){var c='<th class="cw"> </th>';b+=c,this.picker.find(".datepicker-days thead tr:first-child").prepend(c)}for(;a<this.o.weekStart+7;)b+='<th class="dow">'+k[this.o.language].daysMin[a++%7]+"</th>";b+="</tr>",this.picker.find(".datepicker-days thead").append(b)},fillMonths:function(){for(var a="",b=0;12>b;)a+='<span class="month">'+k[this.o.language].monthsShort[b++]+"</span>";this.picker.find(".datepicker-months td").html(a)},setRange:function(b){b&&b.length?this.range=a.map(b,function(a){return a.valueOf()}):delete this.range,this.fill()},getClassNames:function(b){var c=[],d=this.viewDate.getUTCFullYear(),e=this.viewDate.getUTCMonth(),f=this.date.valueOf(),g=new Date;return b.getUTCFullYear()<d||b.getUTCFullYear()==d&&b.getUTCMonth()<e?c.push("old"):(b.getUTCFullYear()>d||b.getUTCFullYear()==d&&b.getUTCMonth()>e)&&c.push("new"),this.o.todayHighlight&&b.getUTCFullYear()==g.getFullYear()&&b.getUTCMonth()==g.getMonth()&&b.getUTCDate()==g.getDate()&&c.push("today"),f&&b.valueOf()==f&&c.push("active"),(b.valueOf()<this.o.startDate||b.valueOf()>this.o.endDate||-1!==a.inArray(b.getUTCDay(),this.o.daysOfWeekDisabled))&&c.push("disabled"),this.range&&(b>this.range[0]&&b<this.range[this.range.length-1]&&c.push("range"),-1!=a.inArray(b.valueOf(),this.range)&&c.push("selected")),c},fill:function(){var c,d=new Date(this.viewDate),e=d.getUTCFullYear(),f=d.getUTCMonth(),g=this.o.startDate!==-1/0?this.o.startDate.getUTCFullYear():-1/0,h=this.o.startDate!==-1/0?this.o.startDate.getUTCMonth():-1/0,i=1/0!==this.o.endDate?this.o.endDate.getUTCFullYear():1/0,j=1/0!==this.o.endDate?this.o.endDate.getUTCMonth():1/0;this.date&&this.date.valueOf(),this.picker.find(".datepicker-days thead th.datepicker-switch").text(k[this.o.language].months[f]+" "+e),this.picker.find("tfoot th.today").text(k[this.o.language].today).toggle(this.o.todayBtn!==!1),this.picker.find("tfoot th.clear").text(k[this.o.language].clear).toggle(this.o.clearBtn!==!1),this.updateNavArrows(),this.fillMonths();var m=b(e,f-1,28,0,0,0,0),n=l.getDaysInMonth(m.getUTCFullYear(),m.getUTCMonth());m.setUTCDate(n),m.setUTCDate(n-(m.getUTCDay()-this.o.weekStart+7)%7);var o=new Date(m);o.setUTCDate(o.getUTCDate()+42),o=o.valueOf();for(var p,q=[];m.valueOf()<o;){if(m.getUTCDay()==this.o.weekStart&&(q.push("<tr>"),this.o.calendarWeeks)){var r=new Date(+m+864e5*((this.o.weekStart-m.getUTCDay()-7)%7)),s=new Date(+r+864e5*((11-r.getUTCDay())%7)),t=new Date(+(t=b(s.getUTCFullYear(),0,1))+864e5*((11-t.getUTCDay())%7)),u=(s-t)/864e5/7+1;q.push('<td class="cw">'+u+"</td>")}p=this.getClassNames(m),p.push("day");var v=this.o.beforeShowDay(m);void 0===v?v={}:"boolean"==typeof v?v={enabled:v}:"string"==typeof v&&(v={classes:v}),v.enabled===!1&&p.push("disabled"),v.classes&&(p=p.concat(v.classes.split(/\s+/))),v.tooltip&&(c=v.tooltip),p=a.unique(p),q.push('<td class="'+p.join(" ")+'"'+(c?' title="'+c+'"':"")+">"+m.getUTCDate()+"</td>"),m.getUTCDay()==this.o.weekEnd&&q.push("</tr>"),m.setUTCDate(m.getUTCDate()+1)}this.picker.find(".datepicker-days tbody").empty().append(q.join(""));var w=this.date&&this.date.getUTCFullYear(),x=this.picker.find(".datepicker-months").find("th:eq(1)").text(e).end().find("span").removeClass("active");w&&w==e&&x.eq(this.date.getUTCMonth()).addClass("active"),(g>e||e>i)&&x.addClass("disabled"),e==g&&x.slice(0,h).addClass("disabled"),e==i&&x.slice(j+1).addClass("disabled"),q="",e=10*parseInt(e/10,10);var y=this.picker.find(".datepicker-years").find("th:eq(1)").text(e+"-"+(e+9)).end().find("td");e-=1;for(var z=-1;11>z;z++)q+='<span class="year'+(-1==z?" old":10==z?" new":"")+(w==e?" active":"")+(g>e||e>i?" disabled":"")+'">'+e+"</span>",e+=1;y.html(q)},updateNavArrows:function(){if(this._allow_update){var a=new Date(this.viewDate),b=a.getUTCFullYear(),c=a.getUTCMonth();switch(this.viewMode){case 0:this.o.startDate!==-1/0&&b<=this.o.startDate.getUTCFullYear()&&c<=this.o.startDate.getUTCMonth()?this.picker.find(".prev").css({visibility:"hidden"}):this.picker.find(".prev").css({visibility:"visible"}),1/0!==this.o.endDate&&b>=this.o.endDate.getUTCFullYear()&&c>=this.o.endDate.getUTCMonth()?this.picker.find(".next").css({visibility:"hidden"}):this.picker.find(".next").css({visibility:"visible"});break;case 1:case 2:this.o.startDate!==-1/0&&b<=this.o.startDate.getUTCFullYear()?this.picker.find(".prev").css({visibility:"hidden"}):this.picker.find(".prev").css({visibility:"visible"}),1/0!==this.o.endDate&&b>=this.o.endDate.getUTCFullYear()?this.picker.find(".next").css({visibility:"hidden"}):this.picker.find(".next").css({visibility:"visible"})}}},click:function(c){c.preventDefault();var d=a(c.target).closest("span, td, th");if(1==d.length)switch(d[0].nodeName.toLowerCase()){case"th":switch(d[0].className){case"datepicker-switch":this.showMode(1);break;case"prev":case"next":var e=l.modes[this.viewMode].navStep*("prev"==d[0].className?-1:1);switch(this.viewMode){case 0:this.viewDate=this.moveMonth(this.viewDate,e);break;case 1:case 2:this.viewDate=this.moveYear(this.viewDate,e)}this.fill();break;case"today":var f=new Date;f=b(f.getFullYear(),f.getMonth(),f.getDate(),0,0,0),this.showMode(-2);var g="linked"==this.o.todayBtn?null:"view";this._setDate(f,g);break;case"clear":var h;this.isInput?h=this.element:this.component&&(h=this.element.find("input")),h&&h.val("").change(),this._trigger("changeDate"),this.update(),this.o.autoclose&&this.hide()}break;case"span":if(!d.is(".disabled")){if(this.viewDate.setUTCDate(1),d.is(".month")){var i=1,j=d.parent().find("span").index(d),k=this.viewDate.getUTCFullYear();this.viewDate.setUTCMonth(j),this._trigger("changeMonth",this.viewDate),1===this.o.minViewMode&&this._setDate(b(k,j,i,0,0,0,0))}else{var k=parseInt(d.text(),10)||0,i=1,j=0;this.viewDate.setUTCFullYear(k),this._trigger("changeYear",this.viewDate),2===this.o.minViewMode&&this._setDate(b(k,j,i,0,0,0,0))}this.showMode(-1),this.fill()}break;case"td":if(d.is(".day")&&!d.is(".disabled")){var i=parseInt(d.text(),10)||1,k=this.viewDate.getUTCFullYear(),j=this.viewDate.getUTCMonth();d.is(".old")?0===j?(j=11,k-=1):j-=1:d.is(".new")&&(11==j?(j=0,k+=1):j+=1),this._setDate(b(k,j,i,0,0,0,0))}}},_setDate:function(a,b){b&&"date"!=b||(this.date=new Date(a)),b&&"view"!=b||(this.viewDate=new Date(a)),this.fill(),this.setValue(),this._trigger("changeDate");var c;this.isInput?c=this.element:this.component&&(c=this.element.find("input")),c&&(c.change(),!this.o.autoclose||b&&"date"!=b||this.hide())},moveMonth:function(a,b){if(!b)return a;var c,d,e=new Date(a.valueOf()),f=e.getUTCDate(),g=e.getUTCMonth(),h=Math.abs(b);if(b=b>0?1:-1,1==h)d=-1==b?function(){return e.getUTCMonth()==g}:function(){return e.getUTCMonth()!=c},c=g+b,e.setUTCMonth(c),(0>c||c>11)&&(c=(c+12)%12);else{for(var i=0;h>i;i++)e=this.moveMonth(e,b);c=e.getUTCMonth(),e.setUTCDate(f),d=function(){return c!=e.getUTCMonth()}}for(;d();)e.setUTCDate(--f),e.setUTCMonth(c);return e},moveYear:function(a,b){return this.moveMonth(a,12*b)},dateWithinRange:function(a){return a>=this.o.startDate&&a<=this.o.endDate},keydown:function(a){if(this.picker.is(":not(:visible)"))return 27==a.keyCode&&this.show(),void 0;var b,c,d,e=!1;switch(a.keyCode){case 27:this.hide(),a.preventDefault();break;case 37:case 39:if(!this.o.keyboardNavigation)break;b=37==a.keyCode?-1:1,a.ctrlKey?(c=this.moveYear(this.date,b),d=this.moveYear(this.viewDate,b)):a.shiftKey?(c=this.moveMonth(this.date,b),d=this.moveMonth(this.viewDate,b)):(c=new Date(this.date),c.setUTCDate(this.date.getUTCDate()+b),d=new Date(this.viewDate),d.setUTCDate(this.viewDate.getUTCDate()+b)),this.dateWithinRange(c)&&(this.date=c,this.viewDate=d,this.setValue(),this.update(),a.preventDefault(),e=!0);break;case 38:case 40:if(!this.o.keyboardNavigation)break;b=38==a.keyCode?-1:1,a.ctrlKey?(c=this.moveYear(this.date,b),d=this.moveYear(this.viewDate,b)):a.shiftKey?(c=this.moveMonth(this.date,b),d=this.moveMonth(this.viewDate,b)):(c=new Date(this.date),c.setUTCDate(this.date.getUTCDate()+7*b),d=new Date(this.viewDate),d.setUTCDate(this.viewDate.getUTCDate()+7*b)),this.dateWithinRange(c)&&(this.date=c,this.viewDate=d,this.setValue(),this.update(),a.preventDefault(),e=!0);break;case 13:this.hide(),a.preventDefault();break;case 9:this.hide()}if(e){this._trigger("changeDate");var f;this.isInput?f=this.element:this.component&&(f=this.element.find("input")),f&&f.change()}},showMode:function(a){a&&(this.viewMode=Math.max(this.o.minViewMode,Math.min(2,this.viewMode+a))),this.picker.find(">div").hide().filter(".datepicker-"+l.modes[this.viewMode].clsName).css("display","block"),this.updateNavArrows()}};var f=function(b,c){this.element=a(b),this.inputs=a.map(c.inputs,function(a){return a.jquery?a[0]:a}),delete c.inputs,a(this.inputs).datepicker(c).bind("changeDate",a.proxy(this.dateUpdated,this)),this.pickers=a.map(this.inputs,function(b){return a(b).data("datepicker")}),this.updateDates()};f.prototype={updateDates:function(){this.dates=a.map(this.pickers,function(a){return a.date}),this.updateRanges()},updateRanges:function(){var b=a.map(this.dates,function(a){return a.valueOf()});a.each(this.pickers,function(a,c){c.setRange(b)})},dateUpdated:function(b){var c=a(b.target).data("datepicker"),d=c.getUTCDate(),e=a.inArray(b.target,this.inputs),f=this.inputs.length;if(-1!=e){if(d<this.dates[e])for(;e>=0&&d<this.dates[e];)this.pickers[e--].setUTCDate(d);else if(d>this.dates[e])for(;f>e&&d>this.dates[e];)this.pickers[e++].setUTCDate(d);this.updateDates()}},remove:function(){a.map(this.pickers,function(a){a.remove()}),delete this.element.data().datepicker}};var g=a.fn.datepicker,h=a.fn.datepicker=function(b){var g=Array.apply(null,arguments);g.shift();var h;return this.each(function(){var j=a(this),k=j.data("datepicker"),l="object"==typeof b&&b;if(!k){var m=c(this,"date"),n=a.extend({},i,m,l),o=d(n.language),p=a.extend({},i,o,m,l);if(j.is(".input-daterange")||p.inputs){var q={inputs:p.inputs||j.find("input").toArray()};j.data("datepicker",k=new f(this,a.extend(p,q)))}else j.data("datepicker",k=new e(this,p))}return"string"==typeof b&&"function"==typeof k[b]&&(h=k[b].apply(k,g),void 0!==h)?!1:void 0}),void 0!==h?h:this},i=a.fn.datepicker.defaults={autoclose:!1,beforeShowDay:a.noop,calendarWeeks:!1,clearBtn:!1,daysOfWeekDisabled:[],endDate:1/0,forceParse:!0,format:"mm/dd/yyyy",keyboardNavigation:!0,language:"en",minViewMode:0,rtl:!1,startDate:-1/0,startView:0,todayBtn:!1,todayHighlight:!1,weekStart:0},j=a.fn.datepicker.locale_opts=["format","rtl","weekStart"];a.fn.datepicker.Constructor=e;var k=a.fn.datepicker.dates={en:{days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat","Sun"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa","Su"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],today:"Today",clear:"Clear"}},l={modes:[{clsName:"days",navFnc:"Month",navStep:1},{clsName:"months",navFnc:"FullYear",navStep:1},{clsName:"years",navFnc:"FullYear",navStep:10}],isLeapYear:function(a){return 0===a%4&&0!==a%100||0===a%400 -},getDaysInMonth:function(a,b){return[31,l.isLeapYear(a)?29:28,31,30,31,30,31,31,30,31,30,31][b]},validParts:/dd?|DD?|mm?|MM?|yy(?:yy)?/g,nonpunctuation:/[^ -\/:-@\[\u3400-\u9fff-`{-~\t\n\r]+/g,parseFormat:function(a){var b=a.replace(this.validParts,"\0").split("\0"),c=a.match(this.validParts);if(!b||!b.length||!c||0===c.length)throw new Error("Invalid date format.");return{separators:b,parts:c}},parseDate:function(c,d,f){if(c instanceof Date)return c;if("string"==typeof d&&(d=l.parseFormat(d)),/^[\-+]\d+[dmwy]([\s,]+[\-+]\d+[dmwy])*$/.test(c)){var g,h,i=/([\-+]\d+)([dmwy])/,j=c.match(/([\-+]\d+)([dmwy])/g);c=new Date;for(var m=0;m<j.length;m++)switch(g=i.exec(j[m]),h=parseInt(g[1]),g[2]){case"d":c.setUTCDate(c.getUTCDate()+h);break;case"m":c=e.prototype.moveMonth.call(e.prototype,c,h);break;case"w":c.setUTCDate(c.getUTCDate()+7*h);break;case"y":c=e.prototype.moveYear.call(e.prototype,c,h)}return b(c.getUTCFullYear(),c.getUTCMonth(),c.getUTCDate(),0,0,0)}var n,o,g,j=c&&c.match(this.nonpunctuation)||[],c=new Date,p={},q=["yyyy","yy","M","MM","m","mm","d","dd"],r={yyyy:function(a,b){return a.setUTCFullYear(b)},yy:function(a,b){return a.setUTCFullYear(2e3+b)},m:function(a,b){for(b-=1;0>b;)b+=12;for(b%=12,a.setUTCMonth(b);a.getUTCMonth()!=b;)a.setUTCDate(a.getUTCDate()-1);return a},d:function(a,b){return a.setUTCDate(b)}};r.M=r.MM=r.mm=r.m,r.dd=r.d,c=b(c.getFullYear(),c.getMonth(),c.getDate(),0,0,0);var s=d.parts.slice();if(j.length!=s.length&&(s=a(s).filter(function(b,c){return-1!==a.inArray(c,q)}).toArray()),j.length==s.length){for(var m=0,t=s.length;t>m;m++){if(n=parseInt(j[m],10),g=s[m],isNaN(n))switch(g){case"MM":o=a(k[f].months).filter(function(){var a=this.slice(0,j[m].length),b=j[m].slice(0,a.length);return a==b}),n=a.inArray(o[0],k[f].months)+1;break;case"M":o=a(k[f].monthsShort).filter(function(){var a=this.slice(0,j[m].length),b=j[m].slice(0,a.length);return a==b}),n=a.inArray(o[0],k[f].monthsShort)+1}p[g]=n}for(var u,m=0;m<q.length;m++)u=q[m],u in p&&!isNaN(p[u])&&r[u](c,p[u])}return c},formatDate:function(b,c,d){"string"==typeof c&&(c=l.parseFormat(c));var e={d:b.getUTCDate(),D:k[d].daysShort[b.getUTCDay()],DD:k[d].days[b.getUTCDay()],m:b.getUTCMonth()+1,M:k[d].monthsShort[b.getUTCMonth()],MM:k[d].months[b.getUTCMonth()],yy:b.getUTCFullYear().toString().substring(2),yyyy:b.getUTCFullYear()};e.dd=(e.d<10?"0":"")+e.d,e.mm=(e.m<10?"0":"")+e.m;for(var b=[],f=a.extend([],c.separators),g=0,h=c.parts.length;h>=g;g++)f.length&&b.push(f.shift()),b.push(e[c.parts[g]]);return b.join("")},headTemplate:'<thead><tr><th class="prev"><i class="icon-arrow-left"/></th><th colspan="5" class="datepicker-switch"></th><th class="next"><i class="icon-arrow-right"/></th></tr></thead>',contTemplate:'<tbody><tr><td colspan="7"></td></tr></tbody>',footTemplate:'<tfoot><tr><th colspan="7" class="today"></th></tr><tr><th colspan="7" class="clear"></th></tr></tfoot>'};l.template='<div class="datepicker"><div class="datepicker-days"><table class=" table-condensed">'+l.headTemplate+"<tbody></tbody>"+l.footTemplate+"</table>"+"</div>"+'<div class="datepicker-months">'+'<table class="table-condensed">'+l.headTemplate+l.contTemplate+l.footTemplate+"</table>"+"</div>"+'<div class="datepicker-years">'+'<table class="table-condensed">'+l.headTemplate+l.contTemplate+l.footTemplate+"</table>"+"</div>"+"</div>",a.fn.datepicker.DPGlobal=l,a.fn.datepicker.noConflict=function(){return a.fn.datepicker=g,this},a(document).on("focus.datepicker.data-api click.datepicker.data-api",'[data-provide="datepicker"]',function(b){var c=a(this);c.data("datepicker")||(b.preventDefault(),h.call(c,"show"))}),a(function(){h.call(a('[data-provide="datepicker-inline"]'))})}(window.jQuery),function(a){"use strict";a.fn.bdatepicker=a.fn.datepicker.noConflict(),a.fn.datepicker||(a.fn.datepicker=a.fn.bdatepicker);var b=function(a){this.init("date",a,b.defaults),this.initPicker(a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.abstractinput),a.extend(b.prototype,{initPicker:function(b,c){this.options.viewformat||(this.options.viewformat=this.options.format),b.datepicker=a.fn.editableutils.tryParseJson(b.datepicker,!0),this.options.datepicker=a.extend({},c.datepicker,b.datepicker,{format:this.options.viewformat}),this.options.datepicker.language=this.options.datepicker.language||"en",this.dpg=a.fn.bdatepicker.DPGlobal,this.parsedFormat=this.dpg.parseFormat(this.options.format),this.parsedViewFormat=this.dpg.parseFormat(this.options.viewformat)},render:function(){this.$input.bdatepicker(this.options.datepicker),this.options.clear&&(this.$clear=a('<a href="#"></a>').html(this.options.clear).click(a.proxy(function(a){a.preventDefault(),a.stopPropagation(),this.clear()},this)),this.$tpl.parent().append(a('<div class="editable-clear">').append(this.$clear)))},value2html:function(a,c){var d=a?this.dpg.formatDate(a,this.parsedViewFormat,this.options.datepicker.language):"";b.superclass.value2html.call(this,d,c)},html2value:function(a){return this.parseDate(a,this.parsedViewFormat)},value2str:function(a){return a?this.dpg.formatDate(a,this.parsedFormat,this.options.datepicker.language):""},str2value:function(a){return this.parseDate(a,this.parsedFormat)},value2submit:function(a){return this.value2str(a)},value2input:function(a){this.$input.bdatepicker("update",a)},input2value:function(){return this.$input.data("datepicker").date},activate:function(){},clear:function(){this.$input.data("datepicker").date=null,this.$input.find(".active").removeClass("active"),this.options.showbuttons||this.$input.closest("form").submit()},autosubmit:function(){this.$input.on("mouseup",".day",function(b){if(!a(b.currentTarget).is(".old")&&!a(b.currentTarget).is(".new")){var c=a(this).closest("form");setTimeout(function(){c.submit()},200)}})},parseDate:function(a,b){var c,d=null;return a&&(d=this.dpg.parseDate(a,b,this.options.datepicker.language),"string"==typeof a&&(c=this.dpg.formatDate(d,b,this.options.datepicker.language),a!==c&&(d=null))),d}}),b.defaults=a.extend({},a.fn.editabletypes.abstractinput.defaults,{tpl:'<div class="editable-date well"></div>',inputclass:null,format:"yyyy-mm-dd",viewformat:null,datepicker:{weekStart:0,startView:0,minViewMode:0,autoclose:!1},clear:"× clear"}),a.fn.editabletypes.date=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("datefield",a,b.defaults),this.initPicker(a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.date),a.extend(b.prototype,{render:function(){this.$input=this.$tpl.find("input"),this.setClass(),this.setAttr("placeholder"),this.$tpl.bdatepicker(this.options.datepicker),this.$input.off("focus keydown"),this.$input.keyup(a.proxy(function(){this.$tpl.removeData("date"),this.$tpl.bdatepicker("update")},this))},value2input:function(a){this.$input.val(a?this.dpg.formatDate(a,this.parsedViewFormat,this.options.datepicker.language):""),this.$tpl.bdatepicker("update")},input2value:function(){return this.html2value(this.$input.val())},activate:function(){a.fn.editabletypes.text.prototype.activate.call(this)},autosubmit:function(){}}),b.defaults=a.extend({},a.fn.editabletypes.date.defaults,{tpl:'<div class="input-append date"><input type="text"/><span class="add-on"><i class="icon-th"></i></span></div>',inputclass:"input-small",datepicker:{weekStart:0,startView:0,minViewMode:0,autoclose:!0}}),a.fn.editabletypes.datefield=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("datetime",a,b.defaults),this.initPicker(a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.abstractinput),a.extend(b.prototype,{initPicker:function(b,c){this.options.viewformat||(this.options.viewformat=this.options.format),b.datetimepicker=a.fn.editableutils.tryParseJson(b.datetimepicker,!0),this.options.datetimepicker=a.extend({},c.datetimepicker,b.datetimepicker,{format:this.options.viewformat}),this.options.datetimepicker.language=this.options.datetimepicker.language||"en",this.dpg=a.fn.datetimepicker.DPGlobal,this.parsedFormat=this.dpg.parseFormat(this.options.format,this.options.formatType),this.parsedViewFormat=this.dpg.parseFormat(this.options.viewformat,this.options.formatType)},render:function(){this.$input.datetimepicker(this.options.datetimepicker),this.$input.on("changeMode",function(){var b=a(this).closest("form").parent();setTimeout(function(){b.triggerHandler("resize")},0)}),this.options.clear&&(this.$clear=a('<a href="#"></a>').html(this.options.clear).click(a.proxy(function(a){a.preventDefault(),a.stopPropagation(),this.clear()},this)),this.$tpl.parent().append(a('<div class="editable-clear">').append(this.$clear)))},value2html:function(a,c){var d=a?this.dpg.formatDate(this.toUTC(a),this.parsedViewFormat,this.options.datetimepicker.language,this.options.formatType):"";return c?(b.superclass.value2html.call(this,d,c),void 0):d},html2value:function(a){var b=this.parseDate(a,this.parsedViewFormat);return b?this.fromUTC(b):null},value2str:function(a){return a?this.dpg.formatDate(this.toUTC(a),this.parsedFormat,this.options.datetimepicker.language,this.options.formatType):""},str2value:function(a){var b=this.parseDate(a,this.parsedFormat);return b?this.fromUTC(b):null},value2submit:function(a){return this.value2str(a)},value2input:function(a){a&&this.$input.data("datetimepicker").setDate(a)},input2value:function(){var a=this.$input.data("datetimepicker");return a.date?a.getDate():null},activate:function(){},clear:function(){this.$input.data("datetimepicker").date=null,this.$input.find(".active").removeClass("active"),this.options.showbuttons||this.$input.closest("form").submit()},autosubmit:function(){this.$input.on("mouseup",".minute",function(){var b=a(this).closest("form");setTimeout(function(){b.submit()},200)})},toUTC:function(a){return a?new Date(a.valueOf()-6e4*a.getTimezoneOffset()):a},fromUTC:function(a){return a?new Date(a.valueOf()+6e4*a.getTimezoneOffset()):a},parseDate:function(a,b){var c,d=null;return a&&(d=this.dpg.parseDate(a,b,this.options.datetimepicker.language,this.options.formatType),"string"==typeof a&&(c=this.dpg.formatDate(d,b,this.options.datetimepicker.language,this.options.formatType),a!==c&&(d=null))),d}}),b.defaults=a.extend({},a.fn.editabletypes.abstractinput.defaults,{tpl:'<div class="editable-date well"></div>',inputclass:null,format:"yyyy-mm-dd hh:ii",formatType:"standard",viewformat:null,datetimepicker:{todayHighlight:!1,autoclose:!1},clear:"× clear"}),a.fn.editabletypes.datetime=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("datetimefield",a,b.defaults),this.initPicker(a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.datetime),a.extend(b.prototype,{render:function(){this.$input=this.$tpl.find("input"),this.setClass(),this.setAttr("placeholder"),this.$tpl.datetimepicker(this.options.datetimepicker),this.$input.off("focus keydown"),this.$input.keyup(a.proxy(function(){this.$tpl.removeData("date"),this.$tpl.datetimepicker("update")},this))},value2input:function(a){this.$input.val(this.value2html(a)),this.$tpl.datetimepicker("update")},input2value:function(){return this.html2value(this.$input.val())},activate:function(){a.fn.editabletypes.text.prototype.activate.call(this)},autosubmit:function(){}}),b.defaults=a.extend({},a.fn.editabletypes.datetime.defaults,{tpl:'<div class="input-append date"><input type="text"/><span class="add-on"><i class="icon-th"></i></span></div>',inputclass:"input-medium",datetimepicker:{todayHighlight:!1,autoclose:!0}}),a.fn.editabletypes.datetimefield=b}(window.jQuery),function(a){"use strict";var b=function(c){this.init("typeahead",c,b.defaults),this.options.typeahead=a.extend({},b.defaults.typeahead,{matcher:this.matcher,sorter:this.sorter,highlighter:this.highlighter,updater:this.updater},c.typeahead)};a.fn.editableutils.inherit(b,a.fn.editabletypes.list),a.extend(b.prototype,{renderList:function(){this.$input=this.$tpl.is("input")?this.$tpl:this.$tpl.find('input[type="text"]'),this.options.typeahead.source=this.sourceData,this.$input.typeahead(this.options.typeahead);var b=this.$input.data("typeahead");b.render=a.proxy(this.typeaheadRender,b),b.select=a.proxy(this.typeaheadSelect,b),b.move=a.proxy(this.typeaheadMove,b),this.renderClear(),this.setClass(),this.setAttr("placeholder")},value2htmlFinal:function(b,c){if(this.getIsObjects()){var d=a.fn.editableutils.itemsByValue(b,this.sourceData);b=d.length?d[0].text:""}a.fn.editabletypes.abstractinput.prototype.value2html.call(this,b,c)},html2value:function(a){return a?a:null},value2input:function(b){if(this.getIsObjects()){var c=a.fn.editableutils.itemsByValue(b,this.sourceData);this.$input.data("value",b).val(c.length?c[0].text:"")}else this.$input.val(b)},input2value:function(){if(this.getIsObjects()){var b=this.$input.data("value"),c=a.fn.editableutils.itemsByValue(b,this.sourceData);return c.length&&c[0].text.toLowerCase()===this.$input.val().toLowerCase()?b:null}return this.$input.val()},getIsObjects:function(){if(void 0===this.isObjects){this.isObjects=!1;for(var a=0;a<this.sourceData.length;a++)if(this.sourceData[a].value!==this.sourceData[a].text){this.isObjects=!0;break}}return this.isObjects},activate:a.fn.editabletypes.text.prototype.activate,renderClear:a.fn.editabletypes.text.prototype.renderClear,postrender:a.fn.editabletypes.text.prototype.postrender,toggleClear:a.fn.editabletypes.text.prototype.toggleClear,clear:function(){a.fn.editabletypes.text.prototype.clear.call(this),this.$input.data("value","")},matcher:function(b){return a.fn.typeahead.Constructor.prototype.matcher.call(this,b.text)},sorter:function(a){for(var b,c,d=[],e=[],f=[];b=a.shift();)c=b.text,c.toLowerCase().indexOf(this.query.toLowerCase())?~c.indexOf(this.query)?e.push(b):f.push(b):d.push(b);return d.concat(e,f)},highlighter:function(b){return a.fn.typeahead.Constructor.prototype.highlighter.call(this,b.text)},updater:function(a){return this.$element.data("value",a.value),a.text},typeaheadRender:function(b){var c=this;return b=a(b).map(function(b,d){return b=a(c.options.item).data("item",d),b.find("a").html(c.highlighter(d)),b[0]}),this.options.autoSelect&&b.first().addClass("active"),this.$menu.html(b),this},typeaheadSelect:function(){var a=this.$menu.find(".active").data("item");return(this.options.autoSelect||a)&&this.$element.val(this.updater(a)).change(),this.hide()},typeaheadMove:function(a){if(this.shown){switch(a.keyCode){case 9:case 13:case 27:if(!this.$menu.find(".active").length)return;a.preventDefault();break;case 38:a.preventDefault(),this.prev();break;case 40:a.preventDefault(),this.next()}a.stopPropagation()}}}),b.defaults=a.extend({},a.fn.editabletypes.list.defaults,{tpl:'<input type="text">',typeahead:null,clear:!0}),a.fn.editabletypes.typeahead=b}(window.jQuery); \ No newline at end of file diff --git a/flask_admin/templates/bootstrap2/admin/actions.html b/flask_admin/templates/bootstrap2/admin/actions.html deleted file mode 100644 index d4840e853..000000000 --- a/flask_admin/templates/bootstrap2/admin/actions.html +++ /dev/null @@ -1,34 +0,0 @@ -{% import 'admin/static.html' as admin_static with context %} - -{% macro dropdown(actions, btn_class='dropdown-toggle') -%} - <a class="{{ btn_class }}" data-toggle="dropdown" href="javascript:void(0)">{{ _gettext('With selected') }}<b class="caret"></b></a> - <ul class="dropdown-menu"> - {% for p in actions %} - <li> - <a href="javascript:void(0)" onclick="return modelActions.execute('{{ p[0] }}');">{{ _gettext(p[1]) }}</a> - </li> - {% endfor %} - </ul> -{% endmacro %} - -{% macro form(actions, url) %} - {% if actions %} - <form id="action_form" action="{{ url }}" method="POST" style="display: none"> - {% if action_form.csrf_token %} - {{ action_form.csrf_token }} - {% elif csrf_token %} - <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/> - {% endif %} - {{ action_form.url(value=return_url) }} - {{ action_form.action() }} - </form> - {% endif %} -{% endmacro %} - -{% macro script(message, actions, actions_confirmation) %} - {% if actions %} - <div id="actions-confirmation-data" style="display:none;">{{ actions_confirmation|tojson|safe }}</div> - <div id="message-data" style="display:none;">{{ message|tojson|safe }}</div> - <script src="{{ admin_static.url(filename='admin/js/actions.js', v='1.0.0') }}"></script> - {% endif %} -{% endmacro %} diff --git a/flask_admin/templates/bootstrap2/admin/base.html b/flask_admin/templates/bootstrap2/admin/base.html deleted file mode 100644 index fa9da6661..000000000 --- a/flask_admin/templates/bootstrap2/admin/base.html +++ /dev/null @@ -1,83 +0,0 @@ -{% import 'admin/layout.html' as layout with context -%} -{% import 'admin/static.html' as admin_static with context %} -<!DOCTYPE html> -<html> - <head> - <title>{% block title %}{% if admin_view.category %}{{ admin_view.category }} - {% endif %}{{ admin_view.name }} - {{ admin_view.admin.name }}{% endblock %}</title> - {% block head_meta %} - <meta charset="UTF-8"> - <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <meta name="description" content=""> - <meta name="author" content=""> - {% endblock %} - {% block head_css %} - <link href="{{ admin_static.url(filename='bootstrap/bootstrap2/swatch/{swatch}/bootstrap.min.css'.format(swatch=theme.swatch), v='2.3.2') }}" rel="stylesheet"> - <link href="{{ admin_static.url(filename='bootstrap/bootstrap2/css/bootstrap-responsive.css', v='2.3.2') }}" rel="stylesheet"> - <link href="{{ admin_static.url(filename='admin/css/bootstrap2/admin.css', v='1.1.1') }}" rel="stylesheet"> - {% if admin_view.extra_css %} - {% for css_url in admin_view.extra_css %} - <link href="{{ css_url }}" rel="stylesheet"> - {% endfor %} - {% endif %} - <style> - body { - padding-top: 4px; - } - </style> - {% endblock %} - {% block head %} - {% endblock %} - {% block head_tail %} - {% endblock %} - </head> - <body> - {% block page_body %} - <div class="container{%if theme.fluid %}-fluid{% endif %}"> - <div class="navbar"> - <div class="navbar-inner"> - {% block brand %} - <a class="brand" href="{{ admin_view.admin.url }}">{{ admin_view.admin.name }}</a> - {% endblock %} - {% block main_menu %} - <ul class="nav"> - {{ layout.menu() }} - </ul> - {% endblock %} - {% block menu_links %} - <ul class="nav pull-right"> - {{ layout.menu_links() }} - </ul> - {% endblock %} - {% block access_control %} - {% endblock %} - </div> - </div> - - {% block messages %} - {{ layout.messages() }} - {% endblock %} - - {# store the jinja2 context for form_rules rendering logic #} - {% set render_ctx = h.resolve_ctx() %} - - {% block body %}{% endblock %} - </div> - {% endblock %} - - {% block tail_js %} - <script src="{{ admin_static.url(filename='vendor/jquery.min.js', v='3.5.1') }}" type="text/javascript"></script> - <script src="{{ admin_static.url(filename='bootstrap/bootstrap2/js/bootstrap.min.js', v='2.3.2') }}" type="text/javascript"></script> - <script src="{{ admin_static.url(filename='vendor/moment.min.js', v='2.29.4') }}" type="text/javascript"></script> - <script src="{{ admin_static.url(filename='vendor/select2/select2.min.js', v='3.5.2') }}" type="text/javascript"></script> - {% if admin_view.extra_js %} - {% for js_url in admin_view.extra_js %} - <script src="{{ js_url }}" type="text/javascript"></script> - {% endfor %} - {% endif %} - {% endblock %} - - {% block tail %} - {% endblock %} - </body> -</html> diff --git a/flask_admin/templates/bootstrap2/admin/file/form.html b/flask_admin/templates/bootstrap2/admin/file/form.html deleted file mode 100644 index 7a4474ad9..000000000 --- a/flask_admin/templates/bootstrap2/admin/file/form.html +++ /dev/null @@ -1,9 +0,0 @@ -{% extends 'admin/master.html' %} -{% import 'admin/lib.html' as lib with context %} - -{% block body %} - {% block header %}<h3>{{ header_text }}</h3>{% endblock %} - {% block fa_form %} - {{ lib.render_form(form, dir_url) }} - {% endblock %} -{% endblock %} diff --git a/flask_admin/templates/bootstrap2/admin/file/list.html b/flask_admin/templates/bootstrap2/admin/file/list.html deleted file mode 100644 index 8817cca00..000000000 --- a/flask_admin/templates/bootstrap2/admin/file/list.html +++ /dev/null @@ -1,197 +0,0 @@ -{% extends 'admin/master.html' %} -{% import 'admin/lib.html' as lib with context %} -{% import 'admin/actions.html' as actionslib with context %} - -{% block body %} - {% block breadcrums %} - <ul class="breadcrumb"> - <li> - <a href="{{ get_dir_url('.index_view', path=None) }}">{{ _gettext('Root') }}</a> - </li> - {% for name, path in breadcrumbs[:-1] %} - <li> - <span class="divider">/</span><a href="{{ get_dir_url('.index_view', path=path) }}">{{ name }}</a> - </li> - {% endfor %} - {% if breadcrumbs %} - <li> - <span class="divider">/</span><a href="{{ get_dir_url('.index_view', path=breadcrumbs[-1][1]) }}">{{ breadcrumbs[-1][0] }}</a> - </li> - {% endif %} - </ul> - {% endblock %} - - {% block file_list_table %} - <div id="no-more-tables"> - <table class="table table-striped table-bordered model-list"> - <thead> - <tr> - {% block list_header scoped %} - {% if actions %} - <th class="span1"> - <input type="checkbox" name="rowtoggle" class="action-rowtoggle" /> - </th> - {% endif %} - <th class="span1"> </th> - {% for column in admin_view.column_list %} - <th> - {% if admin_view.is_column_sortable(column) %} - {% if sort_column == column %} - <a href="{{ sort_url(column, dir_path, True) }}" title="{{ _gettext('Sort by %(name)s', name=column) }}"> - {{ admin_view.column_label(column) }} - {% if sort_desc %} - <i class="fa fa-chevron-up icon-chevron-up"></i> - {% else %} - <i class="fa fa-chevron-down icon-chevron-down"></i> - {% endif %} - </a> - {% else %} - <a href="{{ sort_url(column, dir_path) }}" title="{{ _gettext('Sort by %(name)s', name=column) }}">{{ admin_view.column_label(column) }}</a> - {% endif %} - {% else %} - {{ _gettext(admin_view.column_label(column)) }} - {% endif %} - </th> - {% endfor %} - {% endblock %} - </tr> - </thead> - {% for name, path, is_dir, size, date in items %} - <tr> - {% block list_row scoped %} - {% if actions %} - <td> - {% if not is_dir %} - <input type="checkbox" name="rowid" class="action-checkbox" value="{{ path }}" /> - {% endif %} - </td> - {% endif %} - <td> - {% block list_row_actions scoped %} - {% if admin_view.can_rename and path and name != '..' %} - {%- if admin_view.rename_modal -%} - {{ lib.add_modal_button(url=get_url('.rename', path=path, modal=True), - title=_gettext('Rename File'), - content='<i class="fa fa-pencil icon-pencil"></i>') }} - {% else %} - <a class="icon" href="{{ get_url('.rename', path=path) }}" title="{{ _gettext('Rename File') }}"> - <i class="fa fa-pencil icon-pencil"></i> - </a> - {%- endif -%} - {% endif %} - {%- if admin_view.can_delete and path -%} - {% if is_dir %} - {% if name != '..' and admin_view.can_delete_dirs %} - <form class="icon" method="POST" action="{{ get_url('.delete') }}"> - {{ delete_form.path(value=path) }} - {% if delete_form.csrf_token %} - {{ delete_form.csrf_token }} - {% elif csrf_token %} - <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/> - {% endif %} - <button onclick="return confirm('{{ _gettext('Are you sure you want to delete \\\'%(name)s\\\' recursively?', name=name) }}')"> - <i class="fa fa-times icon-remove"></i> - </button> - </form> - {% endif %} - {% else %} - <form class="icon" method="POST" action="{{ get_url('.delete') }}"> - {{ delete_form.path(value=path) }} - {% if delete_form.csrf_token %} - {{ delete_form.csrf_token }} - {% elif csrf_token %} - <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/> - {% endif %} - <button onclick="return confirm('{{ _gettext('Are you sure you want to delete \\\'%(name)s\\\'?', name=name) }}')"> - <i class="fa fa-times icon-remove"></i> - </button> - </form> - {% endif %} - {%- endif -%} - {% endblock %} - </td> - {% if is_dir %} - <td colspan="2" data-title="{{ _gettext('Name') }}"> - <a href="{{ get_dir_url('.index_view', path)|safe }}"> - <i class="fa fa-folder-o icon-folder-close"></i> <span>{{ name }}</span> - </a> - </td> - {% else %} - <td data-title="{{ _gettext('Name') }}"> - {% if admin_view.can_download %} - {%- if admin_view.edit_modal and admin_view.is_file_editable(path) -%} - {{ lib.add_modal_button(url=get_file_url(path, modal=True)|safe, - btn_class='', content=name) }} - {% else %} - <a href="{{ get_file_url(path)|safe }}">{{ name }}</a> - {%- endif -%} - {% else %} - {{ name }} - {% endif %} - </td> - {% if admin_view.is_column_visible('size') %} - <td data-title="{{ _gettext('Size') }}"> - {{ size|filesizeformat }} - </td> - {% endif %} - {% if admin_view.is_column_visible('date') %} - <td> - {{ timestamp_format(date) }} - </td> - {% endif %} - {% endif %} - {% endblock %} - </tr> - {% endfor %} - </table> - </div> - {% endblock %} - {% block toolbar %} - <div class="btn-toolbar"> - {% if admin_view.can_upload %} - <div class="btn-group"> - {%- if admin_view.upload_modal -%} - {{ lib.add_modal_button(url=get_dir_url('.upload', path=dir_path, modal=True), - btn_class="btn btn-large", - content=_gettext('Upload File')) }} - {% else %} - <a class="btn btn-large" href="{{ get_dir_url('.upload', path=dir_path) }}">{{ _gettext('Upload File') }}</a> - {%- endif -%} - </div> - {% endif %} - {% if admin_view.can_mkdir %} - <div class="btn-group"> - {%- if admin_view.mkdir_modal -%} - {{ lib.add_modal_button(url=get_dir_url('.mkdir', path=dir_path, modal=True), - btn_class="btn btn-large", - content=_gettext('Create Directory')) }} - {% else %} - <a class="btn btn-large" href="{{ get_dir_url('.mkdir', path=dir_path) }}">{{ _gettext('Create Directory') }}</a> - {%- endif -%} - </div> - {% endif %} - {% if actions %} - <div class="btn-group"> - {{ actionslib.dropdown(actions, 'dropdown-toggle btn btn-large') }} - </div> - {% endif %} - </div> - {% endblock %} - - {% block actions %} - {{ actionslib.form(actions, get_url('.action_view')) }} - {% endblock %} - - {%- if admin_view.rename_modal or admin_view.mkdir_modal - or admin_view.upload_modal or admin_view.edit_modal -%} - {{ lib.add_modal_window() }} - {%- endif -%} -{% endblock %} - -{% block tail %} - {{ super() }} - {{ actionslib.script(_gettext('Please select at least one file.'), - actions, - actions_confirmation) }} - <script src="{{ admin_static.url(filename='admin/js/bs2_modal.js', v='1.0.0') }}"></script> -{% endblock %} diff --git a/flask_admin/templates/bootstrap2/admin/file/modals/form.html b/flask_admin/templates/bootstrap2/admin/file/modals/form.html deleted file mode 100644 index 6148596c1..000000000 --- a/flask_admin/templates/bootstrap2/admin/file/modals/form.html +++ /dev/null @@ -1,18 +0,0 @@ -{% import 'admin/static.html' as admin_static with context %} -{% import 'admin/lib.html' as lib with context %} - -{% block body %} - {# content added to modal-content #} - {% block fa_form %} - {{ lib.render_form(form, dir_url, action=request.url, is_modal=True) }} - {% endblock %} -{% endblock %} - -{% block tail %} - <script src="{{ admin_static.url(filename='admin/js/bs2_modal.js', v='1.0.0') }}"></script> - - <script> - // fill the header of modal dynamically - $('.modal-header h3').html('{% block header %}{{ header_text }}{% endblock %}'); - </script> -{% endblock %} diff --git a/flask_admin/templates/bootstrap2/admin/index.html b/flask_admin/templates/bootstrap2/admin/index.html deleted file mode 100644 index fbfdf4c0b..000000000 --- a/flask_admin/templates/bootstrap2/admin/index.html +++ /dev/null @@ -1,4 +0,0 @@ -{% extends 'admin/master.html' %} - -{% block body %} -{% endblock %} diff --git a/flask_admin/templates/bootstrap2/admin/layout.html b/flask_admin/templates/bootstrap2/admin/layout.html deleted file mode 100644 index 6ac9e9be4..000000000 --- a/flask_admin/templates/bootstrap2/admin/layout.html +++ /dev/null @@ -1,96 +0,0 @@ -{% macro menu_icon(item) -%} -{% set icon_type = item.get_icon_type() %} -{%- if icon_type %} - {% set icon_value = item.get_icon_value() %} - {% if icon_type == 'glyph' %} - <i class="{{ icon_value }}"></i> - {% elif icon_type == 'fa' %} - <i class="fa fa-{{ icon_value }}"></i> - {% elif icon_type == 'image' %} - <img src="{{ url_for('static', filename=icon_value) }}" alt="menu image"> - {% elif icon_type == 'image-url' %} - <img src="item.icon_value" alt="menu image"> - {% endif %} -{% endif %} -{%- endmacro %} - -{% macro menu(menu_root=None) %} - {% if menu_root is none %}{% set menu_root = admin_view.admin.menu() %}{% endif %} - {%- for item in menu_root %} - {%- if item.is_category() -%} - {% set children = item.get_children() %} - {%- if children %} - {% set class_name = item.get_class_name() or '' %} - {%- if item.is_active(admin_view) %} - <li class="active dropdown{% if class_name %} {{class_name}}{% endif %}"> - {% else -%} - <li class="dropdown{% if class_name %} {{class_name}}{% endif %}"> - {%- endif %} - <a class="dropdown-toggle" data-toggle="dropdown" href="javascript:void(0)"> - {% if item.class_name %}<i class="{{ item.class_name }}"></i> {% endif %} - {{ menu_icon(item) }}{{ item.name }} - {%- if 'dropdown-submenu' not in class_name -%}<b class="caret"></b>{%- endif -%} - </a> - <ul class="dropdown-menu"> - {%- for child in children -%} - {%- if child.is_category() -%} - {{ menu(menu_root=[child]) }} - {% else %} - {% set class_name = child.get_class_name() %} - {%- if child.is_active(admin_view) %} - <li class="active{% if class_name %} {{class_name}}{% endif %}"> - {% else %} - <li{% if class_name %} class="{{class_name}}"{% endif %}> - {%- endif %} - <a href="{{ child.get_url() }}"{% if child.target %} - target="{{ child.target }}"{% endif %}> - {{ menu_icon(child) }}{{ child.name }}</a> - </li> - {%- endif %} - {%- endfor %} - </ul> - </li> - {% endif %} - {%- else %} - {%- if item.is_accessible() and item.is_visible() -%} - {% set class_name = item.get_class_name() %} - {%- if item.is_active(admin_view) %} - <li class="active{% if class_name %} {{class_name}}{% endif %}"> - {%- else %} - <li{% if class_name %} class="{{class_name}}"{% endif %}> - {%- endif %} - <a href="{{ item.get_url() }}"{% if item.target %} target="{{ item.target }}"{% endif %}>{{ menu_icon(item) }}{{ item.name }}</a> - </li> - {%- endif -%} - {% endif -%} - {% endfor %} -{% endmacro %} - -{% macro menu_links(links=None) %} - {% if links is none %}{% set links = admin_view.admin.menu_links() %}{% endif %} - {% for item in links %} - {% set class_name = item.get_class_name() %} - {% if item.is_accessible() and item.is_visible() %} - <li{% if class_name %} class="{{ class_name }}"{% endif %}> - <a href="{{ item.get_url() }}">{{ menu_icon(item) }}{{ item.name }}</a> - </li> - {% endif %} - {% endfor %} -{% endmacro %} - -{% macro messages() %} - {% with messages = get_flashed_messages(with_categories=True) %} - {% if messages %} - {% for category, m in messages %} - {% if category %} - <div class="alert alert-{{ category }}"> - {% else %} - <div class="alert"> - {% endif %} - <a href="javascript:void(0)" class="close" data-dismiss="alert">x</a> - {{ m }} - </div> - {% endfor %} - {% endif %} - {% endwith %} -{% endmacro %} diff --git a/flask_admin/templates/bootstrap2/admin/lib.html b/flask_admin/templates/bootstrap2/admin/lib.html deleted file mode 100644 index b00bb9ad8..000000000 --- a/flask_admin/templates/bootstrap2/admin/lib.html +++ /dev/null @@ -1,266 +0,0 @@ -{% import 'admin/static.html' as admin_static with context %} - -{# ---------------------- Pager -------------------------- #} -{% macro pager(page, pages, generator) -%} -{% if pages > 1 %} -<div class="pagination"> - <ul> - {% set min = page - 3 %} - {% set max = page + 3 + 1 %} - - {% if min < 0 %} - {% set max = max - min %} - {% endif %} - {% if max >= pages %} - {% set min = min - max + pages %} - {% endif %} - - {% if min < 0 %} - {% set min = 0 %} - {% endif %} - {% if max >= pages %} - {% set max = pages %} - {% endif %} - - {% if min > 0 %} - <li> - <a href="{{ generator(0) }}">«</a> - </li> - {% else %} - <li class="disabled"> - <a href="javascript:void(0)">«</a> - </li> - {% endif %} - {% if page > 0 %} - <li> - <a href="{{ generator(page-1) }}"><</a> - </li> - {% else %} - <li class="disabled"> - <a href="javascript:void(0)"><</a> - </li> - {% endif %} - - {% for p in range(min, max) %} - {% if page == p %} - <li class="active"> - <a href="javascript:void(0)">{{ p + 1 }}</a> - </li> - {% else %} - <li> - <a href="{{ generator(p) }}">{{ p + 1 }}</a> - </li> - {% endif %} - {% endfor %} - - {% if page + 1 < pages %} - <li> - <a href="{{ generator(page + 1) }}">></a> - </li> - {% else %} - <li class="disabled"> - <a href="javascript:void(0)">></a> - </li> - {% endif %} - {% if max < pages %} - <li> - <a href="{{ generator(pages - 1) }}">»</a> - </li> - {% else %} - <li class="disabled"> - <a href="javascript:void(0)">»</a> - </li> - {% endif %} - </ul> -</div> -{% endif %} -{%- endmacro %} - -{% macro simple_pager(page, have_next, generator) -%} -<div class="pagination"> - <ul> - {% if page > 0 %} - <li> - <a href="{{ generator(page - 1) }}"><</a> - </li> - {% else %} - <li class="disabled"> - <a href="{{ generator(0) }}"><</a> - </li> - {% endif %} - {% if have_next %} - <li> - <a href="{{ generator(page + 1) }}">></a> - </li> - {% else %} - <li class="disabled"> - <a href="{{ generator(page) }}">></a> - </li> - {% endif %} - </ul> -</div> -{%- endmacro %} - -{# ---------------------- Modal Window -------------------------- #} -{% macro add_modal_window(modal_window_id='fa_modal_window') %} - <div id="{{ modal_window_id }}" class="modal hide fade" tabindex="-1" role="dialog" aria-hidden="true"> - <div class="modal-header"> - <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> - <h3>Loading...</h3> - </div> - <div class="modal-body"> - </div> - </div> -{% endmacro %} - -{% macro add_modal_button(url='', title='', content='', modal_window_id='fa_modal_window', btn_class='icon') %} - <a class="{{ btn_class }}" href="#" data-toggle="modal" title="{{ title }}" data-target="#{{ modal_window_id }}" data-remote="{{ url }}"> - {{ content|safe }} - </a> -{% endmacro %} - -{# ---------------------- Forms -------------------------- #} -{% macro render_field(form, field, kwargs={}, caller=None) %} - {% set direct_error = h.is_field_error(field.errors) %} - <div class="control-group{{ ' error' if direct_error else '' }}"> - <div class="control-label"> - <label for="{{ field.id }}">{{ field.label.text }} - {% if h.is_required_form_field(field) %} - <strong style="color: red">*</strong> - {%- else -%} - - {%- endif %} - </label> - </div> - <div class="controls"> - <div> - {{ field(**kwargs)|safe }} - </div> - {% if field.description %} - <p class="help-block">{{ field.description|safe }}</p> - {% endif %} - {% if direct_error %} - <ul class="input-errors"> - {% for e in field.errors if e is string %} - <li>{{ e }}</li> - {% endfor %} - </ul> - {% endif %} - </div> - {% if caller %} - {{ caller(form, field, direct_error, kwargs) }} - {% endif %} - </div> -{% endmacro %} - -{% macro render_header(form, text) %} - <h3>{{ text }}</h3> -{% endmacro %} - -{% macro render_form_fields(form, form_opts=None) %} - {% if form.hidden_tag is defined %} - {{ form.hidden_tag() }} - {% else %} - {% if csrf_token %} - <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/> - {% endif %} - {% for f in form if f.widget.input_type == 'hidden' %} - {{ f }} - {% endfor %} - {% endif %} - - {% if form_opts and form_opts.form_rules %} - {% for r in form_opts.form_rules %} - {{ r(form, form_opts=form_opts) }} - {% endfor %} - {% else %} - {% for f in form if f.widget.input_type != 'hidden' %} - {% if form_opts %} - {% set kwargs = form_opts.widget_args.get(f.short_name, {}) %} - {% else %} - {% set kwargs = {} %} - {% endif %} - {{ render_field(form, f, kwargs) }} - {% endfor %} - {% endif %} -{% endmacro %} - -{% macro form_tag(form=None, action=None) %} - <form action="{{ action or '' }}" method="POST" class="admin-form form-horizontal" enctype="multipart/form-data"> - <fieldset> - {{ caller() }} - </fieldset> - </form> -{% endmacro %} - -{% macro render_form_buttons(cancel_url, extra=None, is_modal=False) %} - <hr> - <div class="control-group"> - <div class="controls"> - <input type="submit" class="btn btn-primary" value="{{ _gettext('Save') }}" /> - {% if extra %} - {{ extra }} - {% endif %} - {% if cancel_url %} - <a href="{{ cancel_url }}" class="btn btn-danger" {% if is_modal %}data-dismiss="modal"{% endif %}>{{ _gettext('Cancel') }}</a> - {% endif %} - </div> - </div> -{% endmacro %} - -{% macro render_form(form, cancel_url, extra=None, form_opts=None, action=None, is_modal=False) -%} - {% call form_tag(action=action) %} - {{ render_form_fields(form, form_opts=form_opts) }} - {{ render_form_buttons(cancel_url, extra, is_modal) }} - {% endcall %} -{% endmacro %} - -{% macro form_css() %} - <link href="{{ admin_static.url(filename='vendor/select2/select2.css', v='3.5.2') }}" rel="stylesheet"> - <link href="{{ admin_static.url(filename='vendor/bootstrap-daterangepicker/daterangepicker-bs2.css', v='1.3.22') }}" rel="stylesheet"> - {% if config.FLASK_ADMIN_MAPS %} - <link href="{{ admin_static.url(filename='vendor/leaflet/leaflet.css', v='1.0.2') }}" rel="stylesheet"> - <link href="{{ admin_static.url(filename='vendor/leaflet/leaflet.draw.css', v='0.4.6') }}" rel="stylesheet"> - {% endif %} - {% if editable_columns %} - <link href="{{ admin_static.url(filename='vendor/x-editable/css/bootstrap2-editable.css', v='1.5.1.1') }}" rel="stylesheet"> - {% endif %} -{% endmacro %} - -{% macro form_js() %} - {% if config.FLASK_ADMIN_MAPS %} - <script> - window.FLASK_ADMIN_MAPS = true; - window.FLASK_ADMIN_MAPBOX_MAP_ID = "{{ config.FLASK_ADMIN_MAPBOX_MAP_ID }}"; - {% if config.FLASK_ADMIN_MAPBOX_ACCESS_TOKEN %} - window.FLASK_ADMIN_MAPBOX_ACCESS_TOKEN = "{{ config.FLASK_ADMIN_MAPBOX_ACCESS_TOKEN }}"; - {% endif %} - {% if config.FLASK_ADMIN_DEFAULT_CENTER_LAT and config.FLASK_ADMIN_DEFAULT_CENTER_LONG %} - window.FLASK_ADMIN_DEFAULT_CENTER_LAT = "{{ config.FLASK_ADMIN_DEFAULT_CENTER_LAT }}"; - window.FLASK_ADMIN_DEFAULT_CENTER_LONG = "{{ config.FLASK_ADMIN_DEFAULT_CENTER_LONG }}"; - {% endif %} - </script> - <script src="{{ admin_static.url(filename='vendor/leaflet/leaflet.js', v='1.0.2') }}"></script> - <script src="{{ admin_static.url(filename='vendor/leaflet/leaflet.draw.js', v='0.4.6') }}"></script> - {% if config.FLASK_ADMIN_MAPS_SEARCH %} - <script> - window.FLASK_ADMIN_MAPS_SEARCH = "{{ config.FLASK_ADMIN_MAPS_SEARCH }}"; - </script> - <script src="https://maps.googleapis.com/maps/api/js?v=3&libraries=places&key={{ config.get('FLASK_ADMIN_GOOGLE_MAPS_API_KEY') }}"></script> - {% endif %} - {% endif %} - <script src="{{ admin_static.url(filename='vendor/bootstrap-daterangepicker/daterangepicker.js', v='1.3.22') }}"></script> - {% if editable_columns %} - <script src="{{ admin_static.url(filename='vendor/x-editable/js/bootstrap2-editable.min.js', v='1.5.1.1') }}"></script> - {% endif %} - <script src="{{ admin_static.url(filename='admin/js/form.js', v='1.0.1') }}"></script> -{% endmacro %} - -{% macro extra() %} - {% if admin_view.can_create %} - <input name="_add_another" type="submit" class="btn" value="{{ _gettext('Save and Add Another') }}" /> - {% endif %} - {% if admin_view.can_edit %} - <input name="_continue_editing" type="submit" class="btn" value="{{ _gettext('Save and Continue Editing') }}" /> - {% endif %} -{% endmacro %} diff --git a/flask_admin/templates/bootstrap2/admin/master.html b/flask_admin/templates/bootstrap2/admin/master.html deleted file mode 100644 index 8f27dad00..000000000 --- a/flask_admin/templates/bootstrap2/admin/master.html +++ /dev/null @@ -1 +0,0 @@ -{% extends admin_base_template %} diff --git a/flask_admin/templates/bootstrap2/admin/model/create.html b/flask_admin/templates/bootstrap2/admin/model/create.html deleted file mode 100644 index 9e0834edb..000000000 --- a/flask_admin/templates/bootstrap2/admin/model/create.html +++ /dev/null @@ -1,30 +0,0 @@ -{% extends 'admin/master.html' %} -{% import 'admin/lib.html' as lib with context %} -{% from 'admin/lib.html' import extra with context %} {# backward compatible #} - -{% block head %} - {{ super() }} - {{ lib.form_css() }} -{% endblock %} - -{% block body %} - {% block navlinks %} - <ul class="nav nav-tabs"> - <li> - <a href="{{ return_url }}">{{ _gettext('List') }}</a> - </li> - <li class="active"> - <a href="javascript:void(0)">{{ _gettext('Create') }}</a> - </li> - </ul> - {% endblock %} - - {% block create_form %} - {{ lib.render_form(form, return_url, extra(), form_opts) }} - {% endblock %} -{% endblock %} - -{% block tail %} - {{ super() }} - {{ lib.form_js() }} -{% endblock %} diff --git a/flask_admin/templates/bootstrap2/admin/model/details.html b/flask_admin/templates/bootstrap2/admin/model/details.html deleted file mode 100644 index 2d516b81d..000000000 --- a/flask_admin/templates/bootstrap2/admin/model/details.html +++ /dev/null @@ -1,54 +0,0 @@ -{% extends 'admin/master.html' %} -{% import 'admin/lib.html' as lib with context %} - -{% block body %} - {% block navlinks %} - <ul class="nav nav-tabs"> - <li> - <a href="{{ return_url }}">{{ _gettext('List') }}</a> - </li> - {%- if admin_view.can_create -%} - <li> - <a href="{{ get_url('.create_view', url=return_url) }}">{{ _gettext('Create') }}</a> - </li> - {%- endif -%} - {%- if admin_view.can_edit -%} - <li> - <a href="{{ get_url('.edit_view', id=request.args.get('id'), url=return_url) }}">{{ _gettext('Edit') }}</a> - </li> - {%- endif -%} - <li class="active"> - <a href="javascript:void(0)">{{ _gettext('Details') }}</a> - </li> - </ul> - {% endblock %} - - {% block details_search %} - <div class="row-fluid"> - <div class="input-prepend fa_filter_container"> - <span class="add-on">{{ _gettext('Filter') }}</span> - <input id="fa_filter" id="prependedInput" type="text"> - </div> - </div> - {% endblock %} - - {% block details_table %} - <table class="table table-hover table-bordered searchable"> - {% for c, name in details_columns %} - <tr> - <td> - <b>{{ name }}</b> - </td> - <td> - {{ get_value(model, c) }} - </td> - </tr> - {% endfor %} - </table> - {% endblock %} -{% endblock %} - -{% block tail %} - {{ super() }} - <script src="{{ admin_static.url(filename='admin/js/details_filter.js', v='1.0.0') }}"></script> -{% endblock %} diff --git a/flask_admin/templates/bootstrap2/admin/model/edit.html b/flask_admin/templates/bootstrap2/admin/model/edit.html deleted file mode 100644 index 5bd409992..000000000 --- a/flask_admin/templates/bootstrap2/admin/model/edit.html +++ /dev/null @@ -1,40 +0,0 @@ -{% extends 'admin/master.html' %} -{% import 'admin/lib.html' as lib with context %} -{% from 'admin/lib.html' import extra with context %} {# backward compatible #} - -{% block head %} - {{ super() }} - {{ lib.form_css() }} -{% endblock %} - -{% block body %} - {% block navlinks %} - <ul class="nav nav-tabs"> - <li> - <a href="{{ return_url }}">{{ _gettext('List') }}</a> - </li> - {%- if admin_view.can_create -%} - <li> - <a href="{{ get_url('.create_view', url=return_url) }}">{{ _gettext('Create') }}</a> - </li> - {%- endif -%} - <li class="active"> - <a href="javascript:void(0)">{{ _gettext('Edit') }}</a> - </li> - {%- if admin_view.can_view_details -%} - <li> - <a href="{{ get_url('.details_view', id=request.args.get('id'), url=return_url) }}">{{ _gettext('Details') }}</a> - </li> - {%- endif -%} - </ul> - {% endblock %} - - {% block edit_form %} - {{ lib.render_form(form, return_url, extra(), form_opts) }} - {% endblock %} -{% endblock %} - -{% block tail %} - {{ super() }} - {{ lib.form_js() }} -{% endblock %} diff --git a/flask_admin/templates/bootstrap2/admin/model/inline_field_list.html b/flask_admin/templates/bootstrap2/admin/model/inline_field_list.html deleted file mode 100644 index 120733432..000000000 --- a/flask_admin/templates/bootstrap2/admin/model/inline_field_list.html +++ /dev/null @@ -1,15 +0,0 @@ -{% import 'admin/model/inline_list_base.html' as base with context %} - -{% macro render_field(field) %} - {{ field }} - - {% if h.is_field_error(field.errors) %} - <ul class="input-errors"> - {% for e in field.errors if e is string %} - <li>{{ e }}</li> - {% endfor %} - </ul> - {% endif %} -{% endmacro %} - -{{ base.render_inline_fields(field, template, render_field, check) }} diff --git a/flask_admin/templates/bootstrap2/admin/model/inline_form.html b/flask_admin/templates/bootstrap2/admin/model/inline_form.html deleted file mode 100644 index 6ae3f6c05..000000000 --- a/flask_admin/templates/bootstrap2/admin/model/inline_form.html +++ /dev/null @@ -1,4 +0,0 @@ -{% import 'admin/lib.html' as lib with context %} -<div class="inline-form-field"> - {{ lib.render_form_fields(field.form, form_opts=form_opts) }} -</div> diff --git a/flask_admin/templates/bootstrap2/admin/model/inline_list_base.html b/flask_admin/templates/bootstrap2/admin/model/inline_list_base.html deleted file mode 100644 index c0fb9faff..000000000 --- a/flask_admin/templates/bootstrap2/admin/model/inline_list_base.html +++ /dev/null @@ -1,42 +0,0 @@ -{% macro render_inline_fields(field, template, render, check=None) %} -<div class="inline-field" id="{{ field.id }}"> - {# existing inline form fields #} - <div class="inline-field-list"> - {% for subfield in field %} - <div id="{{ subfield.id }}" class="inline-field well well-small"> - {%- if not check or check(subfield) %} - <legend> - {{ field.label.text }} #{{ loop.index }} - <div class="pull-right"> - {% if subfield.get_pk and subfield.get_pk() %} - <input type="checkbox" name="del-{{ subfield.id }}" id="del-{{ subfield.id }}" /> - <label for="del-{{ subfield.id }}" style="display: inline">{{ _gettext('Delete?') }}</label> - {% else %} - <a href="javascript:void(0)" value="{{ _gettext('Are you sure you want to delete this record?') }}" class="inline-remove-field"><i class="fa fa-times icon-remove"></i></a> - {% endif %} - </div> - </legend> - {%- endif -%} - {{ render(subfield) }} - </div> - {% endfor %} - </div> - - {# template for new inline form fields #} - <div class="inline-field-template hide"> - {% filter forceescape %} - <div class="inline-field well well-small"> - <legend> - {{ _gettext('New') }} {{ field.label.text }} - <div class="pull-right"> - <a href="javascript:void(0)" value="{{ _gettext('Are you sure you want to delete this record?') }}" class="inline-remove-field"><i class="fa fa-times icon-remove"></i></a> - </div> - </legend> - {{ render(template) }} - </div> - {% endfilter %} - </div> - - <a id="{{ field.id }}-button" href="javascript:void(0)" class="btn" onclick="faForm.addInlineField(this, '{{ field.id }}');">{{ _gettext('Add') }} {{ field.label.text }}</a> -</div> -{% endmacro %} diff --git a/flask_admin/templates/bootstrap2/admin/model/layout.html b/flask_admin/templates/bootstrap2/admin/model/layout.html deleted file mode 100644 index 44086dac7..000000000 --- a/flask_admin/templates/bootstrap2/admin/model/layout.html +++ /dev/null @@ -1,105 +0,0 @@ -{% macro filter_options(btn_class='dropdown-toggle') %} - <a class="{{ btn_class }}" data-toggle="dropdown" href="javascript:void(0)"> - {{ _gettext('Add Filter') }}<b class="caret"></b> - </a> - <ul class="dropdown-menu field-filters"> - {% for k in filter_groups %} - <li> - <a href="javascript:void(0)" class="filter" onclick="return false;">{{ k }}</a> - </li> - {% endfor %} - </ul> -{% endmacro %} - -{% macro export_options(btn_class='dropdown-toggle') %} - {% if admin_view.export_types|length > 1 %} - <li class="dropdown"> - <a class="{{ btn_class }}" data-toggle="dropdown" href="javascript:void(0)"> - {{ _gettext('Export') }}<b class="caret"></b> - </a> - <ul class="dropdown-menu field-filters"> - {% for export_type in admin_view.export_types %} - <li> - <a href="{{ get_url('.export', export_type=export_type, **request.args) }}" title="{{ _gettext('Export') }}">{{ _gettext('Export') + ' ' + export_type|upper }}</a> - </li> - {% endfor %} - </ul> - </li> - {% else %} - <li> - <a href="{{ get_url('.export', export_type=admin_view.export_types[0], **request.args) }}" title="{{ _gettext('Export') }}">{{ _gettext('Export') }}</a> - </li> - {% endif %} -{% endmacro %} - -{% macro filter_form() %} - <form id="filter_form" method="GET" action="{{ return_url }}"> - {% for arg_name, arg_value in extra_args.items() %} - <input type="hidden" name="{{ arg_name }}" value="{{ arg_value }}"> - {% endfor %} - {% if sort_column is not none %} - <input type="hidden" name="sort" value="{{ sort_column }}"> - {% endif %} - {% if sort_desc %} - <input type="hidden" name="desc" value="1"> - {% endif %} - {% if search %} - <input type="hidden" name="search" value="{{ search }}"> - {% endif %} - {% if page_size != default_page_size %} - <input type="hidden" name="page_size" value="{{ page_size }}"> - {% endif %} - <div class="pull-right"> - <button type="submit" class="btn btn-primary" style="display: none">{{ _gettext('Apply') }}</button> - {% if active_filters %} - <a href="{{ clear_search_url }}" class="btn">{{ _gettext('Reset Filters') }}</a> - {% endif %} - </div> - - <table class="filters"></table> - </form> - <div class="clearfix"></div> -{% endmacro %} - -{% macro search_form(input_class=None) %} -<form method="GET" action="{{ return_url }}" class="search-form"> - {% for flt_name, flt_value in filter_args.items() %} - <input type="hidden" name="{{ flt_name }}" value="{{ flt_value }}"> - {% endfor %} - {% for arg_name, arg_value in extra_args.items() %} - <input type="hidden" name="{{ arg_name }}" value="{{ arg_value }}"> - {% endfor %} - {% if page_size != default_page_size %} - <input type="hidden" name="page_size" value="{{ page_size }}"> - {% endif %} - {% if sort_column is not none %} - <input type="hidden" name="sort" value="{{ sort_column }}"> - {% endif %} - {% if sort_desc %} - <input type="hidden" name="desc" value="1"> - {% endif %} - {%- set full_search_placeholder = _gettext('Search') %} - {%- if search_placeholder %}{% set full_search_placeholder = [full_search_placeholder, search_placeholder] | join(": ") %}{% endif %} - {% if search %} - <div class="input-append"> - <input type="search" name="search" class="input-xlarge{% if input_class %} {{ input_class }}{% endif %}" value="{{ search }}" placeholder="{{ full_search_placeholder }}"> - <a href="{{ clear_search_url }}" class="clear add-on"> - <i class="fa fa-times icon-remove"></i> - </a> - </div> - {% else %} - <input type="search" name="search" class="input-xlarge{% if input_class %} {{ input_class }}{% endif %}" value="" placeholder="{{ full_search_placeholder }}"> - {% endif %} -</form> -{% endmacro %} - -{% macro page_size_form(generator, btn_class='dropdown-toggle') %} - <a class="{{ btn_class }}" data-toggle="dropdown" href="javascript:void(0)"> - {{ page_size }} {{ _gettext('items') }}<b class="caret"></b> - </a> - <ul class="dropdown-menu"> - <li><a href="{{ generator(20) }}">20 {{ _gettext('items') }}</a></li> - <li><a href="{{ generator(50) }}">50 {{ _gettext('items') }}</a></li> - <li><a href="{{ generator(100) }}">100 {{ _gettext('items') }}</a></li> - </ul> -{% endmacro %} diff --git a/flask_admin/templates/bootstrap2/admin/model/list.html b/flask_admin/templates/bootstrap2/admin/model/list.html deleted file mode 100755 index 255dbcef6..000000000 --- a/flask_admin/templates/bootstrap2/admin/model/list.html +++ /dev/null @@ -1,197 +0,0 @@ -{% extends 'admin/master.html' %} -{% import 'admin/lib.html' as lib with context %} -{% import 'admin/static.html' as admin_static with context%} -{% import 'admin/model/layout.html' as model_layout with context %} -{% import 'admin/actions.html' as actionlib with context %} -{% import 'admin/model/row_actions.html' as row_actions with context %} - -{% block head %} - {{ super() }} - {{ lib.form_css() }} -{% endblock %} - -{% block body %} - {% block model_menu_bar %} - <ul class="nav nav-tabs actions-nav"> - <li class="active"> - <a href="javascript:void(0)">{{ _gettext('List') }}{% if count %} ({{ count }}){% endif %}</a> - </li> - - {% if admin_view.can_create %} - <li> - {%- if admin_view.create_modal -%} - {{ lib.add_modal_button(url=get_url('.create_view', url=return_url, modal=True), title=_gettext('Create New Record'), content=_gettext('Create')) }} - {% else %} - <a href="{{ get_url('.create_view', url=return_url) }}" title="{{ _gettext('Create New Record') }}">{{ _gettext('Create') }}</a> - {%- endif -%} - </li> - {% endif %} - - {% if admin_view.can_export %} - {{ model_layout.export_options() }} - {% endif %} - - {% block model_menu_bar_before_filters %}{% endblock %} - - {% if filters %} - <li class="dropdown"> - {{ model_layout.filter_options() }} - </li> - {% endif %} - - {% if can_set_page_size %} - <li class="dropdown"> - {{ model_layout.page_size_form(page_size_url) }} - </li> - {% endif %} - - {% if actions %} - <li class="dropdown"> - {{ actionlib.dropdown(actions) }} - </li> - {% endif %} - - {% if search_supported %} - <li> - {{ model_layout.search_form() }} - </li> - {% endif %} - {% block model_menu_bar_after_filters %}{% endblock %} - - </ul> - {% endblock %} - - {% if filters %} - {{ model_layout.filter_form() }} - <div class="clearfix"></div> - {% endif %} - - {% block model_list_table %} - <div id="no-more-tables"> - <table class="table table-striped table-bordered table-hover model-list cf"> - <thead class="cf"> - <tr> - {% block list_header scoped %} - {% if actions %} - <th class="list-checkbox-column"> - <input type="checkbox" name="rowtoggle" class="action-rowtoggle" title="{{ _gettext('Select all records') }}" /> - </th> - {% endif %} - {% block list_row_actions_header %} - {% if admin_view.column_display_actions %} - <th class="span1"> </th> - {% endif %} - {% endblock %} - {% for c, name in list_columns %} - {% set column = loop.index0 %} - <th class="column-header col-{{c}}"> - {% if admin_view.is_sortable(c) %} - {% if sort_column == column %} - <a href="{{ sort_url(column, True) }}" title="{{ _gettext('Sort by %(name)s', name=name) }}"> - {{ name }} - {% if sort_desc %} - <i class="fa fa-chevron-up icon-chevron-up"></i> - {% else %} - <i class="fa fa-chevron-down icon-chevron-down"></i> - {% endif %} - </a> - {% else %} - <a href="{{ sort_url(column) }}" title="{{ _gettext('Sort by %(name)s', name=name) }}">{{ name }}</a> - {% endif %} - {% else %} - {{ name }} - {% endif %} - {% if admin_view.column_descriptions.get(c) %} - <a class="fa fa-question-circle icon-question-sign" - title="{{ admin_view.column_descriptions[c] }}" - href="javascript:void(0)" data-role="tooltip" - ></a> - {% endif %} - </th> - {% endfor %} - {% endblock %} - </tr> - </thead> - {% for row in data %} - <tr> - {% block list_row scoped %} - {% if actions %} - <td> - <input type="checkbox" name="rowid" class="action-checkbox" value="{{ get_pk_value(row) }}" title="{{ _gettext('Select record') }}" /> - </td> - {% endif %} - {% block list_row_actions_column scoped %} - {% if admin_view.column_display_actions %} - <td class="list-buttons-column"> - {% block list_row_actions scoped %} - {% for action in list_row_actions %} - {{ action.render_ctx(get_pk_value(row), row) }} - {% endfor %} - {% endblock %} - </td> - {%- endif -%} - {% endblock %} - - {% for c, name in list_columns %} - <td class="col-{{c}}" data-title="{{ name }}"> - {% if admin_view.is_editable(c) %} - {% set form = list_forms[get_pk_value(row)] %} - {% if form.csrf_token %} - {{ form[c](pk=get_pk_value(row), display_value=get_value(row, c), csrf=form.csrf_token._value()) }} - {% elif csrf_token %} - {{ form[c](pk=get_pk_value(row), display_value=get_value(row, c), csrf=csrf_token()) }} - {% else %} - {{ form[c](pk=get_pk_value(row), display_value=get_value(row, c)) }} - {% endif %} - {% else %} - {{ get_value(row, c) }} - {% endif %} - </td> - {% endfor %} - {% endblock %} - </tr> - {% else %} - <tr> - <td colspan="999"> - {% block empty_list_message %} - <div class="text-center"> - {{ admin_view.get_empty_list_message() }} - </div> - {% endblock %} - </td> - </tr> - {% endfor %} - </table> - </div> - {% block list_pager %} - {% if num_pages is not none %} - {{ lib.pager(page, num_pages, pager_url) }} - {% else %} - {{ lib.simple_pager(page, data|length == page_size, pager_url) }} - {% endif %} - {% endblock %} - {% endblock %} - - {{ actionlib.form(actions, get_url('.action_view')) }} - - {%- if admin_view.edit_modal or admin_view.create_modal or admin_view.details_modal -%} - {{ lib.add_modal_window() }} - {%- endif -%} -{% endblock %} - -{% block tail %} - {{ super() }} - - {% if filter_groups %} - <div id="filter-groups-data" style="display:none;">{{ filter_groups|tojson|safe }}</div> - <div id="active-filters-data" style="display:none;">{{ active_filters|tojson|safe }}</div> - {% endif %} - - {{ lib.form_js() }} - <script src="{{ admin_static.url(filename='admin/js/filters.js', v='1.0.0') }}"></script> - <script src="{{ admin_static.url(filename='admin/js/bs2_modal.js', v='1.0.0') }}"></script> - - {{ actionlib.script(_gettext('Please select at least one record.'), - actions, - actions_confirmation) }} -{% endblock %} diff --git a/flask_admin/templates/bootstrap2/admin/model/modals/create.html b/flask_admin/templates/bootstrap2/admin/model/modals/create.html deleted file mode 100644 index a6c410f19..000000000 --- a/flask_admin/templates/bootstrap2/admin/model/modals/create.html +++ /dev/null @@ -1,25 +0,0 @@ -{% import 'admin/static.html' as admin_static with context%} -{% import 'admin/lib.html' as lib with context %} - -{# store the jinja2 context for form_rules rendering logic #} -{% set render_ctx = h.resolve_ctx() %} - -{% block body %} - {# "save and add" button is removed from modal (it won't function properly) #} - {% block create_form %} - {{ lib.render_form(form, return_url, extra=None, form_opts=form_opts, - action=url_for('.create_view', url=return_url), - is_modal=True) }} - {% endblock %} -{% endblock %} - -{% block tail %} - <script>window.faForm.applyGlobalStyles(document.getElementsByClassName('modal'))</script> - - <script> - // fill the header of modal dynamically - $('.modal-header h3').html('{% block header_text -%} - <h3>{{ _gettext('Create New Record') }}</h3> - {%- endblock %}'); - </script> -{% endblock %} diff --git a/flask_admin/templates/bootstrap2/admin/model/modals/details.html b/flask_admin/templates/bootstrap2/admin/model/modals/details.html deleted file mode 100755 index ce31c9e0c..000000000 --- a/flask_admin/templates/bootstrap2/admin/model/modals/details.html +++ /dev/null @@ -1,40 +0,0 @@ -{% import 'admin/static.html' as admin_static with context%} -{% import 'admin/lib.html' as lib with context %} - -{% block body %} - {% block details_search %} - <div class="row-fluid"> - <div class="input-prepend fa_filter_container"> - <span class="add-on">{{ _gettext('Filter') }}</span> - <input id="fa_filter" id="prependedInput" type="text"> - </div> - </div> - {% endblock %} - - {% block details_table %} - <table class="table table-hover table-bordered searchable"> - {% for c, name in details_columns %} - <tr> - <td> - <b>{{ name }}</b> - </td> - <td> - {{ get_value(model, c) }} - </td> - </tr> - {% endfor %} - </table> - {% endblock %} -{% endblock %} - -{% block tail %} - <script src="{{ admin_static.url(filename='admin/js/details_filter.js', v='1.0.0') }}"></script> - <script>window.faForm.applyGlobalStyles(document.getElementsByClassName('modal'))</script> - - <script> - // fill the header of modal dynamically - $('.modal-header h3').html('{% block header_text -%} - {{ _gettext('View Record') + ' #' + request.args.get('id') }} - {%- endblock %}'); - </script> -{% endblock %} diff --git a/flask_admin/templates/bootstrap2/admin/model/modals/edit.html b/flask_admin/templates/bootstrap2/admin/model/modals/edit.html deleted file mode 100644 index 91f5dfb58..000000000 --- a/flask_admin/templates/bootstrap2/admin/model/modals/edit.html +++ /dev/null @@ -1,25 +0,0 @@ -{% import 'admin/static.html' as admin_static with context%} -{% import 'admin/lib.html' as lib with context %} - -{# store the jinja2 context for form_rules rendering logic #} -{% set render_ctx = h.resolve_ctx() %} - -{% block body %} - {# "save and continue" button is removed from modal (it won't function properly) #} - {% block edit_form %} - {{ lib.render_form(form, return_url, extra=None, form_opts=form_opts, - action=url_for('.edit_view', id=request.args.get('id'), url=return_url), - is_modal=True) }} - {% endblock %} -{% endblock %} - -{% block tail %} - <script>window.faForm.applyGlobalStyles(document.getElementsByClassName('modal'))</script> - - <script> - // fill the header of modal dynamically - $('.modal-header h3').html('{% block header_text -%} - {{ _gettext('Edit Record') + ' #' + request.args.get('id') }} - {%- endblock %}'); - </script> -{% endblock %} diff --git a/flask_admin/templates/bootstrap2/admin/model/row_actions.html b/flask_admin/templates/bootstrap2/admin/model/row_actions.html deleted file mode 100644 index 31463ed20..000000000 --- a/flask_admin/templates/bootstrap2/admin/model/row_actions.html +++ /dev/null @@ -1,38 +0,0 @@ -{% import 'admin/lib.html' as lib with context %} - -{% macro link(action, url, icon_class=None) %} -<a class="icon" href="{{ url }}" title="{{ action.title or '' }}"> - <span class="{{ icon_class or action.icon_class }}"></span> -</a> -{% endmacro %} - -{% macro view_row(action, row_id, row) %} - {{ link(action, get_url('.details_view', id=row_id, url=return_url), 'fa fa-eye glyphicon icon-eye-open') }} -{% endmacro %} - -{% macro view_row_popup(action, row_id, row) %} - {{ lib.add_modal_button(url=get_url('.details_view', id=row_id, url=return_url, modal=True), title=action.title, content='<span class="fa fa-eye glyphicon icon-eye-open"></span>') }} -{% endmacro %} - -{% macro edit_row(action, row_id, row) %} - {{ link(action, get_url('.edit_view', id=row_id, url=return_url), 'fa fa-pencil glyphicon icon-pencil') }} -{% endmacro %} - -{% macro edit_row_popup(action, row_id, row) %} - {{ lib.add_modal_button(url=get_url('.edit_view', id=row_id, url=return_url, modal=True), title=action.title, content='<span class="fa fa-pencil glyphicon icon-pencil"></span>') }} -{% endmacro %} - -{% macro delete_row(action, row_id, row) %} -<form class="icon" method="POST" action="{{ get_url('.delete_view') }}"> - {{ delete_form.id(value=get_pk_value(row)) }} - {{ delete_form.url(value=return_url) }} - {% if delete_form.csrf_token %} - {{ delete_form.csrf_token }} - {% elif csrf_token %} - <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/> - {% endif %} - <button onclick="return confirm('{{ _gettext('Are you sure you want to delete this record?') }}');" title="Delete record"> - <span class="fa fa-trash glyphicon icon-trash"></span> - </button> -</form> -{% endmacro %} diff --git a/flask_admin/templates/bootstrap2/admin/rediscli/console.html b/flask_admin/templates/bootstrap2/admin/rediscli/console.html deleted file mode 100644 index 465f817f5..000000000 --- a/flask_admin/templates/bootstrap2/admin/rediscli/console.html +++ /dev/null @@ -1,27 +0,0 @@ -{% extends 'admin/master.html' %} -{% import 'admin/lib.html' as lib with context %} -{% import 'admin/static.html' as admin_static with context%} - -{% block head %} - {{ super() }} - <link href="{{ admin_static.url(filename='admin/css/bootstrap2/rediscli.css', v='1.0.0') }}" rel="stylesheet"> -{% endblock %} - -{% block body %} -<div class="console"> - <div class="console-container"> - </div> - <div class="console-line"> - <form action="#"> - <input type="text"></input> - </form> - </div> -</div> -{% endblock %} - -{% block tail %} - {{ super() }} - - <div id="execute-view-data" style="display:none;">{{ admin_view.get_url('.execute_view')|tojson|safe }}</div> - <script src="{{ admin_static.url(filename='admin/js/rediscli.js', v='1.0.0') }}"></script> -{% endblock %} diff --git a/flask_admin/templates/bootstrap2/admin/rediscli/response.html b/flask_admin/templates/bootstrap2/admin/rediscli/response.html deleted file mode 100644 index f4a950a87..000000000 --- a/flask_admin/templates/bootstrap2/admin/rediscli/response.html +++ /dev/null @@ -1,32 +0,0 @@ -{% macro render(item, depth=0) %} - {% set type = type_name(item) %} - - {% if type == 'tuple' or type == 'list' %} - {% if not item %} - Empty {{ type }}. - {% else %} - {% for n in item %} - {{ loop.index }}) {{ render(n, depth + 1) }}<br/> - {% endfor %} - {% endif %} - {% elif type == 'bool' %} - {% if depth == 0 and item %} - OK - {% else %} - <span class="type-bool">{{ item }}</span> - {% endif %} - {% elif type == 'str' or type == 'unicode' %} - "{{ item }}" - {% elif type == 'bytes' %} - "{{ item.decode('utf-8') }}" - {% elif type == 'TextWrapper' %} - <pre>{{ item }}</pre> - {% elif type == 'dict' %} - {% for k, v in item.items() %} - {{ loop.index }}) {{ k }} - {{ render(v, depth + 1) }}<br/> - {% endfor %} - {% else %} - {{ item }} - {% endif %} -{% endmacro %} -{{ render(result) }} \ No newline at end of file diff --git a/flask_admin/templates/bootstrap2/admin/static.html b/flask_admin/templates/bootstrap2/admin/static.html deleted file mode 100644 index de632ee14..000000000 --- a/flask_admin/templates/bootstrap2/admin/static.html +++ /dev/null @@ -1,3 +0,0 @@ -{% macro url() -%} - {{ get_url('{admin_endpoint}.static'.format(admin_endpoint=admin_view.admin.endpoint), *varargs, **kwargs) }} -{%- endmacro %} diff --git a/flask_admin/tests/fileadmin/test_fileadmin.py b/flask_admin/tests/fileadmin/test_fileadmin.py index 3c4ecccb3..d48f71b06 100644 --- a/flask_admin/tests/fileadmin/test_fileadmin.py +++ b/flask_admin/tests/fileadmin/test_fileadmin.py @@ -2,7 +2,7 @@ import os import os.path as op -from flask_admin.theme import Bootstrap2Theme, Bootstrap3Theme, Bootstrap4Theme +from flask_admin.theme import Bootstrap3Theme, Bootstrap4Theme from flask_admin.contrib import fileadmin from flask_admin import Admin @@ -127,46 +127,6 @@ class MyFileAdmin(fileadmin_class): assert 'path=dummy_renamed_dir' not in rv.data.decode('utf-8') assert 'path=dummy.txt' in rv.data.decode('utf-8') - def test_modal_edit_bs2(self, app, babel): - admin_bs2 = Admin(app, theme=Bootstrap2Theme()) - - fileadmin_class = self.fileadmin_class() - fileadmin_args, fileadmin_kwargs = self.fileadmin_args() - - class EditModalOn(fileadmin_class): - edit_modal = True - editable_extensions = ('txt',) - - class EditModalOff(fileadmin_class): - edit_modal = False - editable_extensions = ('txt',) - - on_view_kwargs = dict(fileadmin_kwargs) - on_view_kwargs.setdefault('endpoint', 'edit_modal_on') - edit_modal_on = EditModalOn(*fileadmin_args, **on_view_kwargs) - - off_view_kwargs = dict(fileadmin_kwargs) - off_view_kwargs.setdefault('endpoint', 'edit_modal_off') - edit_modal_off = EditModalOff(*fileadmin_args, **off_view_kwargs) - - admin_bs2.add_view(edit_modal_on) - admin_bs2.add_view(edit_modal_off) - - client_bs2 = app.test_client() - - # bootstrap 2 - ensure modal window is added when edit_modal is - # enabled - rv = client_bs2.get('/admin/edit_modal_on/') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'fa_modal_window' in data - - # bootstrap 2 - test edit modal disabled - rv = client_bs2.get('/admin/edit_modal_off/') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'fa_modal_window' not in data - def test_modal_edit_bs3(self, app, babel): admin_bs3 = Admin(app, theme=Bootstrap3Theme()) diff --git a/flask_admin/tests/test_model.py b/flask_admin/tests/test_model.py index 3ec5aaeb0..d25e8897f 100644 --- a/flask_admin/tests/test_model.py +++ b/flask_admin/tests/test_model.py @@ -7,7 +7,7 @@ from flask_admin import Admin, form from flask_admin._compat import iteritems, itervalues -from flask_admin.theme import Bootstrap2Theme, Bootstrap3Theme, Bootstrap4Theme +from flask_admin.theme import Bootstrap3Theme, Bootstrap4Theme from flask_admin.model import base, filters from flask_admin.model.template import macro @@ -422,45 +422,6 @@ class TestForm(form.BaseForm): assert not hasattr(view._create_form_class, 'col1') -def test_modal_edit_bs2(app, babel): - admin_bs2 = Admin(app, theme=Bootstrap2Theme()) - - edit_modal_on = MockModelView(Model, edit_modal=True, endpoint="edit_modal_on") - edit_modal_off = MockModelView(Model, edit_modal=False, endpoint="edit_modal_off") - create_modal_on = MockModelView(Model, create_modal=True, endpoint="create_modal_on") - create_modal_off = MockModelView(Model, create_modal=False, endpoint="create_modal_off") - admin_bs2.add_view(edit_modal_on) - admin_bs2.add_view(edit_modal_off) - admin_bs2.add_view(create_modal_on) - admin_bs2.add_view(create_modal_off) - - client_bs2 = app.test_client() - - # bootstrap 2 - ensure modal window is added when edit_modal is enabled - rv = client_bs2.get('/admin/edit_modal_on/') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'fa_modal_window' in data - - # bootstrap 2 - test edit modal disabled - rv = client_bs2.get('/admin/edit_modal_off/') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'fa_modal_window' not in data - - # bootstrap 2 - ensure modal window is added when create_modal is enabled - rv = client_bs2.get('/admin/create_modal_on/') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'fa_modal_window' in data - - # bootstrap 2 - test create modal disabled - rv = client_bs2.get('/admin/create_modal_off/') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'fa_modal_window' not in data - - def test_modal_edit_bs3(app, babel): admin_bs3 = Admin(app, theme=Bootstrap3Theme()) diff --git a/flask_admin/theme.py b/flask_admin/theme.py index 6c61661d0..2c19d44bf 100644 --- a/flask_admin/theme.py +++ b/flask_admin/theme.py @@ -11,12 +11,11 @@ class Theme: @dataclass class BootstrapTheme(Theme): - folder: typing.Literal['bootstrap2', 'bootstrap3', 'bootstrap4'] + folder: typing.Literal['bootstrap3', 'bootstrap4'] base_template: str = 'admin/base.html' swatch: str = 'default' fluid: bool = False -Bootstrap2Theme = partial(BootstrapTheme, folder='bootstrap2') Bootstrap3Theme = partial(BootstrapTheme, folder='bootstrap3') Bootstrap4Theme = partial(BootstrapTheme, folder='bootstrap4') From e32b2f0a3799aeae3d9566646ed019a1766c8d14 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Tue, 23 Jul 2024 20:58:34 +0100 Subject: [PATCH 057/156] Remove Bootstrap3Theme --- examples/custom-layout/app.py | 4 +- flask_admin/base.py | 3 +- flask_admin/form/widgets.py | 5 - .../static/admin/css/bootstrap3/admin.css | 130 - .../static/admin/css/bootstrap3/rediscli.css | 48 - .../static/admin/css/bootstrap3/submenu.css | 18 - flask_admin/static/admin/js/bs3_modal.js | 4 - .../bootstrap3/css/bootstrap-theme.css | 587 -- .../bootstrap3/css/bootstrap-theme.css.map | 1 - .../bootstrap3/css/bootstrap-theme.min.css | 5 - .../bootstrap/bootstrap3/css/bootstrap.css | 6800 ----------------- .../bootstrap3/css/bootstrap.css.map | 1 - .../bootstrap3/css/bootstrap.min.css | 5 - .../bootstrap/bootstrap3/js/bootstrap.js | 2363 ------ .../bootstrap/bootstrap3/js/bootstrap.min.js | 7 - .../swatch/cerulean/bootstrap.min.css | 11 - .../bootstrap3/swatch/cosmo/bootstrap.min.css | 11 - .../swatch/cyborg/bootstrap.min.css | 11 - .../swatch/darkly/bootstrap.min.css | 11 - .../swatch/default/bootstrap.min.css | 5 - .../swatch/flatly/bootstrap.min.css | 11 - .../fonts/glyphicons-halflings-regular.eot | Bin 20127 -> 0 bytes .../fonts/glyphicons-halflings-regular.svg | 288 - .../fonts/glyphicons-halflings-regular.ttf | Bin 45404 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 23424 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 18028 -> 0 bytes .../swatch/journal/bootstrap.min.css | 11 - .../bootstrap3/swatch/lumen/bootstrap.min.css | 11 - .../bootstrap3/swatch/paper/bootstrap.min.css | 11 - .../swatch/readable/bootstrap.min.css | 11 - .../swatch/sandstone/bootstrap.min.css | 11 - .../swatch/simplex/bootstrap.min.css | 11 - .../bootstrap3/swatch/slate/bootstrap.min.css | 11 - .../swatch/spacelab/bootstrap.min.css | 11 - .../swatch/superhero/bootstrap.min.css | 11 - .../swatch/united/bootstrap.min.css | 11 - .../bootstrap3/swatch/yeti/bootstrap.min.css | 11 - .../daterangepicker-bs3.css | 335 - .../vendor/select2/select2-bootstrap3.css | 1 - .../x-editable/css/bootstrap3-editable.css | 663 -- .../x-editable/js/bootstrap3-editable.min.js | 7 - .../templates/bootstrap3/admin/actions.html | 34 - .../templates/bootstrap3/admin/base.html | 98 - .../templates/bootstrap3/admin/file/form.html | 9 - .../templates/bootstrap3/admin/file/list.html | 197 - .../bootstrap3/admin/file/modals/form.html | 19 - .../templates/bootstrap3/admin/index.html | 4 - .../templates/bootstrap3/admin/layout.html | 102 - .../templates/bootstrap3/admin/lib.html | 257 - .../templates/bootstrap3/admin/master.html | 1 - .../bootstrap3/admin/model/create.html | 30 - .../bootstrap3/admin/model/details.html | 52 - .../bootstrap3/admin/model/edit.html | 40 - .../admin/model/inline_field_list.html | 15 - .../bootstrap3/admin/model/inline_form.html | 4 - .../admin/model/inline_list_base.html | 45 - .../bootstrap3/admin/model/layout.html | 107 - .../bootstrap3/admin/model/list.html | 198 - .../bootstrap3/admin/model/modals/create.html | 24 - .../admin/model/modals/details.html | 40 - .../bootstrap3/admin/model/modals/edit.html | 26 - .../bootstrap3/admin/model/row_actions.html | 38 - .../bootstrap3/admin/rediscli/console.html | 27 - .../bootstrap3/admin/rediscli/response.html | 32 - .../templates/bootstrap3/admin/static.html | 3 - flask_admin/tests/fileadmin/test_fileadmin.py | 42 +- flask_admin/tests/test_model.py | 41 +- flask_admin/theme.py | 3 +- 68 files changed, 6 insertions(+), 12938 deletions(-) delete mode 100644 flask_admin/static/admin/css/bootstrap3/admin.css delete mode 100644 flask_admin/static/admin/css/bootstrap3/rediscli.css delete mode 100644 flask_admin/static/admin/css/bootstrap3/submenu.css delete mode 100755 flask_admin/static/admin/js/bs3_modal.js delete mode 100644 flask_admin/static/bootstrap/bootstrap3/css/bootstrap-theme.css delete mode 100644 flask_admin/static/bootstrap/bootstrap3/css/bootstrap-theme.css.map delete mode 100644 flask_admin/static/bootstrap/bootstrap3/css/bootstrap-theme.min.css delete mode 100644 flask_admin/static/bootstrap/bootstrap3/css/bootstrap.css delete mode 100644 flask_admin/static/bootstrap/bootstrap3/css/bootstrap.css.map delete mode 100644 flask_admin/static/bootstrap/bootstrap3/css/bootstrap.min.css delete mode 100644 flask_admin/static/bootstrap/bootstrap3/js/bootstrap.js delete mode 100644 flask_admin/static/bootstrap/bootstrap3/js/bootstrap.min.js delete mode 100644 flask_admin/static/bootstrap/bootstrap3/swatch/cerulean/bootstrap.min.css delete mode 100644 flask_admin/static/bootstrap/bootstrap3/swatch/cosmo/bootstrap.min.css delete mode 100644 flask_admin/static/bootstrap/bootstrap3/swatch/cyborg/bootstrap.min.css delete mode 100644 flask_admin/static/bootstrap/bootstrap3/swatch/darkly/bootstrap.min.css delete mode 100644 flask_admin/static/bootstrap/bootstrap3/swatch/default/bootstrap.min.css delete mode 100644 flask_admin/static/bootstrap/bootstrap3/swatch/flatly/bootstrap.min.css delete mode 100644 flask_admin/static/bootstrap/bootstrap3/swatch/fonts/glyphicons-halflings-regular.eot delete mode 100644 flask_admin/static/bootstrap/bootstrap3/swatch/fonts/glyphicons-halflings-regular.svg delete mode 100644 flask_admin/static/bootstrap/bootstrap3/swatch/fonts/glyphicons-halflings-regular.ttf delete mode 100644 flask_admin/static/bootstrap/bootstrap3/swatch/fonts/glyphicons-halflings-regular.woff delete mode 100644 flask_admin/static/bootstrap/bootstrap3/swatch/fonts/glyphicons-halflings-regular.woff2 delete mode 100644 flask_admin/static/bootstrap/bootstrap3/swatch/journal/bootstrap.min.css delete mode 100644 flask_admin/static/bootstrap/bootstrap3/swatch/lumen/bootstrap.min.css delete mode 100644 flask_admin/static/bootstrap/bootstrap3/swatch/paper/bootstrap.min.css delete mode 100644 flask_admin/static/bootstrap/bootstrap3/swatch/readable/bootstrap.min.css delete mode 100644 flask_admin/static/bootstrap/bootstrap3/swatch/sandstone/bootstrap.min.css delete mode 100644 flask_admin/static/bootstrap/bootstrap3/swatch/simplex/bootstrap.min.css delete mode 100644 flask_admin/static/bootstrap/bootstrap3/swatch/slate/bootstrap.min.css delete mode 100644 flask_admin/static/bootstrap/bootstrap3/swatch/spacelab/bootstrap.min.css delete mode 100644 flask_admin/static/bootstrap/bootstrap3/swatch/superhero/bootstrap.min.css delete mode 100644 flask_admin/static/bootstrap/bootstrap3/swatch/united/bootstrap.min.css delete mode 100644 flask_admin/static/bootstrap/bootstrap3/swatch/yeti/bootstrap.min.css delete mode 100644 flask_admin/static/vendor/bootstrap-daterangepicker/daterangepicker-bs3.css delete mode 100644 flask_admin/static/vendor/select2/select2-bootstrap3.css delete mode 100755 flask_admin/static/vendor/x-editable/css/bootstrap3-editable.css delete mode 100755 flask_admin/static/vendor/x-editable/js/bootstrap3-editable.min.js delete mode 100644 flask_admin/templates/bootstrap3/admin/actions.html delete mode 100644 flask_admin/templates/bootstrap3/admin/base.html delete mode 100644 flask_admin/templates/bootstrap3/admin/file/form.html delete mode 100644 flask_admin/templates/bootstrap3/admin/file/list.html delete mode 100644 flask_admin/templates/bootstrap3/admin/file/modals/form.html delete mode 100644 flask_admin/templates/bootstrap3/admin/index.html delete mode 100644 flask_admin/templates/bootstrap3/admin/layout.html delete mode 100644 flask_admin/templates/bootstrap3/admin/lib.html delete mode 100644 flask_admin/templates/bootstrap3/admin/master.html delete mode 100644 flask_admin/templates/bootstrap3/admin/model/create.html delete mode 100644 flask_admin/templates/bootstrap3/admin/model/details.html delete mode 100644 flask_admin/templates/bootstrap3/admin/model/edit.html delete mode 100644 flask_admin/templates/bootstrap3/admin/model/inline_field_list.html delete mode 100644 flask_admin/templates/bootstrap3/admin/model/inline_form.html delete mode 100644 flask_admin/templates/bootstrap3/admin/model/inline_list_base.html delete mode 100644 flask_admin/templates/bootstrap3/admin/model/layout.html delete mode 100755 flask_admin/templates/bootstrap3/admin/model/list.html delete mode 100644 flask_admin/templates/bootstrap3/admin/model/modals/create.html delete mode 100755 flask_admin/templates/bootstrap3/admin/model/modals/details.html delete mode 100644 flask_admin/templates/bootstrap3/admin/model/modals/edit.html delete mode 100644 flask_admin/templates/bootstrap3/admin/model/row_actions.html delete mode 100644 flask_admin/templates/bootstrap3/admin/rediscli/console.html delete mode 100644 flask_admin/templates/bootstrap3/admin/rediscli/response.html delete mode 100644 flask_admin/templates/bootstrap3/admin/static.html diff --git a/examples/custom-layout/app.py b/examples/custom-layout/app.py index b68e0cc4f..183ebbe95 100644 --- a/examples/custom-layout/app.py +++ b/examples/custom-layout/app.py @@ -4,7 +4,7 @@ from flask_sqlalchemy import SQLAlchemy import flask_admin as admin -from flask_admin.theme import Bootstrap3Theme +from flask_admin.theme import Bootstrap4Theme from flask_admin.contrib.sqla import ModelView @@ -59,7 +59,7 @@ def index(): # Create admin with custom base template -admin = admin.Admin(app, 'Example: Layout-BS3', theme=Bootstrap3Theme(base_template='layout.html')) +admin = admin.Admin(app, 'Example: Layout-BS4', theme=Bootstrap4Theme(base_template='layout.html')) # Add views admin.add_view(UserAdmin(User, db.session)) diff --git a/flask_admin/base.py b/flask_admin/base.py index 181be1d3e..54c3d0f8b 100644 --- a/flask_admin/base.py +++ b/flask_admin/base.py @@ -501,8 +501,7 @@ def __init__(self, app=None, name=None, Static URL Path. If provided, this specifies the default path to the static url directory for all its views. Can be overridden in view configuration. :param theme: - Base theme. Defaults to `Bootstrap4Theme()`. If you want to use - Bootstrap 3 or 4 integration, change it to `Bootstrap3Theme()` or `Bootstrap4Theme()`. + Base theme. Defaults to `Bootstrap4Theme()`. :param category_icon_classes: A dict of category names as keys and html classes as values to be added to menu category icons. Example: {'Favorites': 'glyphicon glyphicon-star'} diff --git a/flask_admin/form/widgets.py b/flask_admin/form/widgets.py index b741ee233..4ea72dd07 100644 --- a/flask_admin/form/widgets.py +++ b/flask_admin/form/widgets.py @@ -6,11 +6,6 @@ __all__ = ['Select2Widget', 'DatePickerWidget', 'DateTimePickerWidget', 'RenderTemplateWidget', 'Select2TagsWidget', ] -def _is_bootstrap3(): - view = h.get_current_view() - return view and view.admin.theme.folder == 'bootstrap3' - - class Select2Widget(widgets.Select): """ `Select2 <https://github.com/ivaynberg/select2>`_ styled select widget. diff --git a/flask_admin/static/admin/css/bootstrap3/admin.css b/flask_admin/static/admin/css/bootstrap3/admin.css deleted file mode 100644 index a0ed9e757..000000000 --- a/flask_admin/static/admin/css/bootstrap3/admin.css +++ /dev/null @@ -1,130 +0,0 @@ -/* List View - fix trash icon inside table column */ -.model-list form.icon { - display: inline; -} - -.model-list form.icon button { - border: none; - background: transparent; - text-decoration: none; - padding: 0; - line-height: normal; -} - -.model-list a.icon:first-child { - margin-left: 10px; -} - -/* List View - prevent link icons from differing from trash icon */ -.model-list a.icon { - text-decoration: none; - color: inherit; -} - -/* List View - fix checkbox column width */ -.list-checkbox-column { - width: 14px; -} - -/* List View - fix overlapping border between actions and table */ -.model-list { - position: static; - margin-top: -1px; - z-index: 999; -} - -/* List View Search Form - fix gap between form and table */ -.actions-nav form.navbar-form { - margin: 1px 0 0 0; -} - -/* List View - prevent word wrap on buttons column, to keep it on one line */ -.list-buttons-column { - white-space: nowrap; -} - -/* Filters */ -table.filters { - border-collapse: collapse; - border-spacing: 4px; -} - -/* prevents gap between table and actions while there are no filters set */ -table.filters:not(:empty) { - margin: 12px 0px 20px 0px; -} - -/* spacing between filter X button, operation, and value field */ -/* uses tables instead of form classes for bootstrap2-3 compatibility */ -table.filters tr td { - padding-right: 5px; - padding-bottom: 3px; -} - -/* Filters - Select2 Boxes */ -.filters .filter-op { - width: 130px; -} - -.filters .filter-val { - width: 220px; -} - -/* Image thumbnails */ -.image-thumbnail img { - max-width: 100px; - max-height: 100px; -} - -/* Forms */ -/* adds spacing between navbar and edit/create form (non-modal only) */ -/* required because form-horizontal removes top padding */ -div.container > .admin-form { - margin-top: 35px; -} - -/* Form Field Description - Appears when field has 'description' attribute */ -/* Test with: form_args = {'name':{'description': 'test'}} */ -/* prevents awkward gap after help-block - This is default for bootstrap2 */ -.admin-form .help-block { - margin-bottom: 0px; -} - -/* Modals */ -/* hack to prevent cut-off left side of select2 inside of modal */ -/* may be able to remove this after Bootstrap v3.3.5 */ -body.modal-open { - overflow-y: scroll; - padding-right: 0 !important; -} - -/* Details View - add space between navbar and results */ -.fa_filter_container { - margin-top: 20px; - margin-bottom: 10px; -} - -.table-responsive -{ - overflow-x: auto; -} - -[placeholder]{ - text-overflow:ellipsis; -} - -::-webkit-input-placeholder { /* Chrome/Opera/Safari */ - text-overflow:ellipsis; -} - -::-moz-placeholder { /* Firefox 19+ */ - text-overflow:ellipsis; -} - -:-ms-input-placeholder { /* IE 10+ */ - text-overflow:ellipsis; -} - -:-moz-placeholder { /* Firefox 18- */ - text-overflow:ellipsis; -} diff --git a/flask_admin/static/admin/css/bootstrap3/rediscli.css b/flask_admin/static/admin/css/bootstrap3/rediscli.css deleted file mode 100644 index 5bf391f2b..000000000 --- a/flask_admin/static/admin/css/bootstrap3/rediscli.css +++ /dev/null @@ -1,48 +0,0 @@ -.console { - position: relative; - width: 100%; - min-height: 400px; -} - -.console-container { - border-radius: 4px; - position: absolute; - border: 1px solid #d4d4d4; - padding: 2px; - overflow: scroll; - top: 2px; - left: 2px; - right: 2px; - bottom: 5em; -} - -.console-line { - position: absolute; - left: 2px; - right: 2px; - bottom: 2px; -} - -.console-line input { - width: 100%; - box-sizing: border-box; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - height: 2em; -} - -.console .cmd { - background-color: #f5f5f5; - padding: 2px; - margin: 1px; -} - -.console .response { - background-color: #f0f0f0; - padding: 2px; - margin: 1px; -} - -.console .error { - color: red; -} \ No newline at end of file diff --git a/flask_admin/static/admin/css/bootstrap3/submenu.css b/flask_admin/static/admin/css/bootstrap3/submenu.css deleted file mode 100644 index e7ab77c5b..000000000 --- a/flask_admin/static/admin/css/bootstrap3/submenu.css +++ /dev/null @@ -1,18 +0,0 @@ -.nav li.dropdown ul.dropdown-menu li:hover ul { - display:block; - position:absolute; - left:100%; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.nav li.dropdown ul.dropdown-menu ul { - display: none; - float:right; - position: relative; - top: auto; - margin-top: -30px; -} -.nav li.dropdown a.dropdown-toggle .glyphicon { - margin: 0 4px; -} diff --git a/flask_admin/static/admin/js/bs3_modal.js b/flask_admin/static/admin/js/bs3_modal.js deleted file mode 100755 index a93b2391c..000000000 --- a/flask_admin/static/admin/js/bs3_modal.js +++ /dev/null @@ -1,4 +0,0 @@ -// fixes "remote modal shows same content every time", avoiding the flicker -$('body').on('hidden.bs.modal', '.modal', function () { - $(this).removeData('bs.modal').find(".modal-content").empty(); -}); diff --git a/flask_admin/static/bootstrap/bootstrap3/css/bootstrap-theme.css b/flask_admin/static/bootstrap/bootstrap3/css/bootstrap-theme.css deleted file mode 100644 index c19cd5c4b..000000000 --- a/flask_admin/static/bootstrap/bootstrap3/css/bootstrap-theme.css +++ /dev/null @@ -1,587 +0,0 @@ -/*! - * Bootstrap v3.3.5 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ -.btn-default, -.btn-primary, -.btn-success, -.btn-info, -.btn-warning, -.btn-danger { - text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); -} -.btn-default:active, -.btn-primary:active, -.btn-success:active, -.btn-info:active, -.btn-warning:active, -.btn-danger:active, -.btn-default.active, -.btn-primary.active, -.btn-success.active, -.btn-info.active, -.btn-warning.active, -.btn-danger.active { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); -} -.btn-default.disabled, -.btn-primary.disabled, -.btn-success.disabled, -.btn-info.disabled, -.btn-warning.disabled, -.btn-danger.disabled, -.btn-default[disabled], -.btn-primary[disabled], -.btn-success[disabled], -.btn-info[disabled], -.btn-warning[disabled], -.btn-danger[disabled], -fieldset[disabled] .btn-default, -fieldset[disabled] .btn-primary, -fieldset[disabled] .btn-success, -fieldset[disabled] .btn-info, -fieldset[disabled] .btn-warning, -fieldset[disabled] .btn-danger { - -webkit-box-shadow: none; - box-shadow: none; -} -.btn-default .badge, -.btn-primary .badge, -.btn-success .badge, -.btn-info .badge, -.btn-warning .badge, -.btn-danger .badge { - text-shadow: none; -} -.btn:active, -.btn.active { - background-image: none; -} -.btn-default { - text-shadow: 0 1px 0 #fff; - background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); - background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0)); - background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #dbdbdb; - border-color: #ccc; -} -.btn-default:hover, -.btn-default:focus { - background-color: #e0e0e0; - background-position: 0 -15px; -} -.btn-default:active, -.btn-default.active { - background-color: #e0e0e0; - border-color: #dbdbdb; -} -.btn-default.disabled, -.btn-default[disabled], -fieldset[disabled] .btn-default, -.btn-default.disabled:hover, -.btn-default[disabled]:hover, -fieldset[disabled] .btn-default:hover, -.btn-default.disabled:focus, -.btn-default[disabled]:focus, -fieldset[disabled] .btn-default:focus, -.btn-default.disabled.focus, -.btn-default[disabled].focus, -fieldset[disabled] .btn-default.focus, -.btn-default.disabled:active, -.btn-default[disabled]:active, -fieldset[disabled] .btn-default:active, -.btn-default.disabled.active, -.btn-default[disabled].active, -fieldset[disabled] .btn-default.active { - background-color: #e0e0e0; - background-image: none; -} -.btn-primary { - background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%); - background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88)); - background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #245580; -} -.btn-primary:hover, -.btn-primary:focus { - background-color: #265a88; - background-position: 0 -15px; -} -.btn-primary:active, -.btn-primary.active { - background-color: #265a88; - border-color: #245580; -} -.btn-primary.disabled, -.btn-primary[disabled], -fieldset[disabled] .btn-primary, -.btn-primary.disabled:hover, -.btn-primary[disabled]:hover, -fieldset[disabled] .btn-primary:hover, -.btn-primary.disabled:focus, -.btn-primary[disabled]:focus, -fieldset[disabled] .btn-primary:focus, -.btn-primary.disabled.focus, -.btn-primary[disabled].focus, -fieldset[disabled] .btn-primary.focus, -.btn-primary.disabled:active, -.btn-primary[disabled]:active, -fieldset[disabled] .btn-primary:active, -.btn-primary.disabled.active, -.btn-primary[disabled].active, -fieldset[disabled] .btn-primary.active { - background-color: #265a88; - background-image: none; -} -.btn-success { - background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); - background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641)); - background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #3e8f3e; -} -.btn-success:hover, -.btn-success:focus { - background-color: #419641; - background-position: 0 -15px; -} -.btn-success:active, -.btn-success.active { - background-color: #419641; - border-color: #3e8f3e; -} -.btn-success.disabled, -.btn-success[disabled], -fieldset[disabled] .btn-success, -.btn-success.disabled:hover, -.btn-success[disabled]:hover, -fieldset[disabled] .btn-success:hover, -.btn-success.disabled:focus, -.btn-success[disabled]:focus, -fieldset[disabled] .btn-success:focus, -.btn-success.disabled.focus, -.btn-success[disabled].focus, -fieldset[disabled] .btn-success.focus, -.btn-success.disabled:active, -.btn-success[disabled]:active, -fieldset[disabled] .btn-success:active, -.btn-success.disabled.active, -.btn-success[disabled].active, -fieldset[disabled] .btn-success.active { - background-color: #419641; - background-image: none; -} -.btn-info { - background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); - background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2)); - background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #28a4c9; -} -.btn-info:hover, -.btn-info:focus { - background-color: #2aabd2; - background-position: 0 -15px; -} -.btn-info:active, -.btn-info.active { - background-color: #2aabd2; - border-color: #28a4c9; -} -.btn-info.disabled, -.btn-info[disabled], -fieldset[disabled] .btn-info, -.btn-info.disabled:hover, -.btn-info[disabled]:hover, -fieldset[disabled] .btn-info:hover, -.btn-info.disabled:focus, -.btn-info[disabled]:focus, -fieldset[disabled] .btn-info:focus, -.btn-info.disabled.focus, -.btn-info[disabled].focus, -fieldset[disabled] .btn-info.focus, -.btn-info.disabled:active, -.btn-info[disabled]:active, -fieldset[disabled] .btn-info:active, -.btn-info.disabled.active, -.btn-info[disabled].active, -fieldset[disabled] .btn-info.active { - background-color: #2aabd2; - background-image: none; -} -.btn-warning { - background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); - background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316)); - background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #e38d13; -} -.btn-warning:hover, -.btn-warning:focus { - background-color: #eb9316; - background-position: 0 -15px; -} -.btn-warning:active, -.btn-warning.active { - background-color: #eb9316; - border-color: #e38d13; -} -.btn-warning.disabled, -.btn-warning[disabled], -fieldset[disabled] .btn-warning, -.btn-warning.disabled:hover, -.btn-warning[disabled]:hover, -fieldset[disabled] .btn-warning:hover, -.btn-warning.disabled:focus, -.btn-warning[disabled]:focus, -fieldset[disabled] .btn-warning:focus, -.btn-warning.disabled.focus, -.btn-warning[disabled].focus, -fieldset[disabled] .btn-warning.focus, -.btn-warning.disabled:active, -.btn-warning[disabled]:active, -fieldset[disabled] .btn-warning:active, -.btn-warning.disabled.active, -.btn-warning[disabled].active, -fieldset[disabled] .btn-warning.active { - background-color: #eb9316; - background-image: none; -} -.btn-danger { - background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); - background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a)); - background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #b92c28; -} -.btn-danger:hover, -.btn-danger:focus { - background-color: #c12e2a; - background-position: 0 -15px; -} -.btn-danger:active, -.btn-danger.active { - background-color: #c12e2a; - border-color: #b92c28; -} -.btn-danger.disabled, -.btn-danger[disabled], -fieldset[disabled] .btn-danger, -.btn-danger.disabled:hover, -.btn-danger[disabled]:hover, -fieldset[disabled] .btn-danger:hover, -.btn-danger.disabled:focus, -.btn-danger[disabled]:focus, -fieldset[disabled] .btn-danger:focus, -.btn-danger.disabled.focus, -.btn-danger[disabled].focus, -fieldset[disabled] .btn-danger.focus, -.btn-danger.disabled:active, -.btn-danger[disabled]:active, -fieldset[disabled] .btn-danger:active, -.btn-danger.disabled.active, -.btn-danger[disabled].active, -fieldset[disabled] .btn-danger.active { - background-color: #c12e2a; - background-image: none; -} -.thumbnail, -.img-thumbnail { - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); - box-shadow: 0 1px 2px rgba(0, 0, 0, .075); -} -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus { - background-color: #e8e8e8; - background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); - background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); - background-repeat: repeat-x; -} -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - background-color: #2e6da4; - background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); - background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); - background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); - background-repeat: repeat-x; -} -.navbar-default { - background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); - background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8)); - background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); -} -.navbar-default .navbar-nav > .open > a, -.navbar-default .navbar-nav > .active > a { - background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); - background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2)); - background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0); - background-repeat: repeat-x; - -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); - box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); -} -.navbar-brand, -.navbar-nav > li > a { - text-shadow: 0 1px 0 rgba(255, 255, 255, .25); -} -.navbar-inverse { - background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); - background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222)); - background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-radius: 4px; -} -.navbar-inverse .navbar-nav > .open > a, -.navbar-inverse .navbar-nav > .active > a { - background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%); - background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f)); - background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0); - background-repeat: repeat-x; - -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); - box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); -} -.navbar-inverse .navbar-brand, -.navbar-inverse .navbar-nav > li > a { - text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); -} -.navbar-static-top, -.navbar-fixed-top, -.navbar-fixed-bottom { - border-radius: 0; -} -@media (max-width: 767px) { - .navbar .navbar-nav .open .dropdown-menu > .active > a, - .navbar .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #fff; - background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); - background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); - background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); - background-repeat: repeat-x; - } -} -.alert { - text-shadow: 0 1px 0 rgba(255, 255, 255, .2); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); -} -.alert-success { - background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); - background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc)); - background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); - background-repeat: repeat-x; - border-color: #b2dba1; -} -.alert-info { - background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); - background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0)); - background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); - background-repeat: repeat-x; - border-color: #9acfea; -} -.alert-warning { - background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); - background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0)); - background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); - background-repeat: repeat-x; - border-color: #f5e79e; -} -.alert-danger { - background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); - background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3)); - background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); - background-repeat: repeat-x; - border-color: #dca7a7; -} -.progress { - background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); - background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5)); - background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar { - background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%); - background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090)); - background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-success { - background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); - background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44)); - background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-info { - background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); - background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5)); - background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-warning { - background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); - background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f)); - background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-danger { - background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); - background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c)); - background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-striped { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.list-group { - border-radius: 4px; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); - box-shadow: 0 1px 2px rgba(0, 0, 0, .075); -} -.list-group-item.active, -.list-group-item.active:hover, -.list-group-item.active:focus { - text-shadow: 0 -1px 0 #286090; - background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%); - background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a)); - background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0); - background-repeat: repeat-x; - border-color: #2b669a; -} -.list-group-item.active .badge, -.list-group-item.active:hover .badge, -.list-group-item.active:focus .badge { - text-shadow: none; -} -.panel { - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); - box-shadow: 0 1px 2px rgba(0, 0, 0, .05); -} -.panel-default > .panel-heading { - background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); - background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); - background-repeat: repeat-x; -} -.panel-primary > .panel-heading { - background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); - background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); - background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); - background-repeat: repeat-x; -} -.panel-success > .panel-heading { - background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); - background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6)); - background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); - background-repeat: repeat-x; -} -.panel-info > .panel-heading { - background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); - background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3)); - background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); - background-repeat: repeat-x; -} -.panel-warning > .panel-heading { - background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); - background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc)); - background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); - background-repeat: repeat-x; -} -.panel-danger > .panel-heading { - background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); - background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc)); - background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); - background-repeat: repeat-x; -} -.well { - background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); - background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5)); - background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); - background-repeat: repeat-x; - border-color: #dcdcdc; - -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); - box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); -} -/*# sourceMappingURL=bootstrap-theme.css.map */ diff --git a/flask_admin/static/bootstrap/bootstrap3/css/bootstrap-theme.css.map b/flask_admin/static/bootstrap/bootstrap3/css/bootstrap-theme.css.map deleted file mode 100644 index 753531147..000000000 --- a/flask_admin/static/bootstrap/bootstrap3/css/bootstrap-theme.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["bootstrap-theme.css","less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"AAAA;;;;GAIG;ACeH;;;;;;EAME,yCAAA;EC2CA,4FAAA;EACQ,oFAAA;CFvDT;ACgBC;;;;;;;;;;;;ECsCA,yDAAA;EACQ,iDAAA;CFxCT;ACMC;;;;;;;;;;;;;;;;;;ECiCA,yBAAA;EACQ,iBAAA;CFnBT;AC/BD;;;;;;EAuBI,kBAAA;CDgBH;ACyBC;;EAEE,uBAAA;CDvBH;AC4BD;EErEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;EAuC2C,0BAAA;EAA2B,mBAAA;CDjBvE;ACpBC;;EAEE,0BAAA;EACA,6BAAA;CDsBH;ACnBC;;EAEE,0BAAA;EACA,sBAAA;CDqBH;ACfG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CD6BL;ACbD;EEtEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CD8DD;AC5DC;;EAEE,0BAAA;EACA,6BAAA;CD8DH;AC3DC;;EAEE,0BAAA;EACA,sBAAA;CD6DH;ACvDG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CDqEL;ACpDD;EEvEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CDsGD;ACpGC;;EAEE,0BAAA;EACA,6BAAA;CDsGH;ACnGC;;EAEE,0BAAA;EACA,sBAAA;CDqGH;AC/FG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CD6GL;AC3FD;EExEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CD8ID;AC5IC;;EAEE,0BAAA;EACA,6BAAA;CD8IH;AC3IC;;EAEE,0BAAA;EACA,sBAAA;CD6IH;ACvIG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CDqJL;AClID;EEzEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CDsLD;ACpLC;;EAEE,0BAAA;EACA,6BAAA;CDsLH;ACnLC;;EAEE,0BAAA;EACA,sBAAA;CDqLH;AC/KG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CD6LL;ACzKD;EE1EI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CD8ND;AC5NC;;EAEE,0BAAA;EACA,6BAAA;CD8NH;AC3NC;;EAEE,0BAAA;EACA,sBAAA;CD6NH;ACvNG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CDqOL;AC1MD;;EClCE,mDAAA;EACQ,2CAAA;CFgPT;ACrMD;;EE3FI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF0FF,0BAAA;CD2MD;ACzMD;;;EEhGI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EFgGF,0BAAA;CD+MD;ACtMD;EE7GI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;ECnBF,oEAAA;EH+HA,mBAAA;ECjEA,4FAAA;EACQ,oFAAA;CF8QT;ACjND;;EE7GI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;ED2CF,yDAAA;EACQ,iDAAA;CFwRT;AC9MD;;EAEE,+CAAA;CDgND;AC5MD;EEhII,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;ECnBF,oEAAA;EHkJA,mBAAA;CDkND;ACrND;;EEhII,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;ED2CF,wDAAA;EACQ,gDAAA;CF+ST;AC/ND;;EAYI,0CAAA;CDuNH;AClND;;;EAGE,iBAAA;CDoND;AC/LD;EAfI;;;IAGE,YAAA;IE7JF,yEAAA;IACA,oEAAA;IACA,8FAAA;IAAA,uEAAA;IACA,4BAAA;IACA,uHAAA;GH+WD;CACF;AC3MD;EACE,8CAAA;EC3HA,2FAAA;EACQ,mFAAA;CFyUT;ACnMD;EEtLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CD+MD;AC1MD;EEvLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CDuND;ACjND;EExLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CD+ND;ACxND;EEzLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CDuOD;ACxND;EEjMI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH4ZH;ACrND;EE3MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHmaH;AC3ND;EE5MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH0aH;ACjOD;EE7MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHibH;ACvOD;EE9MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHwbH;AC7OD;EE/MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH+bH;AChPD;EElLI,8MAAA;EACA,yMAAA;EACA,sMAAA;CHqaH;AC5OD;EACE,mBAAA;EC9KA,mDAAA;EACQ,2CAAA;CF6ZT;AC7OD;;;EAGE,8BAAA;EEnOE,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EFiOF,sBAAA;CDmPD;ACxPD;;;EAQI,kBAAA;CDqPH;AC3OD;ECnME,kDAAA;EACQ,0CAAA;CFibT;ACrOD;EE5PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHoeH;AC3OD;EE7PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH2eH;ACjPD;EE9PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHkfH;ACvPD;EE/PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHyfH;AC7PD;EEhQI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHggBH;ACnQD;EEjQI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHugBH;ACnQD;EExQI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EFsQF,sBAAA;EC3NA,0FAAA;EACQ,kFAAA;CFqeT","file":"bootstrap-theme.css","sourcesContent":["/*!\n * Bootstrap v3.3.5 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default.disabled,\n.btn-primary.disabled,\n.btn-success.disabled,\n.btn-info.disabled,\n.btn-warning.disabled,\n.btn-danger.disabled,\n.btn-default[disabled],\n.btn-primary[disabled],\n.btn-success[disabled],\n.btn-info[disabled],\n.btn-warning[disabled],\n.btn-danger[disabled],\nfieldset[disabled] .btn-default,\nfieldset[disabled] .btn-primary,\nfieldset[disabled] .btn-success,\nfieldset[disabled] .btn-info,\nfieldset[disabled] .btn-warning,\nfieldset[disabled] .btn-danger {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #265a88;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #265a88;\n border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #265a88;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-color: #2e6da4;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222222 100%);\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n@media (max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n }\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n}\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #286090;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","/*!\n * Bootstrap v3.3.5 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n .box-shadow(none);\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n border-radius: @navbar-border-radius;\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} \ No newline at end of file diff --git a/flask_admin/static/bootstrap/bootstrap3/css/bootstrap-theme.min.css b/flask_admin/static/bootstrap/bootstrap3/css/bootstrap-theme.min.css deleted file mode 100644 index 61358b13d..000000000 --- a/flask_admin/static/bootstrap/bootstrap3/css/bootstrap-theme.min.css +++ /dev/null @@ -1,5 +0,0 @@ -/*! - * Bootstrap v3.3.5 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} \ No newline at end of file diff --git a/flask_admin/static/bootstrap/bootstrap3/css/bootstrap.css b/flask_admin/static/bootstrap/bootstrap3/css/bootstrap.css deleted file mode 100644 index 680e76878..000000000 --- a/flask_admin/static/bootstrap/bootstrap3/css/bootstrap.css +++ /dev/null @@ -1,6800 +0,0 @@ -/*! - * Bootstrap v3.3.5 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ -/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ -html { - font-family: sans-serif; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} -body { - margin: 0; -} -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -menu, -nav, -section, -summary { - display: block; -} -audio, -canvas, -progress, -video { - display: inline-block; - vertical-align: baseline; -} -audio:not([controls]) { - display: none; - height: 0; -} -[hidden], -template { - display: none; -} -a { - background-color: transparent; -} -a:active, -a:hover { - outline: 0; -} -abbr[title] { - border-bottom: 1px dotted; -} -b, -strong { - font-weight: bold; -} -dfn { - font-style: italic; -} -h1 { - margin: .67em 0; - font-size: 2em; -} -mark { - color: #000; - background: #ff0; -} -small { - font-size: 80%; -} -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} -sup { - top: -.5em; -} -sub { - bottom: -.25em; -} -img { - border: 0; -} -svg:not(:root) { - overflow: hidden; -} -figure { - margin: 1em 40px; -} -hr { - height: 0; - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; -} -pre { - overflow: auto; -} -code, -kbd, -pre, -samp { - font-family: monospace, monospace; - font-size: 1em; -} -button, -input, -optgroup, -select, -textarea { - margin: 0; - font: inherit; - color: inherit; -} -button { - overflow: visible; -} -button, -select { - text-transform: none; -} -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; - cursor: pointer; -} -button[disabled], -html input[disabled] { - cursor: default; -} -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} -input { - line-height: normal; -} -input[type="checkbox"], -input[type="radio"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 0; -} -input[type="number"]::-webkit-inner-spin-button, -input[type="number"]::-webkit-outer-spin-button { - height: auto; -} -input[type="search"] { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: textfield; -} -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} -fieldset { - padding: .35em .625em .75em; - margin: 0 2px; - border: 1px solid #c0c0c0; -} -legend { - padding: 0; - border: 0; -} -textarea { - overflow: auto; -} -optgroup { - font-weight: bold; -} -table { - border-spacing: 0; - border-collapse: collapse; -} -td, -th { - padding: 0; -} -/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ -@media print { - *, - *:before, - *:after { - color: #000 !important; - text-shadow: none !important; - background: transparent !important; - -webkit-box-shadow: none !important; - box-shadow: none !important; - } - a, - a:visited { - text-decoration: underline; - } - a[href]:after { - content: " (" attr(href) ")"; - } - abbr[title]:after { - content: " (" attr(title) ")"; - } - a[href^="#"]:after, - a[href^="javascript:"]:after { - content: ""; - } - pre, - blockquote { - border: 1px solid #999; - - page-break-inside: avoid; - } - thead { - display: table-header-group; - } - tr, - img { - page-break-inside: avoid; - } - img { - max-width: 100% !important; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } - .navbar { - display: none; - } - .btn > .caret, - .dropup > .btn > .caret { - border-top-color: #000 !important; - } - .label { - border: 1px solid #000; - } - .table { - border-collapse: collapse !important; - } - .table td, - .table th { - background-color: #fff !important; - } - .table-bordered th, - .table-bordered td { - border: 1px solid #ddd !important; - } -} -@font-face { - font-family: 'Glyphicons Halflings'; - - src: url('../fonts/glyphicons-halflings-regular.eot'); - src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); -} -.glyphicon { - position: relative; - top: 1px; - display: inline-block; - font-family: 'Glyphicons Halflings'; - font-style: normal; - font-weight: normal; - line-height: 1; - - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -.glyphicon-asterisk:before { - content: "\2a"; -} -.glyphicon-plus:before { - content: "\2b"; -} -.glyphicon-euro:before, -.glyphicon-eur:before { - content: "\20ac"; -} -.glyphicon-minus:before { - content: "\2212"; -} -.glyphicon-cloud:before { - content: "\2601"; -} -.glyphicon-envelope:before { - content: "\2709"; -} -.glyphicon-pencil:before { - content: "\270f"; -} -.glyphicon-glass:before { - content: "\e001"; -} -.glyphicon-music:before { - content: "\e002"; -} -.glyphicon-search:before { - content: "\e003"; -} -.glyphicon-heart:before { - content: "\e005"; -} -.glyphicon-star:before { - content: "\e006"; -} -.glyphicon-star-empty:before { - content: "\e007"; -} -.glyphicon-user:before { - content: "\e008"; -} -.glyphicon-film:before { - content: "\e009"; -} -.glyphicon-th-large:before { - content: "\e010"; -} -.glyphicon-th:before { - content: "\e011"; -} -.glyphicon-th-list:before { - content: "\e012"; -} -.glyphicon-ok:before { - content: "\e013"; -} -.glyphicon-remove:before { - content: "\e014"; -} -.glyphicon-zoom-in:before { - content: "\e015"; -} -.glyphicon-zoom-out:before { - content: "\e016"; -} -.glyphicon-off:before { - content: "\e017"; -} -.glyphicon-signal:before { - content: "\e018"; -} -.glyphicon-cog:before { - content: "\e019"; -} -.glyphicon-trash:before { - content: "\e020"; -} -.glyphicon-home:before { - content: "\e021"; -} -.glyphicon-file:before { - content: "\e022"; -} -.glyphicon-time:before { - content: "\e023"; -} -.glyphicon-road:before { - content: "\e024"; -} -.glyphicon-download-alt:before { - content: "\e025"; -} -.glyphicon-download:before { - content: "\e026"; -} -.glyphicon-upload:before { - content: "\e027"; -} -.glyphicon-inbox:before { - content: "\e028"; -} -.glyphicon-play-circle:before { - content: "\e029"; -} -.glyphicon-repeat:before { - content: "\e030"; -} -.glyphicon-refresh:before { - content: "\e031"; -} -.glyphicon-list-alt:before { - content: "\e032"; -} -.glyphicon-lock:before { - content: "\e033"; -} -.glyphicon-flag:before { - content: "\e034"; -} -.glyphicon-headphones:before { - content: "\e035"; -} -.glyphicon-volume-off:before { - content: "\e036"; -} -.glyphicon-volume-down:before { - content: "\e037"; -} -.glyphicon-volume-up:before { - content: "\e038"; -} -.glyphicon-qrcode:before { - content: "\e039"; -} -.glyphicon-barcode:before { - content: "\e040"; -} -.glyphicon-tag:before { - content: "\e041"; -} -.glyphicon-tags:before { - content: "\e042"; -} -.glyphicon-book:before { - content: "\e043"; -} -.glyphicon-bookmark:before { - content: "\e044"; -} -.glyphicon-print:before { - content: "\e045"; -} -.glyphicon-camera:before { - content: "\e046"; -} -.glyphicon-font:before { - content: "\e047"; -} -.glyphicon-bold:before { - content: "\e048"; -} -.glyphicon-italic:before { - content: "\e049"; -} -.glyphicon-text-height:before { - content: "\e050"; -} -.glyphicon-text-width:before { - content: "\e051"; -} -.glyphicon-align-left:before { - content: "\e052"; -} -.glyphicon-align-center:before { - content: "\e053"; -} -.glyphicon-align-right:before { - content: "\e054"; -} -.glyphicon-align-justify:before { - content: "\e055"; -} -.glyphicon-list:before { - content: "\e056"; -} -.glyphicon-indent-left:before { - content: "\e057"; -} -.glyphicon-indent-right:before { - content: "\e058"; -} -.glyphicon-facetime-video:before { - content: "\e059"; -} -.glyphicon-picture:before { - content: "\e060"; -} -.glyphicon-map-marker:before { - content: "\e062"; -} -.glyphicon-adjust:before { - content: "\e063"; -} -.glyphicon-tint:before { - content: "\e064"; -} -.glyphicon-edit:before { - content: "\e065"; -} -.glyphicon-share:before { - content: "\e066"; -} -.glyphicon-check:before { - content: "\e067"; -} -.glyphicon-move:before { - content: "\e068"; -} -.glyphicon-step-backward:before { - content: "\e069"; -} -.glyphicon-fast-backward:before { - content: "\e070"; -} -.glyphicon-backward:before { - content: "\e071"; -} -.glyphicon-play:before { - content: "\e072"; -} -.glyphicon-pause:before { - content: "\e073"; -} -.glyphicon-stop:before { - content: "\e074"; -} -.glyphicon-forward:before { - content: "\e075"; -} -.glyphicon-fast-forward:before { - content: "\e076"; -} -.glyphicon-step-forward:before { - content: "\e077"; -} -.glyphicon-eject:before { - content: "\e078"; -} -.glyphicon-chevron-left:before { - content: "\e079"; -} -.glyphicon-chevron-right:before { - content: "\e080"; -} -.glyphicon-plus-sign:before { - content: "\e081"; -} -.glyphicon-minus-sign:before { - content: "\e082"; -} -.glyphicon-remove-sign:before { - content: "\e083"; -} -.glyphicon-ok-sign:before { - content: "\e084"; -} -.glyphicon-question-sign:before { - content: "\e085"; -} -.glyphicon-info-sign:before { - content: "\e086"; -} -.glyphicon-screenshot:before { - content: "\e087"; -} -.glyphicon-remove-circle:before { - content: "\e088"; -} -.glyphicon-ok-circle:before { - content: "\e089"; -} -.glyphicon-ban-circle:before { - content: "\e090"; -} -.glyphicon-arrow-left:before { - content: "\e091"; -} -.glyphicon-arrow-right:before { - content: "\e092"; -} -.glyphicon-arrow-up:before { - content: "\e093"; -} -.glyphicon-arrow-down:before { - content: "\e094"; -} -.glyphicon-share-alt:before { - content: "\e095"; -} -.glyphicon-resize-full:before { - content: "\e096"; -} -.glyphicon-resize-small:before { - content: "\e097"; -} -.glyphicon-exclamation-sign:before { - content: "\e101"; -} -.glyphicon-gift:before { - content: "\e102"; -} -.glyphicon-leaf:before { - content: "\e103"; -} -.glyphicon-fire:before { - content: "\e104"; -} -.glyphicon-eye-open:before { - content: "\e105"; -} -.glyphicon-eye-close:before { - content: "\e106"; -} -.glyphicon-warning-sign:before { - content: "\e107"; -} -.glyphicon-plane:before { - content: "\e108"; -} -.glyphicon-calendar:before { - content: "\e109"; -} -.glyphicon-random:before { - content: "\e110"; -} -.glyphicon-comment:before { - content: "\e111"; -} -.glyphicon-magnet:before { - content: "\e112"; -} -.glyphicon-chevron-up:before { - content: "\e113"; -} -.glyphicon-chevron-down:before { - content: "\e114"; -} -.glyphicon-retweet:before { - content: "\e115"; -} -.glyphicon-shopping-cart:before { - content: "\e116"; -} -.glyphicon-folder-close:before { - content: "\e117"; -} -.glyphicon-folder-open:before { - content: "\e118"; -} -.glyphicon-resize-vertical:before { - content: "\e119"; -} -.glyphicon-resize-horizontal:before { - content: "\e120"; -} -.glyphicon-hdd:before { - content: "\e121"; -} -.glyphicon-bullhorn:before { - content: "\e122"; -} -.glyphicon-bell:before { - content: "\e123"; -} -.glyphicon-certificate:before { - content: "\e124"; -} -.glyphicon-thumbs-up:before { - content: "\e125"; -} -.glyphicon-thumbs-down:before { - content: "\e126"; -} -.glyphicon-hand-right:before { - content: "\e127"; -} -.glyphicon-hand-left:before { - content: "\e128"; -} -.glyphicon-hand-up:before { - content: "\e129"; -} -.glyphicon-hand-down:before { - content: "\e130"; -} -.glyphicon-circle-arrow-right:before { - content: "\e131"; -} -.glyphicon-circle-arrow-left:before { - content: "\e132"; -} -.glyphicon-circle-arrow-up:before { - content: "\e133"; -} -.glyphicon-circle-arrow-down:before { - content: "\e134"; -} -.glyphicon-globe:before { - content: "\e135"; -} -.glyphicon-wrench:before { - content: "\e136"; -} -.glyphicon-tasks:before { - content: "\e137"; -} -.glyphicon-filter:before { - content: "\e138"; -} -.glyphicon-briefcase:before { - content: "\e139"; -} -.glyphicon-fullscreen:before { - content: "\e140"; -} -.glyphicon-dashboard:before { - content: "\e141"; -} -.glyphicon-paperclip:before { - content: "\e142"; -} -.glyphicon-heart-empty:before { - content: "\e143"; -} -.glyphicon-link:before { - content: "\e144"; -} -.glyphicon-phone:before { - content: "\e145"; -} -.glyphicon-pushpin:before { - content: "\e146"; -} -.glyphicon-usd:before { - content: "\e148"; -} -.glyphicon-gbp:before { - content: "\e149"; -} -.glyphicon-sort:before { - content: "\e150"; -} -.glyphicon-sort-by-alphabet:before { - content: "\e151"; -} -.glyphicon-sort-by-alphabet-alt:before { - content: "\e152"; -} -.glyphicon-sort-by-order:before { - content: "\e153"; -} -.glyphicon-sort-by-order-alt:before { - content: "\e154"; -} -.glyphicon-sort-by-attributes:before { - content: "\e155"; -} -.glyphicon-sort-by-attributes-alt:before { - content: "\e156"; -} -.glyphicon-unchecked:before { - content: "\e157"; -} -.glyphicon-expand:before { - content: "\e158"; -} -.glyphicon-collapse-down:before { - content: "\e159"; -} -.glyphicon-collapse-up:before { - content: "\e160"; -} -.glyphicon-log-in:before { - content: "\e161"; -} -.glyphicon-flash:before { - content: "\e162"; -} -.glyphicon-log-out:before { - content: "\e163"; -} -.glyphicon-new-window:before { - content: "\e164"; -} -.glyphicon-record:before { - content: "\e165"; -} -.glyphicon-save:before { - content: "\e166"; -} -.glyphicon-open:before { - content: "\e167"; -} -.glyphicon-saved:before { - content: "\e168"; -} -.glyphicon-import:before { - content: "\e169"; -} -.glyphicon-export:before { - content: "\e170"; -} -.glyphicon-send:before { - content: "\e171"; -} -.glyphicon-floppy-disk:before { - content: "\e172"; -} -.glyphicon-floppy-saved:before { - content: "\e173"; -} -.glyphicon-floppy-remove:before { - content: "\e174"; -} -.glyphicon-floppy-save:before { - content: "\e175"; -} -.glyphicon-floppy-open:before { - content: "\e176"; -} -.glyphicon-credit-card:before { - content: "\e177"; -} -.glyphicon-transfer:before { - content: "\e178"; -} -.glyphicon-cutlery:before { - content: "\e179"; -} -.glyphicon-header:before { - content: "\e180"; -} -.glyphicon-compressed:before { - content: "\e181"; -} -.glyphicon-earphone:before { - content: "\e182"; -} -.glyphicon-phone-alt:before { - content: "\e183"; -} -.glyphicon-tower:before { - content: "\e184"; -} -.glyphicon-stats:before { - content: "\e185"; -} -.glyphicon-sd-video:before { - content: "\e186"; -} -.glyphicon-hd-video:before { - content: "\e187"; -} -.glyphicon-subtitles:before { - content: "\e188"; -} -.glyphicon-sound-stereo:before { - content: "\e189"; -} -.glyphicon-sound-dolby:before { - content: "\e190"; -} -.glyphicon-sound-5-1:before { - content: "\e191"; -} -.glyphicon-sound-6-1:before { - content: "\e192"; -} -.glyphicon-sound-7-1:before { - content: "\e193"; -} -.glyphicon-copyright-mark:before { - content: "\e194"; -} -.glyphicon-registration-mark:before { - content: "\e195"; -} -.glyphicon-cloud-download:before { - content: "\e197"; -} -.glyphicon-cloud-upload:before { - content: "\e198"; -} -.glyphicon-tree-conifer:before { - content: "\e199"; -} -.glyphicon-tree-deciduous:before { - content: "\e200"; -} -.glyphicon-cd:before { - content: "\e201"; -} -.glyphicon-save-file:before { - content: "\e202"; -} -.glyphicon-open-file:before { - content: "\e203"; -} -.glyphicon-level-up:before { - content: "\e204"; -} -.glyphicon-copy:before { - content: "\e205"; -} -.glyphicon-paste:before { - content: "\e206"; -} -.glyphicon-alert:before { - content: "\e209"; -} -.glyphicon-equalizer:before { - content: "\e210"; -} -.glyphicon-king:before { - content: "\e211"; -} -.glyphicon-queen:before { - content: "\e212"; -} -.glyphicon-pawn:before { - content: "\e213"; -} -.glyphicon-bishop:before { - content: "\e214"; -} -.glyphicon-knight:before { - content: "\e215"; -} -.glyphicon-baby-formula:before { - content: "\e216"; -} -.glyphicon-tent:before { - content: "\26fa"; -} -.glyphicon-blackboard:before { - content: "\e218"; -} -.glyphicon-bed:before { - content: "\e219"; -} -.glyphicon-apple:before { - content: "\f8ff"; -} -.glyphicon-erase:before { - content: "\e221"; -} -.glyphicon-hourglass:before { - content: "\231b"; -} -.glyphicon-lamp:before { - content: "\e223"; -} -.glyphicon-duplicate:before { - content: "\e224"; -} -.glyphicon-piggy-bank:before { - content: "\e225"; -} -.glyphicon-scissors:before { - content: "\e226"; -} -.glyphicon-bitcoin:before { - content: "\e227"; -} -.glyphicon-btc:before { - content: "\e227"; -} -.glyphicon-xbt:before { - content: "\e227"; -} -.glyphicon-yen:before { - content: "\00a5"; -} -.glyphicon-jpy:before { - content: "\00a5"; -} -.glyphicon-ruble:before { - content: "\20bd"; -} -.glyphicon-rub:before { - content: "\20bd"; -} -.glyphicon-scale:before { - content: "\e230"; -} -.glyphicon-ice-lolly:before { - content: "\e231"; -} -.glyphicon-ice-lolly-tasted:before { - content: "\e232"; -} -.glyphicon-education:before { - content: "\e233"; -} -.glyphicon-option-horizontal:before { - content: "\e234"; -} -.glyphicon-option-vertical:before { - content: "\e235"; -} -.glyphicon-menu-hamburger:before { - content: "\e236"; -} -.glyphicon-modal-window:before { - content: "\e237"; -} -.glyphicon-oil:before { - content: "\e238"; -} -.glyphicon-grain:before { - content: "\e239"; -} -.glyphicon-sunglasses:before { - content: "\e240"; -} -.glyphicon-text-size:before { - content: "\e241"; -} -.glyphicon-text-color:before { - content: "\e242"; -} -.glyphicon-text-background:before { - content: "\e243"; -} -.glyphicon-object-align-top:before { - content: "\e244"; -} -.glyphicon-object-align-bottom:before { - content: "\e245"; -} -.glyphicon-object-align-horizontal:before { - content: "\e246"; -} -.glyphicon-object-align-left:before { - content: "\e247"; -} -.glyphicon-object-align-vertical:before { - content: "\e248"; -} -.glyphicon-object-align-right:before { - content: "\e249"; -} -.glyphicon-triangle-right:before { - content: "\e250"; -} -.glyphicon-triangle-left:before { - content: "\e251"; -} -.glyphicon-triangle-bottom:before { - content: "\e252"; -} -.glyphicon-triangle-top:before { - content: "\e253"; -} -.glyphicon-console:before { - content: "\e254"; -} -.glyphicon-superscript:before { - content: "\e255"; -} -.glyphicon-subscript:before { - content: "\e256"; -} -.glyphicon-menu-left:before { - content: "\e257"; -} -.glyphicon-menu-right:before { - content: "\e258"; -} -.glyphicon-menu-down:before { - content: "\e259"; -} -.glyphicon-menu-up:before { - content: "\e260"; -} -* { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -*:before, -*:after { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -html { - font-size: 10px; - - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} -body { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 1.42857143; - color: #333; - background-color: #fff; -} -input, -button, -select, -textarea { - font-family: inherit; - font-size: inherit; - line-height: inherit; -} -a { - color: #337ab7; - text-decoration: none; -} -a:hover, -a:focus { - color: #23527c; - text-decoration: underline; -} -a:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -figure { - margin: 0; -} -img { - vertical-align: middle; -} -.img-responsive, -.thumbnail > img, -.thumbnail a > img, -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - display: block; - max-width: 100%; - height: auto; -} -.img-rounded { - border-radius: 6px; -} -.img-thumbnail { - display: inline-block; - max-width: 100%; - height: auto; - padding: 4px; - line-height: 1.42857143; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 4px; - -webkit-transition: all .2s ease-in-out; - -o-transition: all .2s ease-in-out; - transition: all .2s ease-in-out; -} -.img-circle { - border-radius: 50%; -} -hr { - margin-top: 20px; - margin-bottom: 20px; - border: 0; - border-top: 1px solid #eee; -} -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - border: 0; -} -.sr-only-focusable:active, -.sr-only-focusable:focus { - position: static; - width: auto; - height: auto; - margin: 0; - overflow: visible; - clip: auto; -} -[role="button"] { - cursor: pointer; -} -h1, -h2, -h3, -h4, -h5, -h6, -.h1, -.h2, -.h3, -.h4, -.h5, -.h6 { - font-family: inherit; - font-weight: 500; - line-height: 1.1; - color: inherit; -} -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small, -.h1 small, -.h2 small, -.h3 small, -.h4 small, -.h5 small, -.h6 small, -h1 .small, -h2 .small, -h3 .small, -h4 .small, -h5 .small, -h6 .small, -.h1 .small, -.h2 .small, -.h3 .small, -.h4 .small, -.h5 .small, -.h6 .small { - font-weight: normal; - line-height: 1; - color: #777; -} -h1, -.h1, -h2, -.h2, -h3, -.h3 { - margin-top: 20px; - margin-bottom: 10px; -} -h1 small, -.h1 small, -h2 small, -.h2 small, -h3 small, -.h3 small, -h1 .small, -.h1 .small, -h2 .small, -.h2 .small, -h3 .small, -.h3 .small { - font-size: 65%; -} -h4, -.h4, -h5, -.h5, -h6, -.h6 { - margin-top: 10px; - margin-bottom: 10px; -} -h4 small, -.h4 small, -h5 small, -.h5 small, -h6 small, -.h6 small, -h4 .small, -.h4 .small, -h5 .small, -.h5 .small, -h6 .small, -.h6 .small { - font-size: 75%; -} -h1, -.h1 { - font-size: 36px; -} -h2, -.h2 { - font-size: 30px; -} -h3, -.h3 { - font-size: 24px; -} -h4, -.h4 { - font-size: 18px; -} -h5, -.h5 { - font-size: 14px; -} -h6, -.h6 { - font-size: 12px; -} -p { - margin: 0 0 10px; -} -.lead { - margin-bottom: 20px; - font-size: 16px; - font-weight: 300; - line-height: 1.4; -} -@media (min-width: 768px) { - .lead { - font-size: 21px; - } -} -small, -.small { - font-size: 85%; -} -mark, -.mark { - padding: .2em; - background-color: #fcf8e3; -} -.text-left { - text-align: left; -} -.text-right { - text-align: right; -} -.text-center { - text-align: center; -} -.text-justify { - text-align: justify; -} -.text-nowrap { - white-space: nowrap; -} -.text-lowercase { - text-transform: lowercase; -} -.text-uppercase { - text-transform: uppercase; -} -.text-capitalize { - text-transform: capitalize; -} -.text-muted { - color: #777; -} -.text-primary { - color: #337ab7; -} -a.text-primary:hover, -a.text-primary:focus { - color: #286090; -} -.text-success { - color: #3c763d; -} -a.text-success:hover, -a.text-success:focus { - color: #2b542c; -} -.text-info { - color: #31708f; -} -a.text-info:hover, -a.text-info:focus { - color: #245269; -} -.text-warning { - color: #8a6d3b; -} -a.text-warning:hover, -a.text-warning:focus { - color: #66512c; -} -.text-danger { - color: #a94442; -} -a.text-danger:hover, -a.text-danger:focus { - color: #843534; -} -.bg-primary { - color: #fff; - background-color: #337ab7; -} -a.bg-primary:hover, -a.bg-primary:focus { - background-color: #286090; -} -.bg-success { - background-color: #dff0d8; -} -a.bg-success:hover, -a.bg-success:focus { - background-color: #c1e2b3; -} -.bg-info { - background-color: #d9edf7; -} -a.bg-info:hover, -a.bg-info:focus { - background-color: #afd9ee; -} -.bg-warning { - background-color: #fcf8e3; -} -a.bg-warning:hover, -a.bg-warning:focus { - background-color: #f7ecb5; -} -.bg-danger { - background-color: #f2dede; -} -a.bg-danger:hover, -a.bg-danger:focus { - background-color: #e4b9b9; -} -.page-header { - padding-bottom: 9px; - margin: 40px 0 20px; - border-bottom: 1px solid #eee; -} -ul, -ol { - margin-top: 0; - margin-bottom: 10px; -} -ul ul, -ol ul, -ul ol, -ol ol { - margin-bottom: 0; -} -.list-unstyled { - padding-left: 0; - list-style: none; -} -.list-inline { - padding-left: 0; - margin-left: -5px; - list-style: none; -} -.list-inline > li { - display: inline-block; - padding-right: 5px; - padding-left: 5px; -} -dl { - margin-top: 0; - margin-bottom: 20px; -} -dt, -dd { - line-height: 1.42857143; -} -dt { - font-weight: bold; -} -dd { - margin-left: 0; -} -@media (min-width: 768px) { - .dl-horizontal dt { - float: left; - width: 160px; - overflow: hidden; - clear: left; - text-align: right; - text-overflow: ellipsis; - white-space: nowrap; - } - .dl-horizontal dd { - margin-left: 180px; - } -} -abbr[title], -abbr[data-original-title] { - cursor: help; - border-bottom: 1px dotted #777; -} -.initialism { - font-size: 90%; - text-transform: uppercase; -} -blockquote { - padding: 10px 20px; - margin: 0 0 20px; - font-size: 17.5px; - border-left: 5px solid #eee; -} -blockquote p:last-child, -blockquote ul:last-child, -blockquote ol:last-child { - margin-bottom: 0; -} -blockquote footer, -blockquote small, -blockquote .small { - display: block; - font-size: 80%; - line-height: 1.42857143; - color: #777; -} -blockquote footer:before, -blockquote small:before, -blockquote .small:before { - content: '\2014 \00A0'; -} -.blockquote-reverse, -blockquote.pull-right { - padding-right: 15px; - padding-left: 0; - text-align: right; - border-right: 5px solid #eee; - border-left: 0; -} -.blockquote-reverse footer:before, -blockquote.pull-right footer:before, -.blockquote-reverse small:before, -blockquote.pull-right small:before, -.blockquote-reverse .small:before, -blockquote.pull-right .small:before { - content: ''; -} -.blockquote-reverse footer:after, -blockquote.pull-right footer:after, -.blockquote-reverse small:after, -blockquote.pull-right small:after, -.blockquote-reverse .small:after, -blockquote.pull-right .small:after { - content: '\00A0 \2014'; -} -address { - margin-bottom: 20px; - font-style: normal; - line-height: 1.42857143; -} -code, -kbd, -pre, -samp { - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; -} -code { - padding: 2px 4px; - font-size: 90%; - color: #c7254e; - background-color: #f9f2f4; - border-radius: 4px; -} -kbd { - padding: 2px 4px; - font-size: 90%; - color: #fff; - background-color: #333; - border-radius: 3px; - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); -} -kbd kbd { - padding: 0; - font-size: 100%; - font-weight: bold; - -webkit-box-shadow: none; - box-shadow: none; -} -pre { - display: block; - padding: 9.5px; - margin: 0 0 10px; - font-size: 13px; - line-height: 1.42857143; - color: #333; - word-break: break-all; - word-wrap: break-word; - background-color: #f5f5f5; - border: 1px solid #ccc; - border-radius: 4px; -} -pre code { - padding: 0; - font-size: inherit; - color: inherit; - white-space: pre-wrap; - background-color: transparent; - border-radius: 0; -} -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} -.container { - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; -} -@media (min-width: 768px) { - .container { - width: 750px; - } -} -@media (min-width: 992px) { - .container { - width: 970px; - } -} -@media (min-width: 1200px) { - .container { - width: 1170px; - } -} -.container-fluid { - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; -} -.row { - margin-right: -15px; - margin-left: -15px; -} -.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; -} -.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { - float: left; -} -.col-xs-12 { - width: 100%; -} -.col-xs-11 { - width: 91.66666667%; -} -.col-xs-10 { - width: 83.33333333%; -} -.col-xs-9 { - width: 75%; -} -.col-xs-8 { - width: 66.66666667%; -} -.col-xs-7 { - width: 58.33333333%; -} -.col-xs-6 { - width: 50%; -} -.col-xs-5 { - width: 41.66666667%; -} -.col-xs-4 { - width: 33.33333333%; -} -.col-xs-3 { - width: 25%; -} -.col-xs-2 { - width: 16.66666667%; -} -.col-xs-1 { - width: 8.33333333%; -} -.col-xs-pull-12 { - right: 100%; -} -.col-xs-pull-11 { - right: 91.66666667%; -} -.col-xs-pull-10 { - right: 83.33333333%; -} -.col-xs-pull-9 { - right: 75%; -} -.col-xs-pull-8 { - right: 66.66666667%; -} -.col-xs-pull-7 { - right: 58.33333333%; -} -.col-xs-pull-6 { - right: 50%; -} -.col-xs-pull-5 { - right: 41.66666667%; -} -.col-xs-pull-4 { - right: 33.33333333%; -} -.col-xs-pull-3 { - right: 25%; -} -.col-xs-pull-2 { - right: 16.66666667%; -} -.col-xs-pull-1 { - right: 8.33333333%; -} -.col-xs-pull-0 { - right: auto; -} -.col-xs-push-12 { - left: 100%; -} -.col-xs-push-11 { - left: 91.66666667%; -} -.col-xs-push-10 { - left: 83.33333333%; -} -.col-xs-push-9 { - left: 75%; -} -.col-xs-push-8 { - left: 66.66666667%; -} -.col-xs-push-7 { - left: 58.33333333%; -} -.col-xs-push-6 { - left: 50%; -} -.col-xs-push-5 { - left: 41.66666667%; -} -.col-xs-push-4 { - left: 33.33333333%; -} -.col-xs-push-3 { - left: 25%; -} -.col-xs-push-2 { - left: 16.66666667%; -} -.col-xs-push-1 { - left: 8.33333333%; -} -.col-xs-push-0 { - left: auto; -} -.col-xs-offset-12 { - margin-left: 100%; -} -.col-xs-offset-11 { - margin-left: 91.66666667%; -} -.col-xs-offset-10 { - margin-left: 83.33333333%; -} -.col-xs-offset-9 { - margin-left: 75%; -} -.col-xs-offset-8 { - margin-left: 66.66666667%; -} -.col-xs-offset-7 { - margin-left: 58.33333333%; -} -.col-xs-offset-6 { - margin-left: 50%; -} -.col-xs-offset-5 { - margin-left: 41.66666667%; -} -.col-xs-offset-4 { - margin-left: 33.33333333%; -} -.col-xs-offset-3 { - margin-left: 25%; -} -.col-xs-offset-2 { - margin-left: 16.66666667%; -} -.col-xs-offset-1 { - margin-left: 8.33333333%; -} -.col-xs-offset-0 { - margin-left: 0; -} -@media (min-width: 768px) { - .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { - float: left; - } - .col-sm-12 { - width: 100%; - } - .col-sm-11 { - width: 91.66666667%; - } - .col-sm-10 { - width: 83.33333333%; - } - .col-sm-9 { - width: 75%; - } - .col-sm-8 { - width: 66.66666667%; - } - .col-sm-7 { - width: 58.33333333%; - } - .col-sm-6 { - width: 50%; - } - .col-sm-5 { - width: 41.66666667%; - } - .col-sm-4 { - width: 33.33333333%; - } - .col-sm-3 { - width: 25%; - } - .col-sm-2 { - width: 16.66666667%; - } - .col-sm-1 { - width: 8.33333333%; - } - .col-sm-pull-12 { - right: 100%; - } - .col-sm-pull-11 { - right: 91.66666667%; - } - .col-sm-pull-10 { - right: 83.33333333%; - } - .col-sm-pull-9 { - right: 75%; - } - .col-sm-pull-8 { - right: 66.66666667%; - } - .col-sm-pull-7 { - right: 58.33333333%; - } - .col-sm-pull-6 { - right: 50%; - } - .col-sm-pull-5 { - right: 41.66666667%; - } - .col-sm-pull-4 { - right: 33.33333333%; - } - .col-sm-pull-3 { - right: 25%; - } - .col-sm-pull-2 { - right: 16.66666667%; - } - .col-sm-pull-1 { - right: 8.33333333%; - } - .col-sm-pull-0 { - right: auto; - } - .col-sm-push-12 { - left: 100%; - } - .col-sm-push-11 { - left: 91.66666667%; - } - .col-sm-push-10 { - left: 83.33333333%; - } - .col-sm-push-9 { - left: 75%; - } - .col-sm-push-8 { - left: 66.66666667%; - } - .col-sm-push-7 { - left: 58.33333333%; - } - .col-sm-push-6 { - left: 50%; - } - .col-sm-push-5 { - left: 41.66666667%; - } - .col-sm-push-4 { - left: 33.33333333%; - } - .col-sm-push-3 { - left: 25%; - } - .col-sm-push-2 { - left: 16.66666667%; - } - .col-sm-push-1 { - left: 8.33333333%; - } - .col-sm-push-0 { - left: auto; - } - .col-sm-offset-12 { - margin-left: 100%; - } - .col-sm-offset-11 { - margin-left: 91.66666667%; - } - .col-sm-offset-10 { - margin-left: 83.33333333%; - } - .col-sm-offset-9 { - margin-left: 75%; - } - .col-sm-offset-8 { - margin-left: 66.66666667%; - } - .col-sm-offset-7 { - margin-left: 58.33333333%; - } - .col-sm-offset-6 { - margin-left: 50%; - } - .col-sm-offset-5 { - margin-left: 41.66666667%; - } - .col-sm-offset-4 { - margin-left: 33.33333333%; - } - .col-sm-offset-3 { - margin-left: 25%; - } - .col-sm-offset-2 { - margin-left: 16.66666667%; - } - .col-sm-offset-1 { - margin-left: 8.33333333%; - } - .col-sm-offset-0 { - margin-left: 0; - } -} -@media (min-width: 992px) { - .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { - float: left; - } - .col-md-12 { - width: 100%; - } - .col-md-11 { - width: 91.66666667%; - } - .col-md-10 { - width: 83.33333333%; - } - .col-md-9 { - width: 75%; - } - .col-md-8 { - width: 66.66666667%; - } - .col-md-7 { - width: 58.33333333%; - } - .col-md-6 { - width: 50%; - } - .col-md-5 { - width: 41.66666667%; - } - .col-md-4 { - width: 33.33333333%; - } - .col-md-3 { - width: 25%; - } - .col-md-2 { - width: 16.66666667%; - } - .col-md-1 { - width: 8.33333333%; - } - .col-md-pull-12 { - right: 100%; - } - .col-md-pull-11 { - right: 91.66666667%; - } - .col-md-pull-10 { - right: 83.33333333%; - } - .col-md-pull-9 { - right: 75%; - } - .col-md-pull-8 { - right: 66.66666667%; - } - .col-md-pull-7 { - right: 58.33333333%; - } - .col-md-pull-6 { - right: 50%; - } - .col-md-pull-5 { - right: 41.66666667%; - } - .col-md-pull-4 { - right: 33.33333333%; - } - .col-md-pull-3 { - right: 25%; - } - .col-md-pull-2 { - right: 16.66666667%; - } - .col-md-pull-1 { - right: 8.33333333%; - } - .col-md-pull-0 { - right: auto; - } - .col-md-push-12 { - left: 100%; - } - .col-md-push-11 { - left: 91.66666667%; - } - .col-md-push-10 { - left: 83.33333333%; - } - .col-md-push-9 { - left: 75%; - } - .col-md-push-8 { - left: 66.66666667%; - } - .col-md-push-7 { - left: 58.33333333%; - } - .col-md-push-6 { - left: 50%; - } - .col-md-push-5 { - left: 41.66666667%; - } - .col-md-push-4 { - left: 33.33333333%; - } - .col-md-push-3 { - left: 25%; - } - .col-md-push-2 { - left: 16.66666667%; - } - .col-md-push-1 { - left: 8.33333333%; - } - .col-md-push-0 { - left: auto; - } - .col-md-offset-12 { - margin-left: 100%; - } - .col-md-offset-11 { - margin-left: 91.66666667%; - } - .col-md-offset-10 { - margin-left: 83.33333333%; - } - .col-md-offset-9 { - margin-left: 75%; - } - .col-md-offset-8 { - margin-left: 66.66666667%; - } - .col-md-offset-7 { - margin-left: 58.33333333%; - } - .col-md-offset-6 { - margin-left: 50%; - } - .col-md-offset-5 { - margin-left: 41.66666667%; - } - .col-md-offset-4 { - margin-left: 33.33333333%; - } - .col-md-offset-3 { - margin-left: 25%; - } - .col-md-offset-2 { - margin-left: 16.66666667%; - } - .col-md-offset-1 { - margin-left: 8.33333333%; - } - .col-md-offset-0 { - margin-left: 0; - } -} -@media (min-width: 1200px) { - .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { - float: left; - } - .col-lg-12 { - width: 100%; - } - .col-lg-11 { - width: 91.66666667%; - } - .col-lg-10 { - width: 83.33333333%; - } - .col-lg-9 { - width: 75%; - } - .col-lg-8 { - width: 66.66666667%; - } - .col-lg-7 { - width: 58.33333333%; - } - .col-lg-6 { - width: 50%; - } - .col-lg-5 { - width: 41.66666667%; - } - .col-lg-4 { - width: 33.33333333%; - } - .col-lg-3 { - width: 25%; - } - .col-lg-2 { - width: 16.66666667%; - } - .col-lg-1 { - width: 8.33333333%; - } - .col-lg-pull-12 { - right: 100%; - } - .col-lg-pull-11 { - right: 91.66666667%; - } - .col-lg-pull-10 { - right: 83.33333333%; - } - .col-lg-pull-9 { - right: 75%; - } - .col-lg-pull-8 { - right: 66.66666667%; - } - .col-lg-pull-7 { - right: 58.33333333%; - } - .col-lg-pull-6 { - right: 50%; - } - .col-lg-pull-5 { - right: 41.66666667%; - } - .col-lg-pull-4 { - right: 33.33333333%; - } - .col-lg-pull-3 { - right: 25%; - } - .col-lg-pull-2 { - right: 16.66666667%; - } - .col-lg-pull-1 { - right: 8.33333333%; - } - .col-lg-pull-0 { - right: auto; - } - .col-lg-push-12 { - left: 100%; - } - .col-lg-push-11 { - left: 91.66666667%; - } - .col-lg-push-10 { - left: 83.33333333%; - } - .col-lg-push-9 { - left: 75%; - } - .col-lg-push-8 { - left: 66.66666667%; - } - .col-lg-push-7 { - left: 58.33333333%; - } - .col-lg-push-6 { - left: 50%; - } - .col-lg-push-5 { - left: 41.66666667%; - } - .col-lg-push-4 { - left: 33.33333333%; - } - .col-lg-push-3 { - left: 25%; - } - .col-lg-push-2 { - left: 16.66666667%; - } - .col-lg-push-1 { - left: 8.33333333%; - } - .col-lg-push-0 { - left: auto; - } - .col-lg-offset-12 { - margin-left: 100%; - } - .col-lg-offset-11 { - margin-left: 91.66666667%; - } - .col-lg-offset-10 { - margin-left: 83.33333333%; - } - .col-lg-offset-9 { - margin-left: 75%; - } - .col-lg-offset-8 { - margin-left: 66.66666667%; - } - .col-lg-offset-7 { - margin-left: 58.33333333%; - } - .col-lg-offset-6 { - margin-left: 50%; - } - .col-lg-offset-5 { - margin-left: 41.66666667%; - } - .col-lg-offset-4 { - margin-left: 33.33333333%; - } - .col-lg-offset-3 { - margin-left: 25%; - } - .col-lg-offset-2 { - margin-left: 16.66666667%; - } - .col-lg-offset-1 { - margin-left: 8.33333333%; - } - .col-lg-offset-0 { - margin-left: 0; - } -} -table { - background-color: transparent; -} -caption { - padding-top: 8px; - padding-bottom: 8px; - color: #777; - text-align: left; -} -th { - text-align: left; -} -.table { - width: 100%; - max-width: 100%; - margin-bottom: 20px; -} -.table > thead > tr > th, -.table > tbody > tr > th, -.table > tfoot > tr > th, -.table > thead > tr > td, -.table > tbody > tr > td, -.table > tfoot > tr > td { - padding: 8px; - line-height: 1.42857143; - vertical-align: top; - border-top: 1px solid #ddd; -} -.table > thead > tr > th { - vertical-align: bottom; - border-bottom: 2px solid #ddd; -} -.table > caption + thead > tr:first-child > th, -.table > colgroup + thead > tr:first-child > th, -.table > thead:first-child > tr:first-child > th, -.table > caption + thead > tr:first-child > td, -.table > colgroup + thead > tr:first-child > td, -.table > thead:first-child > tr:first-child > td { - border-top: 0; -} -.table > tbody + tbody { - border-top: 2px solid #ddd; -} -.table .table { - background-color: #fff; -} -.table-condensed > thead > tr > th, -.table-condensed > tbody > tr > th, -.table-condensed > tfoot > tr > th, -.table-condensed > thead > tr > td, -.table-condensed > tbody > tr > td, -.table-condensed > tfoot > tr > td { - padding: 5px; -} -.table-bordered { - border: 1px solid #ddd; -} -.table-bordered > thead > tr > th, -.table-bordered > tbody > tr > th, -.table-bordered > tfoot > tr > th, -.table-bordered > thead > tr > td, -.table-bordered > tbody > tr > td, -.table-bordered > tfoot > tr > td { - border: 1px solid #ddd; -} -.table-bordered > thead > tr > th, -.table-bordered > thead > tr > td { - border-bottom-width: 2px; -} -.table-striped > tbody > tr:nth-of-type(odd) { - background-color: #f9f9f9; -} -.table-hover > tbody > tr:hover { - background-color: #f5f5f5; -} -table col[class*="col-"] { - position: static; - display: table-column; - float: none; -} -table td[class*="col-"], -table th[class*="col-"] { - position: static; - display: table-cell; - float: none; -} -.table > thead > tr > td.active, -.table > tbody > tr > td.active, -.table > tfoot > tr > td.active, -.table > thead > tr > th.active, -.table > tbody > tr > th.active, -.table > tfoot > tr > th.active, -.table > thead > tr.active > td, -.table > tbody > tr.active > td, -.table > tfoot > tr.active > td, -.table > thead > tr.active > th, -.table > tbody > tr.active > th, -.table > tfoot > tr.active > th { - background-color: #f5f5f5; -} -.table-hover > tbody > tr > td.active:hover, -.table-hover > tbody > tr > th.active:hover, -.table-hover > tbody > tr.active:hover > td, -.table-hover > tbody > tr:hover > .active, -.table-hover > tbody > tr.active:hover > th { - background-color: #e8e8e8; -} -.table > thead > tr > td.success, -.table > tbody > tr > td.success, -.table > tfoot > tr > td.success, -.table > thead > tr > th.success, -.table > tbody > tr > th.success, -.table > tfoot > tr > th.success, -.table > thead > tr.success > td, -.table > tbody > tr.success > td, -.table > tfoot > tr.success > td, -.table > thead > tr.success > th, -.table > tbody > tr.success > th, -.table > tfoot > tr.success > th { - background-color: #dff0d8; -} -.table-hover > tbody > tr > td.success:hover, -.table-hover > tbody > tr > th.success:hover, -.table-hover > tbody > tr.success:hover > td, -.table-hover > tbody > tr:hover > .success, -.table-hover > tbody > tr.success:hover > th { - background-color: #d0e9c6; -} -.table > thead > tr > td.info, -.table > tbody > tr > td.info, -.table > tfoot > tr > td.info, -.table > thead > tr > th.info, -.table > tbody > tr > th.info, -.table > tfoot > tr > th.info, -.table > thead > tr.info > td, -.table > tbody > tr.info > td, -.table > tfoot > tr.info > td, -.table > thead > tr.info > th, -.table > tbody > tr.info > th, -.table > tfoot > tr.info > th { - background-color: #d9edf7; -} -.table-hover > tbody > tr > td.info:hover, -.table-hover > tbody > tr > th.info:hover, -.table-hover > tbody > tr.info:hover > td, -.table-hover > tbody > tr:hover > .info, -.table-hover > tbody > tr.info:hover > th { - background-color: #c4e3f3; -} -.table > thead > tr > td.warning, -.table > tbody > tr > td.warning, -.table > tfoot > tr > td.warning, -.table > thead > tr > th.warning, -.table > tbody > tr > th.warning, -.table > tfoot > tr > th.warning, -.table > thead > tr.warning > td, -.table > tbody > tr.warning > td, -.table > tfoot > tr.warning > td, -.table > thead > tr.warning > th, -.table > tbody > tr.warning > th, -.table > tfoot > tr.warning > th { - background-color: #fcf8e3; -} -.table-hover > tbody > tr > td.warning:hover, -.table-hover > tbody > tr > th.warning:hover, -.table-hover > tbody > tr.warning:hover > td, -.table-hover > tbody > tr:hover > .warning, -.table-hover > tbody > tr.warning:hover > th { - background-color: #faf2cc; -} -.table > thead > tr > td.danger, -.table > tbody > tr > td.danger, -.table > tfoot > tr > td.danger, -.table > thead > tr > th.danger, -.table > tbody > tr > th.danger, -.table > tfoot > tr > th.danger, -.table > thead > tr.danger > td, -.table > tbody > tr.danger > td, -.table > tfoot > tr.danger > td, -.table > thead > tr.danger > th, -.table > tbody > tr.danger > th, -.table > tfoot > tr.danger > th { - background-color: #f2dede; -} -.table-hover > tbody > tr > td.danger:hover, -.table-hover > tbody > tr > th.danger:hover, -.table-hover > tbody > tr.danger:hover > td, -.table-hover > tbody > tr:hover > .danger, -.table-hover > tbody > tr.danger:hover > th { - background-color: #ebcccc; -} -.table-responsive { - min-height: .01%; - overflow-x: auto; -} -@media screen and (max-width: 767px) { - .table-responsive { - width: 100%; - margin-bottom: 15px; - overflow-y: hidden; - -ms-overflow-style: -ms-autohiding-scrollbar; - border: 1px solid #ddd; - } - .table-responsive > .table { - margin-bottom: 0; - } - .table-responsive > .table > thead > tr > th, - .table-responsive > .table > tbody > tr > th, - .table-responsive > .table > tfoot > tr > th, - .table-responsive > .table > thead > tr > td, - .table-responsive > .table > tbody > tr > td, - .table-responsive > .table > tfoot > tr > td { - white-space: nowrap; - } - .table-responsive > .table-bordered { - border: 0; - } - .table-responsive > .table-bordered > thead > tr > th:first-child, - .table-responsive > .table-bordered > tbody > tr > th:first-child, - .table-responsive > .table-bordered > tfoot > tr > th:first-child, - .table-responsive > .table-bordered > thead > tr > td:first-child, - .table-responsive > .table-bordered > tbody > tr > td:first-child, - .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; - } - .table-responsive > .table-bordered > thead > tr > th:last-child, - .table-responsive > .table-bordered > tbody > tr > th:last-child, - .table-responsive > .table-bordered > tfoot > tr > th:last-child, - .table-responsive > .table-bordered > thead > tr > td:last-child, - .table-responsive > .table-bordered > tbody > tr > td:last-child, - .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; - } - .table-responsive > .table-bordered > tbody > tr:last-child > th, - .table-responsive > .table-bordered > tfoot > tr:last-child > th, - .table-responsive > .table-bordered > tbody > tr:last-child > td, - .table-responsive > .table-bordered > tfoot > tr:last-child > td { - border-bottom: 0; - } -} -fieldset { - min-width: 0; - padding: 0; - margin: 0; - border: 0; -} -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: inherit; - color: #333; - border: 0; - border-bottom: 1px solid #e5e5e5; -} -label { - display: inline-block; - max-width: 100%; - margin-bottom: 5px; - font-weight: bold; -} -input[type="search"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - margin-top: 1px \9; - line-height: normal; -} -input[type="file"] { - display: block; -} -input[type="range"] { - display: block; - width: 100%; -} -select[multiple], -select[size] { - height: auto; -} -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -output { - display: block; - padding-top: 7px; - font-size: 14px; - line-height: 1.42857143; - color: #555; -} -.form-control { - display: block; - width: 100%; - height: 34px; - padding: 6px 12px; - font-size: 14px; - line-height: 1.42857143; - color: #555; - background-color: #fff; - background-image: none; - border: 1px solid #ccc; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; - -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; - transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; -} -.form-control:focus { - border-color: #66afe9; - outline: 0; - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); - box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); -} -.form-control::-moz-placeholder { - color: #999; - opacity: 1; -} -.form-control:-ms-input-placeholder { - color: #999; -} -.form-control::-webkit-input-placeholder { - color: #999; -} -.form-control[disabled], -.form-control[readonly], -fieldset[disabled] .form-control { - background-color: #eee; - opacity: 1; -} -.form-control[disabled], -fieldset[disabled] .form-control { - cursor: not-allowed; -} -textarea.form-control { - height: auto; -} -input[type="search"] { - -webkit-appearance: none; -} -@media screen and (-webkit-min-device-pixel-ratio: 0) { - input[type="date"].form-control, - input[type="time"].form-control, - input[type="datetime-local"].form-control, - input[type="month"].form-control { - line-height: 34px; - } - input[type="date"].input-sm, - input[type="time"].input-sm, - input[type="datetime-local"].input-sm, - input[type="month"].input-sm, - .input-group-sm input[type="date"], - .input-group-sm input[type="time"], - .input-group-sm input[type="datetime-local"], - .input-group-sm input[type="month"] { - line-height: 30px; - } - input[type="date"].input-lg, - input[type="time"].input-lg, - input[type="datetime-local"].input-lg, - input[type="month"].input-lg, - .input-group-lg input[type="date"], - .input-group-lg input[type="time"], - .input-group-lg input[type="datetime-local"], - .input-group-lg input[type="month"] { - line-height: 46px; - } -} -.form-group { - margin-bottom: 15px; -} -.radio, -.checkbox { - position: relative; - display: block; - margin-top: 10px; - margin-bottom: 10px; -} -.radio label, -.checkbox label { - min-height: 20px; - padding-left: 20px; - margin-bottom: 0; - font-weight: normal; - cursor: pointer; -} -.radio input[type="radio"], -.radio-inline input[type="radio"], -.checkbox input[type="checkbox"], -.checkbox-inline input[type="checkbox"] { - position: absolute; - margin-top: 4px \9; - margin-left: -20px; -} -.radio + .radio, -.checkbox + .checkbox { - margin-top: -5px; -} -.radio-inline, -.checkbox-inline { - position: relative; - display: inline-block; - padding-left: 20px; - margin-bottom: 0; - font-weight: normal; - vertical-align: middle; - cursor: pointer; -} -.radio-inline + .radio-inline, -.checkbox-inline + .checkbox-inline { - margin-top: 0; - margin-left: 10px; -} -input[type="radio"][disabled], -input[type="checkbox"][disabled], -input[type="radio"].disabled, -input[type="checkbox"].disabled, -fieldset[disabled] input[type="radio"], -fieldset[disabled] input[type="checkbox"] { - cursor: not-allowed; -} -.radio-inline.disabled, -.checkbox-inline.disabled, -fieldset[disabled] .radio-inline, -fieldset[disabled] .checkbox-inline { - cursor: not-allowed; -} -.radio.disabled label, -.checkbox.disabled label, -fieldset[disabled] .radio label, -fieldset[disabled] .checkbox label { - cursor: not-allowed; -} -.form-control-static { - min-height: 34px; - padding-top: 7px; - padding-bottom: 7px; - margin-bottom: 0; -} -.form-control-static.input-lg, -.form-control-static.input-sm { - padding-right: 0; - padding-left: 0; -} -.input-sm { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -select.input-sm { - height: 30px; - line-height: 30px; -} -textarea.input-sm, -select[multiple].input-sm { - height: auto; -} -.form-group-sm .form-control { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -.form-group-sm select.form-control { - height: 30px; - line-height: 30px; -} -.form-group-sm textarea.form-control, -.form-group-sm select[multiple].form-control { - height: auto; -} -.form-group-sm .form-control-static { - height: 30px; - min-height: 32px; - padding: 6px 10px; - font-size: 12px; - line-height: 1.5; -} -.input-lg { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.3333333; - border-radius: 6px; -} -select.input-lg { - height: 46px; - line-height: 46px; -} -textarea.input-lg, -select[multiple].input-lg { - height: auto; -} -.form-group-lg .form-control { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.3333333; - border-radius: 6px; -} -.form-group-lg select.form-control { - height: 46px; - line-height: 46px; -} -.form-group-lg textarea.form-control, -.form-group-lg select[multiple].form-control { - height: auto; -} -.form-group-lg .form-control-static { - height: 46px; - min-height: 38px; - padding: 11px 16px; - font-size: 18px; - line-height: 1.3333333; -} -.has-feedback { - position: relative; -} -.has-feedback .form-control { - padding-right: 42.5px; -} -.form-control-feedback { - position: absolute; - top: 0; - right: 0; - z-index: 2; - display: block; - width: 34px; - height: 34px; - line-height: 34px; - text-align: center; - pointer-events: none; -} -.input-lg + .form-control-feedback, -.input-group-lg + .form-control-feedback, -.form-group-lg .form-control + .form-control-feedback { - width: 46px; - height: 46px; - line-height: 46px; -} -.input-sm + .form-control-feedback, -.input-group-sm + .form-control-feedback, -.form-group-sm .form-control + .form-control-feedback { - width: 30px; - height: 30px; - line-height: 30px; -} -.has-success .help-block, -.has-success .control-label, -.has-success .radio, -.has-success .checkbox, -.has-success .radio-inline, -.has-success .checkbox-inline, -.has-success.radio label, -.has-success.checkbox label, -.has-success.radio-inline label, -.has-success.checkbox-inline label { - color: #3c763d; -} -.has-success .form-control { - border-color: #3c763d; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -} -.has-success .form-control:focus { - border-color: #2b542c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; -} -.has-success .input-group-addon { - color: #3c763d; - background-color: #dff0d8; - border-color: #3c763d; -} -.has-success .form-control-feedback { - color: #3c763d; -} -.has-warning .help-block, -.has-warning .control-label, -.has-warning .radio, -.has-warning .checkbox, -.has-warning .radio-inline, -.has-warning .checkbox-inline, -.has-warning.radio label, -.has-warning.checkbox label, -.has-warning.radio-inline label, -.has-warning.checkbox-inline label { - color: #8a6d3b; -} -.has-warning .form-control { - border-color: #8a6d3b; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -} -.has-warning .form-control:focus { - border-color: #66512c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; -} -.has-warning .input-group-addon { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #8a6d3b; -} -.has-warning .form-control-feedback { - color: #8a6d3b; -} -.has-error .help-block, -.has-error .control-label, -.has-error .radio, -.has-error .checkbox, -.has-error .radio-inline, -.has-error .checkbox-inline, -.has-error.radio label, -.has-error.checkbox label, -.has-error.radio-inline label, -.has-error.checkbox-inline label { - color: #a94442; -} -.has-error .form-control { - border-color: #a94442; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -} -.has-error .form-control:focus { - border-color: #843534; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; -} -.has-error .input-group-addon { - color: #a94442; - background-color: #f2dede; - border-color: #a94442; -} -.has-error .form-control-feedback { - color: #a94442; -} -.has-feedback label ~ .form-control-feedback { - top: 25px; -} -.has-feedback label.sr-only ~ .form-control-feedback { - top: 0; -} -.help-block { - display: block; - margin-top: 5px; - margin-bottom: 10px; - color: #737373; -} -@media (min-width: 768px) { - .form-inline .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .form-control { - display: inline-block; - width: auto; - vertical-align: middle; - } - .form-inline .form-control-static { - display: inline-block; - } - .form-inline .input-group { - display: inline-table; - vertical-align: middle; - } - .form-inline .input-group .input-group-addon, - .form-inline .input-group .input-group-btn, - .form-inline .input-group .form-control { - width: auto; - } - .form-inline .input-group > .form-control { - width: 100%; - } - .form-inline .control-label { - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .radio, - .form-inline .checkbox { - display: inline-block; - margin-top: 0; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .radio label, - .form-inline .checkbox label { - padding-left: 0; - } - .form-inline .radio input[type="radio"], - .form-inline .checkbox input[type="checkbox"] { - position: relative; - margin-left: 0; - } - .form-inline .has-feedback .form-control-feedback { - top: 0; - } -} -.form-horizontal .radio, -.form-horizontal .checkbox, -.form-horizontal .radio-inline, -.form-horizontal .checkbox-inline { - padding-top: 7px; - margin-top: 0; - margin-bottom: 0; -} -.form-horizontal .radio, -.form-horizontal .checkbox { - min-height: 27px; -} -.form-horizontal .form-group { - margin-right: -15px; - margin-left: -15px; -} -@media (min-width: 768px) { - .form-horizontal .control-label { - padding-top: 7px; - margin-bottom: 0; - text-align: right; - } -} -.form-horizontal .has-feedback .form-control-feedback { - right: 15px; -} -@media (min-width: 768px) { - .form-horizontal .form-group-lg .control-label { - padding-top: 14.333333px; - font-size: 18px; - } -} -@media (min-width: 768px) { - .form-horizontal .form-group-sm .control-label { - padding-top: 6px; - font-size: 12px; - } -} -.btn { - display: inline-block; - padding: 6px 12px; - margin-bottom: 0; - font-size: 14px; - font-weight: normal; - line-height: 1.42857143; - text-align: center; - white-space: nowrap; - vertical-align: middle; - -ms-touch-action: manipulation; - touch-action: manipulation; - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - background-image: none; - border: 1px solid transparent; - border-radius: 4px; -} -.btn:focus, -.btn:active:focus, -.btn.active:focus, -.btn.focus, -.btn:active.focus, -.btn.active.focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.btn:hover, -.btn:focus, -.btn.focus { - color: #333; - text-decoration: none; -} -.btn:active, -.btn.active { - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); -} -.btn.disabled, -.btn[disabled], -fieldset[disabled] .btn { - cursor: not-allowed; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - box-shadow: none; - opacity: .65; -} -a.btn.disabled, -fieldset[disabled] a.btn { - pointer-events: none; -} -.btn-default { - color: #333; - background-color: #fff; - border-color: #ccc; -} -.btn-default:focus, -.btn-default.focus { - color: #333; - background-color: #e6e6e6; - border-color: #8c8c8c; -} -.btn-default:hover { - color: #333; - background-color: #e6e6e6; - border-color: #adadad; -} -.btn-default:active, -.btn-default.active, -.open > .dropdown-toggle.btn-default { - color: #333; - background-color: #e6e6e6; - border-color: #adadad; -} -.btn-default:active:hover, -.btn-default.active:hover, -.open > .dropdown-toggle.btn-default:hover, -.btn-default:active:focus, -.btn-default.active:focus, -.open > .dropdown-toggle.btn-default:focus, -.btn-default:active.focus, -.btn-default.active.focus, -.open > .dropdown-toggle.btn-default.focus { - color: #333; - background-color: #d4d4d4; - border-color: #8c8c8c; -} -.btn-default:active, -.btn-default.active, -.open > .dropdown-toggle.btn-default { - background-image: none; -} -.btn-default.disabled, -.btn-default[disabled], -fieldset[disabled] .btn-default, -.btn-default.disabled:hover, -.btn-default[disabled]:hover, -fieldset[disabled] .btn-default:hover, -.btn-default.disabled:focus, -.btn-default[disabled]:focus, -fieldset[disabled] .btn-default:focus, -.btn-default.disabled.focus, -.btn-default[disabled].focus, -fieldset[disabled] .btn-default.focus, -.btn-default.disabled:active, -.btn-default[disabled]:active, -fieldset[disabled] .btn-default:active, -.btn-default.disabled.active, -.btn-default[disabled].active, -fieldset[disabled] .btn-default.active { - background-color: #fff; - border-color: #ccc; -} -.btn-default .badge { - color: #fff; - background-color: #333; -} -.btn-primary { - color: #fff; - background-color: #337ab7; - border-color: #2e6da4; -} -.btn-primary:focus, -.btn-primary.focus { - color: #fff; - background-color: #286090; - border-color: #122b40; -} -.btn-primary:hover { - color: #fff; - background-color: #286090; - border-color: #204d74; -} -.btn-primary:active, -.btn-primary.active, -.open > .dropdown-toggle.btn-primary { - color: #fff; - background-color: #286090; - border-color: #204d74; -} -.btn-primary:active:hover, -.btn-primary.active:hover, -.open > .dropdown-toggle.btn-primary:hover, -.btn-primary:active:focus, -.btn-primary.active:focus, -.open > .dropdown-toggle.btn-primary:focus, -.btn-primary:active.focus, -.btn-primary.active.focus, -.open > .dropdown-toggle.btn-primary.focus { - color: #fff; - background-color: #204d74; - border-color: #122b40; -} -.btn-primary:active, -.btn-primary.active, -.open > .dropdown-toggle.btn-primary { - background-image: none; -} -.btn-primary.disabled, -.btn-primary[disabled], -fieldset[disabled] .btn-primary, -.btn-primary.disabled:hover, -.btn-primary[disabled]:hover, -fieldset[disabled] .btn-primary:hover, -.btn-primary.disabled:focus, -.btn-primary[disabled]:focus, -fieldset[disabled] .btn-primary:focus, -.btn-primary.disabled.focus, -.btn-primary[disabled].focus, -fieldset[disabled] .btn-primary.focus, -.btn-primary.disabled:active, -.btn-primary[disabled]:active, -fieldset[disabled] .btn-primary:active, -.btn-primary.disabled.active, -.btn-primary[disabled].active, -fieldset[disabled] .btn-primary.active { - background-color: #337ab7; - border-color: #2e6da4; -} -.btn-primary .badge { - color: #337ab7; - background-color: #fff; -} -.btn-success { - color: #fff; - background-color: #5cb85c; - border-color: #4cae4c; -} -.btn-success:focus, -.btn-success.focus { - color: #fff; - background-color: #449d44; - border-color: #255625; -} -.btn-success:hover { - color: #fff; - background-color: #449d44; - border-color: #398439; -} -.btn-success:active, -.btn-success.active, -.open > .dropdown-toggle.btn-success { - color: #fff; - background-color: #449d44; - border-color: #398439; -} -.btn-success:active:hover, -.btn-success.active:hover, -.open > .dropdown-toggle.btn-success:hover, -.btn-success:active:focus, -.btn-success.active:focus, -.open > .dropdown-toggle.btn-success:focus, -.btn-success:active.focus, -.btn-success.active.focus, -.open > .dropdown-toggle.btn-success.focus { - color: #fff; - background-color: #398439; - border-color: #255625; -} -.btn-success:active, -.btn-success.active, -.open > .dropdown-toggle.btn-success { - background-image: none; -} -.btn-success.disabled, -.btn-success[disabled], -fieldset[disabled] .btn-success, -.btn-success.disabled:hover, -.btn-success[disabled]:hover, -fieldset[disabled] .btn-success:hover, -.btn-success.disabled:focus, -.btn-success[disabled]:focus, -fieldset[disabled] .btn-success:focus, -.btn-success.disabled.focus, -.btn-success[disabled].focus, -fieldset[disabled] .btn-success.focus, -.btn-success.disabled:active, -.btn-success[disabled]:active, -fieldset[disabled] .btn-success:active, -.btn-success.disabled.active, -.btn-success[disabled].active, -fieldset[disabled] .btn-success.active { - background-color: #5cb85c; - border-color: #4cae4c; -} -.btn-success .badge { - color: #5cb85c; - background-color: #fff; -} -.btn-info { - color: #fff; - background-color: #5bc0de; - border-color: #46b8da; -} -.btn-info:focus, -.btn-info.focus { - color: #fff; - background-color: #31b0d5; - border-color: #1b6d85; -} -.btn-info:hover { - color: #fff; - background-color: #31b0d5; - border-color: #269abc; -} -.btn-info:active, -.btn-info.active, -.open > .dropdown-toggle.btn-info { - color: #fff; - background-color: #31b0d5; - border-color: #269abc; -} -.btn-info:active:hover, -.btn-info.active:hover, -.open > .dropdown-toggle.btn-info:hover, -.btn-info:active:focus, -.btn-info.active:focus, -.open > .dropdown-toggle.btn-info:focus, -.btn-info:active.focus, -.btn-info.active.focus, -.open > .dropdown-toggle.btn-info.focus { - color: #fff; - background-color: #269abc; - border-color: #1b6d85; -} -.btn-info:active, -.btn-info.active, -.open > .dropdown-toggle.btn-info { - background-image: none; -} -.btn-info.disabled, -.btn-info[disabled], -fieldset[disabled] .btn-info, -.btn-info.disabled:hover, -.btn-info[disabled]:hover, -fieldset[disabled] .btn-info:hover, -.btn-info.disabled:focus, -.btn-info[disabled]:focus, -fieldset[disabled] .btn-info:focus, -.btn-info.disabled.focus, -.btn-info[disabled].focus, -fieldset[disabled] .btn-info.focus, -.btn-info.disabled:active, -.btn-info[disabled]:active, -fieldset[disabled] .btn-info:active, -.btn-info.disabled.active, -.btn-info[disabled].active, -fieldset[disabled] .btn-info.active { - background-color: #5bc0de; - border-color: #46b8da; -} -.btn-info .badge { - color: #5bc0de; - background-color: #fff; -} -.btn-warning { - color: #fff; - background-color: #f0ad4e; - border-color: #eea236; -} -.btn-warning:focus, -.btn-warning.focus { - color: #fff; - background-color: #ec971f; - border-color: #985f0d; -} -.btn-warning:hover { - color: #fff; - background-color: #ec971f; - border-color: #d58512; -} -.btn-warning:active, -.btn-warning.active, -.open > .dropdown-toggle.btn-warning { - color: #fff; - background-color: #ec971f; - border-color: #d58512; -} -.btn-warning:active:hover, -.btn-warning.active:hover, -.open > .dropdown-toggle.btn-warning:hover, -.btn-warning:active:focus, -.btn-warning.active:focus, -.open > .dropdown-toggle.btn-warning:focus, -.btn-warning:active.focus, -.btn-warning.active.focus, -.open > .dropdown-toggle.btn-warning.focus { - color: #fff; - background-color: #d58512; - border-color: #985f0d; -} -.btn-warning:active, -.btn-warning.active, -.open > .dropdown-toggle.btn-warning { - background-image: none; -} -.btn-warning.disabled, -.btn-warning[disabled], -fieldset[disabled] .btn-warning, -.btn-warning.disabled:hover, -.btn-warning[disabled]:hover, -fieldset[disabled] .btn-warning:hover, -.btn-warning.disabled:focus, -.btn-warning[disabled]:focus, -fieldset[disabled] .btn-warning:focus, -.btn-warning.disabled.focus, -.btn-warning[disabled].focus, -fieldset[disabled] .btn-warning.focus, -.btn-warning.disabled:active, -.btn-warning[disabled]:active, -fieldset[disabled] .btn-warning:active, -.btn-warning.disabled.active, -.btn-warning[disabled].active, -fieldset[disabled] .btn-warning.active { - background-color: #f0ad4e; - border-color: #eea236; -} -.btn-warning .badge { - color: #f0ad4e; - background-color: #fff; -} -.btn-danger { - color: #fff; - background-color: #d9534f; - border-color: #d43f3a; -} -.btn-danger:focus, -.btn-danger.focus { - color: #fff; - background-color: #c9302c; - border-color: #761c19; -} -.btn-danger:hover { - color: #fff; - background-color: #c9302c; - border-color: #ac2925; -} -.btn-danger:active, -.btn-danger.active, -.open > .dropdown-toggle.btn-danger { - color: #fff; - background-color: #c9302c; - border-color: #ac2925; -} -.btn-danger:active:hover, -.btn-danger.active:hover, -.open > .dropdown-toggle.btn-danger:hover, -.btn-danger:active:focus, -.btn-danger.active:focus, -.open > .dropdown-toggle.btn-danger:focus, -.btn-danger:active.focus, -.btn-danger.active.focus, -.open > .dropdown-toggle.btn-danger.focus { - color: #fff; - background-color: #ac2925; - border-color: #761c19; -} -.btn-danger:active, -.btn-danger.active, -.open > .dropdown-toggle.btn-danger { - background-image: none; -} -.btn-danger.disabled, -.btn-danger[disabled], -fieldset[disabled] .btn-danger, -.btn-danger.disabled:hover, -.btn-danger[disabled]:hover, -fieldset[disabled] .btn-danger:hover, -.btn-danger.disabled:focus, -.btn-danger[disabled]:focus, -fieldset[disabled] .btn-danger:focus, -.btn-danger.disabled.focus, -.btn-danger[disabled].focus, -fieldset[disabled] .btn-danger.focus, -.btn-danger.disabled:active, -.btn-danger[disabled]:active, -fieldset[disabled] .btn-danger:active, -.btn-danger.disabled.active, -.btn-danger[disabled].active, -fieldset[disabled] .btn-danger.active { - background-color: #d9534f; - border-color: #d43f3a; -} -.btn-danger .badge { - color: #d9534f; - background-color: #fff; -} -.btn-link { - font-weight: normal; - color: #337ab7; - border-radius: 0; -} -.btn-link, -.btn-link:active, -.btn-link.active, -.btn-link[disabled], -fieldset[disabled] .btn-link { - background-color: transparent; - -webkit-box-shadow: none; - box-shadow: none; -} -.btn-link, -.btn-link:hover, -.btn-link:focus, -.btn-link:active { - border-color: transparent; -} -.btn-link:hover, -.btn-link:focus { - color: #23527c; - text-decoration: underline; - background-color: transparent; -} -.btn-link[disabled]:hover, -fieldset[disabled] .btn-link:hover, -.btn-link[disabled]:focus, -fieldset[disabled] .btn-link:focus { - color: #777; - text-decoration: none; -} -.btn-lg, -.btn-group-lg > .btn { - padding: 10px 16px; - font-size: 18px; - line-height: 1.3333333; - border-radius: 6px; -} -.btn-sm, -.btn-group-sm > .btn { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -.btn-xs, -.btn-group-xs > .btn { - padding: 1px 5px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -.btn-block { - display: block; - width: 100%; -} -.btn-block + .btn-block { - margin-top: 5px; -} -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} -.fade { - opacity: 0; - -webkit-transition: opacity .15s linear; - -o-transition: opacity .15s linear; - transition: opacity .15s linear; -} -.fade.in { - opacity: 1; -} -.collapse { - display: none; -} -.collapse.in { - display: block; -} -tr.collapse.in { - display: table-row; -} -tbody.collapse.in { - display: table-row-group; -} -.collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition-timing-function: ease; - -o-transition-timing-function: ease; - transition-timing-function: ease; - -webkit-transition-duration: .35s; - -o-transition-duration: .35s; - transition-duration: .35s; - -webkit-transition-property: height, visibility; - -o-transition-property: height, visibility; - transition-property: height, visibility; -} -.caret { - display: inline-block; - width: 0; - height: 0; - margin-left: 2px; - vertical-align: middle; - border-top: 4px dashed; - border-top: 4px solid \9; - border-right: 4px solid transparent; - border-left: 4px solid transparent; -} -.dropup, -.dropdown { - position: relative; -} -.dropdown-toggle:focus { - outline: 0; -} -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - font-size: 14px; - text-align: left; - list-style: none; - background-color: #fff; - -webkit-background-clip: padding-box; - background-clip: padding-box; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, .15); - border-radius: 4px; - -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); - box-shadow: 0 6px 12px rgba(0, 0, 0, .175); -} -.dropdown-menu.pull-right { - right: 0; - left: auto; -} -.dropdown-menu .divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} -.dropdown-menu > li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 1.42857143; - color: #333; - white-space: nowrap; -} -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus { - color: #262626; - text-decoration: none; - background-color: #f5f5f5; -} -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - color: #fff; - text-decoration: none; - background-color: #337ab7; - outline: 0; -} -.dropdown-menu > .disabled > a, -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - color: #777; -} -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - text-decoration: none; - cursor: not-allowed; - background-color: transparent; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.open > .dropdown-menu { - display: block; -} -.open > a { - outline: 0; -} -.dropdown-menu-right { - right: 0; - left: auto; -} -.dropdown-menu-left { - right: auto; - left: 0; -} -.dropdown-header { - display: block; - padding: 3px 20px; - font-size: 12px; - line-height: 1.42857143; - color: #777; - white-space: nowrap; -} -.dropdown-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 990; -} -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - content: ""; - border-top: 0; - border-bottom: 4px dashed; - border-bottom: 4px solid \9; -} -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 2px; -} -@media (min-width: 768px) { - .navbar-right .dropdown-menu { - right: 0; - left: auto; - } - .navbar-right .dropdown-menu-left { - right: auto; - left: 0; - } -} -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-block; - vertical-align: middle; -} -.btn-group > .btn, -.btn-group-vertical > .btn { - position: relative; - float: left; -} -.btn-group > .btn:hover, -.btn-group-vertical > .btn:hover, -.btn-group > .btn:focus, -.btn-group-vertical > .btn:focus, -.btn-group > .btn:active, -.btn-group-vertical > .btn:active, -.btn-group > .btn.active, -.btn-group-vertical > .btn.active { - z-index: 2; -} -.btn-group .btn + .btn, -.btn-group .btn + .btn-group, -.btn-group .btn-group + .btn, -.btn-group .btn-group + .btn-group { - margin-left: -1px; -} -.btn-toolbar { - margin-left: -5px; -} -.btn-toolbar .btn, -.btn-toolbar .btn-group, -.btn-toolbar .input-group { - float: left; -} -.btn-toolbar > .btn, -.btn-toolbar > .btn-group, -.btn-toolbar > .input-group { - margin-left: 5px; -} -.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { - border-radius: 0; -} -.btn-group > .btn:first-child { - margin-left: 0; -} -.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.btn-group > .btn:last-child:not(:first-child), -.btn-group > .dropdown-toggle:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group > .btn-group { - float: left; -} -.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} -.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, -.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} -.btn-group > .btn + .dropdown-toggle { - padding-right: 8px; - padding-left: 8px; -} -.btn-group > .btn-lg + .dropdown-toggle { - padding-right: 12px; - padding-left: 12px; -} -.btn-group.open .dropdown-toggle { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); -} -.btn-group.open .dropdown-toggle.btn-link { - -webkit-box-shadow: none; - box-shadow: none; -} -.btn .caret { - margin-left: 0; -} -.btn-lg .caret { - border-width: 5px 5px 0; - border-bottom-width: 0; -} -.dropup .btn-lg .caret { - border-width: 0 5px 5px; -} -.btn-group-vertical > .btn, -.btn-group-vertical > .btn-group, -.btn-group-vertical > .btn-group > .btn { - display: block; - float: none; - width: 100%; - max-width: 100%; -} -.btn-group-vertical > .btn-group > .btn { - float: none; -} -.btn-group-vertical > .btn + .btn, -.btn-group-vertical > .btn + .btn-group, -.btn-group-vertical > .btn-group + .btn, -.btn-group-vertical > .btn-group + .btn-group { - margin-top: -1px; - margin-left: 0; -} -.btn-group-vertical > .btn:not(:first-child):not(:last-child) { - border-radius: 0; -} -.btn-group-vertical > .btn:first-child:not(:last-child) { - border-top-right-radius: 4px; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group-vertical > .btn:last-child:not(:first-child) { - border-top-left-radius: 0; - border-top-right-radius: 0; - border-bottom-left-radius: 4px; -} -.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.btn-group-justified { - display: table; - width: 100%; - table-layout: fixed; - border-collapse: separate; -} -.btn-group-justified > .btn, -.btn-group-justified > .btn-group { - display: table-cell; - float: none; - width: 1%; -} -.btn-group-justified > .btn-group .btn { - width: 100%; -} -.btn-group-justified > .btn-group .dropdown-menu { - left: auto; -} -[data-toggle="buttons"] > .btn input[type="radio"], -[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], -[data-toggle="buttons"] > .btn input[type="checkbox"], -[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { - position: absolute; - clip: rect(0, 0, 0, 0); - pointer-events: none; -} -.input-group { - position: relative; - display: table; - border-collapse: separate; -} -.input-group[class*="col-"] { - float: none; - padding-right: 0; - padding-left: 0; -} -.input-group .form-control { - position: relative; - z-index: 2; - float: left; - width: 100%; - margin-bottom: 0; -} -.input-group-lg > .form-control, -.input-group-lg > .input-group-addon, -.input-group-lg > .input-group-btn > .btn { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.3333333; - border-radius: 6px; -} -select.input-group-lg > .form-control, -select.input-group-lg > .input-group-addon, -select.input-group-lg > .input-group-btn > .btn { - height: 46px; - line-height: 46px; -} -textarea.input-group-lg > .form-control, -textarea.input-group-lg > .input-group-addon, -textarea.input-group-lg > .input-group-btn > .btn, -select[multiple].input-group-lg > .form-control, -select[multiple].input-group-lg > .input-group-addon, -select[multiple].input-group-lg > .input-group-btn > .btn { - height: auto; -} -.input-group-sm > .form-control, -.input-group-sm > .input-group-addon, -.input-group-sm > .input-group-btn > .btn { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -select.input-group-sm > .form-control, -select.input-group-sm > .input-group-addon, -select.input-group-sm > .input-group-btn > .btn { - height: 30px; - line-height: 30px; -} -textarea.input-group-sm > .form-control, -textarea.input-group-sm > .input-group-addon, -textarea.input-group-sm > .input-group-btn > .btn, -select[multiple].input-group-sm > .form-control, -select[multiple].input-group-sm > .input-group-addon, -select[multiple].input-group-sm > .input-group-btn > .btn { - height: auto; -} -.input-group-addon, -.input-group-btn, -.input-group .form-control { - display: table-cell; -} -.input-group-addon:not(:first-child):not(:last-child), -.input-group-btn:not(:first-child):not(:last-child), -.input-group .form-control:not(:first-child):not(:last-child) { - border-radius: 0; -} -.input-group-addon, -.input-group-btn { - width: 1%; - white-space: nowrap; - vertical-align: middle; -} -.input-group-addon { - padding: 6px 12px; - font-size: 14px; - font-weight: normal; - line-height: 1; - color: #555; - text-align: center; - background-color: #eee; - border: 1px solid #ccc; - border-radius: 4px; -} -.input-group-addon.input-sm { - padding: 5px 10px; - font-size: 12px; - border-radius: 3px; -} -.input-group-addon.input-lg { - padding: 10px 16px; - font-size: 18px; - border-radius: 6px; -} -.input-group-addon input[type="radio"], -.input-group-addon input[type="checkbox"] { - margin-top: 0; -} -.input-group .form-control:first-child, -.input-group-addon:first-child, -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .btn-group > .btn, -.input-group-btn:first-child > .dropdown-toggle, -.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), -.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.input-group-addon:first-child { - border-right: 0; -} -.input-group .form-control:last-child, -.input-group-addon:last-child, -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .btn-group > .btn, -.input-group-btn:last-child > .dropdown-toggle, -.input-group-btn:first-child > .btn:not(:first-child), -.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.input-group-addon:last-child { - border-left: 0; -} -.input-group-btn { - position: relative; - font-size: 0; - white-space: nowrap; -} -.input-group-btn > .btn { - position: relative; -} -.input-group-btn > .btn + .btn { - margin-left: -1px; -} -.input-group-btn > .btn:hover, -.input-group-btn > .btn:focus, -.input-group-btn > .btn:active { - z-index: 2; -} -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .btn-group { - margin-right: -1px; -} -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .btn-group { - z-index: 2; - margin-left: -1px; -} -.nav { - padding-left: 0; - margin-bottom: 0; - list-style: none; -} -.nav > li { - position: relative; - display: block; -} -.nav > li > a { - position: relative; - display: block; - padding: 10px 15px; -} -.nav > li > a:hover, -.nav > li > a:focus { - text-decoration: none; - background-color: #eee; -} -.nav > li.disabled > a { - color: #777; -} -.nav > li.disabled > a:hover, -.nav > li.disabled > a:focus { - color: #777; - text-decoration: none; - cursor: not-allowed; - background-color: transparent; -} -.nav .open > a, -.nav .open > a:hover, -.nav .open > a:focus { - background-color: #eee; - border-color: #337ab7; -} -.nav .nav-divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} -.nav > li > a > img { - max-width: none; -} -.nav-tabs { - border-bottom: 1px solid #ddd; -} -.nav-tabs > li { - float: left; - margin-bottom: -1px; -} -.nav-tabs > li > a { - margin-right: 2px; - line-height: 1.42857143; - border: 1px solid transparent; - border-radius: 4px 4px 0 0; -} -.nav-tabs > li > a:hover { - border-color: #eee #eee #ddd; -} -.nav-tabs > li.active > a, -.nav-tabs > li.active > a:hover, -.nav-tabs > li.active > a:focus { - color: #555; - cursor: default; - background-color: #fff; - border: 1px solid #ddd; - border-bottom-color: transparent; -} -.nav-tabs.nav-justified { - width: 100%; - border-bottom: 0; -} -.nav-tabs.nav-justified > li { - float: none; -} -.nav-tabs.nav-justified > li > a { - margin-bottom: 5px; - text-align: center; -} -.nav-tabs.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -@media (min-width: 768px) { - .nav-tabs.nav-justified > li { - display: table-cell; - width: 1%; - } - .nav-tabs.nav-justified > li > a { - margin-bottom: 0; - } -} -.nav-tabs.nav-justified > li > a { - margin-right: 0; - border-radius: 4px; -} -.nav-tabs.nav-justified > .active > a, -.nav-tabs.nav-justified > .active > a:hover, -.nav-tabs.nav-justified > .active > a:focus { - border: 1px solid #ddd; -} -@media (min-width: 768px) { - .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid #ddd; - border-radius: 4px 4px 0 0; - } - .nav-tabs.nav-justified > .active > a, - .nav-tabs.nav-justified > .active > a:hover, - .nav-tabs.nav-justified > .active > a:focus { - border-bottom-color: #fff; - } -} -.nav-pills > li { - float: left; -} -.nav-pills > li > a { - border-radius: 4px; -} -.nav-pills > li + li { - margin-left: 2px; -} -.nav-pills > li.active > a, -.nav-pills > li.active > a:hover, -.nav-pills > li.active > a:focus { - color: #fff; - background-color: #337ab7; -} -.nav-stacked > li { - float: none; -} -.nav-stacked > li + li { - margin-top: 2px; - margin-left: 0; -} -.nav-justified { - width: 100%; -} -.nav-justified > li { - float: none; -} -.nav-justified > li > a { - margin-bottom: 5px; - text-align: center; -} -.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -@media (min-width: 768px) { - .nav-justified > li { - display: table-cell; - width: 1%; - } - .nav-justified > li > a { - margin-bottom: 0; - } -} -.nav-tabs-justified { - border-bottom: 0; -} -.nav-tabs-justified > li > a { - margin-right: 0; - border-radius: 4px; -} -.nav-tabs-justified > .active > a, -.nav-tabs-justified > .active > a:hover, -.nav-tabs-justified > .active > a:focus { - border: 1px solid #ddd; -} -@media (min-width: 768px) { - .nav-tabs-justified > li > a { - border-bottom: 1px solid #ddd; - border-radius: 4px 4px 0 0; - } - .nav-tabs-justified > .active > a, - .nav-tabs-justified > .active > a:hover, - .nav-tabs-justified > .active > a:focus { - border-bottom-color: #fff; - } -} -.tab-content > .tab-pane { - display: none; -} -.tab-content > .active { - display: block; -} -.nav-tabs .dropdown-menu { - margin-top: -1px; - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.navbar { - position: relative; - min-height: 50px; - margin-bottom: 20px; - border: 1px solid transparent; -} -@media (min-width: 768px) { - .navbar { - border-radius: 4px; - } -} -@media (min-width: 768px) { - .navbar-header { - float: left; - } -} -.navbar-collapse { - padding-right: 15px; - padding-left: 15px; - overflow-x: visible; - -webkit-overflow-scrolling: touch; - border-top: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); -} -.navbar-collapse.in { - overflow-y: auto; -} -@media (min-width: 768px) { - .navbar-collapse { - width: auto; - border-top: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-collapse.collapse { - display: block !important; - height: auto !important; - padding-bottom: 0; - overflow: visible !important; - } - .navbar-collapse.in { - overflow-y: visible; - } - .navbar-fixed-top .navbar-collapse, - .navbar-static-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - padding-right: 0; - padding-left: 0; - } -} -.navbar-fixed-top .navbar-collapse, -.navbar-fixed-bottom .navbar-collapse { - max-height: 340px; -} -@media (max-device-width: 480px) and (orientation: landscape) { - .navbar-fixed-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - max-height: 200px; - } -} -.container > .navbar-header, -.container-fluid > .navbar-header, -.container > .navbar-collapse, -.container-fluid > .navbar-collapse { - margin-right: -15px; - margin-left: -15px; -} -@media (min-width: 768px) { - .container > .navbar-header, - .container-fluid > .navbar-header, - .container > .navbar-collapse, - .container-fluid > .navbar-collapse { - margin-right: 0; - margin-left: 0; - } -} -.navbar-static-top { - z-index: 1000; - border-width: 0 0 1px; -} -@media (min-width: 768px) { - .navbar-static-top { - border-radius: 0; - } -} -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; -} -@media (min-width: 768px) { - .navbar-fixed-top, - .navbar-fixed-bottom { - border-radius: 0; - } -} -.navbar-fixed-top { - top: 0; - border-width: 0 0 1px; -} -.navbar-fixed-bottom { - bottom: 0; - margin-bottom: 0; - border-width: 1px 0 0; -} -.navbar-brand { - float: left; - height: 50px; - padding: 15px 15px; - font-size: 18px; - line-height: 20px; -} -.navbar-brand:hover, -.navbar-brand:focus { - text-decoration: none; -} -.navbar-brand > img { - display: block; -} -@media (min-width: 768px) { - .navbar > .container .navbar-brand, - .navbar > .container-fluid .navbar-brand { - margin-left: -15px; - } -} -.navbar-toggle { - position: relative; - float: right; - padding: 9px 10px; - margin-top: 8px; - margin-right: 15px; - margin-bottom: 8px; - background-color: transparent; - background-image: none; - border: 1px solid transparent; - border-radius: 4px; -} -.navbar-toggle:focus { - outline: 0; -} -.navbar-toggle .icon-bar { - display: block; - width: 22px; - height: 2px; - border-radius: 1px; -} -.navbar-toggle .icon-bar + .icon-bar { - margin-top: 4px; -} -@media (min-width: 768px) { - .navbar-toggle { - display: none; - } -} -.navbar-nav { - margin: 7.5px -15px; -} -.navbar-nav > li > a { - padding-top: 10px; - padding-bottom: 10px; - line-height: 20px; -} -@media (max-width: 767px) { - .navbar-nav .open .dropdown-menu { - position: static; - float: none; - width: auto; - margin-top: 0; - background-color: transparent; - border: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-nav .open .dropdown-menu > li > a, - .navbar-nav .open .dropdown-menu .dropdown-header { - padding: 5px 15px 5px 25px; - } - .navbar-nav .open .dropdown-menu > li > a { - line-height: 20px; - } - .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-nav .open .dropdown-menu > li > a:focus { - background-image: none; - } -} -@media (min-width: 768px) { - .navbar-nav { - float: left; - margin: 0; - } - .navbar-nav > li { - float: left; - } - .navbar-nav > li > a { - padding-top: 15px; - padding-bottom: 15px; - } -} -.navbar-form { - padding: 10px 15px; - margin-top: 8px; - margin-right: -15px; - margin-bottom: 8px; - margin-left: -15px; - border-top: 1px solid transparent; - border-bottom: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); -} -@media (min-width: 768px) { - .navbar-form .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .form-control { - display: inline-block; - width: auto; - vertical-align: middle; - } - .navbar-form .form-control-static { - display: inline-block; - } - .navbar-form .input-group { - display: inline-table; - vertical-align: middle; - } - .navbar-form .input-group .input-group-addon, - .navbar-form .input-group .input-group-btn, - .navbar-form .input-group .form-control { - width: auto; - } - .navbar-form .input-group > .form-control { - width: 100%; - } - .navbar-form .control-label { - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .radio, - .navbar-form .checkbox { - display: inline-block; - margin-top: 0; - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .radio label, - .navbar-form .checkbox label { - padding-left: 0; - } - .navbar-form .radio input[type="radio"], - .navbar-form .checkbox input[type="checkbox"] { - position: relative; - margin-left: 0; - } - .navbar-form .has-feedback .form-control-feedback { - top: 0; - } -} -@media (max-width: 767px) { - .navbar-form .form-group { - margin-bottom: 5px; - } - .navbar-form .form-group:last-child { - margin-bottom: 0; - } -} -@media (min-width: 768px) { - .navbar-form { - width: auto; - padding-top: 0; - padding-bottom: 0; - margin-right: 0; - margin-left: 0; - border: 0; - -webkit-box-shadow: none; - box-shadow: none; - } -} -.navbar-nav > li > .dropdown-menu { - margin-top: 0; - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { - margin-bottom: 0; - border-top-left-radius: 4px; - border-top-right-radius: 4px; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.navbar-btn { - margin-top: 8px; - margin-bottom: 8px; -} -.navbar-btn.btn-sm { - margin-top: 10px; - margin-bottom: 10px; -} -.navbar-btn.btn-xs { - margin-top: 14px; - margin-bottom: 14px; -} -.navbar-text { - margin-top: 15px; - margin-bottom: 15px; -} -@media (min-width: 768px) { - .navbar-text { - float: left; - margin-right: 15px; - margin-left: 15px; - } -} -@media (min-width: 768px) { - .navbar-left { - float: left !important; - } - .navbar-right { - float: right !important; - margin-right: -15px; - } - .navbar-right ~ .navbar-right { - margin-right: 0; - } -} -.navbar-default { - background-color: #f8f8f8; - border-color: #e7e7e7; -} -.navbar-default .navbar-brand { - color: #777; -} -.navbar-default .navbar-brand:hover, -.navbar-default .navbar-brand:focus { - color: #5e5e5e; - background-color: transparent; -} -.navbar-default .navbar-text { - color: #777; -} -.navbar-default .navbar-nav > li > a { - color: #777; -} -.navbar-default .navbar-nav > li > a:hover, -.navbar-default .navbar-nav > li > a:focus { - color: #333; - background-color: transparent; -} -.navbar-default .navbar-nav > .active > a, -.navbar-default .navbar-nav > .active > a:hover, -.navbar-default .navbar-nav > .active > a:focus { - color: #555; - background-color: #e7e7e7; -} -.navbar-default .navbar-nav > .disabled > a, -.navbar-default .navbar-nav > .disabled > a:hover, -.navbar-default .navbar-nav > .disabled > a:focus { - color: #ccc; - background-color: transparent; -} -.navbar-default .navbar-toggle { - border-color: #ddd; -} -.navbar-default .navbar-toggle:hover, -.navbar-default .navbar-toggle:focus { - background-color: #ddd; -} -.navbar-default .navbar-toggle .icon-bar { - background-color: #888; -} -.navbar-default .navbar-collapse, -.navbar-default .navbar-form { - border-color: #e7e7e7; -} -.navbar-default .navbar-nav > .open > a, -.navbar-default .navbar-nav > .open > a:hover, -.navbar-default .navbar-nav > .open > a:focus { - color: #555; - background-color: #e7e7e7; -} -@media (max-width: 767px) { - .navbar-default .navbar-nav .open .dropdown-menu > li > a { - color: #777; - } - .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { - color: #333; - background-color: transparent; - } - .navbar-default .navbar-nav .open .dropdown-menu > .active > a, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #555; - background-color: #e7e7e7; - } - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #ccc; - background-color: transparent; - } -} -.navbar-default .navbar-link { - color: #777; -} -.navbar-default .navbar-link:hover { - color: #333; -} -.navbar-default .btn-link { - color: #777; -} -.navbar-default .btn-link:hover, -.navbar-default .btn-link:focus { - color: #333; -} -.navbar-default .btn-link[disabled]:hover, -fieldset[disabled] .navbar-default .btn-link:hover, -.navbar-default .btn-link[disabled]:focus, -fieldset[disabled] .navbar-default .btn-link:focus { - color: #ccc; -} -.navbar-inverse { - background-color: #222; - border-color: #080808; -} -.navbar-inverse .navbar-brand { - color: #9d9d9d; -} -.navbar-inverse .navbar-brand:hover, -.navbar-inverse .navbar-brand:focus { - color: #fff; - background-color: transparent; -} -.navbar-inverse .navbar-text { - color: #9d9d9d; -} -.navbar-inverse .navbar-nav > li > a { - color: #9d9d9d; -} -.navbar-inverse .navbar-nav > li > a:hover, -.navbar-inverse .navbar-nav > li > a:focus { - color: #fff; - background-color: transparent; -} -.navbar-inverse .navbar-nav > .active > a, -.navbar-inverse .navbar-nav > .active > a:hover, -.navbar-inverse .navbar-nav > .active > a:focus { - color: #fff; - background-color: #080808; -} -.navbar-inverse .navbar-nav > .disabled > a, -.navbar-inverse .navbar-nav > .disabled > a:hover, -.navbar-inverse .navbar-nav > .disabled > a:focus { - color: #444; - background-color: transparent; -} -.navbar-inverse .navbar-toggle { - border-color: #333; -} -.navbar-inverse .navbar-toggle:hover, -.navbar-inverse .navbar-toggle:focus { - background-color: #333; -} -.navbar-inverse .navbar-toggle .icon-bar { - background-color: #fff; -} -.navbar-inverse .navbar-collapse, -.navbar-inverse .navbar-form { - border-color: #101010; -} -.navbar-inverse .navbar-nav > .open > a, -.navbar-inverse .navbar-nav > .open > a:hover, -.navbar-inverse .navbar-nav > .open > a:focus { - color: #fff; - background-color: #080808; -} -@media (max-width: 767px) { - .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { - border-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu .divider { - background-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { - color: #9d9d9d; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { - color: #fff; - background-color: transparent; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #fff; - background-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #444; - background-color: transparent; - } -} -.navbar-inverse .navbar-link { - color: #9d9d9d; -} -.navbar-inverse .navbar-link:hover { - color: #fff; -} -.navbar-inverse .btn-link { - color: #9d9d9d; -} -.navbar-inverse .btn-link:hover, -.navbar-inverse .btn-link:focus { - color: #fff; -} -.navbar-inverse .btn-link[disabled]:hover, -fieldset[disabled] .navbar-inverse .btn-link:hover, -.navbar-inverse .btn-link[disabled]:focus, -fieldset[disabled] .navbar-inverse .btn-link:focus { - color: #444; -} -.breadcrumb { - padding: 8px 15px; - margin-bottom: 20px; - list-style: none; - background-color: #f5f5f5; - border-radius: 4px; -} -.breadcrumb > li { - display: inline-block; -} -.breadcrumb > li + li:before { - padding: 0 5px; - color: #ccc; - content: "/\00a0"; -} -.breadcrumb > .active { - color: #777; -} -.pagination { - display: inline-block; - padding-left: 0; - margin: 20px 0; - border-radius: 4px; -} -.pagination > li { - display: inline; -} -.pagination > li > a, -.pagination > li > span { - position: relative; - float: left; - padding: 6px 12px; - margin-left: -1px; - line-height: 1.42857143; - color: #337ab7; - text-decoration: none; - background-color: #fff; - border: 1px solid #ddd; -} -.pagination > li:first-child > a, -.pagination > li:first-child > span { - margin-left: 0; - border-top-left-radius: 4px; - border-bottom-left-radius: 4px; -} -.pagination > li:last-child > a, -.pagination > li:last-child > span { - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; -} -.pagination > li > a:hover, -.pagination > li > span:hover, -.pagination > li > a:focus, -.pagination > li > span:focus { - z-index: 3; - color: #23527c; - background-color: #eee; - border-color: #ddd; -} -.pagination > .active > a, -.pagination > .active > span, -.pagination > .active > a:hover, -.pagination > .active > span:hover, -.pagination > .active > a:focus, -.pagination > .active > span:focus { - z-index: 2; - color: #fff; - cursor: default; - background-color: #337ab7; - border-color: #337ab7; -} -.pagination > .disabled > span, -.pagination > .disabled > span:hover, -.pagination > .disabled > span:focus, -.pagination > .disabled > a, -.pagination > .disabled > a:hover, -.pagination > .disabled > a:focus { - color: #777; - cursor: not-allowed; - background-color: #fff; - border-color: #ddd; -} -.pagination-lg > li > a, -.pagination-lg > li > span { - padding: 10px 16px; - font-size: 18px; - line-height: 1.3333333; -} -.pagination-lg > li:first-child > a, -.pagination-lg > li:first-child > span { - border-top-left-radius: 6px; - border-bottom-left-radius: 6px; -} -.pagination-lg > li:last-child > a, -.pagination-lg > li:last-child > span { - border-top-right-radius: 6px; - border-bottom-right-radius: 6px; -} -.pagination-sm > li > a, -.pagination-sm > li > span { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; -} -.pagination-sm > li:first-child > a, -.pagination-sm > li:first-child > span { - border-top-left-radius: 3px; - border-bottom-left-radius: 3px; -} -.pagination-sm > li:last-child > a, -.pagination-sm > li:last-child > span { - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; -} -.pager { - padding-left: 0; - margin: 20px 0; - text-align: center; - list-style: none; -} -.pager li { - display: inline; -} -.pager li > a, -.pager li > span { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 15px; -} -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; - background-color: #eee; -} -.pager .next > a, -.pager .next > span { - float: right; -} -.pager .previous > a, -.pager .previous > span { - float: left; -} -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > a:focus, -.pager .disabled > span { - color: #777; - cursor: not-allowed; - background-color: #fff; -} -.label { - display: inline; - padding: .2em .6em .3em; - font-size: 75%; - font-weight: bold; - line-height: 1; - color: #fff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: .25em; -} -a.label:hover, -a.label:focus { - color: #fff; - text-decoration: none; - cursor: pointer; -} -.label:empty { - display: none; -} -.btn .label { - position: relative; - top: -1px; -} -.label-default { - background-color: #777; -} -.label-default[href]:hover, -.label-default[href]:focus { - background-color: #5e5e5e; -} -.label-primary { - background-color: #337ab7; -} -.label-primary[href]:hover, -.label-primary[href]:focus { - background-color: #286090; -} -.label-success { - background-color: #5cb85c; -} -.label-success[href]:hover, -.label-success[href]:focus { - background-color: #449d44; -} -.label-info { - background-color: #5bc0de; -} -.label-info[href]:hover, -.label-info[href]:focus { - background-color: #31b0d5; -} -.label-warning { - background-color: #f0ad4e; -} -.label-warning[href]:hover, -.label-warning[href]:focus { - background-color: #ec971f; -} -.label-danger { - background-color: #d9534f; -} -.label-danger[href]:hover, -.label-danger[href]:focus { - background-color: #c9302c; -} -.badge { - display: inline-block; - min-width: 10px; - padding: 3px 7px; - font-size: 12px; - font-weight: bold; - line-height: 1; - color: #fff; - text-align: center; - white-space: nowrap; - vertical-align: middle; - background-color: #777; - border-radius: 10px; -} -.badge:empty { - display: none; -} -.btn .badge { - position: relative; - top: -1px; -} -.btn-xs .badge, -.btn-group-xs > .btn .badge { - top: 0; - padding: 1px 5px; -} -a.badge:hover, -a.badge:focus { - color: #fff; - text-decoration: none; - cursor: pointer; -} -.list-group-item.active > .badge, -.nav-pills > .active > a > .badge { - color: #337ab7; - background-color: #fff; -} -.list-group-item > .badge { - float: right; -} -.list-group-item > .badge + .badge { - margin-right: 5px; -} -.nav-pills > li > a > .badge { - margin-left: 3px; -} -.jumbotron { - padding-top: 30px; - padding-bottom: 30px; - margin-bottom: 30px; - color: inherit; - background-color: #eee; -} -.jumbotron h1, -.jumbotron .h1 { - color: inherit; -} -.jumbotron p { - margin-bottom: 15px; - font-size: 21px; - font-weight: 200; -} -.jumbotron > hr { - border-top-color: #d5d5d5; -} -.container .jumbotron, -.container-fluid .jumbotron { - border-radius: 6px; -} -.jumbotron .container { - max-width: 100%; -} -@media screen and (min-width: 768px) { - .jumbotron { - padding-top: 48px; - padding-bottom: 48px; - } - .container .jumbotron, - .container-fluid .jumbotron { - padding-right: 60px; - padding-left: 60px; - } - .jumbotron h1, - .jumbotron .h1 { - font-size: 63px; - } -} -.thumbnail { - display: block; - padding: 4px; - margin-bottom: 20px; - line-height: 1.42857143; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 4px; - -webkit-transition: border .2s ease-in-out; - -o-transition: border .2s ease-in-out; - transition: border .2s ease-in-out; -} -.thumbnail > img, -.thumbnail a > img { - margin-right: auto; - margin-left: auto; -} -a.thumbnail:hover, -a.thumbnail:focus, -a.thumbnail.active { - border-color: #337ab7; -} -.thumbnail .caption { - padding: 9px; - color: #333; -} -.alert { - padding: 15px; - margin-bottom: 20px; - border: 1px solid transparent; - border-radius: 4px; -} -.alert h4 { - margin-top: 0; - color: inherit; -} -.alert .alert-link { - font-weight: bold; -} -.alert > p, -.alert > ul { - margin-bottom: 0; -} -.alert > p + p { - margin-top: 5px; -} -.alert-dismissable, -.alert-dismissible { - padding-right: 35px; -} -.alert-dismissable .close, -.alert-dismissible .close { - position: relative; - top: -2px; - right: -21px; - color: inherit; -} -.alert-success { - color: #3c763d; - background-color: #dff0d8; - border-color: #d6e9c6; -} -.alert-success hr { - border-top-color: #c9e2b3; -} -.alert-success .alert-link { - color: #2b542c; -} -.alert-info { - color: #31708f; - background-color: #d9edf7; - border-color: #bce8f1; -} -.alert-info hr { - border-top-color: #a6e1ec; -} -.alert-info .alert-link { - color: #245269; -} -.alert-warning { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #faebcc; -} -.alert-warning hr { - border-top-color: #f7e1b5; -} -.alert-warning .alert-link { - color: #66512c; -} -.alert-danger { - color: #a94442; - background-color: #f2dede; - border-color: #ebccd1; -} -.alert-danger hr { - border-top-color: #e4b9c0; -} -.alert-danger .alert-link { - color: #843534; -} -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@-o-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -.progress { - height: 20px; - margin-bottom: 20px; - overflow: hidden; - background-color: #f5f5f5; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); -} -.progress-bar { - float: left; - width: 0; - height: 100%; - font-size: 12px; - line-height: 20px; - color: #fff; - text-align: center; - background-color: #337ab7; - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); - -webkit-transition: width .6s ease; - -o-transition: width .6s ease; - transition: width .6s ease; -} -.progress-striped .progress-bar, -.progress-bar-striped { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - -webkit-background-size: 40px 40px; - background-size: 40px 40px; -} -.progress.active .progress-bar, -.progress-bar.active { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -o-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} -.progress-bar-success { - background-color: #5cb85c; -} -.progress-striped .progress-bar-success { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.progress-bar-info { - background-color: #5bc0de; -} -.progress-striped .progress-bar-info { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.progress-bar-warning { - background-color: #f0ad4e; -} -.progress-striped .progress-bar-warning { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.progress-bar-danger { - background-color: #d9534f; -} -.progress-striped .progress-bar-danger { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.media { - margin-top: 15px; -} -.media:first-child { - margin-top: 0; -} -.media, -.media-body { - overflow: hidden; - zoom: 1; -} -.media-body { - width: 10000px; -} -.media-object { - display: block; -} -.media-object.img-thumbnail { - max-width: none; -} -.media-right, -.media > .pull-right { - padding-left: 10px; -} -.media-left, -.media > .pull-left { - padding-right: 10px; -} -.media-left, -.media-right, -.media-body { - display: table-cell; - vertical-align: top; -} -.media-middle { - vertical-align: middle; -} -.media-bottom { - vertical-align: bottom; -} -.media-heading { - margin-top: 0; - margin-bottom: 5px; -} -.media-list { - padding-left: 0; - list-style: none; -} -.list-group { - padding-left: 0; - margin-bottom: 20px; -} -.list-group-item { - position: relative; - display: block; - padding: 10px 15px; - margin-bottom: -1px; - background-color: #fff; - border: 1px solid #ddd; -} -.list-group-item:first-child { - border-top-left-radius: 4px; - border-top-right-radius: 4px; -} -.list-group-item:last-child { - margin-bottom: 0; - border-bottom-right-radius: 4px; - border-bottom-left-radius: 4px; -} -a.list-group-item, -button.list-group-item { - color: #555; -} -a.list-group-item .list-group-item-heading, -button.list-group-item .list-group-item-heading { - color: #333; -} -a.list-group-item:hover, -button.list-group-item:hover, -a.list-group-item:focus, -button.list-group-item:focus { - color: #555; - text-decoration: none; - background-color: #f5f5f5; -} -button.list-group-item { - width: 100%; - text-align: left; -} -.list-group-item.disabled, -.list-group-item.disabled:hover, -.list-group-item.disabled:focus { - color: #777; - cursor: not-allowed; - background-color: #eee; -} -.list-group-item.disabled .list-group-item-heading, -.list-group-item.disabled:hover .list-group-item-heading, -.list-group-item.disabled:focus .list-group-item-heading { - color: inherit; -} -.list-group-item.disabled .list-group-item-text, -.list-group-item.disabled:hover .list-group-item-text, -.list-group-item.disabled:focus .list-group-item-text { - color: #777; -} -.list-group-item.active, -.list-group-item.active:hover, -.list-group-item.active:focus { - z-index: 2; - color: #fff; - background-color: #337ab7; - border-color: #337ab7; -} -.list-group-item.active .list-group-item-heading, -.list-group-item.active:hover .list-group-item-heading, -.list-group-item.active:focus .list-group-item-heading, -.list-group-item.active .list-group-item-heading > small, -.list-group-item.active:hover .list-group-item-heading > small, -.list-group-item.active:focus .list-group-item-heading > small, -.list-group-item.active .list-group-item-heading > .small, -.list-group-item.active:hover .list-group-item-heading > .small, -.list-group-item.active:focus .list-group-item-heading > .small { - color: inherit; -} -.list-group-item.active .list-group-item-text, -.list-group-item.active:hover .list-group-item-text, -.list-group-item.active:focus .list-group-item-text { - color: #c7ddef; -} -.list-group-item-success { - color: #3c763d; - background-color: #dff0d8; -} -a.list-group-item-success, -button.list-group-item-success { - color: #3c763d; -} -a.list-group-item-success .list-group-item-heading, -button.list-group-item-success .list-group-item-heading { - color: inherit; -} -a.list-group-item-success:hover, -button.list-group-item-success:hover, -a.list-group-item-success:focus, -button.list-group-item-success:focus { - color: #3c763d; - background-color: #d0e9c6; -} -a.list-group-item-success.active, -button.list-group-item-success.active, -a.list-group-item-success.active:hover, -button.list-group-item-success.active:hover, -a.list-group-item-success.active:focus, -button.list-group-item-success.active:focus { - color: #fff; - background-color: #3c763d; - border-color: #3c763d; -} -.list-group-item-info { - color: #31708f; - background-color: #d9edf7; -} -a.list-group-item-info, -button.list-group-item-info { - color: #31708f; -} -a.list-group-item-info .list-group-item-heading, -button.list-group-item-info .list-group-item-heading { - color: inherit; -} -a.list-group-item-info:hover, -button.list-group-item-info:hover, -a.list-group-item-info:focus, -button.list-group-item-info:focus { - color: #31708f; - background-color: #c4e3f3; -} -a.list-group-item-info.active, -button.list-group-item-info.active, -a.list-group-item-info.active:hover, -button.list-group-item-info.active:hover, -a.list-group-item-info.active:focus, -button.list-group-item-info.active:focus { - color: #fff; - background-color: #31708f; - border-color: #31708f; -} -.list-group-item-warning { - color: #8a6d3b; - background-color: #fcf8e3; -} -a.list-group-item-warning, -button.list-group-item-warning { - color: #8a6d3b; -} -a.list-group-item-warning .list-group-item-heading, -button.list-group-item-warning .list-group-item-heading { - color: inherit; -} -a.list-group-item-warning:hover, -button.list-group-item-warning:hover, -a.list-group-item-warning:focus, -button.list-group-item-warning:focus { - color: #8a6d3b; - background-color: #faf2cc; -} -a.list-group-item-warning.active, -button.list-group-item-warning.active, -a.list-group-item-warning.active:hover, -button.list-group-item-warning.active:hover, -a.list-group-item-warning.active:focus, -button.list-group-item-warning.active:focus { - color: #fff; - background-color: #8a6d3b; - border-color: #8a6d3b; -} -.list-group-item-danger { - color: #a94442; - background-color: #f2dede; -} -a.list-group-item-danger, -button.list-group-item-danger { - color: #a94442; -} -a.list-group-item-danger .list-group-item-heading, -button.list-group-item-danger .list-group-item-heading { - color: inherit; -} -a.list-group-item-danger:hover, -button.list-group-item-danger:hover, -a.list-group-item-danger:focus, -button.list-group-item-danger:focus { - color: #a94442; - background-color: #ebcccc; -} -a.list-group-item-danger.active, -button.list-group-item-danger.active, -a.list-group-item-danger.active:hover, -button.list-group-item-danger.active:hover, -a.list-group-item-danger.active:focus, -button.list-group-item-danger.active:focus { - color: #fff; - background-color: #a94442; - border-color: #a94442; -} -.list-group-item-heading { - margin-top: 0; - margin-bottom: 5px; -} -.list-group-item-text { - margin-bottom: 0; - line-height: 1.3; -} -.panel { - margin-bottom: 20px; - background-color: #fff; - border: 1px solid transparent; - border-radius: 4px; - -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); - box-shadow: 0 1px 1px rgba(0, 0, 0, .05); -} -.panel-body { - padding: 15px; -} -.panel-heading { - padding: 10px 15px; - border-bottom: 1px solid transparent; - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel-heading > .dropdown .dropdown-toggle { - color: inherit; -} -.panel-title { - margin-top: 0; - margin-bottom: 0; - font-size: 16px; - color: inherit; -} -.panel-title > a, -.panel-title > small, -.panel-title > .small, -.panel-title > small > a, -.panel-title > .small > a { - color: inherit; -} -.panel-footer { - padding: 10px 15px; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel > .list-group, -.panel > .panel-collapse > .list-group { - margin-bottom: 0; -} -.panel > .list-group .list-group-item, -.panel > .panel-collapse > .list-group .list-group-item { - border-width: 1px 0; - border-radius: 0; -} -.panel > .list-group:first-child .list-group-item:first-child, -.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { - border-top: 0; - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel > .list-group:last-child .list-group-item:last-child, -.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { - border-bottom: 0; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.panel-heading + .list-group .list-group-item:first-child { - border-top-width: 0; -} -.list-group + .panel-footer { - border-top-width: 0; -} -.panel > .table, -.panel > .table-responsive > .table, -.panel > .panel-collapse > .table { - margin-bottom: 0; -} -.panel > .table caption, -.panel > .table-responsive > .table caption, -.panel > .panel-collapse > .table caption { - padding-right: 15px; - padding-left: 15px; -} -.panel > .table:first-child, -.panel > .table-responsive:first-child > .table:first-child { - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel > .table:first-child > thead:first-child > tr:first-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, -.panel > .table:first-child > tbody:first-child > tr:first-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, -.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, -.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, -.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { - border-top-left-radius: 3px; -} -.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, -.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, -.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, -.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { - border-top-right-radius: 3px; -} -.panel > .table:last-child, -.panel > .table-responsive:last-child > .table:last-child { - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel > .table:last-child > tbody:last-child > tr:last-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, -.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { - border-bottom-left-radius: 3px; -} -.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, -.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { - border-bottom-right-radius: 3px; -} -.panel > .panel-body + .table, -.panel > .panel-body + .table-responsive, -.panel > .table + .panel-body, -.panel > .table-responsive + .panel-body { - border-top: 1px solid #ddd; -} -.panel > .table > tbody:first-child > tr:first-child th, -.panel > .table > tbody:first-child > tr:first-child td { - border-top: 0; -} -.panel > .table-bordered, -.panel > .table-responsive > .table-bordered { - border: 0; -} -.panel > .table-bordered > thead > tr > th:first-child, -.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, -.panel > .table-bordered > tbody > tr > th:first-child, -.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, -.panel > .table-bordered > tfoot > tr > th:first-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, -.panel > .table-bordered > thead > tr > td:first-child, -.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, -.panel > .table-bordered > tbody > tr > td:first-child, -.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, -.panel > .table-bordered > tfoot > tr > td:first-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; -} -.panel > .table-bordered > thead > tr > th:last-child, -.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, -.panel > .table-bordered > tbody > tr > th:last-child, -.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, -.panel > .table-bordered > tfoot > tr > th:last-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, -.panel > .table-bordered > thead > tr > td:last-child, -.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, -.panel > .table-bordered > tbody > tr > td:last-child, -.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, -.panel > .table-bordered > tfoot > tr > td:last-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; -} -.panel > .table-bordered > thead > tr:first-child > td, -.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, -.panel > .table-bordered > tbody > tr:first-child > td, -.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, -.panel > .table-bordered > thead > tr:first-child > th, -.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, -.panel > .table-bordered > tbody > tr:first-child > th, -.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { - border-bottom: 0; -} -.panel > .table-bordered > tbody > tr:last-child > td, -.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, -.panel > .table-bordered > tfoot > tr:last-child > td, -.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, -.panel > .table-bordered > tbody > tr:last-child > th, -.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, -.panel > .table-bordered > tfoot > tr:last-child > th, -.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { - border-bottom: 0; -} -.panel > .table-responsive { - margin-bottom: 0; - border: 0; -} -.panel-group { - margin-bottom: 20px; -} -.panel-group .panel { - margin-bottom: 0; - border-radius: 4px; -} -.panel-group .panel + .panel { - margin-top: 5px; -} -.panel-group .panel-heading { - border-bottom: 0; -} -.panel-group .panel-heading + .panel-collapse > .panel-body, -.panel-group .panel-heading + .panel-collapse > .list-group { - border-top: 1px solid #ddd; -} -.panel-group .panel-footer { - border-top: 0; -} -.panel-group .panel-footer + .panel-collapse .panel-body { - border-bottom: 1px solid #ddd; -} -.panel-default { - border-color: #ddd; -} -.panel-default > .panel-heading { - color: #333; - background-color: #f5f5f5; - border-color: #ddd; -} -.panel-default > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #ddd; -} -.panel-default > .panel-heading .badge { - color: #f5f5f5; - background-color: #333; -} -.panel-default > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #ddd; -} -.panel-primary { - border-color: #337ab7; -} -.panel-primary > .panel-heading { - color: #fff; - background-color: #337ab7; - border-color: #337ab7; -} -.panel-primary > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #337ab7; -} -.panel-primary > .panel-heading .badge { - color: #337ab7; - background-color: #fff; -} -.panel-primary > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #337ab7; -} -.panel-success { - border-color: #d6e9c6; -} -.panel-success > .panel-heading { - color: #3c763d; - background-color: #dff0d8; - border-color: #d6e9c6; -} -.panel-success > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #d6e9c6; -} -.panel-success > .panel-heading .badge { - color: #dff0d8; - background-color: #3c763d; -} -.panel-success > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #d6e9c6; -} -.panel-info { - border-color: #bce8f1; -} -.panel-info > .panel-heading { - color: #31708f; - background-color: #d9edf7; - border-color: #bce8f1; -} -.panel-info > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #bce8f1; -} -.panel-info > .panel-heading .badge { - color: #d9edf7; - background-color: #31708f; -} -.panel-info > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #bce8f1; -} -.panel-warning { - border-color: #faebcc; -} -.panel-warning > .panel-heading { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #faebcc; -} -.panel-warning > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #faebcc; -} -.panel-warning > .panel-heading .badge { - color: #fcf8e3; - background-color: #8a6d3b; -} -.panel-warning > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #faebcc; -} -.panel-danger { - border-color: #ebccd1; -} -.panel-danger > .panel-heading { - color: #a94442; - background-color: #f2dede; - border-color: #ebccd1; -} -.panel-danger > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #ebccd1; -} -.panel-danger > .panel-heading .badge { - color: #f2dede; - background-color: #a94442; -} -.panel-danger > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #ebccd1; -} -.embed-responsive { - position: relative; - display: block; - height: 0; - padding: 0; - overflow: hidden; -} -.embed-responsive .embed-responsive-item, -.embed-responsive iframe, -.embed-responsive embed, -.embed-responsive object, -.embed-responsive video { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 100%; - height: 100%; - border: 0; -} -.embed-responsive-16by9 { - padding-bottom: 56.25%; -} -.embed-responsive-4by3 { - padding-bottom: 75%; -} -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #e3e3e3; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); -} -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, .15); -} -.well-lg { - padding: 24px; - border-radius: 6px; -} -.well-sm { - padding: 9px; - border-radius: 3px; -} -.close { - float: right; - font-size: 21px; - font-weight: bold; - line-height: 1; - color: #000; - text-shadow: 0 1px 0 #fff; - filter: alpha(opacity=20); - opacity: .2; -} -.close:hover, -.close:focus { - color: #000; - text-decoration: none; - cursor: pointer; - filter: alpha(opacity=50); - opacity: .5; -} -button.close { - -webkit-appearance: none; - padding: 0; - cursor: pointer; - background: transparent; - border: 0; -} -.modal-open { - overflow: hidden; -} -.modal { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1050; - display: none; - overflow: hidden; - -webkit-overflow-scrolling: touch; - outline: 0; -} -.modal.fade .modal-dialog { - -webkit-transition: -webkit-transform .3s ease-out; - -o-transition: -o-transform .3s ease-out; - transition: transform .3s ease-out; - -webkit-transform: translate(0, -25%); - -ms-transform: translate(0, -25%); - -o-transform: translate(0, -25%); - transform: translate(0, -25%); -} -.modal.in .modal-dialog { - -webkit-transform: translate(0, 0); - -ms-transform: translate(0, 0); - -o-transform: translate(0, 0); - transform: translate(0, 0); -} -.modal-open .modal { - overflow-x: hidden; - overflow-y: auto; -} -.modal-dialog { - position: relative; - width: auto; - margin: 10px; -} -.modal-content { - position: relative; - background-color: #fff; - -webkit-background-clip: padding-box; - background-clip: padding-box; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, .2); - border-radius: 6px; - outline: 0; - -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); - box-shadow: 0 3px 9px rgba(0, 0, 0, .5); -} -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000; -} -.modal-backdrop.fade { - filter: alpha(opacity=0); - opacity: 0; -} -.modal-backdrop.in { - filter: alpha(opacity=50); - opacity: .5; -} -.modal-header { - min-height: 16.42857143px; - padding: 15px; - border-bottom: 1px solid #e5e5e5; -} -.modal-header .close { - margin-top: -2px; -} -.modal-title { - margin: 0; - line-height: 1.42857143; -} -.modal-body { - position: relative; - padding: 15px; -} -.modal-footer { - padding: 15px; - text-align: right; - border-top: 1px solid #e5e5e5; -} -.modal-footer .btn + .btn { - margin-bottom: 0; - margin-left: 5px; -} -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} -.modal-footer .btn-block + .btn-block { - margin-left: 0; -} -.modal-scrollbar-measure { - position: absolute; - top: -9999px; - width: 50px; - height: 50px; - overflow: scroll; -} -@media (min-width: 768px) { - .modal-dialog { - width: 600px; - margin: 30px auto; - } - .modal-content { - -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); - box-shadow: 0 5px 15px rgba(0, 0, 0, .5); - } - .modal-sm { - width: 300px; - } -} -@media (min-width: 992px) { - .modal-lg { - width: 900px; - } -} -.tooltip { - position: absolute; - z-index: 1070; - display: block; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 12px; - font-style: normal; - font-weight: normal; - line-height: 1.42857143; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - word-spacing: normal; - word-wrap: normal; - white-space: normal; - filter: alpha(opacity=0); - opacity: 0; - - line-break: auto; -} -.tooltip.in { - filter: alpha(opacity=90); - opacity: .9; -} -.tooltip.top { - padding: 5px 0; - margin-top: -3px; -} -.tooltip.right { - padding: 0 5px; - margin-left: 3px; -} -.tooltip.bottom { - padding: 5px 0; - margin-top: 3px; -} -.tooltip.left { - padding: 0 5px; - margin-left: -3px; -} -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #fff; - text-align: center; - background-color: #000; - border-radius: 4px; -} -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.top-left .tooltip-arrow { - right: 5px; - bottom: 0; - margin-bottom: -5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.top-right .tooltip-arrow { - bottom: 0; - left: 5px; - margin-bottom: -5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-width: 5px 5px 5px 0; - border-right-color: #000; -} -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-width: 5px 0 5px 5px; - border-left-color: #000; -} -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.tooltip.bottom-left .tooltip-arrow { - top: 0; - right: 5px; - margin-top: -5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.tooltip.bottom-right .tooltip-arrow { - top: 0; - left: 5px; - margin-top: -5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1060; - display: none; - max-width: 276px; - padding: 1px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - font-style: normal; - font-weight: normal; - line-height: 1.42857143; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - word-spacing: normal; - word-wrap: normal; - white-space: normal; - background-color: #fff; - -webkit-background-clip: padding-box; - background-clip: padding-box; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, .2); - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); - box-shadow: 0 5px 10px rgba(0, 0, 0, .2); - - line-break: auto; -} -.popover.top { - margin-top: -10px; -} -.popover.right { - margin-left: 10px; -} -.popover.bottom { - margin-top: 10px; -} -.popover.left { - margin-left: -10px; -} -.popover-title { - padding: 8px 14px; - margin: 0; - font-size: 14px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - border-radius: 5px 5px 0 0; -} -.popover-content { - padding: 9px 14px; -} -.popover > .arrow, -.popover > .arrow:after { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.popover > .arrow { - border-width: 11px; -} -.popover > .arrow:after { - content: ""; - border-width: 10px; -} -.popover.top > .arrow { - bottom: -11px; - left: 50%; - margin-left: -11px; - border-top-color: #999; - border-top-color: rgba(0, 0, 0, .25); - border-bottom-width: 0; -} -.popover.top > .arrow:after { - bottom: 1px; - margin-left: -10px; - content: " "; - border-top-color: #fff; - border-bottom-width: 0; -} -.popover.right > .arrow { - top: 50%; - left: -11px; - margin-top: -11px; - border-right-color: #999; - border-right-color: rgba(0, 0, 0, .25); - border-left-width: 0; -} -.popover.right > .arrow:after { - bottom: -10px; - left: 1px; - content: " "; - border-right-color: #fff; - border-left-width: 0; -} -.popover.bottom > .arrow { - top: -11px; - left: 50%; - margin-left: -11px; - border-top-width: 0; - border-bottom-color: #999; - border-bottom-color: rgba(0, 0, 0, .25); -} -.popover.bottom > .arrow:after { - top: 1px; - margin-left: -10px; - content: " "; - border-top-width: 0; - border-bottom-color: #fff; -} -.popover.left > .arrow { - top: 50%; - right: -11px; - margin-top: -11px; - border-right-width: 0; - border-left-color: #999; - border-left-color: rgba(0, 0, 0, .25); -} -.popover.left > .arrow:after { - right: 1px; - bottom: -10px; - content: " "; - border-right-width: 0; - border-left-color: #fff; -} -.carousel { - position: relative; -} -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} -.carousel-inner > .item { - position: relative; - display: none; - -webkit-transition: .6s ease-in-out left; - -o-transition: .6s ease-in-out left; - transition: .6s ease-in-out left; -} -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - line-height: 1; -} -@media all and (transform-3d), (-webkit-transform-3d) { - .carousel-inner > .item { - -webkit-transition: -webkit-transform .6s ease-in-out; - -o-transition: -o-transform .6s ease-in-out; - transition: transform .6s ease-in-out; - - -webkit-backface-visibility: hidden; - backface-visibility: hidden; - -webkit-perspective: 1000px; - perspective: 1000px; - } - .carousel-inner > .item.next, - .carousel-inner > .item.active.right { - left: 0; - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - } - .carousel-inner > .item.prev, - .carousel-inner > .item.active.left { - left: 0; - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - } - .carousel-inner > .item.next.left, - .carousel-inner > .item.prev.right, - .carousel-inner > .item.active { - left: 0; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -.carousel-inner > .active, -.carousel-inner > .next, -.carousel-inner > .prev { - display: block; -} -.carousel-inner > .active { - left: 0; -} -.carousel-inner > .next, -.carousel-inner > .prev { - position: absolute; - top: 0; - width: 100%; -} -.carousel-inner > .next { - left: 100%; -} -.carousel-inner > .prev { - left: -100%; -} -.carousel-inner > .next.left, -.carousel-inner > .prev.right { - left: 0; -} -.carousel-inner > .active.left { - left: -100%; -} -.carousel-inner > .active.right { - left: 100%; -} -.carousel-control { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 15%; - font-size: 20px; - color: #fff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, .6); - filter: alpha(opacity=50); - opacity: .5; -} -.carousel-control.left { - background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); - background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); - background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); - background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); - background-repeat: repeat-x; -} -.carousel-control.right { - right: 0; - left: auto; - background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); - background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); - background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); - background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); - background-repeat: repeat-x; -} -.carousel-control:hover, -.carousel-control:focus { - color: #fff; - text-decoration: none; - filter: alpha(opacity=90); - outline: 0; - opacity: .9; -} -.carousel-control .icon-prev, -.carousel-control .icon-next, -.carousel-control .glyphicon-chevron-left, -.carousel-control .glyphicon-chevron-right { - position: absolute; - top: 50%; - z-index: 5; - display: inline-block; - margin-top: -10px; -} -.carousel-control .icon-prev, -.carousel-control .glyphicon-chevron-left { - left: 50%; - margin-left: -10px; -} -.carousel-control .icon-next, -.carousel-control .glyphicon-chevron-right { - right: 50%; - margin-right: -10px; -} -.carousel-control .icon-prev, -.carousel-control .icon-next { - width: 20px; - height: 20px; - font-family: serif; - line-height: 1; -} -.carousel-control .icon-prev:before { - content: '\2039'; -} -.carousel-control .icon-next:before { - content: '\203a'; -} -.carousel-indicators { - position: absolute; - bottom: 10px; - left: 50%; - z-index: 15; - width: 60%; - padding-left: 0; - margin-left: -30%; - text-align: center; - list-style: none; -} -.carousel-indicators li { - display: inline-block; - width: 10px; - height: 10px; - margin: 1px; - text-indent: -999px; - cursor: pointer; - background-color: #000 \9; - background-color: rgba(0, 0, 0, 0); - border: 1px solid #fff; - border-radius: 10px; -} -.carousel-indicators .active { - width: 12px; - height: 12px; - margin: 0; - background-color: #fff; -} -.carousel-caption { - position: absolute; - right: 15%; - bottom: 20px; - left: 15%; - z-index: 10; - padding-top: 20px; - padding-bottom: 20px; - color: #fff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, .6); -} -.carousel-caption .btn { - text-shadow: none; -} -@media screen and (min-width: 768px) { - .carousel-control .glyphicon-chevron-left, - .carousel-control .glyphicon-chevron-right, - .carousel-control .icon-prev, - .carousel-control .icon-next { - width: 30px; - height: 30px; - margin-top: -15px; - font-size: 30px; - } - .carousel-control .glyphicon-chevron-left, - .carousel-control .icon-prev { - margin-left: -15px; - } - .carousel-control .glyphicon-chevron-right, - .carousel-control .icon-next { - margin-right: -15px; - } - .carousel-caption { - right: 20%; - left: 20%; - padding-bottom: 30px; - } - .carousel-indicators { - bottom: 20px; - } -} -.clearfix:before, -.clearfix:after, -.dl-horizontal dd:before, -.dl-horizontal dd:after, -.container:before, -.container:after, -.container-fluid:before, -.container-fluid:after, -.row:before, -.row:after, -.form-horizontal .form-group:before, -.form-horizontal .form-group:after, -.btn-toolbar:before, -.btn-toolbar:after, -.btn-group-vertical > .btn-group:before, -.btn-group-vertical > .btn-group:after, -.nav:before, -.nav:after, -.navbar:before, -.navbar:after, -.navbar-header:before, -.navbar-header:after, -.navbar-collapse:before, -.navbar-collapse:after, -.pager:before, -.pager:after, -.panel-body:before, -.panel-body:after, -.modal-footer:before, -.modal-footer:after { - display: table; - content: " "; -} -.clearfix:after, -.dl-horizontal dd:after, -.container:after, -.container-fluid:after, -.row:after, -.form-horizontal .form-group:after, -.btn-toolbar:after, -.btn-group-vertical > .btn-group:after, -.nav:after, -.navbar:after, -.navbar-header:after, -.navbar-collapse:after, -.pager:after, -.panel-body:after, -.modal-footer:after { - clear: both; -} -.center-block { - display: block; - margin-right: auto; - margin-left: auto; -} -.pull-right { - float: right !important; -} -.pull-left { - float: left !important; -} -.hide { - display: none !important; -} -.show { - display: block !important; -} -.invisible { - visibility: hidden; -} -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} -.hidden { - display: none !important; -} -.affix { - position: fixed; -} -@-ms-viewport { - width: device-width; -} -.visible-xs, -.visible-sm, -.visible-md, -.visible-lg { - display: none !important; -} -.visible-xs-block, -.visible-xs-inline, -.visible-xs-inline-block, -.visible-sm-block, -.visible-sm-inline, -.visible-sm-inline-block, -.visible-md-block, -.visible-md-inline, -.visible-md-inline-block, -.visible-lg-block, -.visible-lg-inline, -.visible-lg-inline-block { - display: none !important; -} -@media (max-width: 767px) { - .visible-xs { - display: block !important; - } - table.visible-xs { - display: table !important; - } - tr.visible-xs { - display: table-row !important; - } - th.visible-xs, - td.visible-xs { - display: table-cell !important; - } -} -@media (max-width: 767px) { - .visible-xs-block { - display: block !important; - } -} -@media (max-width: 767px) { - .visible-xs-inline { - display: inline !important; - } -} -@media (max-width: 767px) { - .visible-xs-inline-block { - display: inline-block !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm { - display: block !important; - } - table.visible-sm { - display: table !important; - } - tr.visible-sm { - display: table-row !important; - } - th.visible-sm, - td.visible-sm { - display: table-cell !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-block { - display: block !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-inline { - display: inline !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-inline-block { - display: inline-block !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md { - display: block !important; - } - table.visible-md { - display: table !important; - } - tr.visible-md { - display: table-row !important; - } - th.visible-md, - td.visible-md { - display: table-cell !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-block { - display: block !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-inline { - display: inline !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-inline-block { - display: inline-block !important; - } -} -@media (min-width: 1200px) { - .visible-lg { - display: block !important; - } - table.visible-lg { - display: table !important; - } - tr.visible-lg { - display: table-row !important; - } - th.visible-lg, - td.visible-lg { - display: table-cell !important; - } -} -@media (min-width: 1200px) { - .visible-lg-block { - display: block !important; - } -} -@media (min-width: 1200px) { - .visible-lg-inline { - display: inline !important; - } -} -@media (min-width: 1200px) { - .visible-lg-inline-block { - display: inline-block !important; - } -} -@media (max-width: 767px) { - .hidden-xs { - display: none !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .hidden-sm { - display: none !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .hidden-md { - display: none !important; - } -} -@media (min-width: 1200px) { - .hidden-lg { - display: none !important; - } -} -.visible-print { - display: none !important; -} -@media print { - .visible-print { - display: block !important; - } - table.visible-print { - display: table !important; - } - tr.visible-print { - display: table-row !important; - } - th.visible-print, - td.visible-print { - display: table-cell !important; - } -} -.visible-print-block { - display: none !important; -} -@media print { - .visible-print-block { - display: block !important; - } -} -.visible-print-inline { - display: none !important; -} -@media print { - .visible-print-inline { - display: inline !important; - } -} -.visible-print-inline-block { - display: none !important; -} -@media print { - .visible-print-inline-block { - display: inline-block !important; - } -} -@media print { - .hidden-print { - display: none !important; - } -} -/*# sourceMappingURL=bootstrap.css.map */ diff --git a/flask_admin/static/bootstrap/bootstrap3/css/bootstrap.css.map b/flask_admin/static/bootstrap/bootstrap3/css/bootstrap.css.map deleted file mode 100644 index 9f60ed2b1..000000000 --- a/flask_admin/static/bootstrap/bootstrap3/css/bootstrap.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["bootstrap.css","less/normalize.less","less/print.less","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/mixins/reset-text.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,4EAA4E;ACG5E;EACE,wBAAA;EACA,2BAAA;EACA,+BAAA;CDDD;ACQD;EACE,UAAA;CDND;ACmBD;;;;;;;;;;;;;EAaE,eAAA;CDjBD;ACyBD;;;;EAIE,sBAAA;EACA,yBAAA;CDvBD;AC+BD;EACE,cAAA;EACA,UAAA;CD7BD;ACqCD;;EAEE,cAAA;CDnCD;AC6CD;EACE,8BAAA;CD3CD;ACmDD;;EAEE,WAAA;CDjDD;AC2DD;EACE,0BAAA;CDzDD;ACgED;;EAEE,kBAAA;CD9DD;ACqED;EACE,mBAAA;CDnED;AC2ED;EACE,eAAA;EACA,iBAAA;CDzED;ACgFD;EACE,iBAAA;EACA,YAAA;CD9ED;ACqFD;EACE,eAAA;CDnFD;AC0FD;;EAEE,eAAA;EACA,eAAA;EACA,mBAAA;EACA,yBAAA;CDxFD;AC2FD;EACE,YAAA;CDzFD;AC4FD;EACE,gBAAA;CD1FD;ACoGD;EACE,UAAA;CDlGD;ACyGD;EACE,iBAAA;CDvGD;ACiHD;EACE,iBAAA;CD/GD;ACsHD;EACE,gCAAA;KAAA,6BAAA;UAAA,wBAAA;EACA,UAAA;CDpHD;AC2HD;EACE,eAAA;CDzHD;ACgID;;;;EAIE,kCAAA;EACA,eAAA;CD9HD;ACgJD;;;;;EAKE,eAAA;EACA,cAAA;EACA,UAAA;CD9ID;ACqJD;EACE,kBAAA;CDnJD;AC6JD;;EAEE,qBAAA;CD3JD;ACsKD;;;;EAIE,2BAAA;EACA,gBAAA;CDpKD;AC2KD;;EAEE,gBAAA;CDzKD;ACgLD;;EAEE,UAAA;EACA,WAAA;CD9KD;ACsLD;EACE,oBAAA;CDpLD;AC+LD;;EAEE,+BAAA;KAAA,4BAAA;UAAA,uBAAA;EACA,WAAA;CD7LD;ACsMD;;EAEE,aAAA;CDpMD;AC4MD;EACE,8BAAA;EACA,gCAAA;KAAA,6BAAA;UAAA,wBAAA;CD1MD;ACmND;;EAEE,yBAAA;CDjND;ACwND;EACE,0BAAA;EACA,cAAA;EACA,+BAAA;CDtND;AC8ND;EACE,UAAA;EACA,WAAA;CD5ND;ACmOD;EACE,eAAA;CDjOD;ACyOD;EACE,kBAAA;CDvOD;ACiPD;EACE,0BAAA;EACA,kBAAA;CD/OD;ACkPD;;EAEE,WAAA;CDhPD;AACD,qFAAqF;AElFrF;EA7FI;;;IAGI,mCAAA;IACA,uBAAA;IACA,oCAAA;YAAA,4BAAA;IACA,6BAAA;GFkLL;EE/KC;;IAEI,2BAAA;GFiLL;EE9KC;IACI,6BAAA;GFgLL;EE7KC;IACI,8BAAA;GF+KL;EE1KC;;IAEI,YAAA;GF4KL;EEzKC;;IAEI,uBAAA;IACA,yBAAA;GF2KL;EExKC;IACI,4BAAA;GF0KL;EEvKC;;IAEI,yBAAA;GFyKL;EEtKC;IACI,2BAAA;GFwKL;EErKC;;;IAGI,WAAA;IACA,UAAA;GFuKL;EEpKC;;IAEI,wBAAA;GFsKL;EEhKC;IACI,cAAA;GFkKL;EEhKC;;IAGQ,kCAAA;GFiKT;EE9JC;IACI,uBAAA;GFgKL;EE7JC;IACI,qCAAA;GF+JL;EEhKC;;IAKQ,kCAAA;GF+JT;EE5JC;;IAGQ,kCAAA;GF6JT;CACF;AGnPD;EACE,oCAAA;EACA,sDAAA;EACA,gYAAA;CHqPD;AG7OD;EACE,mBAAA;EACA,SAAA;EACA,sBAAA;EACA,oCAAA;EACA,mBAAA;EACA,oBAAA;EACA,eAAA;EACA,oCAAA;EACA,mCAAA;CH+OD;AG3OmC;EAAW,eAAA;CH8O9C;AG7OmC;EAAW,eAAA;CHgP9C;AG9OmC;;EAAW,iBAAA;CHkP9C;AGjPmC;EAAW,iBAAA;CHoP9C;AGnPmC;EAAW,iBAAA;CHsP9C;AGrPmC;EAAW,iBAAA;CHwP9C;AGvPmC;EAAW,iBAAA;CH0P9C;AGzPmC;EAAW,iBAAA;CH4P9C;AG3PmC;EAAW,iBAAA;CH8P9C;AG7PmC;EAAW,iBAAA;CHgQ9C;AG/PmC;EAAW,iBAAA;CHkQ9C;AGjQmC;EAAW,iBAAA;CHoQ9C;AGnQmC;EAAW,iBAAA;CHsQ9C;AGrQmC;EAAW,iBAAA;CHwQ9C;AGvQmC;EAAW,iBAAA;CH0Q9C;AGzQmC;EAAW,iBAAA;CH4Q9C;AG3QmC;EAAW,iBAAA;CH8Q9C;AG7QmC;EAAW,iBAAA;CHgR9C;AG/QmC;EAAW,iBAAA;CHkR9C;AGjRmC;EAAW,iBAAA;CHoR9C;AGnRmC;EAAW,iBAAA;CHsR9C;AGrRmC;EAAW,iBAAA;CHwR9C;AGvRmC;EAAW,iBAAA;CH0R9C;AGzRmC;EAAW,iBAAA;CH4R9C;AG3RmC;EAAW,iBAAA;CH8R9C;AG7RmC;EAAW,iBAAA;CHgS9C;AG/RmC;EAAW,iBAAA;CHkS9C;AGjSmC;EAAW,iBAAA;CHoS9C;AGnSmC;EAAW,iBAAA;CHsS9C;AGrSmC;EAAW,iBAAA;CHwS9C;AGvSmC;EAAW,iBAAA;CH0S9C;AGzSmC;EAAW,iBAAA;CH4S9C;AG3SmC;EAAW,iBAAA;CH8S9C;AG7SmC;EAAW,iBAAA;CHgT9C;AG/SmC;EAAW,iBAAA;CHkT9C;AGjTmC;EAAW,iBAAA;CHoT9C;AGnTmC;EAAW,iBAAA;CHsT9C;AGrTmC;EAAW,iBAAA;CHwT9C;AGvTmC;EAAW,iBAAA;CH0T9C;AGzTmC;EAAW,iBAAA;CH4T9C;AG3TmC;EAAW,iBAAA;CH8T9C;AG7TmC;EAAW,iBAAA;CHgU9C;AG/TmC;EAAW,iBAAA;CHkU9C;AGjUmC;EAAW,iBAAA;CHoU9C;AGnUmC;EAAW,iBAAA;CHsU9C;AGrUmC;EAAW,iBAAA;CHwU9C;AGvUmC;EAAW,iBAAA;CH0U9C;AGzUmC;EAAW,iBAAA;CH4U9C;AG3UmC;EAAW,iBAAA;CH8U9C;AG7UmC;EAAW,iBAAA;CHgV9C;AG/UmC;EAAW,iBAAA;CHkV9C;AGjVmC;EAAW,iBAAA;CHoV9C;AGnVmC;EAAW,iBAAA;CHsV9C;AGrVmC;EAAW,iBAAA;CHwV9C;AGvVmC;EAAW,iBAAA;CH0V9C;AGzVmC;EAAW,iBAAA;CH4V9C;AG3VmC;EAAW,iBAAA;CH8V9C;AG7VmC;EAAW,iBAAA;CHgW9C;AG/VmC;EAAW,iBAAA;CHkW9C;AGjWmC;EAAW,iBAAA;CHoW9C;AGnWmC;EAAW,iBAAA;CHsW9C;AGrWmC;EAAW,iBAAA;CHwW9C;AGvWmC;EAAW,iBAAA;CH0W9C;AGzWmC;EAAW,iBAAA;CH4W9C;AG3WmC;EAAW,iBAAA;CH8W9C;AG7WmC;EAAW,iBAAA;CHgX9C;AG/WmC;EAAW,iBAAA;CHkX9C;AGjXmC;EAAW,iBAAA;CHoX9C;AGnXmC;EAAW,iBAAA;CHsX9C;AGrXmC;EAAW,iBAAA;CHwX9C;AGvXmC;EAAW,iBAAA;CH0X9C;AGzXmC;EAAW,iBAAA;CH4X9C;AG3XmC;EAAW,iBAAA;CH8X9C;AG7XmC;EAAW,iBAAA;CHgY9C;AG/XmC;EAAW,iBAAA;CHkY9C;AGjYmC;EAAW,iBAAA;CHoY9C;AGnYmC;EAAW,iBAAA;CHsY9C;AGrYmC;EAAW,iBAAA;CHwY9C;AGvYmC;EAAW,iBAAA;CH0Y9C;AGzYmC;EAAW,iBAAA;CH4Y9C;AG3YmC;EAAW,iBAAA;CH8Y9C;AG7YmC;EAAW,iBAAA;CHgZ9C;AG/YmC;EAAW,iBAAA;CHkZ9C;AGjZmC;EAAW,iBAAA;CHoZ9C;AGnZmC;EAAW,iBAAA;CHsZ9C;AGrZmC;EAAW,iBAAA;CHwZ9C;AGvZmC;EAAW,iBAAA;CH0Z9C;AGzZmC;EAAW,iBAAA;CH4Z9C;AG3ZmC;EAAW,iBAAA;CH8Z9C;AG7ZmC;EAAW,iBAAA;CHga9C;AG/ZmC;EAAW,iBAAA;CHka9C;AGjamC;EAAW,iBAAA;CHoa9C;AGnamC;EAAW,iBAAA;CHsa9C;AGramC;EAAW,iBAAA;CHwa9C;AGvamC;EAAW,iBAAA;CH0a9C;AGzamC;EAAW,iBAAA;CH4a9C;AG3amC;EAAW,iBAAA;CH8a9C;AG7amC;EAAW,iBAAA;CHgb9C;AG/amC;EAAW,iBAAA;CHkb9C;AGjbmC;EAAW,iBAAA;CHob9C;AGnbmC;EAAW,iBAAA;CHsb9C;AGrbmC;EAAW,iBAAA;CHwb9C;AGvbmC;EAAW,iBAAA;CH0b9C;AGzbmC;EAAW,iBAAA;CH4b9C;AG3bmC;EAAW,iBAAA;CH8b9C;AG7bmC;EAAW,iBAAA;CHgc9C;AG/bmC;EAAW,iBAAA;CHkc9C;AGjcmC;EAAW,iBAAA;CHoc9C;AGncmC;EAAW,iBAAA;CHsc9C;AGrcmC;EAAW,iBAAA;CHwc9C;AGvcmC;EAAW,iBAAA;CH0c9C;AGzcmC;EAAW,iBAAA;CH4c9C;AG3cmC;EAAW,iBAAA;CH8c9C;AG7cmC;EAAW,iBAAA;CHgd9C;AG/cmC;EAAW,iBAAA;CHkd9C;AGjdmC;EAAW,iBAAA;CHod9C;AGndmC;EAAW,iBAAA;CHsd9C;AGrdmC;EAAW,iBAAA;CHwd9C;AGvdmC;EAAW,iBAAA;CH0d9C;AGzdmC;EAAW,iBAAA;CH4d9C;AG3dmC;EAAW,iBAAA;CH8d9C;AG7dmC;EAAW,iBAAA;CHge9C;AG/dmC;EAAW,iBAAA;CHke9C;AGjemC;EAAW,iBAAA;CHoe9C;AGnemC;EAAW,iBAAA;CHse9C;AGremC;EAAW,iBAAA;CHwe9C;AGvemC;EAAW,iBAAA;CH0e9C;AGzemC;EAAW,iBAAA;CH4e9C;AG3emC;EAAW,iBAAA;CH8e9C;AG7emC;EAAW,iBAAA;CHgf9C;AG/emC;EAAW,iBAAA;CHkf9C;AGjfmC;EAAW,iBAAA;CHof9C;AGnfmC;EAAW,iBAAA;CHsf9C;AGrfmC;EAAW,iBAAA;CHwf9C;AGvfmC;EAAW,iBAAA;CH0f9C;AGzfmC;EAAW,iBAAA;CH4f9C;AG3fmC;EAAW,iBAAA;CH8f9C;AG7fmC;EAAW,iBAAA;CHggB9C;AG/fmC;EAAW,iBAAA;CHkgB9C;AGjgBmC;EAAW,iBAAA;CHogB9C;AGngBmC;EAAW,iBAAA;CHsgB9C;AGrgBmC;EAAW,iBAAA;CHwgB9C;AGvgBmC;EAAW,iBAAA;CH0gB9C;AGzgBmC;EAAW,iBAAA;CH4gB9C;AG3gBmC;EAAW,iBAAA;CH8gB9C;AG7gBmC;EAAW,iBAAA;CHghB9C;AG/gBmC;EAAW,iBAAA;CHkhB9C;AGjhBmC;EAAW,iBAAA;CHohB9C;AGnhBmC;EAAW,iBAAA;CHshB9C;AGrhBmC;EAAW,iBAAA;CHwhB9C;AGvhBmC;EAAW,iBAAA;CH0hB9C;AGzhBmC;EAAW,iBAAA;CH4hB9C;AG3hBmC;EAAW,iBAAA;CH8hB9C;AG7hBmC;EAAW,iBAAA;CHgiB9C;AG/hBmC;EAAW,iBAAA;CHkiB9C;AGjiBmC;EAAW,iBAAA;CHoiB9C;AGniBmC;EAAW,iBAAA;CHsiB9C;AGriBmC;EAAW,iBAAA;CHwiB9C;AGviBmC;EAAW,iBAAA;CH0iB9C;AGziBmC;EAAW,iBAAA;CH4iB9C;AG3iBmC;EAAW,iBAAA;CH8iB9C;AG7iBmC;EAAW,iBAAA;CHgjB9C;AG/iBmC;EAAW,iBAAA;CHkjB9C;AGjjBmC;EAAW,iBAAA;CHojB9C;AGnjBmC;EAAW,iBAAA;CHsjB9C;AGrjBmC;EAAW,iBAAA;CHwjB9C;AGvjBmC;EAAW,iBAAA;CH0jB9C;AGzjBmC;EAAW,iBAAA;CH4jB9C;AG3jBmC;EAAW,iBAAA;CH8jB9C;AG7jBmC;EAAW,iBAAA;CHgkB9C;AG/jBmC;EAAW,iBAAA;CHkkB9C;AGjkBmC;EAAW,iBAAA;CHokB9C;AGnkBmC;EAAW,iBAAA;CHskB9C;AGrkBmC;EAAW,iBAAA;CHwkB9C;AGvkBmC;EAAW,iBAAA;CH0kB9C;AGzkBmC;EAAW,iBAAA;CH4kB9C;AG3kBmC;EAAW,iBAAA;CH8kB9C;AG7kBmC;EAAW,iBAAA;CHglB9C;AG/kBmC;EAAW,iBAAA;CHklB9C;AGjlBmC;EAAW,iBAAA;CHolB9C;AGnlBmC;EAAW,iBAAA;CHslB9C;AGrlBmC;EAAW,iBAAA;CHwlB9C;AGvlBmC;EAAW,iBAAA;CH0lB9C;AGzlBmC;EAAW,iBAAA;CH4lB9C;AG3lBmC;EAAW,iBAAA;CH8lB9C;AG7lBmC;EAAW,iBAAA;CHgmB9C;AG/lBmC;EAAW,iBAAA;CHkmB9C;AGjmBmC;EAAW,iBAAA;CHomB9C;AGnmBmC;EAAW,iBAAA;CHsmB9C;AGrmBmC;EAAW,iBAAA;CHwmB9C;AGvmBmC;EAAW,iBAAA;CH0mB9C;AGzmBmC;EAAW,iBAAA;CH4mB9C;AG3mBmC;EAAW,iBAAA;CH8mB9C;AG7mBmC;EAAW,iBAAA;CHgnB9C;AG/mBmC;EAAW,iBAAA;CHknB9C;AGjnBmC;EAAW,iBAAA;CHonB9C;AGnnBmC;EAAW,iBAAA;CHsnB9C;AGrnBmC;EAAW,iBAAA;CHwnB9C;AGvnBmC;EAAW,iBAAA;CH0nB9C;AGznBmC;EAAW,iBAAA;CH4nB9C;AG3nBmC;EAAW,iBAAA;CH8nB9C;AG7nBmC;EAAW,iBAAA;CHgoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AGvoBmC;EAAW,iBAAA;CH0oB9C;AGzoBmC;EAAW,iBAAA;CH4oB9C;AG3oBmC;EAAW,iBAAA;CH8oB9C;AG7oBmC;EAAW,iBAAA;CHgpB9C;AG/oBmC;EAAW,iBAAA;CHkpB9C;AGjpBmC;EAAW,iBAAA;CHopB9C;AGnpBmC;EAAW,iBAAA;CHspB9C;AGrpBmC;EAAW,iBAAA;CHwpB9C;AGvpBmC;EAAW,iBAAA;CH0pB9C;AGzpBmC;EAAW,iBAAA;CH4pB9C;AG3pBmC;EAAW,iBAAA;CH8pB9C;AG7pBmC;EAAW,iBAAA;CHgqB9C;AG/pBmC;EAAW,iBAAA;CHkqB9C;AGjqBmC;EAAW,iBAAA;CHoqB9C;AGnqBmC;EAAW,iBAAA;CHsqB9C;AGrqBmC;EAAW,iBAAA;CHwqB9C;AGvqBmC;EAAW,iBAAA;CH0qB9C;AGzqBmC;EAAW,iBAAA;CH4qB9C;AG3qBmC;EAAW,iBAAA;CH8qB9C;AG7qBmC;EAAW,iBAAA;CHgrB9C;AG/qBmC;EAAW,iBAAA;CHkrB9C;AGjrBmC;EAAW,iBAAA;CHorB9C;AGnrBmC;EAAW,iBAAA;CHsrB9C;AGrrBmC;EAAW,iBAAA;CHwrB9C;AGvrBmC;EAAW,iBAAA;CH0rB9C;AGzrBmC;EAAW,iBAAA;CH4rB9C;AG3rBmC;EAAW,iBAAA;CH8rB9C;AG7rBmC;EAAW,iBAAA;CHgsB9C;AG/rBmC;EAAW,iBAAA;CHksB9C;AGjsBmC;EAAW,iBAAA;CHosB9C;AGnsBmC;EAAW,iBAAA;CHssB9C;AGrsBmC;EAAW,iBAAA;CHwsB9C;AGvsBmC;EAAW,iBAAA;CH0sB9C;AGzsBmC;EAAW,iBAAA;CH4sB9C;AG3sBmC;EAAW,iBAAA;CH8sB9C;AG7sBmC;EAAW,iBAAA;CHgtB9C;AG/sBmC;EAAW,iBAAA;CHktB9C;AGjtBmC;EAAW,iBAAA;CHotB9C;AGntBmC;EAAW,iBAAA;CHstB9C;AGrtBmC;EAAW,iBAAA;CHwtB9C;AGvtBmC;EAAW,iBAAA;CH0tB9C;AGztBmC;EAAW,iBAAA;CH4tB9C;AG3tBmC;EAAW,iBAAA;CH8tB9C;AG7tBmC;EAAW,iBAAA;CHguB9C;AG/tBmC;EAAW,iBAAA;CHkuB9C;AGjuBmC;EAAW,iBAAA;CHouB9C;AGnuBmC;EAAW,iBAAA;CHsuB9C;AGruBmC;EAAW,iBAAA;CHwuB9C;AGvuBmC;EAAW,iBAAA;CH0uB9C;AGzuBmC;EAAW,iBAAA;CH4uB9C;AG3uBmC;EAAW,iBAAA;CH8uB9C;AG7uBmC;EAAW,iBAAA;CHgvB9C;AIthCD;ECgEE,+BAAA;EACG,4BAAA;EACK,uBAAA;CLy9BT;AIxhCD;;EC6DE,+BAAA;EACG,4BAAA;EACK,uBAAA;CL+9BT;AIthCD;EACE,gBAAA;EACA,8CAAA;CJwhCD;AIrhCD;EACE,4DAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,0BAAA;CJuhCD;AInhCD;;;;EAIE,qBAAA;EACA,mBAAA;EACA,qBAAA;CJqhCD;AI/gCD;EACE,eAAA;EACA,sBAAA;CJihCD;AI/gCC;;EAEE,eAAA;EACA,2BAAA;CJihCH;AI9gCC;EErDA,qBAAA;EAEA,2CAAA;EACA,qBAAA;CNqkCD;AIxgCD;EACE,UAAA;CJ0gCD;AIpgCD;EACE,uBAAA;CJsgCD;AIlgCD;;;;;EGvEE,eAAA;EACA,gBAAA;EACA,aAAA;CPglCD;AItgCD;EACE,mBAAA;CJwgCD;AIlgCD;EACE,aAAA;EACA,wBAAA;EACA,0BAAA;EACA,0BAAA;EACA,mBAAA;EC6FA,yCAAA;EACK,oCAAA;EACG,iCAAA;EEvLR,sBAAA;EACA,gBAAA;EACA,aAAA;CPgmCD;AIlgCD;EACE,mBAAA;CJogCD;AI9/BD;EACE,iBAAA;EACA,oBAAA;EACA,UAAA;EACA,8BAAA;CJggCD;AIx/BD;EACE,mBAAA;EACA,WAAA;EACA,YAAA;EACA,aAAA;EACA,WAAA;EACA,iBAAA;EACA,uBAAA;EACA,UAAA;CJ0/BD;AIl/BC;;EAEE,iBAAA;EACA,YAAA;EACA,aAAA;EACA,UAAA;EACA,kBAAA;EACA,WAAA;CJo/BH;AIz+BD;EACE,gBAAA;CJ2+BD;AQloCD;;;;;;;;;;;;EAEE,qBAAA;EACA,iBAAA;EACA,iBAAA;EACA,eAAA;CR8oCD;AQnpCD;;;;;;;;;;;;;;;;;;;;;;;;EASI,oBAAA;EACA,eAAA;EACA,eAAA;CRoqCH;AQhqCD;;;;;;EAGE,iBAAA;EACA,oBAAA;CRqqCD;AQzqCD;;;;;;;;;;;;EAQI,eAAA;CR+qCH;AQ5qCD;;;;;;EAGE,iBAAA;EACA,oBAAA;CRirCD;AQrrCD;;;;;;;;;;;;EAQI,eAAA;CR2rCH;AQvrCD;;EAAU,gBAAA;CR2rCT;AQ1rCD;;EAAU,gBAAA;CR8rCT;AQ7rCD;;EAAU,gBAAA;CRisCT;AQhsCD;;EAAU,gBAAA;CRosCT;AQnsCD;;EAAU,gBAAA;CRusCT;AQtsCD;;EAAU,gBAAA;CR0sCT;AQpsCD;EACE,iBAAA;CRssCD;AQnsCD;EACE,oBAAA;EACA,gBAAA;EACA,iBAAA;EACA,iBAAA;CRqsCD;AQhsCD;EAAA;IAFI,gBAAA;GRssCD;CACF;AQ9rCD;;EAEE,eAAA;CRgsCD;AQ7rCD;;EAEE,0BAAA;EACA,cAAA;CR+rCD;AQ3rCD;EAAuB,iBAAA;CR8rCtB;AQ7rCD;EAAuB,kBAAA;CRgsCtB;AQ/rCD;EAAuB,mBAAA;CRksCtB;AQjsCD;EAAuB,oBAAA;CRosCtB;AQnsCD;EAAuB,oBAAA;CRssCtB;AQnsCD;EAAuB,0BAAA;CRssCtB;AQrsCD;EAAuB,0BAAA;CRwsCtB;AQvsCD;EAAuB,2BAAA;CR0sCtB;AQvsCD;EACE,eAAA;CRysCD;AQvsCD;ECrGE,eAAA;CT+yCD;AS9yCC;;EAEE,eAAA;CTgzCH;AQ3sCD;ECxGE,eAAA;CTszCD;ASrzCC;;EAEE,eAAA;CTuzCH;AQ/sCD;EC3GE,eAAA;CT6zCD;AS5zCC;;EAEE,eAAA;CT8zCH;AQntCD;EC9GE,eAAA;CTo0CD;ASn0CC;;EAEE,eAAA;CTq0CH;AQvtCD;ECjHE,eAAA;CT20CD;AS10CC;;EAEE,eAAA;CT40CH;AQvtCD;EAGE,YAAA;EE3HA,0BAAA;CVm1CD;AUl1CC;;EAEE,0BAAA;CVo1CH;AQztCD;EE9HE,0BAAA;CV01CD;AUz1CC;;EAEE,0BAAA;CV21CH;AQ7tCD;EEjIE,0BAAA;CVi2CD;AUh2CC;;EAEE,0BAAA;CVk2CH;AQjuCD;EEpIE,0BAAA;CVw2CD;AUv2CC;;EAEE,0BAAA;CVy2CH;AQruCD;EEvIE,0BAAA;CV+2CD;AU92CC;;EAEE,0BAAA;CVg3CH;AQpuCD;EACE,oBAAA;EACA,oBAAA;EACA,iCAAA;CRsuCD;AQ9tCD;;EAEE,cAAA;EACA,oBAAA;CRguCD;AQnuCD;;;;EAMI,iBAAA;CRmuCH;AQ5tCD;EACE,gBAAA;EACA,iBAAA;CR8tCD;AQ1tCD;EALE,gBAAA;EACA,iBAAA;EAMA,kBAAA;CR6tCD;AQ/tCD;EAKI,sBAAA;EACA,kBAAA;EACA,mBAAA;CR6tCH;AQxtCD;EACE,cAAA;EACA,oBAAA;CR0tCD;AQxtCD;;EAEE,wBAAA;CR0tCD;AQxtCD;EACE,kBAAA;CR0tCD;AQxtCD;EACE,eAAA;CR0tCD;AQjsCD;EAAA;IAVM,YAAA;IACA,aAAA;IACA,YAAA;IACA,kBAAA;IGtNJ,iBAAA;IACA,wBAAA;IACA,oBAAA;GXs6CC;EQ3sCH;IAHM,mBAAA;GRitCH;CACF;AQxsCD;;EAGE,aAAA;EACA,kCAAA;CRysCD;AQvsCD;EACE,eAAA;EA9IqB,0BAAA;CRw1CtB;AQrsCD;EACE,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,+BAAA;CRusCD;AQlsCG;;;EACE,iBAAA;CRssCL;AQhtCD;;;EAmBI,eAAA;EACA,eAAA;EACA,wBAAA;EACA,eAAA;CRksCH;AQhsCG;;;EACE,uBAAA;CRosCL;AQ5rCD;;EAEE,oBAAA;EACA,gBAAA;EACA,gCAAA;EACA,eAAA;EACA,kBAAA;CR8rCD;AQxrCG;;;;;;EAAW,YAAA;CRgsCd;AQ/rCG;;;;;;EACE,uBAAA;CRssCL;AQhsCD;EACE,oBAAA;EACA,mBAAA;EACA,wBAAA;CRksCD;AYx+CD;;;;EAIE,+DAAA;CZ0+CD;AYt+CD;EACE,iBAAA;EACA,eAAA;EACA,eAAA;EACA,0BAAA;EACA,mBAAA;CZw+CD;AYp+CD;EACE,iBAAA;EACA,eAAA;EACA,eAAA;EACA,0BAAA;EACA,mBAAA;EACA,uDAAA;UAAA,+CAAA;CZs+CD;AY5+CD;EASI,WAAA;EACA,gBAAA;EACA,kBAAA;EACA,yBAAA;UAAA,iBAAA;CZs+CH;AYj+CD;EACE,eAAA;EACA,eAAA;EACA,iBAAA;EACA,gBAAA;EACA,wBAAA;EACA,sBAAA;EACA,sBAAA;EACA,eAAA;EACA,0BAAA;EACA,0BAAA;EACA,mBAAA;CZm+CD;AY9+CD;EAeI,WAAA;EACA,mBAAA;EACA,eAAA;EACA,sBAAA;EACA,8BAAA;EACA,iBAAA;CZk+CH;AY79CD;EACE,kBAAA;EACA,mBAAA;CZ+9CD;AazhDD;ECHE,mBAAA;EACA,kBAAA;EACA,mBAAA;EACA,oBAAA;Cd+hDD;AazhDC;EAAA;IAFE,aAAA;Gb+hDD;CACF;Aa3hDC;EAAA;IAFE,aAAA;GbiiDD;CACF;Aa7hDD;EAAA;IAFI,cAAA;GbmiDD;CACF;Aa1hDD;ECvBE,mBAAA;EACA,kBAAA;EACA,mBAAA;EACA,oBAAA;CdojDD;AavhDD;ECvBE,mBAAA;EACA,oBAAA;CdijDD;AejjDG;EACE,mBAAA;EAEA,gBAAA;EAEA,mBAAA;EACA,oBAAA;CfijDL;AejiDG;EACE,YAAA;CfmiDL;Ae5hDC;EACE,YAAA;Cf8hDH;Ae/hDC;EACE,oBAAA;CfiiDH;AeliDC;EACE,oBAAA;CfoiDH;AeriDC;EACE,WAAA;CfuiDH;AexiDC;EACE,oBAAA;Cf0iDH;Ae3iDC;EACE,oBAAA;Cf6iDH;Ae9iDC;EACE,WAAA;CfgjDH;AejjDC;EACE,oBAAA;CfmjDH;AepjDC;EACE,oBAAA;CfsjDH;AevjDC;EACE,WAAA;CfyjDH;Ae1jDC;EACE,oBAAA;Cf4jDH;Ae7jDC;EACE,mBAAA;Cf+jDH;AejjDC;EACE,YAAA;CfmjDH;AepjDC;EACE,oBAAA;CfsjDH;AevjDC;EACE,oBAAA;CfyjDH;Ae1jDC;EACE,WAAA;Cf4jDH;Ae7jDC;EACE,oBAAA;Cf+jDH;AehkDC;EACE,oBAAA;CfkkDH;AenkDC;EACE,WAAA;CfqkDH;AetkDC;EACE,oBAAA;CfwkDH;AezkDC;EACE,oBAAA;Cf2kDH;Ae5kDC;EACE,WAAA;Cf8kDH;Ae/kDC;EACE,oBAAA;CfilDH;AellDC;EACE,mBAAA;CfolDH;AehlDC;EACE,YAAA;CfklDH;AelmDC;EACE,WAAA;CfomDH;AermDC;EACE,mBAAA;CfumDH;AexmDC;EACE,mBAAA;Cf0mDH;Ae3mDC;EACE,UAAA;Cf6mDH;Ae9mDC;EACE,mBAAA;CfgnDH;AejnDC;EACE,mBAAA;CfmnDH;AepnDC;EACE,UAAA;CfsnDH;AevnDC;EACE,mBAAA;CfynDH;Ae1nDC;EACE,mBAAA;Cf4nDH;Ae7nDC;EACE,UAAA;Cf+nDH;AehoDC;EACE,mBAAA;CfkoDH;AenoDC;EACE,kBAAA;CfqoDH;AejoDC;EACE,WAAA;CfmoDH;AernDC;EACE,kBAAA;CfunDH;AexnDC;EACE,0BAAA;Cf0nDH;Ae3nDC;EACE,0BAAA;Cf6nDH;Ae9nDC;EACE,iBAAA;CfgoDH;AejoDC;EACE,0BAAA;CfmoDH;AepoDC;EACE,0BAAA;CfsoDH;AevoDC;EACE,iBAAA;CfyoDH;Ae1oDC;EACE,0BAAA;Cf4oDH;Ae7oDC;EACE,0BAAA;Cf+oDH;AehpDC;EACE,iBAAA;CfkpDH;AenpDC;EACE,0BAAA;CfqpDH;AetpDC;EACE,yBAAA;CfwpDH;AezpDC;EACE,gBAAA;Cf2pDH;Aa3pDD;EElCI;IACE,YAAA;GfgsDH;EezrDD;IACE,YAAA;Gf2rDD;Ee5rDD;IACE,oBAAA;Gf8rDD;Ee/rDD;IACE,oBAAA;GfisDD;EelsDD;IACE,WAAA;GfosDD;EersDD;IACE,oBAAA;GfusDD;EexsDD;IACE,oBAAA;Gf0sDD;Ee3sDD;IACE,WAAA;Gf6sDD;Ee9sDD;IACE,oBAAA;GfgtDD;EejtDD;IACE,oBAAA;GfmtDD;EeptDD;IACE,WAAA;GfstDD;EevtDD;IACE,oBAAA;GfytDD;Ee1tDD;IACE,mBAAA;Gf4tDD;Ee9sDD;IACE,YAAA;GfgtDD;EejtDD;IACE,oBAAA;GfmtDD;EeptDD;IACE,oBAAA;GfstDD;EevtDD;IACE,WAAA;GfytDD;Ee1tDD;IACE,oBAAA;Gf4tDD;Ee7tDD;IACE,oBAAA;Gf+tDD;EehuDD;IACE,WAAA;GfkuDD;EenuDD;IACE,oBAAA;GfquDD;EetuDD;IACE,oBAAA;GfwuDD;EezuDD;IACE,WAAA;Gf2uDD;Ee5uDD;IACE,oBAAA;Gf8uDD;Ee/uDD;IACE,mBAAA;GfivDD;Ee7uDD;IACE,YAAA;Gf+uDD;Ee/vDD;IACE,WAAA;GfiwDD;EelwDD;IACE,mBAAA;GfowDD;EerwDD;IACE,mBAAA;GfuwDD;EexwDD;IACE,UAAA;Gf0wDD;Ee3wDD;IACE,mBAAA;Gf6wDD;Ee9wDD;IACE,mBAAA;GfgxDD;EejxDD;IACE,UAAA;GfmxDD;EepxDD;IACE,mBAAA;GfsxDD;EevxDD;IACE,mBAAA;GfyxDD;Ee1xDD;IACE,UAAA;Gf4xDD;Ee7xDD;IACE,mBAAA;Gf+xDD;EehyDD;IACE,kBAAA;GfkyDD;Ee9xDD;IACE,WAAA;GfgyDD;EelxDD;IACE,kBAAA;GfoxDD;EerxDD;IACE,0BAAA;GfuxDD;EexxDD;IACE,0BAAA;Gf0xDD;Ee3xDD;IACE,iBAAA;Gf6xDD;Ee9xDD;IACE,0BAAA;GfgyDD;EejyDD;IACE,0BAAA;GfmyDD;EepyDD;IACE,iBAAA;GfsyDD;EevyDD;IACE,0BAAA;GfyyDD;Ee1yDD;IACE,0BAAA;Gf4yDD;Ee7yDD;IACE,iBAAA;Gf+yDD;EehzDD;IACE,0BAAA;GfkzDD;EenzDD;IACE,yBAAA;GfqzDD;EetzDD;IACE,gBAAA;GfwzDD;CACF;AahzDD;EE3CI;IACE,YAAA;Gf81DH;Eev1DD;IACE,YAAA;Gfy1DD;Ee11DD;IACE,oBAAA;Gf41DD;Ee71DD;IACE,oBAAA;Gf+1DD;Eeh2DD;IACE,WAAA;Gfk2DD;Een2DD;IACE,oBAAA;Gfq2DD;Eet2DD;IACE,oBAAA;Gfw2DD;Eez2DD;IACE,WAAA;Gf22DD;Ee52DD;IACE,oBAAA;Gf82DD;Ee/2DD;IACE,oBAAA;Gfi3DD;Eel3DD;IACE,WAAA;Gfo3DD;Eer3DD;IACE,oBAAA;Gfu3DD;Eex3DD;IACE,mBAAA;Gf03DD;Ee52DD;IACE,YAAA;Gf82DD;Ee/2DD;IACE,oBAAA;Gfi3DD;Eel3DD;IACE,oBAAA;Gfo3DD;Eer3DD;IACE,WAAA;Gfu3DD;Eex3DD;IACE,oBAAA;Gf03DD;Ee33DD;IACE,oBAAA;Gf63DD;Ee93DD;IACE,WAAA;Gfg4DD;Eej4DD;IACE,oBAAA;Gfm4DD;Eep4DD;IACE,oBAAA;Gfs4DD;Eev4DD;IACE,WAAA;Gfy4DD;Ee14DD;IACE,oBAAA;Gf44DD;Ee74DD;IACE,mBAAA;Gf+4DD;Ee34DD;IACE,YAAA;Gf64DD;Ee75DD;IACE,WAAA;Gf+5DD;Eeh6DD;IACE,mBAAA;Gfk6DD;Een6DD;IACE,mBAAA;Gfq6DD;Eet6DD;IACE,UAAA;Gfw6DD;Eez6DD;IACE,mBAAA;Gf26DD;Ee56DD;IACE,mBAAA;Gf86DD;Ee/6DD;IACE,UAAA;Gfi7DD;Eel7DD;IACE,mBAAA;Gfo7DD;Eer7DD;IACE,mBAAA;Gfu7DD;Eex7DD;IACE,UAAA;Gf07DD;Ee37DD;IACE,mBAAA;Gf67DD;Ee97DD;IACE,kBAAA;Gfg8DD;Ee57DD;IACE,WAAA;Gf87DD;Eeh7DD;IACE,kBAAA;Gfk7DD;Een7DD;IACE,0BAAA;Gfq7DD;Eet7DD;IACE,0BAAA;Gfw7DD;Eez7DD;IACE,iBAAA;Gf27DD;Ee57DD;IACE,0BAAA;Gf87DD;Ee/7DD;IACE,0BAAA;Gfi8DD;Eel8DD;IACE,iBAAA;Gfo8DD;Eer8DD;IACE,0BAAA;Gfu8DD;Eex8DD;IACE,0BAAA;Gf08DD;Ee38DD;IACE,iBAAA;Gf68DD;Ee98DD;IACE,0BAAA;Gfg9DD;Eej9DD;IACE,yBAAA;Gfm9DD;Eep9DD;IACE,gBAAA;Gfs9DD;CACF;Aa38DD;EE9CI;IACE,YAAA;Gf4/DH;Eer/DD;IACE,YAAA;Gfu/DD;Eex/DD;IACE,oBAAA;Gf0/DD;Ee3/DD;IACE,oBAAA;Gf6/DD;Ee9/DD;IACE,WAAA;GfggED;EejgED;IACE,oBAAA;GfmgED;EepgED;IACE,oBAAA;GfsgED;EevgED;IACE,WAAA;GfygED;Ee1gED;IACE,oBAAA;Gf4gED;Ee7gED;IACE,oBAAA;Gf+gED;EehhED;IACE,WAAA;GfkhED;EenhED;IACE,oBAAA;GfqhED;EethED;IACE,mBAAA;GfwhED;Ee1gED;IACE,YAAA;Gf4gED;Ee7gED;IACE,oBAAA;Gf+gED;EehhED;IACE,oBAAA;GfkhED;EenhED;IACE,WAAA;GfqhED;EethED;IACE,oBAAA;GfwhED;EezhED;IACE,oBAAA;Gf2hED;Ee5hED;IACE,WAAA;Gf8hED;Ee/hED;IACE,oBAAA;GfiiED;EeliED;IACE,oBAAA;GfoiED;EeriED;IACE,WAAA;GfuiED;EexiED;IACE,oBAAA;Gf0iED;Ee3iED;IACE,mBAAA;Gf6iED;EeziED;IACE,YAAA;Gf2iED;Ee3jED;IACE,WAAA;Gf6jED;Ee9jED;IACE,mBAAA;GfgkED;EejkED;IACE,mBAAA;GfmkED;EepkED;IACE,UAAA;GfskED;EevkED;IACE,mBAAA;GfykED;Ee1kED;IACE,mBAAA;Gf4kED;Ee7kED;IACE,UAAA;Gf+kED;EehlED;IACE,mBAAA;GfklED;EenlED;IACE,mBAAA;GfqlED;EetlED;IACE,UAAA;GfwlED;EezlED;IACE,mBAAA;Gf2lED;Ee5lED;IACE,kBAAA;Gf8lED;Ee1lED;IACE,WAAA;Gf4lED;Ee9kED;IACE,kBAAA;GfglED;EejlED;IACE,0BAAA;GfmlED;EeplED;IACE,0BAAA;GfslED;EevlED;IACE,iBAAA;GfylED;Ee1lED;IACE,0BAAA;Gf4lED;Ee7lED;IACE,0BAAA;Gf+lED;EehmED;IACE,iBAAA;GfkmED;EenmED;IACE,0BAAA;GfqmED;EetmED;IACE,0BAAA;GfwmED;EezmED;IACE,iBAAA;Gf2mED;Ee5mED;IACE,0BAAA;Gf8mED;Ee/mED;IACE,yBAAA;GfinED;EelnED;IACE,gBAAA;GfonED;CACF;AgBxrED;EACE,8BAAA;ChB0rED;AgBxrED;EACE,iBAAA;EACA,oBAAA;EACA,eAAA;EACA,iBAAA;ChB0rED;AgBxrED;EACE,iBAAA;ChB0rED;AgBprED;EACE,YAAA;EACA,gBAAA;EACA,oBAAA;ChBsrED;AgBzrED;;;;;;EAWQ,aAAA;EACA,wBAAA;EACA,oBAAA;EACA,8BAAA;ChBsrEP;AgBpsED;EAoBI,uBAAA;EACA,iCAAA;ChBmrEH;AgBxsED;;;;;;EA8BQ,cAAA;ChBkrEP;AgBhtED;EAoCI,8BAAA;ChB+qEH;AgBntED;EAyCI,0BAAA;ChB6qEH;AgBtqED;;;;;;EAOQ,aAAA;ChBuqEP;AgB5pED;EACE,0BAAA;ChB8pED;AgB/pED;;;;;;EAQQ,0BAAA;ChB+pEP;AgBvqED;;EAeM,yBAAA;ChB4pEL;AgBlpED;EAEI,0BAAA;ChBmpEH;AgB1oED;EAEI,0BAAA;ChB2oEH;AgBloED;EACE,iBAAA;EACA,YAAA;EACA,sBAAA;ChBooED;AgB/nEG;;EACE,iBAAA;EACA,YAAA;EACA,oBAAA;ChBkoEL;AiB9wEC;;;;;;;;;;;;EAOI,0BAAA;CjBqxEL;AiB/wEC;;;;;EAMI,0BAAA;CjBgxEL;AiBnyEC;;;;;;;;;;;;EAOI,0BAAA;CjB0yEL;AiBpyEC;;;;;EAMI,0BAAA;CjBqyEL;AiBxzEC;;;;;;;;;;;;EAOI,0BAAA;CjB+zEL;AiBzzEC;;;;;EAMI,0BAAA;CjB0zEL;AiB70EC;;;;;;;;;;;;EAOI,0BAAA;CjBo1EL;AiB90EC;;;;;EAMI,0BAAA;CjB+0EL;AiBl2EC;;;;;;;;;;;;EAOI,0BAAA;CjBy2EL;AiBn2EC;;;;;EAMI,0BAAA;CjBo2EL;AgBltED;EACE,iBAAA;EACA,kBAAA;ChBotED;AgBvpED;EAAA;IA1DI,YAAA;IACA,oBAAA;IACA,mBAAA;IACA,6CAAA;IACA,0BAAA;GhBqtED;EgB/pEH;IAlDM,iBAAA;GhBotEH;EgBlqEH;;;;;;IAzCY,oBAAA;GhBmtET;EgB1qEH;IAjCM,UAAA;GhB8sEH;EgB7qEH;;;;;;IAxBY,eAAA;GhB6sET;EgBrrEH;;;;;;IApBY,gBAAA;GhBitET;EgB7rEH;;;;IAPY,iBAAA;GhB0sET;CACF;AkBp6ED;EACE,WAAA;EACA,UAAA;EACA,UAAA;EAIA,aAAA;ClBm6ED;AkBh6ED;EACE,eAAA;EACA,YAAA;EACA,WAAA;EACA,oBAAA;EACA,gBAAA;EACA,qBAAA;EACA,eAAA;EACA,UAAA;EACA,iCAAA;ClBk6ED;AkB/5ED;EACE,sBAAA;EACA,gBAAA;EACA,mBAAA;EACA,kBAAA;ClBi6ED;AkBt5ED;Eb4BE,+BAAA;EACG,4BAAA;EACK,uBAAA;CL63ET;AkBt5ED;;EAEE,gBAAA;EACA,mBAAA;EACA,oBAAA;ClBw5ED;AkBr5ED;EACE,eAAA;ClBu5ED;AkBn5ED;EACE,eAAA;EACA,YAAA;ClBq5ED;AkBj5ED;;EAEE,aAAA;ClBm5ED;AkB/4ED;;;EZvEE,qBAAA;EAEA,2CAAA;EACA,qBAAA;CN09ED;AkB/4ED;EACE,eAAA;EACA,iBAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;ClBi5ED;AkBv3ED;EACE,eAAA;EACA,YAAA;EACA,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,0BAAA;EACA,uBAAA;EACA,0BAAA;EACA,mBAAA;EbxDA,yDAAA;EACQ,iDAAA;EAyHR,uFAAA;EACK,0EAAA;EACG,uEAAA;CL0zET;AmBl8EC;EACE,sBAAA;EACA,WAAA;EdUF,uFAAA;EACQ,+EAAA;CL27ET;AK15EC;EACE,eAAA;EACA,WAAA;CL45EH;AK15EC;EAA0B,eAAA;CL65E3B;AK55EC;EAAgC,eAAA;CL+5EjC;AkB/3EC;;;EAGE,0BAAA;EACA,WAAA;ClBi4EH;AkB93EC;;EAEE,oBAAA;ClBg4EH;AkB53EC;EACE,aAAA;ClB83EH;AkBl3ED;EACE,yBAAA;ClBo3ED;AkB50ED;EAtBI;;;;IACE,kBAAA;GlBw2EH;EkBr2EC;;;;;;;;IAEE,kBAAA;GlB62EH;EkB12EC;;;;;;;;IAEE,kBAAA;GlBk3EH;CACF;AkBx2ED;EACE,oBAAA;ClB02ED;AkBl2ED;;EAEE,mBAAA;EACA,eAAA;EACA,iBAAA;EACA,oBAAA;ClBo2ED;AkBz2ED;;EAQI,iBAAA;EACA,mBAAA;EACA,iBAAA;EACA,oBAAA;EACA,gBAAA;ClBq2EH;AkBl2ED;;;;EAIE,mBAAA;EACA,mBAAA;EACA,mBAAA;ClBo2ED;AkBj2ED;;EAEE,iBAAA;ClBm2ED;AkB/1ED;;EAEE,mBAAA;EACA,sBAAA;EACA,mBAAA;EACA,iBAAA;EACA,uBAAA;EACA,oBAAA;EACA,gBAAA;ClBi2ED;AkB/1ED;;EAEE,cAAA;EACA,kBAAA;ClBi2ED;AkBx1EC;;;;;;EAGE,oBAAA;ClB61EH;AkBv1EC;;;;EAEE,oBAAA;ClB21EH;AkBr1EC;;;;EAGI,oBAAA;ClBw1EL;AkB70ED;EAEE,iBAAA;EACA,oBAAA;EAEA,iBAAA;EACA,iBAAA;ClB60ED;AkB30EC;;EAEE,gBAAA;EACA,iBAAA;ClB60EH;AkBh0ED;EC7PE,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CnBgkFD;AmB9jFC;EACE,aAAA;EACA,kBAAA;CnBgkFH;AmB7jFC;;EAEE,aAAA;CnB+jFH;AkB50ED;EAEI,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;ClB60EH;AkBn1ED;EASI,aAAA;EACA,kBAAA;ClB60EH;AkBv1ED;;EAcI,aAAA;ClB60EH;AkB31ED;EAiBI,aAAA;EACA,iBAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;ClB60EH;AkBz0ED;ECzRE,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;CnBqmFD;AmBnmFC;EACE,aAAA;EACA,kBAAA;CnBqmFH;AmBlmFC;;EAEE,aAAA;CnBomFH;AkBr1ED;EAEI,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;ClBs1EH;AkB51ED;EASI,aAAA;EACA,kBAAA;ClBs1EH;AkBh2ED;;EAcI,aAAA;ClBs1EH;AkBp2ED;EAiBI,aAAA;EACA,iBAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;ClBs1EH;AkB70ED;EAEE,mBAAA;ClB80ED;AkBh1ED;EAMI,sBAAA;ClB60EH;AkBz0ED;EACE,mBAAA;EACA,OAAA;EACA,SAAA;EACA,WAAA;EACA,eAAA;EACA,YAAA;EACA,aAAA;EACA,kBAAA;EACA,mBAAA;EACA,qBAAA;ClB20ED;AkBz0ED;;;EAGE,YAAA;EACA,aAAA;EACA,kBAAA;ClB20ED;AkBz0ED;;;EAGE,YAAA;EACA,aAAA;EACA,kBAAA;ClB20ED;AkBv0ED;;;;;;;;;;ECpZI,eAAA;CnBuuFH;AkBn1ED;EChZI,sBAAA;Ed+CF,yDAAA;EACQ,iDAAA;CLwrFT;AmBtuFG;EACE,sBAAA;Ed4CJ,0EAAA;EACQ,kEAAA;CL6rFT;AkB71ED;ECtYI,eAAA;EACA,sBAAA;EACA,0BAAA;CnBsuFH;AkBl2ED;EChYI,eAAA;CnBquFH;AkBl2ED;;;;;;;;;;ECvZI,eAAA;CnBqwFH;AkB92ED;ECnZI,sBAAA;Ed+CF,yDAAA;EACQ,iDAAA;CLstFT;AmBpwFG;EACE,sBAAA;Ed4CJ,0EAAA;EACQ,kEAAA;CL2tFT;AkBx3ED;ECzYI,eAAA;EACA,sBAAA;EACA,0BAAA;CnBowFH;AkB73ED;ECnYI,eAAA;CnBmwFH;AkB73ED;;;;;;;;;;EC1ZI,eAAA;CnBmyFH;AkBz4ED;ECtZI,sBAAA;Ed+CF,yDAAA;EACQ,iDAAA;CLovFT;AmBlyFG;EACE,sBAAA;Ed4CJ,0EAAA;EACQ,kEAAA;CLyvFT;AkBn5ED;EC5YI,eAAA;EACA,sBAAA;EACA,0BAAA;CnBkyFH;AkBx5ED;ECtYI,eAAA;CnBiyFH;AkBp5EC;EACG,UAAA;ClBs5EJ;AkBp5EC;EACG,OAAA;ClBs5EJ;AkB54ED;EACE,eAAA;EACA,gBAAA;EACA,oBAAA;EACA,eAAA;ClB84ED;AkB3zED;EAAA;IA9DM,sBAAA;IACA,iBAAA;IACA,uBAAA;GlB63EH;EkBj0EH;IAvDM,sBAAA;IACA,YAAA;IACA,uBAAA;GlB23EH;EkBt0EH;IAhDM,sBAAA;GlBy3EH;EkBz0EH;IA5CM,sBAAA;IACA,uBAAA;GlBw3EH;EkB70EH;;;IAtCQ,YAAA;GlBw3EL;EkBl1EH;IAhCM,YAAA;GlBq3EH;EkBr1EH;IA5BM,iBAAA;IACA,uBAAA;GlBo3EH;EkBz1EH;;IApBM,sBAAA;IACA,cAAA;IACA,iBAAA;IACA,uBAAA;GlBi3EH;EkBh2EH;;IAdQ,gBAAA;GlBk3EL;EkBp2EH;;IATM,mBAAA;IACA,eAAA;GlBi3EH;EkBz2EH;IAHM,OAAA;GlB+2EH;CACF;AkBr2ED;;;;EASI,cAAA;EACA,iBAAA;EACA,iBAAA;ClBk2EH;AkB72ED;;EAiBI,iBAAA;ClBg2EH;AkBj3ED;EJhhBE,mBAAA;EACA,oBAAA;Cdo4FD;AkB90EC;EAAA;IAVI,kBAAA;IACA,iBAAA;IACA,iBAAA;GlB41EH;CACF;AkB53ED;EAwCI,YAAA;ClBu1EH;AkBz0EC;EAAA;IAJM,yBAAA;IACA,gBAAA;GlBi1EL;CACF;AkBv0EC;EAAA;IAJM,iBAAA;IACA,gBAAA;GlB+0EL;CACF;AoBl6FD;EACE,sBAAA;EACA,iBAAA;EACA,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,+BAAA;MAAA,2BAAA;EACA,gBAAA;EACA,uBAAA;EACA,8BAAA;EACA,oBAAA;EC6CA,kBAAA;EACA,gBAAA;EACA,wBAAA;EACA,mBAAA;EhB4JA,0BAAA;EACG,uBAAA;EACC,sBAAA;EACI,kBAAA;CL6tFT;AoBr6FG;;;;;;EdrBF,qBAAA;EAEA,2CAAA;EACA,qBAAA;CNi8FD;AoBz6FC;;;EAGE,eAAA;EACA,sBAAA;CpB26FH;AoBx6FC;;EAEE,WAAA;EACA,uBAAA;Ef2BF,yDAAA;EACQ,iDAAA;CLg5FT;AoBx6FC;;;EAGE,oBAAA;EE7CF,cAAA;EAGA,0BAAA;EjB8DA,yBAAA;EACQ,iBAAA;CLy5FT;AoBx6FG;;EAEE,qBAAA;CpB06FL;AoBj6FD;EC3DE,eAAA;EACA,0BAAA;EACA,sBAAA;CrB+9FD;AqB79FC;;EAEE,eAAA;EACA,0BAAA;EACI,sBAAA;CrB+9FP;AqB79FC;EACE,eAAA;EACA,0BAAA;EACI,sBAAA;CrB+9FP;AqB79FC;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrB+9FP;AqB79FG;;;;;;;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBq+FT;AqBl+FC;;;EAGE,uBAAA;CrBo+FH;AqB/9FG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,sBAAA;CrB6+FT;AoB/9FD;ECTI,eAAA;EACA,0BAAA;CrB2+FH;AoBh+FD;EC9DE,eAAA;EACA,0BAAA;EACA,sBAAA;CrBiiGD;AqB/hGC;;EAEE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBiiGP;AqB/hGC;EACE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBiiGP;AqB/hGC;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBiiGP;AqB/hGG;;;;;;;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBuiGT;AqBpiGC;;;EAGE,uBAAA;CrBsiGH;AqBjiGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,sBAAA;CrB+iGT;AoB9hGD;ECZI,eAAA;EACA,0BAAA;CrB6iGH;AoB9hGD;EClEE,eAAA;EACA,0BAAA;EACA,sBAAA;CrBmmGD;AqBjmGC;;EAEE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBmmGP;AqBjmGC;EACE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBmmGP;AqBjmGC;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBmmGP;AqBjmGG;;;;;;;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBymGT;AqBtmGC;;;EAGE,uBAAA;CrBwmGH;AqBnmGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,sBAAA;CrBinGT;AoB5lGD;EChBI,eAAA;EACA,0BAAA;CrB+mGH;AoB5lGD;ECtEE,eAAA;EACA,0BAAA;EACA,sBAAA;CrBqqGD;AqBnqGC;;EAEE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBqqGP;AqBnqGC;EACE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBqqGP;AqBnqGC;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBqqGP;AqBnqGG;;;;;;;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrB2qGT;AqBxqGC;;;EAGE,uBAAA;CrB0qGH;AqBrqGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,sBAAA;CrBmrGT;AoB1pGD;ECpBI,eAAA;EACA,0BAAA;CrBirGH;AoB1pGD;EC1EE,eAAA;EACA,0BAAA;EACA,sBAAA;CrBuuGD;AqBruGC;;EAEE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBuuGP;AqBruGC;EACE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBuuGP;AqBruGC;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBuuGP;AqBruGG;;;;;;;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrB6uGT;AqB1uGC;;;EAGE,uBAAA;CrB4uGH;AqBvuGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,sBAAA;CrBqvGT;AoBxtGD;ECxBI,eAAA;EACA,0BAAA;CrBmvGH;AoBxtGD;EC9EE,eAAA;EACA,0BAAA;EACA,sBAAA;CrByyGD;AqBvyGC;;EAEE,eAAA;EACA,0BAAA;EACI,sBAAA;CrByyGP;AqBvyGC;EACE,eAAA;EACA,0BAAA;EACI,sBAAA;CrByyGP;AqBvyGC;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrByyGP;AqBvyGG;;;;;;;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrB+yGT;AqB5yGC;;;EAGE,uBAAA;CrB8yGH;AqBzyGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,sBAAA;CrBuzGT;AoBtxGD;EC5BI,eAAA;EACA,0BAAA;CrBqzGH;AoBjxGD;EACE,eAAA;EACA,oBAAA;EACA,iBAAA;CpBmxGD;AoBjxGC;;;;;EAKE,8BAAA;EfnCF,yBAAA;EACQ,iBAAA;CLuzGT;AoBlxGC;;;;EAIE,0BAAA;CpBoxGH;AoBlxGC;;EAEE,eAAA;EACA,2BAAA;EACA,8BAAA;CpBoxGH;AoBhxGG;;;;EAEE,eAAA;EACA,sBAAA;CpBoxGL;AoB3wGD;;ECrEE,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;CrBo1GD;AoB9wGD;;ECzEE,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CrB21GD;AoBjxGD;;EC7EE,iBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CrBk2GD;AoBhxGD;EACE,eAAA;EACA,YAAA;CpBkxGD;AoB9wGD;EACE,gBAAA;CpBgxGD;AoBzwGC;;;EACE,YAAA;CpB6wGH;AuBv6GD;EACE,WAAA;ElBoLA,yCAAA;EACK,oCAAA;EACG,iCAAA;CLsvGT;AuB16GC;EACE,WAAA;CvB46GH;AuBx6GD;EACE,cAAA;CvB06GD;AuBx6GC;EAAY,eAAA;CvB26Gb;AuB16GC;EAAY,mBAAA;CvB66Gb;AuB56GC;EAAY,yBAAA;CvB+6Gb;AuB56GD;EACE,mBAAA;EACA,UAAA;EACA,iBAAA;ElBuKA,gDAAA;EACQ,2CAAA;KAAA,wCAAA;EAOR,mCAAA;EACQ,8BAAA;KAAA,2BAAA;EAGR,yCAAA;EACQ,oCAAA;KAAA,iCAAA;CLgwGT;AwB18GD;EACE,sBAAA;EACA,SAAA;EACA,UAAA;EACA,iBAAA;EACA,uBAAA;EACA,uBAAA;EACA,yBAAA;EACA,oCAAA;EACA,mCAAA;CxB48GD;AwBx8GD;;EAEE,mBAAA;CxB08GD;AwBt8GD;EACE,WAAA;CxBw8GD;AwBp8GD;EACE,mBAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,cAAA;EACA,YAAA;EACA,iBAAA;EACA,eAAA;EACA,gBAAA;EACA,iBAAA;EACA,gBAAA;EACA,iBAAA;EACA,0BAAA;EACA,0BAAA;EACA,sCAAA;EACA,mBAAA;EnBsBA,oDAAA;EACQ,4CAAA;EmBrBR,qCAAA;UAAA,6BAAA;CxBu8GD;AwBl8GC;EACE,SAAA;EACA,WAAA;CxBo8GH;AwB79GD;ECzBE,YAAA;EACA,cAAA;EACA,iBAAA;EACA,0BAAA;CzBy/GD;AwBn+GD;EAmCI,eAAA;EACA,kBAAA;EACA,YAAA;EACA,oBAAA;EACA,wBAAA;EACA,eAAA;EACA,oBAAA;CxBm8GH;AwB77GC;;EAEE,sBAAA;EACA,eAAA;EACA,0BAAA;CxB+7GH;AwBz7GC;;;EAGE,eAAA;EACA,sBAAA;EACA,WAAA;EACA,0BAAA;CxB27GH;AwBl7GC;;;EAGE,eAAA;CxBo7GH;AwBh7GC;;EAEE,sBAAA;EACA,8BAAA;EACA,uBAAA;EE3GF,oEAAA;EF6GE,oBAAA;CxBk7GH;AwB76GD;EAGI,eAAA;CxB66GH;AwBh7GD;EAQI,WAAA;CxB26GH;AwBn6GD;EACE,WAAA;EACA,SAAA;CxBq6GD;AwB75GD;EACE,QAAA;EACA,YAAA;CxB+5GD;AwB35GD;EACE,eAAA;EACA,kBAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,oBAAA;CxB65GD;AwBz5GD;EACE,gBAAA;EACA,QAAA;EACA,SAAA;EACA,UAAA;EACA,OAAA;EACA,aAAA;CxB25GD;AwBv5GD;EACE,SAAA;EACA,WAAA;CxBy5GD;AwBj5GD;;EAII,cAAA;EACA,0BAAA;EACA,4BAAA;EACA,YAAA;CxBi5GH;AwBx5GD;;EAWI,UAAA;EACA,aAAA;EACA,mBAAA;CxBi5GH;AwB53GD;EAXE;IApEA,WAAA;IACA,SAAA;GxB+8GC;EwB54GD;IA1DA,QAAA;IACA,YAAA;GxBy8GC;CACF;A2BzlHD;;EAEE,mBAAA;EACA,sBAAA;EACA,uBAAA;C3B2lHD;A2B/lHD;;EAMI,mBAAA;EACA,YAAA;C3B6lHH;A2B3lHG;;;;;;;;EAIE,WAAA;C3BimHL;A2B3lHD;;;;EAKI,kBAAA;C3B4lHH;A2BvlHD;EACE,kBAAA;C3BylHD;A2B1lHD;;;EAOI,YAAA;C3BwlHH;A2B/lHD;;;EAYI,iBAAA;C3BwlHH;A2BplHD;EACE,iBAAA;C3BslHD;A2BllHD;EACE,eAAA;C3BolHD;A2BnlHC;EClDA,8BAAA;EACG,2BAAA;C5BwoHJ;A2BllHD;;EC/CE,6BAAA;EACG,0BAAA;C5BqoHJ;A2BjlHD;EACE,YAAA;C3BmlHD;A2BjlHD;EACE,iBAAA;C3BmlHD;A2BjlHD;;ECnEE,8BAAA;EACG,2BAAA;C5BwpHJ;A2BhlHD;ECjEE,6BAAA;EACG,0BAAA;C5BopHJ;A2B/kHD;;EAEE,WAAA;C3BilHD;A2BhkHD;EACE,kBAAA;EACA,mBAAA;C3BkkHD;A2BhkHD;EACE,mBAAA;EACA,oBAAA;C3BkkHD;A2B7jHD;EtB/CE,yDAAA;EACQ,iDAAA;CL+mHT;A2B7jHC;EtBnDA,yBAAA;EACQ,iBAAA;CLmnHT;A2B1jHD;EACE,eAAA;C3B4jHD;A2BzjHD;EACE,wBAAA;EACA,uBAAA;C3B2jHD;A2BxjHD;EACE,wBAAA;C3B0jHD;A2BnjHD;;;EAII,eAAA;EACA,YAAA;EACA,YAAA;EACA,gBAAA;C3BojHH;A2B3jHD;EAcM,YAAA;C3BgjHL;A2B9jHD;;;;EAsBI,iBAAA;EACA,eAAA;C3B8iHH;A2BziHC;EACE,iBAAA;C3B2iHH;A2BziHC;EACE,6BAAA;ECpKF,8BAAA;EACC,6BAAA;C5BgtHF;A2B1iHC;EACE,+BAAA;EChLF,2BAAA;EACC,0BAAA;C5B6tHF;A2B1iHD;EACE,iBAAA;C3B4iHD;A2B1iHD;;EC/KE,8BAAA;EACC,6BAAA;C5B6tHF;A2BziHD;EC7LE,2BAAA;EACC,0BAAA;C5ByuHF;A2BriHD;EACE,eAAA;EACA,YAAA;EACA,oBAAA;EACA,0BAAA;C3BuiHD;A2B3iHD;;EAOI,YAAA;EACA,oBAAA;EACA,UAAA;C3BwiHH;A2BjjHD;EAYI,YAAA;C3BwiHH;A2BpjHD;EAgBI,WAAA;C3BuiHH;A2BthHD;;;;EAKM,mBAAA;EACA,uBAAA;EACA,qBAAA;C3BuhHL;A6BjwHD;EACE,mBAAA;EACA,eAAA;EACA,0BAAA;C7BmwHD;A6BhwHC;EACE,YAAA;EACA,gBAAA;EACA,iBAAA;C7BkwHH;A6B3wHD;EAeI,mBAAA;EACA,WAAA;EAKA,YAAA;EAEA,YAAA;EACA,iBAAA;C7B0vHH;A6BjvHD;;;EV8BE,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;CnBwtHD;AmBttHC;;;EACE,aAAA;EACA,kBAAA;CnB0tHH;AmBvtHC;;;;;;EAEE,aAAA;CnB6tHH;A6BnwHD;;;EVyBE,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CnB+uHD;AmB7uHC;;;EACE,aAAA;EACA,kBAAA;CnBivHH;AmB9uHC;;;;;;EAEE,aAAA;CnBovHH;A6BjxHD;;;EAGE,oBAAA;C7BmxHD;A6BjxHC;;;EACE,iBAAA;C7BqxHH;A6BjxHD;;EAEE,UAAA;EACA,oBAAA;EACA,uBAAA;C7BmxHD;A6B9wHD;EACE,kBAAA;EACA,gBAAA;EACA,oBAAA;EACA,eAAA;EACA,eAAA;EACA,mBAAA;EACA,0BAAA;EACA,0BAAA;EACA,mBAAA;C7BgxHD;A6B7wHC;EACE,kBAAA;EACA,gBAAA;EACA,mBAAA;C7B+wHH;A6B7wHC;EACE,mBAAA;EACA,gBAAA;EACA,mBAAA;C7B+wHH;A6BnyHD;;EA0BI,cAAA;C7B6wHH;A6BxwHD;;;;;;;EDhGE,8BAAA;EACG,2BAAA;C5Bi3HJ;A6BzwHD;EACE,gBAAA;C7B2wHD;A6BzwHD;;;;;;;EDpGE,6BAAA;EACG,0BAAA;C5Bs3HJ;A6B1wHD;EACE,eAAA;C7B4wHD;A6BvwHD;EACE,mBAAA;EAGA,aAAA;EACA,oBAAA;C7BuwHD;A6B5wHD;EAUI,mBAAA;C7BqwHH;A6B/wHD;EAYM,kBAAA;C7BswHL;A6BnwHG;;;EAGE,WAAA;C7BqwHL;A6BhwHC;;EAGI,mBAAA;C7BiwHL;A6B9vHC;;EAGI,WAAA;EACA,kBAAA;C7B+vHL;A8B15HD;EACE,iBAAA;EACA,gBAAA;EACA,iBAAA;C9B45HD;A8B/5HD;EAOI,mBAAA;EACA,eAAA;C9B25HH;A8Bn6HD;EAWM,mBAAA;EACA,eAAA;EACA,mBAAA;C9B25HL;A8B15HK;;EAEE,sBAAA;EACA,0BAAA;C9B45HP;A8Bv5HG;EACE,eAAA;C9By5HL;A8Bv5HK;;EAEE,eAAA;EACA,sBAAA;EACA,8BAAA;EACA,oBAAA;C9By5HP;A8Bl5HG;;;EAGE,0BAAA;EACA,sBAAA;C9Bo5HL;A8B77HD;ELHE,YAAA;EACA,cAAA;EACA,iBAAA;EACA,0BAAA;CzBm8HD;A8Bn8HD;EA0DI,gBAAA;C9B44HH;A8Bn4HD;EACE,iCAAA;C9Bq4HD;A8Bt4HD;EAGI,YAAA;EAEA,oBAAA;C9Bq4HH;A8B14HD;EASM,kBAAA;EACA,wBAAA;EACA,8BAAA;EACA,2BAAA;C9Bo4HL;A8Bn4HK;EACE,sCAAA;C9Bq4HP;A8B/3HK;;;EAGE,eAAA;EACA,0BAAA;EACA,0BAAA;EACA,iCAAA;EACA,gBAAA;C9Bi4HP;A8B53HC;EAqDA,YAAA;EA8BA,iBAAA;C9B6yHD;A8Bh4HC;EAwDE,YAAA;C9B20HH;A8Bn4HC;EA0DI,mBAAA;EACA,mBAAA;C9B40HL;A8Bv4HC;EAgEE,UAAA;EACA,WAAA;C9B00HH;A8B9zHD;EAAA;IAPM,oBAAA;IACA,UAAA;G9By0HH;E8Bn0HH;IAJQ,iBAAA;G9B00HL;CACF;A8Bp5HC;EAuFE,gBAAA;EACA,mBAAA;C9Bg0HH;A8Bx5HC;;;EA8FE,0BAAA;C9B+zHH;A8BjzHD;EAAA;IATM,iCAAA;IACA,2BAAA;G9B8zHH;E8BtzHH;;;IAHM,6BAAA;G9B8zHH;CACF;A8B/5HD;EAEI,YAAA;C9Bg6HH;A8Bl6HD;EAMM,mBAAA;C9B+5HL;A8Br6HD;EASM,iBAAA;C9B+5HL;A8B15HK;;;EAGE,eAAA;EACA,0BAAA;C9B45HP;A8Bp5HD;EAEI,YAAA;C9Bq5HH;A8Bv5HD;EAIM,gBAAA;EACA,eAAA;C9Bs5HL;A8B14HD;EACE,YAAA;C9B44HD;A8B74HD;EAII,YAAA;C9B44HH;A8Bh5HD;EAMM,mBAAA;EACA,mBAAA;C9B64HL;A8Bp5HD;EAYI,UAAA;EACA,WAAA;C9B24HH;A8B/3HD;EAAA;IAPM,oBAAA;IACA,UAAA;G9B04HH;E8Bp4HH;IAJQ,iBAAA;G9B24HL;CACF;A8Bn4HD;EACE,iBAAA;C9Bq4HD;A8Bt4HD;EAKI,gBAAA;EACA,mBAAA;C9Bo4HH;A8B14HD;;;EAYI,0BAAA;C9Bm4HH;A8Br3HD;EAAA;IATM,iCAAA;IACA,2BAAA;G9Bk4HH;E8B13HH;;;IAHM,6BAAA;G9Bk4HH;CACF;A8Bz3HD;EAEI,cAAA;C9B03HH;A8B53HD;EAKI,eAAA;C9B03HH;A8Bj3HD;EAEE,iBAAA;EF3OA,2BAAA;EACC,0BAAA;C5B8lIF;A+BxlID;EACE,mBAAA;EACA,iBAAA;EACA,oBAAA;EACA,8BAAA;C/B0lID;A+BllID;EAAA;IAFI,mBAAA;G/BwlID;CACF;A+BzkID;EAAA;IAFI,YAAA;G/B+kID;CACF;A+BjkID;EACE,oBAAA;EACA,oBAAA;EACA,mBAAA;EACA,kCAAA;EACA,2DAAA;UAAA,mDAAA;EAEA,kCAAA;C/BkkID;A+BhkIC;EACE,iBAAA;C/BkkIH;A+BtiID;EAAA;IAxBI,YAAA;IACA,cAAA;IACA,yBAAA;YAAA,iBAAA;G/BkkID;E+BhkIC;IACE,0BAAA;IACA,wBAAA;IACA,kBAAA;IACA,6BAAA;G/BkkIH;E+B/jIC;IACE,oBAAA;G/BikIH;E+B5jIC;;;IAGE,gBAAA;IACA,iBAAA;G/B8jIH;CACF;A+B1jID;;EAGI,kBAAA;C/B2jIH;A+BtjIC;EAAA;;IAFI,kBAAA;G/B6jIH;CACF;A+BpjID;;;;EAII,oBAAA;EACA,mBAAA;C/BsjIH;A+BhjIC;EAAA;;;;IAHI,gBAAA;IACA,eAAA;G/B0jIH;CACF;A+B9iID;EACE,cAAA;EACA,sBAAA;C/BgjID;A+B3iID;EAAA;IAFI,iBAAA;G/BijID;CACF;A+B7iID;;EAEE,gBAAA;EACA,SAAA;EACA,QAAA;EACA,cAAA;C/B+iID;A+BziID;EAAA;;IAFI,iBAAA;G/BgjID;CACF;A+B9iID;EACE,OAAA;EACA,sBAAA;C/BgjID;A+B9iID;EACE,UAAA;EACA,iBAAA;EACA,sBAAA;C/BgjID;A+B1iID;EACE,YAAA;EACA,mBAAA;EACA,gBAAA;EACA,kBAAA;EACA,aAAA;C/B4iID;A+B1iIC;;EAEE,sBAAA;C/B4iIH;A+BrjID;EAaI,eAAA;C/B2iIH;A+BliID;EALI;;IAEE,mBAAA;G/B0iIH;CACF;A+BhiID;EACE,mBAAA;EACA,aAAA;EACA,mBAAA;EACA,kBAAA;EC9LA,gBAAA;EACA,mBAAA;ED+LA,8BAAA;EACA,uBAAA;EACA,8BAAA;EACA,mBAAA;C/BmiID;A+B/hIC;EACE,WAAA;C/BiiIH;A+B/iID;EAmBI,eAAA;EACA,YAAA;EACA,YAAA;EACA,mBAAA;C/B+hIH;A+BrjID;EAyBI,gBAAA;C/B+hIH;A+BzhID;EAAA;IAFI,cAAA;G/B+hID;CACF;A+BthID;EACE,oBAAA;C/BwhID;A+BzhID;EAII,kBAAA;EACA,qBAAA;EACA,kBAAA;C/BwhIH;A+B5/HC;EAAA;IAtBI,iBAAA;IACA,YAAA;IACA,YAAA;IACA,cAAA;IACA,8BAAA;IACA,UAAA;IACA,yBAAA;YAAA,iBAAA;G/BshIH;E+BtgID;;IAbM,2BAAA;G/BuhIL;E+B1gID;IAVM,kBAAA;G/BuhIL;E+BthIK;;IAEE,uBAAA;G/BwhIP;CACF;A+BtgID;EAAA;IAXI,YAAA;IACA,UAAA;G/BqhID;E+B3gIH;IAPM,YAAA;G/BqhIH;E+B9gIH;IALQ,kBAAA;IACA,qBAAA;G/BshIL;CACF;A+B3gID;EACE,mBAAA;EACA,oBAAA;EACA,mBAAA;EACA,kCAAA;EACA,qCAAA;E1B9NA,6FAAA;EACQ,qFAAA;E2B/DR,gBAAA;EACA,mBAAA;ChC4yID;AkB5xHD;EAAA;IA9DM,sBAAA;IACA,iBAAA;IACA,uBAAA;GlB81HH;EkBlyHH;IAvDM,sBAAA;IACA,YAAA;IACA,uBAAA;GlB41HH;EkBvyHH;IAhDM,sBAAA;GlB01HH;EkB1yHH;IA5CM,sBAAA;IACA,uBAAA;GlBy1HH;EkB9yHH;;;IAtCQ,YAAA;GlBy1HL;EkBnzHH;IAhCM,YAAA;GlBs1HH;EkBtzHH;IA5BM,iBAAA;IACA,uBAAA;GlBq1HH;EkB1zHH;;IApBM,sBAAA;IACA,cAAA;IACA,iBAAA;IACA,uBAAA;GlBk1HH;EkBj0HH;;IAdQ,gBAAA;GlBm1HL;EkBr0HH;;IATM,mBAAA;IACA,eAAA;GlBk1HH;EkB10HH;IAHM,OAAA;GlBg1HH;CACF;A+BpjIC;EAAA;IANI,mBAAA;G/B8jIH;E+B5jIG;IACE,iBAAA;G/B8jIL;CACF;A+B7iID;EAAA;IARI,YAAA;IACA,UAAA;IACA,eAAA;IACA,gBAAA;IACA,eAAA;IACA,kBAAA;I1BzPF,yBAAA;IACQ,iBAAA;GLmzIP;CACF;A+BnjID;EACE,cAAA;EHpUA,2BAAA;EACC,0BAAA;C5B03IF;A+BnjID;EACE,iBAAA;EHzUA,6BAAA;EACC,4BAAA;EAOD,8BAAA;EACC,6BAAA;C5By3IF;A+B/iID;EChVE,gBAAA;EACA,mBAAA;ChCk4ID;A+BhjIC;ECnVA,iBAAA;EACA,oBAAA;ChCs4ID;A+BjjIC;ECtVA,iBAAA;EACA,oBAAA;ChC04ID;A+B3iID;EChWE,iBAAA;EACA,oBAAA;ChC84ID;A+BviID;EAAA;IAJI,YAAA;IACA,kBAAA;IACA,mBAAA;G/B+iID;CACF;A+BlhID;EAhBE;IExWA,uBAAA;GjC84IC;E+BriID;IE5WA,wBAAA;IF8WE,oBAAA;G/BuiID;E+BziID;IAKI,gBAAA;G/BuiIH;CACF;A+B9hID;EACE,0BAAA;EACA,sBAAA;C/BgiID;A+BliID;EAKI,eAAA;C/BgiIH;A+B/hIG;;EAEE,eAAA;EACA,8BAAA;C/BiiIL;A+B1iID;EAcI,eAAA;C/B+hIH;A+B7iID;EAmBM,eAAA;C/B6hIL;A+B3hIK;;EAEE,eAAA;EACA,8BAAA;C/B6hIP;A+BzhIK;;;EAGE,eAAA;EACA,0BAAA;C/B2hIP;A+BvhIK;;;EAGE,eAAA;EACA,8BAAA;C/ByhIP;A+BjkID;EA8CI,sBAAA;C/BshIH;A+BrhIG;;EAEE,0BAAA;C/BuhIL;A+BxkID;EAoDM,0BAAA;C/BuhIL;A+B3kID;;EA0DI,sBAAA;C/BqhIH;A+B9gIK;;;EAGE,0BAAA;EACA,eAAA;C/BghIP;A+B/+HC;EAAA;IAzBQ,eAAA;G/B4gIP;E+B3gIO;;IAEE,eAAA;IACA,8BAAA;G/B6gIT;E+BzgIO;;;IAGE,eAAA;IACA,0BAAA;G/B2gIT;E+BvgIO;;;IAGE,eAAA;IACA,8BAAA;G/BygIT;CACF;A+B3mID;EA8GI,eAAA;C/BggIH;A+B//HG;EACE,eAAA;C/BigIL;A+BjnID;EAqHI,eAAA;C/B+/HH;A+B9/HG;;EAEE,eAAA;C/BggIL;A+B5/HK;;;;EAEE,eAAA;C/BggIP;A+Bx/HD;EACE,0BAAA;EACA,sBAAA;C/B0/HD;A+B5/HD;EAKI,eAAA;C/B0/HH;A+Bz/HG;;EAEE,eAAA;EACA,8BAAA;C/B2/HL;A+BpgID;EAcI,eAAA;C/By/HH;A+BvgID;EAmBM,eAAA;C/Bu/HL;A+Br/HK;;EAEE,eAAA;EACA,8BAAA;C/Bu/HP;A+Bn/HK;;;EAGE,eAAA;EACA,0BAAA;C/Bq/HP;A+Bj/HK;;;EAGE,eAAA;EACA,8BAAA;C/Bm/HP;A+B3hID;EA+CI,sBAAA;C/B++HH;A+B9+HG;;EAEE,0BAAA;C/Bg/HL;A+BliID;EAqDM,0BAAA;C/Bg/HL;A+BriID;;EA2DI,sBAAA;C/B8+HH;A+Bx+HK;;;EAGE,0BAAA;EACA,eAAA;C/B0+HP;A+Bn8HC;EAAA;IA/BQ,sBAAA;G/Bs+HP;E+Bv8HD;IA5BQ,0BAAA;G/Bs+HP;E+B18HD;IAzBQ,eAAA;G/Bs+HP;E+Br+HO;;IAEE,eAAA;IACA,8BAAA;G/Bu+HT;E+Bn+HO;;;IAGE,eAAA;IACA,0BAAA;G/Bq+HT;E+Bj+HO;;;IAGE,eAAA;IACA,8BAAA;G/Bm+HT;CACF;A+B3kID;EA+GI,eAAA;C/B+9HH;A+B99HG;EACE,eAAA;C/Bg+HL;A+BjlID;EAsHI,eAAA;C/B89HH;A+B79HG;;EAEE,eAAA;C/B+9HL;A+B39HK;;;;EAEE,eAAA;C/B+9HP;AkCzmJD;EACE,kBAAA;EACA,oBAAA;EACA,iBAAA;EACA,0BAAA;EACA,mBAAA;ClC2mJD;AkChnJD;EAQI,sBAAA;ClC2mJH;AkCnnJD;EAWM,kBAAA;EACA,eAAA;EACA,eAAA;ClC2mJL;AkCxnJD;EAkBI,eAAA;ClCymJH;AmC7nJD;EACE,sBAAA;EACA,gBAAA;EACA,eAAA;EACA,mBAAA;CnC+nJD;AmCnoJD;EAOI,gBAAA;CnC+nJH;AmCtoJD;;EAUM,mBAAA;EACA,YAAA;EACA,kBAAA;EACA,wBAAA;EACA,sBAAA;EACA,eAAA;EACA,0BAAA;EACA,0BAAA;EACA,kBAAA;CnCgoJL;AmC9nJG;;EAGI,eAAA;EPXN,+BAAA;EACG,4BAAA;C5B2oJJ;AmC7nJG;;EPvBF,gCAAA;EACG,6BAAA;C5BwpJJ;AmCxnJG;;;;EAEE,WAAA;EACA,eAAA;EACA,0BAAA;EACA,sBAAA;CnC4nJL;AmCtnJG;;;;;;EAGE,WAAA;EACA,eAAA;EACA,0BAAA;EACA,sBAAA;EACA,gBAAA;CnC2nJL;AmClrJD;;;;;;EAkEM,eAAA;EACA,0BAAA;EACA,sBAAA;EACA,oBAAA;CnCwnJL;AmC/mJD;;EC3EM,mBAAA;EACA,gBAAA;EACA,uBAAA;CpC8rJL;AoC5rJG;;ERKF,+BAAA;EACG,4BAAA;C5B2rJJ;AoC3rJG;;ERTF,gCAAA;EACG,6BAAA;C5BwsJJ;AmC1nJD;;EChFM,kBAAA;EACA,gBAAA;EACA,iBAAA;CpC8sJL;AoC5sJG;;ERKF,+BAAA;EACG,4BAAA;C5B2sJJ;AoC3sJG;;ERTF,gCAAA;EACG,6BAAA;C5BwtJJ;AqC3tJD;EACE,gBAAA;EACA,eAAA;EACA,iBAAA;EACA,mBAAA;CrC6tJD;AqCjuJD;EAOI,gBAAA;CrC6tJH;AqCpuJD;;EAUM,sBAAA;EACA,kBAAA;EACA,0BAAA;EACA,0BAAA;EACA,oBAAA;CrC8tJL;AqC5uJD;;EAmBM,sBAAA;EACA,0BAAA;CrC6tJL;AqCjvJD;;EA2BM,aAAA;CrC0tJL;AqCrvJD;;EAkCM,YAAA;CrCutJL;AqCzvJD;;;;EA2CM,eAAA;EACA,0BAAA;EACA,oBAAA;CrCotJL;AsClwJD;EACE,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,kBAAA;EACA,eAAA;EACA,eAAA;EACA,mBAAA;EACA,oBAAA;EACA,yBAAA;EACA,qBAAA;CtCowJD;AsChwJG;;EAEE,eAAA;EACA,sBAAA;EACA,gBAAA;CtCkwJL;AsC7vJC;EACE,cAAA;CtC+vJH;AsC3vJC;EACE,mBAAA;EACA,UAAA;CtC6vJH;AsCtvJD;ECtCE,0BAAA;CvC+xJD;AuC5xJG;;EAEE,0BAAA;CvC8xJL;AsCzvJD;EC1CE,0BAAA;CvCsyJD;AuCnyJG;;EAEE,0BAAA;CvCqyJL;AsC5vJD;EC9CE,0BAAA;CvC6yJD;AuC1yJG;;EAEE,0BAAA;CvC4yJL;AsC/vJD;EClDE,0BAAA;CvCozJD;AuCjzJG;;EAEE,0BAAA;CvCmzJL;AsClwJD;ECtDE,0BAAA;CvC2zJD;AuCxzJG;;EAEE,0BAAA;CvC0zJL;AsCrwJD;EC1DE,0BAAA;CvCk0JD;AuC/zJG;;EAEE,0BAAA;CvCi0JL;AwCn0JD;EACE,sBAAA;EACA,gBAAA;EACA,iBAAA;EACA,gBAAA;EACA,kBAAA;EACA,eAAA;EACA,eAAA;EACA,uBAAA;EACA,oBAAA;EACA,mBAAA;EACA,0BAAA;EACA,oBAAA;CxCq0JD;AwCl0JC;EACE,cAAA;CxCo0JH;AwCh0JC;EACE,mBAAA;EACA,UAAA;CxCk0JH;AwC/zJC;;EAEE,OAAA;EACA,iBAAA;CxCi0JH;AwC5zJG;;EAEE,eAAA;EACA,sBAAA;EACA,gBAAA;CxC8zJL;AwCzzJC;;EAEE,eAAA;EACA,0BAAA;CxC2zJH;AwCxzJC;EACE,aAAA;CxC0zJH;AwCvzJC;EACE,kBAAA;CxCyzJH;AwCtzJC;EACE,iBAAA;CxCwzJH;AyCl3JD;EACE,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,eAAA;EACA,0BAAA;CzCo3JD;AyCz3JD;;EASI,eAAA;CzCo3JH;AyC73JD;EAaI,oBAAA;EACA,gBAAA;EACA,iBAAA;CzCm3JH;AyCl4JD;EAmBI,0BAAA;CzCk3JH;AyC/2JC;;EAEE,mBAAA;CzCi3JH;AyCz4JD;EA4BI,gBAAA;CzCg3JH;AyC91JD;EAAA;IAdI,kBAAA;IACA,qBAAA;GzCg3JD;EyC92JC;;IAEE,mBAAA;IACA,oBAAA;GzCg3JH;EyCx2JH;;IAHM,gBAAA;GzC+2JH;CACF;A0C15JD;EACE,eAAA;EACA,aAAA;EACA,oBAAA;EACA,wBAAA;EACA,0BAAA;EACA,0BAAA;EACA,mBAAA;ErCiLA,4CAAA;EACK,uCAAA;EACG,oCAAA;CL4uJT;A0Ct6JD;;EAaI,kBAAA;EACA,mBAAA;C1C65JH;A0Cz5JC;;;EAGE,sBAAA;C1C25JH;A0Ch7JD;EA0BI,aAAA;EACA,eAAA;C1Cy5JH;A2Cl7JD;EACE,cAAA;EACA,oBAAA;EACA,8BAAA;EACA,mBAAA;C3Co7JD;A2Cx7JD;EAQI,cAAA;EAEA,eAAA;C3Ck7JH;A2C57JD;EAeI,kBAAA;C3Cg7JH;A2C/7JD;;EAqBI,iBAAA;C3C86JH;A2Cn8JD;EAyBI,gBAAA;C3C66JH;A2Cr6JD;;EAEE,oBAAA;C3Cu6JD;A2Cz6JD;;EAMI,mBAAA;EACA,UAAA;EACA,aAAA;EACA,eAAA;C3Cu6JH;A2C/5JD;ECvDE,0BAAA;EACA,sBAAA;EACA,eAAA;C5Cy9JD;A2Cp6JD;EClDI,0BAAA;C5Cy9JH;A2Cv6JD;EC/CI,eAAA;C5Cy9JH;A2Ct6JD;EC3DE,0BAAA;EACA,sBAAA;EACA,eAAA;C5Co+JD;A2C36JD;ECtDI,0BAAA;C5Co+JH;A2C96JD;ECnDI,eAAA;C5Co+JH;A2C76JD;EC/DE,0BAAA;EACA,sBAAA;EACA,eAAA;C5C++JD;A2Cl7JD;EC1DI,0BAAA;C5C++JH;A2Cr7JD;ECvDI,eAAA;C5C++JH;A2Cp7JD;ECnEE,0BAAA;EACA,sBAAA;EACA,eAAA;C5C0/JD;A2Cz7JD;EC9DI,0BAAA;C5C0/JH;A2C57JD;EC3DI,eAAA;C5C0/JH;A6C5/JD;EACE;IAAQ,4BAAA;G7C+/JP;E6C9/JD;IAAQ,yBAAA;G7CigKP;CACF;A6C9/JD;EACE;IAAQ,4BAAA;G7CigKP;E6ChgKD;IAAQ,yBAAA;G7CmgKP;CACF;A6CtgKD;EACE;IAAQ,4BAAA;G7CigKP;E6ChgKD;IAAQ,yBAAA;G7CmgKP;CACF;A6C5/JD;EACE,iBAAA;EACA,aAAA;EACA,oBAAA;EACA,0BAAA;EACA,mBAAA;ExCsCA,uDAAA;EACQ,+CAAA;CLy9JT;A6C3/JD;EACE,YAAA;EACA,UAAA;EACA,aAAA;EACA,gBAAA;EACA,kBAAA;EACA,eAAA;EACA,mBAAA;EACA,0BAAA;ExCyBA,uDAAA;EACQ,+CAAA;EAyHR,oCAAA;EACK,+BAAA;EACG,4BAAA;CL62JT;A6Cx/JD;;ECCI,8MAAA;EACA,yMAAA;EACA,sMAAA;EDAF,mCAAA;UAAA,2BAAA;C7C4/JD;A6Cr/JD;;ExC5CE,2DAAA;EACK,sDAAA;EACG,mDAAA;CLqiKT;A6Cl/JD;EErEE,0BAAA;C/C0jKD;A+CvjKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9C0gKH;A6Ct/JD;EEzEE,0BAAA;C/CkkKD;A+C/jKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9CkhKH;A6C1/JD;EE7EE,0BAAA;C/C0kKD;A+CvkKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9C0hKH;A6C9/JD;EEjFE,0BAAA;C/CklKD;A+C/kKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9CkiKH;AgD1lKD;EAEE,iBAAA;ChD2lKD;AgDzlKC;EACE,cAAA;ChD2lKH;AgDvlKD;;EAEE,QAAA;EACA,iBAAA;ChDylKD;AgDtlKD;EACE,eAAA;ChDwlKD;AgDrlKD;EACE,eAAA;ChDulKD;AgDplKC;EACE,gBAAA;ChDslKH;AgDllKD;;EAEE,mBAAA;ChDolKD;AgDjlKD;;EAEE,oBAAA;ChDmlKD;AgDhlKD;;;EAGE,oBAAA;EACA,oBAAA;ChDklKD;AgD/kKD;EACE,uBAAA;ChDilKD;AgD9kKD;EACE,uBAAA;ChDglKD;AgD5kKD;EACE,cAAA;EACA,mBAAA;ChD8kKD;AgDxkKD;EACE,gBAAA;EACA,iBAAA;ChD0kKD;AiDjoKD;EAEE,oBAAA;EACA,gBAAA;CjDkoKD;AiD1nKD;EACE,mBAAA;EACA,eAAA;EACA,mBAAA;EAEA,oBAAA;EACA,0BAAA;EACA,0BAAA;CjD2nKD;AiDxnKC;ErB3BA,6BAAA;EACC,4BAAA;C5BspKF;AiDznKC;EACE,iBAAA;ErBvBF,gCAAA;EACC,+BAAA;C5BmpKF;AiDlnKD;;EAEE,eAAA;CjDonKD;AiDtnKD;;EAKI,eAAA;CjDqnKH;AiDjnKC;;;;EAEE,sBAAA;EACA,eAAA;EACA,0BAAA;CjDqnKH;AiDjnKD;EACE,YAAA;EACA,iBAAA;CjDmnKD;AiD9mKC;;;EAGE,0BAAA;EACA,eAAA;EACA,oBAAA;CjDgnKH;AiDrnKC;;;EASI,eAAA;CjDinKL;AiD1nKC;;;EAYI,eAAA;CjDmnKL;AiD9mKC;;;EAGE,WAAA;EACA,eAAA;EACA,0BAAA;EACA,sBAAA;CjDgnKH;AiDtnKC;;;;;;;;;EAYI,eAAA;CjDqnKL;AiDjoKC;;;EAeI,eAAA;CjDunKL;AkDztKC;EACE,eAAA;EACA,0BAAA;ClD2tKH;AkDztKG;;EAEE,eAAA;ClD2tKL;AkD7tKG;;EAKI,eAAA;ClD4tKP;AkDztKK;;;;EAEE,eAAA;EACA,0BAAA;ClD6tKP;AkD3tKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClDguKP;AkDtvKC;EACE,eAAA;EACA,0BAAA;ClDwvKH;AkDtvKG;;EAEE,eAAA;ClDwvKL;AkD1vKG;;EAKI,eAAA;ClDyvKP;AkDtvKK;;;;EAEE,eAAA;EACA,0BAAA;ClD0vKP;AkDxvKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClD6vKP;AkDnxKC;EACE,eAAA;EACA,0BAAA;ClDqxKH;AkDnxKG;;EAEE,eAAA;ClDqxKL;AkDvxKG;;EAKI,eAAA;ClDsxKP;AkDnxKK;;;;EAEE,eAAA;EACA,0BAAA;ClDuxKP;AkDrxKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClD0xKP;AkDhzKC;EACE,eAAA;EACA,0BAAA;ClDkzKH;AkDhzKG;;EAEE,eAAA;ClDkzKL;AkDpzKG;;EAKI,eAAA;ClDmzKP;AkDhzKK;;;;EAEE,eAAA;EACA,0BAAA;ClDozKP;AkDlzKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClDuzKP;AiDttKD;EACE,cAAA;EACA,mBAAA;CjDwtKD;AiDttKD;EACE,iBAAA;EACA,iBAAA;CjDwtKD;AmDl1KD;EACE,oBAAA;EACA,0BAAA;EACA,8BAAA;EACA,mBAAA;E9C0DA,kDAAA;EACQ,0CAAA;CL2xKT;AmDj1KD;EACE,cAAA;CnDm1KD;AmD90KD;EACE,mBAAA;EACA,qCAAA;EvBpBA,6BAAA;EACC,4BAAA;C5Bq2KF;AmDp1KD;EAMI,eAAA;CnDi1KH;AmD50KD;EACE,cAAA;EACA,iBAAA;EACA,gBAAA;EACA,eAAA;CnD80KD;AmDl1KD;;;;;EAWI,eAAA;CnD80KH;AmDz0KD;EACE,mBAAA;EACA,0BAAA;EACA,8BAAA;EvBxCA,gCAAA;EACC,+BAAA;C5Bo3KF;AmDn0KD;;EAGI,iBAAA;CnDo0KH;AmDv0KD;;EAMM,oBAAA;EACA,iBAAA;CnDq0KL;AmDj0KG;;EAEI,cAAA;EvBvEN,6BAAA;EACC,4BAAA;C5B24KF;AmD/zKG;;EAEI,iBAAA;EvBvEN,gCAAA;EACC,+BAAA;C5By4KF;AmDx1KD;EvB1DE,2BAAA;EACC,0BAAA;C5Bq5KF;AmD3zKD;EAEI,oBAAA;CnD4zKH;AmDzzKD;EACE,oBAAA;CnD2zKD;AmDnzKD;;;EAII,iBAAA;CnDozKH;AmDxzKD;;;EAOM,mBAAA;EACA,oBAAA;CnDszKL;AmD9zKD;;EvBzGE,6BAAA;EACC,4BAAA;C5B26KF;AmDn0KD;;;;EAmBQ,4BAAA;EACA,6BAAA;CnDszKP;AmD10KD;;;;;;;;EAwBU,4BAAA;CnD4zKT;AmDp1KD;;;;;;;;EA4BU,6BAAA;CnDk0KT;AmD91KD;;EvBjGE,gCAAA;EACC,+BAAA;C5Bm8KF;AmDn2KD;;;;EAyCQ,+BAAA;EACA,gCAAA;CnDg0KP;AmD12KD;;;;;;;;EA8CU,+BAAA;CnDs0KT;AmDp3KD;;;;;;;;EAkDU,gCAAA;CnD40KT;AmD93KD;;;;EA2DI,8BAAA;CnDy0KH;AmDp4KD;;EA+DI,cAAA;CnDy0KH;AmDx4KD;;EAmEI,UAAA;CnDy0KH;AmD54KD;;;;;;;;;;;;EA0EU,eAAA;CnDg1KT;AmD15KD;;;;;;;;;;;;EA8EU,gBAAA;CnD01KT;AmDx6KD;;;;;;;;EAuFU,iBAAA;CnD21KT;AmDl7KD;;;;;;;;EAgGU,iBAAA;CnD41KT;AmD57KD;EAsGI,UAAA;EACA,iBAAA;CnDy1KH;AmD/0KD;EACE,oBAAA;CnDi1KD;AmDl1KD;EAKI,iBAAA;EACA,mBAAA;CnDg1KH;AmDt1KD;EASM,gBAAA;CnDg1KL;AmDz1KD;EAcI,iBAAA;CnD80KH;AmD51KD;;EAkBM,8BAAA;CnD80KL;AmDh2KD;EAuBI,cAAA;CnD40KH;AmDn2KD;EAyBM,iCAAA;CnD60KL;AmDt0KD;EC1PE,sBAAA;CpDmkLD;AoDjkLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpDmkLH;AoDtkLC;EAMI,0BAAA;CpDmkLL;AoDzkLC;EASI,eAAA;EACA,0BAAA;CpDmkLL;AoDhkLC;EAEI,6BAAA;CpDikLL;AmDr1KD;EC7PE,sBAAA;CpDqlLD;AoDnlLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpDqlLH;AoDxlLC;EAMI,0BAAA;CpDqlLL;AoD3lLC;EASI,eAAA;EACA,0BAAA;CpDqlLL;AoDllLC;EAEI,6BAAA;CpDmlLL;AmDp2KD;EChQE,sBAAA;CpDumLD;AoDrmLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpDumLH;AoD1mLC;EAMI,0BAAA;CpDumLL;AoD7mLC;EASI,eAAA;EACA,0BAAA;CpDumLL;AoDpmLC;EAEI,6BAAA;CpDqmLL;AmDn3KD;ECnQE,sBAAA;CpDynLD;AoDvnLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpDynLH;AoD5nLC;EAMI,0BAAA;CpDynLL;AoD/nLC;EASI,eAAA;EACA,0BAAA;CpDynLL;AoDtnLC;EAEI,6BAAA;CpDunLL;AmDl4KD;ECtQE,sBAAA;CpD2oLD;AoDzoLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpD2oLH;AoD9oLC;EAMI,0BAAA;CpD2oLL;AoDjpLC;EASI,eAAA;EACA,0BAAA;CpD2oLL;AoDxoLC;EAEI,6BAAA;CpDyoLL;AmDj5KD;ECzQE,sBAAA;CpD6pLD;AoD3pLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpD6pLH;AoDhqLC;EAMI,0BAAA;CpD6pLL;AoDnqLC;EASI,eAAA;EACA,0BAAA;CpD6pLL;AoD1pLC;EAEI,6BAAA;CpD2pLL;AqD3qLD;EACE,mBAAA;EACA,eAAA;EACA,UAAA;EACA,WAAA;EACA,iBAAA;CrD6qLD;AqDlrLD;;;;;EAYI,mBAAA;EACA,OAAA;EACA,QAAA;EACA,UAAA;EACA,aAAA;EACA,YAAA;EACA,UAAA;CrD6qLH;AqDxqLD;EACE,uBAAA;CrD0qLD;AqDtqLD;EACE,oBAAA;CrDwqLD;AsDnsLD;EACE,iBAAA;EACA,cAAA;EACA,oBAAA;EACA,0BAAA;EACA,0BAAA;EACA,mBAAA;EjDwDA,wDAAA;EACQ,gDAAA;CL8oLT;AsD7sLD;EASI,mBAAA;EACA,kCAAA;CtDusLH;AsDlsLD;EACE,cAAA;EACA,mBAAA;CtDosLD;AsDlsLD;EACE,aAAA;EACA,mBAAA;CtDosLD;AuD1tLD;EACE,aAAA;EACA,gBAAA;EACA,kBAAA;EACA,eAAA;EACA,eAAA;EACA,6BAAA;EjCRA,aAAA;EAGA,0BAAA;CtBmuLD;AuD3tLC;;EAEE,eAAA;EACA,sBAAA;EACA,gBAAA;EjCfF,aAAA;EAGA,0BAAA;CtB2uLD;AuDvtLC;EACE,WAAA;EACA,gBAAA;EACA,wBAAA;EACA,UAAA;EACA,yBAAA;CvDytLH;AwD9uLD;EACE,iBAAA;CxDgvLD;AwD5uLD;EACE,cAAA;EACA,iBAAA;EACA,gBAAA;EACA,OAAA;EACA,SAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,kCAAA;EAIA,WAAA;CxD2uLD;AwDxuLC;EnD+GA,sCAAA;EACI,kCAAA;EACC,iCAAA;EACG,8BAAA;EAkER,oDAAA;EAEK,0CAAA;EACG,oCAAA;CL2jLT;AwD9uLC;EnD2GA,mCAAA;EACI,+BAAA;EACC,8BAAA;EACG,2BAAA;CLsoLT;AwDlvLD;EACE,mBAAA;EACA,iBAAA;CxDovLD;AwDhvLD;EACE,mBAAA;EACA,YAAA;EACA,aAAA;CxDkvLD;AwD9uLD;EACE,mBAAA;EACA,0BAAA;EACA,0BAAA;EACA,qCAAA;EACA,mBAAA;EnDaA,iDAAA;EACQ,yCAAA;EmDZR,qCAAA;UAAA,6BAAA;EAEA,WAAA;CxDgvLD;AwD5uLD;EACE,gBAAA;EACA,OAAA;EACA,SAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,0BAAA;CxD8uLD;AwD5uLC;ElCrEA,WAAA;EAGA,yBAAA;CtBkzLD;AwD/uLC;ElCtEA,aAAA;EAGA,0BAAA;CtBszLD;AwD9uLD;EACE,cAAA;EACA,iCAAA;EACA,0BAAA;CxDgvLD;AwD7uLD;EACE,iBAAA;CxD+uLD;AwD3uLD;EACE,UAAA;EACA,wBAAA;CxD6uLD;AwDxuLD;EACE,mBAAA;EACA,cAAA;CxD0uLD;AwDtuLD;EACE,cAAA;EACA,kBAAA;EACA,8BAAA;CxDwuLD;AwD3uLD;EAQI,iBAAA;EACA,iBAAA;CxDsuLH;AwD/uLD;EAaI,kBAAA;CxDquLH;AwDlvLD;EAiBI,eAAA;CxDouLH;AwD/tLD;EACE,mBAAA;EACA,aAAA;EACA,YAAA;EACA,aAAA;EACA,iBAAA;CxDiuLD;AwD/sLD;EAZE;IACE,aAAA;IACA,kBAAA;GxD8tLD;EwD5tLD;InDvEA,kDAAA;IACQ,0CAAA;GLsyLP;EwD3tLD;IAAY,aAAA;GxD8tLX;CACF;AwDztLD;EAFE;IAAY,aAAA;GxD+tLX;CACF;AyD92LD;EACE,mBAAA;EACA,cAAA;EACA,eAAA;ECRA,4DAAA;EAEA,mBAAA;EACA,oBAAA;EACA,uBAAA;EACA,iBAAA;EACA,wBAAA;EACA,iBAAA;EACA,kBAAA;EACA,sBAAA;EACA,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,mBAAA;EACA,qBAAA;EACA,kBAAA;EDHA,gBAAA;EnCVA,WAAA;EAGA,yBAAA;CtBq4LD;AyD13LC;EnCdA,aAAA;EAGA,0BAAA;CtBy4LD;AyD73LC;EAAW,iBAAA;EAAmB,eAAA;CzDi4L/B;AyDh4LC;EAAW,iBAAA;EAAmB,eAAA;CzDo4L/B;AyDn4LC;EAAW,gBAAA;EAAmB,eAAA;CzDu4L/B;AyDt4LC;EAAW,kBAAA;EAAmB,eAAA;CzD04L/B;AyDt4LD;EACE,iBAAA;EACA,iBAAA;EACA,eAAA;EACA,mBAAA;EACA,0BAAA;EACA,mBAAA;CzDw4LD;AyDp4LD;EACE,mBAAA;EACA,SAAA;EACA,UAAA;EACA,0BAAA;EACA,oBAAA;CzDs4LD;AyDl4LC;EACE,UAAA;EACA,UAAA;EACA,kBAAA;EACA,wBAAA;EACA,0BAAA;CzDo4LH;AyDl4LC;EACE,UAAA;EACA,WAAA;EACA,oBAAA;EACA,wBAAA;EACA,0BAAA;CzDo4LH;AyDl4LC;EACE,UAAA;EACA,UAAA;EACA,oBAAA;EACA,wBAAA;EACA,0BAAA;CzDo4LH;AyDl4LC;EACE,SAAA;EACA,QAAA;EACA,iBAAA;EACA,4BAAA;EACA,4BAAA;CzDo4LH;AyDl4LC;EACE,SAAA;EACA,SAAA;EACA,iBAAA;EACA,4BAAA;EACA,2BAAA;CzDo4LH;AyDl4LC;EACE,OAAA;EACA,UAAA;EACA,kBAAA;EACA,wBAAA;EACA,6BAAA;CzDo4LH;AyDl4LC;EACE,OAAA;EACA,WAAA;EACA,iBAAA;EACA,wBAAA;EACA,6BAAA;CzDo4LH;AyDl4LC;EACE,OAAA;EACA,UAAA;EACA,iBAAA;EACA,wBAAA;EACA,6BAAA;CzDo4LH;A2Dj+LD;EACE,mBAAA;EACA,OAAA;EACA,QAAA;EACA,cAAA;EACA,cAAA;EACA,iBAAA;EACA,aAAA;EDXA,4DAAA;EAEA,mBAAA;EACA,oBAAA;EACA,uBAAA;EACA,iBAAA;EACA,wBAAA;EACA,iBAAA;EACA,kBAAA;EACA,sBAAA;EACA,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,mBAAA;EACA,qBAAA;EACA,kBAAA;ECAA,gBAAA;EAEA,0BAAA;EACA,qCAAA;UAAA,6BAAA;EACA,0BAAA;EACA,qCAAA;EACA,mBAAA;EtD8CA,kDAAA;EACQ,0CAAA;CLi8LT;A2D5+LC;EAAY,kBAAA;C3D++Lb;A2D9+LC;EAAY,kBAAA;C3Di/Lb;A2Dh/LC;EAAY,iBAAA;C3Dm/Lb;A2Dl/LC;EAAY,mBAAA;C3Dq/Lb;A2Dl/LD;EACE,UAAA;EACA,kBAAA;EACA,gBAAA;EACA,0BAAA;EACA,iCAAA;EACA,2BAAA;C3Do/LD;A2Dj/LD;EACE,kBAAA;C3Dm/LD;A2D3+LC;;EAEE,mBAAA;EACA,eAAA;EACA,SAAA;EACA,UAAA;EACA,0BAAA;EACA,oBAAA;C3D6+LH;A2D1+LD;EACE,mBAAA;C3D4+LD;A2D1+LD;EACE,mBAAA;EACA,YAAA;C3D4+LD;A2Dx+LC;EACE,UAAA;EACA,mBAAA;EACA,uBAAA;EACA,0BAAA;EACA,sCAAA;EACA,cAAA;C3D0+LH;A2Dz+LG;EACE,aAAA;EACA,YAAA;EACA,mBAAA;EACA,uBAAA;EACA,0BAAA;C3D2+LL;A2Dx+LC;EACE,SAAA;EACA,YAAA;EACA,kBAAA;EACA,qBAAA;EACA,4BAAA;EACA,wCAAA;C3D0+LH;A2Dz+LG;EACE,aAAA;EACA,UAAA;EACA,cAAA;EACA,qBAAA;EACA,4BAAA;C3D2+LL;A2Dx+LC;EACE,UAAA;EACA,mBAAA;EACA,oBAAA;EACA,6BAAA;EACA,yCAAA;EACA,WAAA;C3D0+LH;A2Dz+LG;EACE,aAAA;EACA,SAAA;EACA,mBAAA;EACA,oBAAA;EACA,6BAAA;C3D2+LL;A2Dv+LC;EACE,SAAA;EACA,aAAA;EACA,kBAAA;EACA,sBAAA;EACA,2BAAA;EACA,uCAAA;C3Dy+LH;A2Dx+LG;EACE,aAAA;EACA,WAAA;EACA,sBAAA;EACA,2BAAA;EACA,cAAA;C3D0+LL;A4DnmMD;EACE,mBAAA;C5DqmMD;A4DlmMD;EACE,mBAAA;EACA,iBAAA;EACA,YAAA;C5DomMD;A4DvmMD;EAMI,cAAA;EACA,mBAAA;EvD6KF,0CAAA;EACK,qCAAA;EACG,kCAAA;CLw7LT;A4D9mMD;;EAcM,eAAA;C5DomML;A4D1kMC;EAAA;IvDiKA,uDAAA;IAEK,6CAAA;IACG,uCAAA;IA7JR,oCAAA;IAEQ,4BAAA;IA+GR,4BAAA;IAEQ,oBAAA;GL69LP;E4DxmMG;;IvDmHJ,2CAAA;IACQ,mCAAA;IuDjHF,QAAA;G5D2mML;E4DzmMG;;IvD8GJ,4CAAA;IACQ,oCAAA;IuD5GF,QAAA;G5D4mML;E4D1mMG;;;IvDyGJ,wCAAA;IACQ,gCAAA;IuDtGF,QAAA;G5D6mML;CACF;A4DnpMD;;;EA6CI,eAAA;C5D2mMH;A4DxpMD;EAiDI,QAAA;C5D0mMH;A4D3pMD;;EAsDI,mBAAA;EACA,OAAA;EACA,YAAA;C5DymMH;A4DjqMD;EA4DI,WAAA;C5DwmMH;A4DpqMD;EA+DI,YAAA;C5DwmMH;A4DvqMD;;EAmEI,QAAA;C5DwmMH;A4D3qMD;EAuEI,YAAA;C5DumMH;A4D9qMD;EA0EI,WAAA;C5DumMH;A4D/lMD;EACE,mBAAA;EACA,OAAA;EACA,QAAA;EACA,UAAA;EACA,WAAA;EtC9FA,aAAA;EAGA,0BAAA;EsC6FA,gBAAA;EACA,eAAA;EACA,mBAAA;EACA,0CAAA;C5DkmMD;A4D7lMC;EdlGE,mGAAA;EACA,8FAAA;EACA,qHAAA;EAAA,+FAAA;EACA,4BAAA;EACA,uHAAA;C9CksMH;A4DjmMC;EACE,WAAA;EACA,SAAA;EdvGA,mGAAA;EACA,8FAAA;EACA,qHAAA;EAAA,+FAAA;EACA,4BAAA;EACA,uHAAA;C9C2sMH;A4DnmMC;;EAEE,WAAA;EACA,eAAA;EACA,sBAAA;EtCtHF,aAAA;EAGA,0BAAA;CtB0tMD;A4DpoMD;;;;EAsCI,mBAAA;EACA,SAAA;EACA,kBAAA;EACA,WAAA;EACA,sBAAA;C5DomMH;A4D9oMD;;EA8CI,UAAA;EACA,mBAAA;C5DomMH;A4DnpMD;;EAmDI,WAAA;EACA,oBAAA;C5DomMH;A4DxpMD;;EAwDI,YAAA;EACA,aAAA;EACA,eAAA;EACA,mBAAA;C5DomMH;A4D/lMG;EACE,iBAAA;C5DimML;A4D7lMG;EACE,iBAAA;C5D+lML;A4DrlMD;EACE,mBAAA;EACA,aAAA;EACA,UAAA;EACA,YAAA;EACA,WAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;C5DulMD;A4DhmMD;EAYI,sBAAA;EACA,YAAA;EACA,aAAA;EACA,YAAA;EACA,oBAAA;EACA,0BAAA;EACA,oBAAA;EACA,gBAAA;EAWA,0BAAA;EACA,mCAAA;C5D6kMH;A4D5mMD;EAkCI,UAAA;EACA,YAAA;EACA,aAAA;EACA,0BAAA;C5D6kMH;A4DtkMD;EACE,mBAAA;EACA,UAAA;EACA,WAAA;EACA,aAAA;EACA,YAAA;EACA,kBAAA;EACA,qBAAA;EACA,eAAA;EACA,mBAAA;EACA,0CAAA;C5DwkMD;A4DvkMC;EACE,kBAAA;C5DykMH;A4DhiMD;EAhCE;;;;IAKI,YAAA;IACA,aAAA;IACA,kBAAA;IACA,gBAAA;G5DkkMH;E4D1kMD;;IAYI,mBAAA;G5DkkMH;E4D9kMD;;IAgBI,oBAAA;G5DkkMH;E4D7jMD;IACE,UAAA;IACA,WAAA;IACA,qBAAA;G5D+jMD;E4D3jMD;IACE,aAAA;G5D6jMD;CACF;A6D3zMC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE,aAAA;EACA,eAAA;C7Dy1MH;A6Dv1MC;;;;;;;;;;;;;;;EACE,YAAA;C7Du2MH;AiC/2MD;E6BRE,eAAA;EACA,kBAAA;EACA,mBAAA;C9D03MD;AiCj3MD;EACE,wBAAA;CjCm3MD;AiCj3MD;EACE,uBAAA;CjCm3MD;AiC32MD;EACE,yBAAA;CjC62MD;AiC32MD;EACE,0BAAA;CjC62MD;AiC32MD;EACE,mBAAA;CjC62MD;AiC32MD;E8BzBE,YAAA;EACA,mBAAA;EACA,kBAAA;EACA,8BAAA;EACA,UAAA;C/Du4MD;AiCz2MD;EACE,yBAAA;CjC22MD;AiCp2MD;EACE,gBAAA;CjCs2MD;AgEv4MD;EACE,oBAAA;ChEy4MD;AgEn4MD;;;;ECdE,yBAAA;CjEu5MD;AgEl4MD;;;;;;;;;;;;EAYE,yBAAA;ChEo4MD;AgE73MD;EAAA;IChDE,0BAAA;GjEi7MC;EiEh7MD;IAAU,0BAAA;GjEm7MT;EiEl7MD;IAAU,8BAAA;GjEq7MT;EiEp7MD;;IACU,+BAAA;GjEu7MT;CACF;AgEv4MD;EAAA;IAFI,0BAAA;GhE64MD;CACF;AgEv4MD;EAAA;IAFI,2BAAA;GhE64MD;CACF;AgEv4MD;EAAA;IAFI,iCAAA;GhE64MD;CACF;AgEt4MD;EAAA;ICrEE,0BAAA;GjE+8MC;EiE98MD;IAAU,0BAAA;GjEi9MT;EiEh9MD;IAAU,8BAAA;GjEm9MT;EiEl9MD;;IACU,+BAAA;GjEq9MT;CACF;AgEh5MD;EAAA;IAFI,0BAAA;GhEs5MD;CACF;AgEh5MD;EAAA;IAFI,2BAAA;GhEs5MD;CACF;AgEh5MD;EAAA;IAFI,iCAAA;GhEs5MD;CACF;AgE/4MD;EAAA;IC1FE,0BAAA;GjE6+MC;EiE5+MD;IAAU,0BAAA;GjE++MT;EiE9+MD;IAAU,8BAAA;GjEi/MT;EiEh/MD;;IACU,+BAAA;GjEm/MT;CACF;AgEz5MD;EAAA;IAFI,0BAAA;GhE+5MD;CACF;AgEz5MD;EAAA;IAFI,2BAAA;GhE+5MD;CACF;AgEz5MD;EAAA;IAFI,iCAAA;GhE+5MD;CACF;AgEx5MD;EAAA;IC/GE,0BAAA;GjE2gNC;EiE1gND;IAAU,0BAAA;GjE6gNT;EiE5gND;IAAU,8BAAA;GjE+gNT;EiE9gND;;IACU,+BAAA;GjEihNT;CACF;AgEl6MD;EAAA;IAFI,0BAAA;GhEw6MD;CACF;AgEl6MD;EAAA;IAFI,2BAAA;GhEw6MD;CACF;AgEl6MD;EAAA;IAFI,iCAAA;GhEw6MD;CACF;AgEj6MD;EAAA;IC5HE,yBAAA;GjEiiNC;CACF;AgEj6MD;EAAA;ICjIE,yBAAA;GjEsiNC;CACF;AgEj6MD;EAAA;ICtIE,yBAAA;GjE2iNC;CACF;AgEj6MD;EAAA;IC3IE,yBAAA;GjEgjNC;CACF;AgE95MD;ECnJE,yBAAA;CjEojND;AgE35MD;EAAA;ICjKE,0BAAA;GjEgkNC;EiE/jND;IAAU,0BAAA;GjEkkNT;EiEjkND;IAAU,8BAAA;GjEokNT;EiEnkND;;IACU,+BAAA;GjEskNT;CACF;AgEz6MD;EACE,yBAAA;ChE26MD;AgEt6MD;EAAA;IAFI,0BAAA;GhE46MD;CACF;AgE16MD;EACE,yBAAA;ChE46MD;AgEv6MD;EAAA;IAFI,2BAAA;GhE66MD;CACF;AgE36MD;EACE,yBAAA;ChE66MD;AgEx6MD;EAAA;IAFI,iCAAA;GhE86MD;CACF;AgEv6MD;EAAA;ICpLE,yBAAA;GjE+lNC;CACF","file":"bootstrap.css","sourcesContent":["/*!\n * Bootstrap v3.3.5 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: 1px dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important;\n box-shadow: none !important;\n text-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('../fonts/glyphicons-halflings-regular.eot');\n src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\2a\";\n}\n.glyphicon-plus:before {\n content: \"\\2b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #ffffff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n background-color: #fcf8e3;\n padding: .2em;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777777;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: '\\00A0 \\2014';\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #ffffff;\n background-color: #333333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n word-break: break-all;\n word-wrap: break-word;\n color: #333333;\n background-color: #f5f5f5;\n border: 1px solid #cccccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n.row {\n margin-left: -15px;\n margin-right: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #dddddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #dddddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #dddddd;\n}\n.table .table {\n background-color: #ffffff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #dddddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #dddddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #dddddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n min-width: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #ffffff;\n background-image: none;\n border: 1px solid #cccccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999999;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.form-control-static {\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n min-height: 34px;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-left: 0;\n padding-right: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n border-color: #3c763d;\n background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n border-color: #8a6d3b;\n background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n border-color: #a94442;\n background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-left: -15px;\n margin-right: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: 7px;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 14.333333px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n white-space: nowrap;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n outline: 0;\n background-image: none;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n opacity: 0.65;\n filter: alpha(opacity=65);\n -webkit-box-shadow: none;\n box-shadow: none;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333333;\n background-color: #ffffff;\n border-color: #cccccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n background-image: none;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #ffffff;\n border-color: #cccccc;\n}\n.btn-default .badge {\n color: #ffffff;\n background-color: #333333;\n}\n.btn-primary {\n color: #ffffff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #ffffff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #ffffff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #ffffff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #ffffff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n background-image: none;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #ffffff;\n}\n.btn-success {\n color: #ffffff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #ffffff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #ffffff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #ffffff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #ffffff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n background-image: none;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #ffffff;\n}\n.btn-info {\n color: #ffffff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #ffffff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #ffffff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #ffffff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #ffffff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n background-image: none;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #ffffff;\n}\n.btn-warning {\n color: #ffffff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #ffffff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #ffffff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #ffffff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #ffffff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n background-image: none;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #ffffff;\n}\n.btn-danger {\n color: #ffffff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #ffffff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #ffffff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #ffffff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #ffffff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n background-image: none;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #ffffff;\n}\n.btn-link {\n color: #337ab7;\n font-weight: normal;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n list-style: none;\n font-size: 14px;\n text-align: left;\n background-color: #ffffff;\n border: 1px solid #cccccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n text-decoration: none;\n color: #262626;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #ffffff;\n text-decoration: none;\n outline: 0;\n background-color: #337ab7;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n cursor: not-allowed;\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n left: auto;\n right: 0;\n}\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n left: auto;\n right: 0;\n }\n .navbar-right .dropdown-menu-left {\n left: 0;\n right: auto;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-bottom-left-radius: 4px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #cccccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n margin-bottom: 0;\n padding-left: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #dddddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #dddddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-bottom-color: transparent;\n cursor: default;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #dddddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #dddddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #ffffff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #ffffff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #dddddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #dddddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #ffffff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n overflow-x: visible;\n padding-right: 15px;\n padding-left: 15px;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-left: 0;\n padding-right: 0;\n }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.navbar-brand {\n float: left;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n height: 50px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: 15px;\n padding: 9px 10px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n margin-left: -15px;\n margin-right: -15px;\n padding: 10px 15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-left: 15px;\n margin-right: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #cccccc;\n background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n border-color: #dddddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #dddddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n background-color: #e7e7e7;\n color: #555555;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #cccccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-link {\n color: #777777;\n}\n.navbar-default .navbar-link:hover {\n color: #333333;\n}\n.navbar-default .btn-link {\n color: #777777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #cccccc;\n}\n.navbar-inverse {\n background-color: #222222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #ffffff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #ffffff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #ffffff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #ffffff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n background-color: #080808;\n color: #ffffff;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #ffffff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #ffffff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #ffffff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #ffffff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n content: \"/\\00a0\";\n padding: 0 5px;\n color: #cccccc;\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n line-height: 1.42857143;\n text-decoration: none;\n color: #337ab7;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-bottom-left-radius: 4px;\n border-top-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-bottom-right-radius: 4px;\n border-top-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 3;\n color: #23527c;\n background-color: #eeeeee;\n border-color: #dddddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 2;\n color: #ffffff;\n background-color: #337ab7;\n border-color: #337ab7;\n cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n background-color: #ffffff;\n border-color: #dddddd;\n cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-bottom-left-radius: 6px;\n border-top-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-bottom-right-radius: 6px;\n border-top-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-bottom-left-radius: 3px;\n border-top-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-bottom-right-radius: 3px;\n border-top-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n list-style: none;\n text-align: center;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n background-color: #ffffff;\n cursor: not-allowed;\n}\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #ffffff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n color: #ffffff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n color: #ffffff;\n line-height: 1;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #ffffff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #ffffff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n border-radius: 6px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-left: 60px;\n padding-right: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-left: auto;\n margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n background-color: #dff0d8;\n border-color: #d6e9c6;\n color: #3c763d;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n background-color: #d9edf7;\n border-color: #bce8f1;\n color: #31708f;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n background-color: #fcf8e3;\n border-color: #faebcc;\n color: #8a6d3b;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n background-color: #f2dede;\n border-color: #ebccd1;\n color: #a94442;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n overflow: hidden;\n height: 20px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #ffffff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n margin-bottom: 20px;\n padding-left: 0;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n}\n.list-group-item:first-child {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n text-decoration: none;\n color: #555555;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n background-color: #eeeeee;\n color: #777777;\n cursor: not-allowed;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #ffffff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #ffffff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #dddddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-left: 15px;\n padding-right: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-left-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #dddddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n border: 0;\n margin-bottom: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #dddddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #dddddd;\n}\n.panel-default {\n border-color: #dddddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #dddddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #dddddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #dddddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #ffffff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #ffffff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000000;\n text-shadow: 0 1px 0 #ffffff;\n opacity: 0.2;\n filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n color: #000000;\n text-decoration: none;\n cursor: pointer;\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #ffffff;\n border: 1px solid #999999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n background-clip: padding-box;\n outline: 0;\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000000;\n}\n.modal-backdrop.fade {\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n min-height: 16.42857143px;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 12px;\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.tooltip.in {\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.tooltip.top {\n margin-top: -3px;\n padding: 5px 0;\n}\n.tooltip.right {\n margin-left: 3px;\n padding: 0 5px;\n}\n.tooltip.bottom {\n margin-top: 3px;\n padding: 5px 0;\n}\n.tooltip.left {\n margin-left: -3px;\n padding: 0 5px;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #ffffff;\n text-align: center;\n background-color: #000000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000000;\n}\n.tooltip.top-left .tooltip-arrow {\n bottom: 0;\n right: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000000;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 14px;\n background-color: #ffffff;\n background-clip: padding-box;\n border: 1px solid #cccccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover-title {\n margin: 0;\n padding: 8px 14px;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow:after {\n border-width: 10px;\n content: \"\";\n}\n.popover.top > .arrow {\n left: 50%;\n margin-left: -11px;\n border-bottom-width: 0;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n bottom: -11px;\n}\n.popover.top > .arrow:after {\n content: \" \";\n bottom: 1px;\n margin-left: -10px;\n border-bottom-width: 0;\n border-top-color: #ffffff;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-left-width: 0;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n content: \" \";\n left: 1px;\n bottom: -10px;\n border-left-width: 0;\n border-right-color: #ffffff;\n}\n.popover.bottom > .arrow {\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n top: -11px;\n}\n.popover.bottom > .arrow:after {\n content: \" \";\n top: 1px;\n margin-left: -10px;\n border-top-width: 0;\n border-bottom-color: #ffffff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: #ffffff;\n bottom: -10px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n}\n.carousel-inner > .item {\n display: none;\n position: relative;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -moz-transition: -moz-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n -moz-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n -moz-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: 15%;\n opacity: 0.5;\n filter: alpha(opacity=50);\n font-size: 20px;\n color: #ffffff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n.carousel-control.right {\n left: auto;\n right: 0;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n.carousel-control:hover,\n.carousel-control:focus {\n outline: 0;\n color: #ffffff;\n text-decoration: none;\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n}\n.carousel-control .icon-prev:before {\n content: '\\2039';\n}\n.carousel-control .icon-next:before {\n content: '\\203a';\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid #ffffff;\n border-radius: 10px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: #ffffff;\n}\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #ffffff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -15px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -15px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -15px;\n }\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-footer:before,\n.modal-footer:after {\n content: \" \";\n display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n// without disabling user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n box-shadow: none !important;\n text-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n // Bootstrap specific changes end\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// <a href=\"#\"><span class=\"glyphicon glyphicon-star\"></span> Star</a>\n\n// Import the fonts\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('@{icon-font-path}@{icon-font-name}.eot');\n src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n url('@{icon-font-path}@{icon-font-name}.woff2') format('woff2'),\n url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\2a\"; } }\n.glyphicon-plus { &:before { content: \"\\2b\"; } }\n.glyphicon-euro,\n.glyphicon-eur { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n.glyphicon-cd { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up { &:before { content: \"\\e204\"; } }\n.glyphicon-copy { &:before { content: \"\\e205\"; } }\n.glyphicon-paste { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer { &:before { content: \"\\e210\"; } }\n.glyphicon-king { &:before { content: \"\\e211\"; } }\n.glyphicon-queen { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop { &:before { content: \"\\e214\"; } }\n.glyphicon-knight { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula { &:before { content: \"\\e216\"; } }\n.glyphicon-tent { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard { &:before { content: \"\\e218\"; } }\n.glyphicon-bed { &:before { content: \"\\e219\"; } }\n.glyphicon-apple { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin { &:before { content: \"\\e227\"; } }\n.glyphicon-btc { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt { &:before { content: \"\\e227\"; } }\n.glyphicon-yen { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted { &:before { content: \"\\e232\"; } }\n.glyphicon-education { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window { &:before { content: \"\\e237\"; } }\n.glyphicon-oil { &:before { content: \"\\e238\"; } }\n.glyphicon-grain { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top { &:before { content: \"\\e253\"; } }\n.glyphicon-console { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n cursor: pointer;\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // Default\n outline: thin dotted;\n // WebKit\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n background-color: @state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @grid-float-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n .text-uppercase();\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover,\n a&:focus {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover,\n a&:focus {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n margin-right: auto;\n margin-left: auto;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: ceil((@gutter / -2));\n margin-right: floor((@gutter / -2));\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: ceil((@grid-gutter-width / 2));\n padding-right: floor((@grid-gutter-width / 2));\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n}\ncaption {\n padding-top: @table-cell-padding;\n padding-bottom: @table-cell-padding;\n color: @text-muted;\n text-align: left;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(odd) {\n background-color: @table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: @table-bg-hover;\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * 0.75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n}\n\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n .tab-focus();\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: (@padding-base-vertical + 1);\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-radius: @input-border-radius; // Note: This has no effect on <select>s in some browsers, due to the limited stylability of <select>s in CSS.\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n // Customize the `:focus` state to imitate native WebKit styles.\n .form-control-focus();\n\n // Placeholder\n .placeholder();\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &[disabled],\n &[readonly],\n fieldset[disabled] & {\n background-color: @input-bg-disabled;\n opacity: 1; // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655\n }\n\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n\n // Reset height for `textarea`s\n textarea& {\n height: auto;\n }\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n\n\n// Special styles for iOS temporal inputs\n//\n// In Mobile Safari, setting `display: block` on temporal inputs causes the\n// text within the input to become vertically misaligned. As a workaround, we\n// set a pixel line-height that matches the given height of the input, but only\n// for Safari. See https://bugs.webkit.org/show_bug.cgi?id=139848\n//\n// Note that as of 8.3, iOS doesn't support `datetime` or `week`.\n\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"],\n input[type=\"time\"],\n input[type=\"datetime-local\"],\n input[type=\"month\"] {\n &.form-control {\n line-height: @input-height-base;\n }\n\n &.input-sm,\n .input-group-sm & {\n line-height: @input-height-small;\n }\n\n &.input-lg,\n .input-group-lg & {\n line-height: @input-height-large;\n }\n }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n margin-bottom: @form-group-margin-bottom;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n\n label {\n min-height: @line-height-computed; // Ensure the input doesn't jump when there is no text\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n// Some special care is needed because <label>s don't inherit their parent's `cursor`.\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n &[disabled],\n &.disabled,\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n}\n// These classes are used directly on <label>s\n.radio-inline,\n.checkbox-inline {\n &.disabled,\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n}\n// These classes are used on elements with <label> descendants\n.radio,\n.checkbox {\n &.disabled,\n fieldset[disabled] & {\n label {\n cursor: @cursor-disabled;\n }\n }\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n // Size it appropriately next to real form controls\n padding-top: (@padding-base-vertical + 1);\n padding-bottom: (@padding-base-vertical + 1);\n // Remove default margin from `p`\n margin-bottom: 0;\n min-height: (@line-height-computed + @font-size-base);\n\n &.input-lg,\n &.input-sm {\n padding-left: 0;\n padding-right: 0;\n }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n//\n// The `.form-group-* form-control` variations are sadly duplicated to avoid the\n// issue documented in https://github.com/twbs/bootstrap/issues/15074.\n\n.input-sm {\n .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @input-border-radius-small);\n}\n.form-group-sm {\n .form-control {\n height: @input-height-small;\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n line-height: @line-height-small;\n border-radius: @input-border-radius-small;\n }\n select.form-control {\n height: @input-height-small;\n line-height: @input-height-small;\n }\n textarea.form-control,\n select[multiple].form-control {\n height: auto;\n }\n .form-control-static {\n height: @input-height-small;\n min-height: (@line-height-computed + @font-size-small);\n padding: (@padding-small-vertical + 1) @padding-small-horizontal;\n font-size: @font-size-small;\n line-height: @line-height-small;\n }\n}\n\n.input-lg {\n .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @input-border-radius-large);\n}\n.form-group-lg {\n .form-control {\n height: @input-height-large;\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-large;\n border-radius: @input-border-radius-large;\n }\n select.form-control {\n height: @input-height-large;\n line-height: @input-height-large;\n }\n textarea.form-control,\n select[multiple].form-control {\n height: auto;\n }\n .form-control-static {\n height: @input-height-large;\n min-height: (@line-height-computed + @font-size-large);\n padding: (@padding-large-vertical + 1) @padding-large-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-large;\n }\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n.has-feedback {\n // Enable absolute positioning\n position: relative;\n\n // Ensure icons don't overlap text\n .form-control {\n padding-right: (@input-height-base * 1.25);\n }\n}\n// Feedback icon (requires .glyphicon classes)\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2; // Ensure icon is above input groups\n display: block;\n width: @input-height-base;\n height: @input-height-base;\n line-height: @input-height-base;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: @input-height-large;\n height: @input-height-large;\n line-height: @input-height-large;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: @input-height-small;\n height: @input-height-small;\n line-height: @input-height-small;\n}\n\n// Feedback states\n.has-success {\n .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);\n}\n.has-warning {\n .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);\n}\n.has-error {\n .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);\n}\n\n// Reposition feedback icon if input has visible label above\n.has-feedback label {\n\n & ~ .form-control-feedback {\n top: (@line-height-computed + 5); // Height of the `label` and its margin\n }\n &.sr-only ~ .form-control-feedback {\n top: 0;\n }\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n display: block; // account for any element using help-block\n margin-top: 5px;\n margin-bottom: 10px;\n color: lighten(@text-color, 25%); // lighten the text some for contrast\n}\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n.form-inline {\n\n // Kick in the inline\n @media (min-width: @screen-sm-min) {\n // Inline-block all the things for \"inline\"\n .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // In navbar-form, allow folks to *not* use `.form-group`\n .form-control {\n display: inline-block;\n width: auto; // Prevent labels from stacking above inputs in `.form-group`\n vertical-align: middle;\n }\n\n // Make static controls behave like regular ones\n .form-control-static {\n display: inline-block;\n }\n\n .input-group {\n display: inline-table;\n vertical-align: middle;\n\n .input-group-addon,\n .input-group-btn,\n .form-control {\n width: auto;\n }\n }\n\n // Input groups need that 100% width though\n .input-group > .form-control {\n width: 100%;\n }\n\n .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // Remove default margin on radios/checkboxes that were used for stacking, and\n // then undo the floating of radios and checkboxes to match.\n .radio,\n .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n\n label {\n padding-left: 0;\n }\n }\n .radio input[type=\"radio\"],\n .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n\n // Re-override the feedback icon.\n .has-feedback .form-control-feedback {\n top: 0;\n }\n }\n}\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n // Consistent vertical alignment of radios and checkboxes\n //\n // Labels also get some reset styles, but that is scoped to a media query below.\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n // Account for padding we're adding to ensure the alignment and of help text\n // and other content below items\n .radio,\n .checkbox {\n min-height: (@line-height-computed + (@padding-base-vertical + 1));\n }\n\n // Make form groups behave like rows\n .form-group {\n .make-row();\n }\n\n // Reset spacing and right align labels, but scope to media queries so that\n // labels on narrow viewports stack the same as a default form example.\n @media (min-width: @screen-sm-min) {\n .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n }\n\n // Validation states\n //\n // Reposition the icon because it's now within a grid column and columns have\n // `position: relative;` on them. Also accounts for the grid gutter padding.\n .has-feedback .form-control-feedback {\n right: floor((@grid-gutter-width / 2));\n }\n\n // Form group sizes\n //\n // Quick utility class for applying `.input-lg` and `.input-sm` styles to the\n // inputs and labels within a `.form-group`.\n .form-group-lg {\n @media (min-width: @screen-sm-min) {\n .control-label {\n padding-top: ((@padding-large-vertical * @line-height-large) + 1);\n font-size: @font-size-large;\n }\n }\n }\n .form-group-sm {\n @media (min-width: @screen-sm-min) {\n .control-label {\n padding-top: (@padding-small-vertical + 1);\n font-size: @font-size-small;\n }\n }\n }\n}\n","// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {\n // Color the label and help text\n .help-block,\n .control-label,\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline,\n &.radio label,\n &.checkbox label,\n &.radio-inline label,\n &.checkbox-inline label {\n color: @text-color;\n }\n // Set the border and box shadow on specific inputs to match\n .form-control {\n border-color: @border-color;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n &:focus {\n border-color: darken(@border-color, 10%);\n @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);\n .box-shadow(@shadow);\n }\n }\n // Set validation states also for addons\n .input-group-addon {\n color: @text-color;\n border-color: @border-color;\n background-color: @background-color;\n }\n // Optional feedback icon\n .form-control-feedback {\n color: @text-color;\n }\n}\n\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `@input-border-focus` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n.form-control-focus(@color: @input-border-focus) {\n @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);\n &:focus {\n border-color: @color;\n outline: 0;\n .box-shadow(~\"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}\");\n }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. `<select>`\n// element gets special love because it's special, and that's a fact!\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n height: @input-height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n\n select& {\n height: @input-height;\n line-height: @input-height;\n }\n\n textarea&,\n select[multiple]& {\n height: auto;\n }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n display: inline-block;\n margin-bottom: 0; // For input.btn\n font-weight: @btn-font-weight;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n white-space: nowrap;\n .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @btn-border-radius-base);\n .user-select(none);\n\n &,\n &:active,\n &.active {\n &:focus,\n &.focus {\n .tab-focus();\n }\n }\n\n &:hover,\n &:focus,\n &.focus {\n color: @btn-default-color;\n text-decoration: none;\n }\n\n &:active,\n &.active {\n outline: 0;\n background-image: none;\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n .opacity(.65);\n .box-shadow(none);\n }\n\n a& {\n &.disabled,\n fieldset[disabled] & {\n pointer-events: none; // Future-proof disabling of clicks on `<a>` elements\n }\n }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n color: @link-color;\n font-weight: normal;\n border-radius: 0;\n\n &,\n &:active,\n &.active,\n &[disabled],\n fieldset[disabled] & {\n background-color: transparent;\n .box-shadow(none);\n }\n &,\n &:hover,\n &:focus,\n &:active {\n border-color: transparent;\n }\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n background-color: transparent;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @btn-link-disabled-color;\n text-decoration: none;\n }\n }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n // line-height: ensure even-numbered height of button next to large input\n .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @btn-border-radius-large);\n}\n.btn-sm {\n // line-height: ensure proper height of button next to small input\n .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n.btn-xs {\n .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n.button-variant(@color; @background; @border) {\n color: @color;\n background-color: @background;\n border-color: @border;\n\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 25%);\n }\n &:hover {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n\n &:hover,\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 17%);\n border-color: darken(@border, 25%);\n }\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n background-image: none;\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: @background;\n border-color: @border;\n }\n }\n\n .badge {\n color: @background;\n background-color: @color;\n }\n}\n\n// Button sizes\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n}\n","// Opacity\n\n.opacity(@opacity) {\n opacity: @opacity;\n // IE8 filter\n @opacity-ie: (@opacity * 100);\n filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n opacity: 0;\n .transition(opacity .15s linear);\n &.in {\n opacity: 1;\n }\n}\n\n.collapse {\n display: none;\n\n &.in { display: block; }\n tr&.in { display: table-row; }\n tbody&.in { display: table-row-group; }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n .transition-property(~\"height, visibility\");\n .transition-duration(.35s);\n .transition-timing-function(ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: @caret-width-base dashed;\n border-top: @caret-width-base solid ~\"\\9\"; // IE8\n border-right: @caret-width-base solid transparent;\n border-left: @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropup,\n.dropdown {\n position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: @zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0; // override default ul\n list-style: none;\n font-size: @font-size-base;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n background-color: @dropdown-bg;\n border: 1px solid @dropdown-fallback-border; // IE8 fallback\n border: 1px solid @dropdown-border;\n border-radius: @border-radius-base;\n .box-shadow(0 6px 12px rgba(0,0,0,.175));\n background-clip: padding-box;\n\n // Aligns the dropdown menu to right\n //\n // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n &.pull-right {\n right: 0;\n left: auto;\n }\n\n // Dividers (basically an hr) within the dropdown\n .divider {\n .nav-divider(@dropdown-divider-bg);\n }\n\n // Links within the dropdown menu\n > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: @line-height-base;\n color: @dropdown-link-color;\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n &:hover,\n &:focus {\n text-decoration: none;\n color: @dropdown-link-hover-color;\n background-color: @dropdown-link-hover-bg;\n }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-active-color;\n text-decoration: none;\n outline: 0;\n background-color: @dropdown-link-active-bg;\n }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-disabled-color;\n }\n\n // Nuke hover/focus effects\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none; // Remove CSS gradient\n .reset-filter();\n cursor: @cursor-disabled;\n }\n}\n\n// Open state for the dropdown\n.open {\n // Show the menu\n > .dropdown-menu {\n display: block;\n }\n\n // Remove the outline when :focus is triggered\n > a {\n outline: 0;\n }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n left: auto; // Reset the default from `.dropdown-menu`\n right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: @font-size-small;\n line-height: @line-height-base;\n color: @dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n // Reverse the caret\n .caret {\n border-top: 0;\n border-bottom: @caret-width-base dashed;\n border-bottom: @caret-width-base solid ~\"\\9\"; // IE8\n content: \"\";\n }\n // Different positioning for bottom up menu\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-right {\n .dropdown-menu {\n .dropdown-menu-right();\n }\n // Necessary for overrides of the default right aligned menu.\n // Will remove come v4 in all likelihood.\n .dropdown-menu-left {\n .dropdown-menu-left();\n }\n }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n.nav-divider(@color: #e5e5e5) {\n height: 1px;\n margin: ((@line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: @color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle; // match .btn alignment given font-size hack above\n > .btn {\n position: relative;\n float: left;\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active,\n &.active {\n z-index: 2;\n }\n }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n .btn + .btn,\n .btn + .btn-group,\n .btn-group + .btn,\n .btn-group + .btn-group {\n margin-left: -1px;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n margin-left: -5px; // Offset the first child's margin\n &:extend(.clearfix all);\n\n .btn,\n .btn-group,\n .input-group {\n float: left;\n }\n > .btn,\n > .btn-group,\n > .input-group {\n margin-left: 5px;\n }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n margin-left: 0;\n &:not(:last-child):not(.dropdown-toggle) {\n .border-right-radius(0);\n }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-right-radius(0);\n }\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n .box-shadow(none);\n }\n}\n\n\n// Reposition the caret\n.btn .caret {\n margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n border-width: @caret-width-large @caret-width-large 0;\n border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n > .btn,\n > .btn-group,\n > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n }\n\n // Clear floats so dropdown menus can be properly placed\n > .btn-group {\n &:extend(.clearfix all);\n > .btn {\n float: none;\n }\n }\n\n > .btn + .btn,\n > .btn + .btn-group,\n > .btn-group + .btn,\n > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n }\n}\n\n.btn-group-vertical > .btn {\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n &:first-child:not(:last-child) {\n border-top-right-radius: @btn-border-radius-base;\n .border-bottom-radius(0);\n }\n &:last-child:not(:first-child) {\n border-bottom-left-radius: @btn-border-radius-base;\n .border-top-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-bottom-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-top-radius(0);\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n > .btn,\n > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n }\n > .btn-group .btn {\n width: 100%;\n }\n\n > .btn-group .dropdown-menu {\n left: auto;\n }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n > .btn,\n > .btn-group > .btn {\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0,0,0,0);\n pointer-events: none;\n }\n }\n}\n","// Single side border-radius\n\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n border-bottom-left-radius: @radius;\n border-top-left-radius: @radius;\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n position: relative; // For dropdowns\n display: table;\n border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n // Undo padding and float of grid classes\n &[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n }\n\n .form-control {\n // Ensure that the input is always above the *appended* addon button for\n // proper border colors.\n position: relative;\n z-index: 2;\n\n // IE9 fubars the placeholder attribute in text inputs and the arrows on\n // select elements in input groups. To fix it, we float the input. Details:\n // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n float: left;\n\n width: 100%;\n margin-bottom: 0;\n }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n .input-lg();\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n .input-sm();\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 1;\n color: @input-color;\n text-align: center;\n background-color: @input-group-addon-bg;\n border: 1px solid @input-group-addon-border-color;\n border-radius: @border-radius-base;\n\n // Sizing\n &.input-sm {\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n border-radius: @border-radius-small;\n }\n &.input-lg {\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n border-radius: @border-radius-large;\n }\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n .border-right-radius(0);\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n .border-left-radius(0);\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n position: relative;\n // Jankily prevent input button groups from wrapping with `white-space` and\n // `font-size` in combination with `inline-block` on buttons.\n font-size: 0;\n white-space: nowrap;\n\n // Negative margin for spacing, position for bringing hovered/focused/actived\n // element above the siblings.\n > .btn {\n position: relative;\n + .btn {\n margin-left: -1px;\n }\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active {\n z-index: 2;\n }\n }\n\n // Negative margin to only have a 1px border between the two\n &:first-child {\n > .btn,\n > .btn-group {\n margin-right: -1px;\n }\n }\n &:last-child {\n > .btn,\n > .btn-group {\n z-index: 2;\n margin-left: -1px;\n }\n }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n margin-bottom: 0;\n padding-left: 0; // Override default ul/ol\n list-style: none;\n &:extend(.clearfix all);\n\n > li {\n position: relative;\n display: block;\n\n > a {\n position: relative;\n display: block;\n padding: @nav-link-padding;\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @nav-link-hover-bg;\n }\n }\n\n // Disabled state sets text to gray and nukes hover/tab effects\n &.disabled > a {\n color: @nav-disabled-link-color;\n\n &:hover,\n &:focus {\n color: @nav-disabled-link-hover-color;\n text-decoration: none;\n background-color: transparent;\n cursor: @cursor-disabled;\n }\n }\n }\n\n // Open dropdowns\n .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @nav-link-hover-bg;\n border-color: @link-color;\n }\n }\n\n // Nav dividers (deprecated with v3.0.1)\n //\n // This should have been removed in v3 with the dropping of `.nav-list`, but\n // we missed it. We don't currently support this anywhere, but in the interest\n // of maintaining backward compatibility in case you use it, it's deprecated.\n .nav-divider {\n .nav-divider();\n }\n\n // Prevent IE8 from misplacing imgs\n //\n // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n > li > a > img {\n max-width: none;\n }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n border-bottom: 1px solid @nav-tabs-border-color;\n > li {\n float: left;\n // Make the list-items overlay the bottom border\n margin-bottom: -1px;\n\n // Actual tabs (as links)\n > a {\n margin-right: 2px;\n line-height: @line-height-base;\n border: 1px solid transparent;\n border-radius: @border-radius-base @border-radius-base 0 0;\n &:hover {\n border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n }\n }\n\n // Active state, and its :hover to override normal :hover\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-tabs-active-link-hover-color;\n background-color: @nav-tabs-active-link-hover-bg;\n border: 1px solid @nav-tabs-active-link-hover-border-color;\n border-bottom-color: transparent;\n cursor: default;\n }\n }\n }\n // pulling this in mainly for less shorthand\n &.nav-justified {\n .nav-justified();\n .nav-tabs-justified();\n }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n > li {\n float: left;\n\n // Links rendered as pills\n > a {\n border-radius: @nav-pills-border-radius;\n }\n + li {\n margin-left: 2px;\n }\n\n // Active state\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-pills-active-link-hover-color;\n background-color: @nav-pills-active-link-hover-bg;\n }\n }\n }\n}\n\n\n// Stacked pills\n.nav-stacked {\n > li {\n float: none;\n + li {\n margin-top: 2px;\n margin-left: 0; // no need for this gap between nav items\n }\n }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n width: 100%;\n\n > li {\n float: none;\n > a {\n text-align: center;\n margin-bottom: 5px;\n }\n }\n\n > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n }\n\n @media (min-width: @screen-sm-min) {\n > li {\n display: table-cell;\n width: 1%;\n > a {\n margin-bottom: 0;\n }\n }\n }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n border-bottom: 0;\n\n > li > a {\n // Override margin from .nav-tabs\n margin-right: 0;\n border-radius: @border-radius-base;\n }\n\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border: 1px solid @nav-tabs-justified-link-border-color;\n }\n\n @media (min-width: @screen-sm-min) {\n > li > a {\n border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n border-radius: @border-radius-base @border-radius-base 0 0;\n }\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border-bottom-color: @nav-tabs-justified-active-link-border-color;\n }\n }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n // make dropdown border overlap tab border\n margin-top: -1px;\n // Remove the top rounded corners here since there is a hard edge above the menu\n .border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n margin-bottom: @navbar-margin-bottom;\n border: 1px solid transparent;\n\n // Prevent floats from breaking the navbar\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: @navbar-border-radius;\n }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n overflow-x: visible;\n padding-right: @navbar-padding-horizontal;\n padding-left: @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n &:extend(.clearfix all);\n -webkit-overflow-scrolling: touch;\n\n &.in {\n overflow-y: auto;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border-top: 0;\n box-shadow: none;\n\n &.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0; // Override default setting\n overflow: visible !important;\n }\n\n &.in {\n overflow-y: visible;\n }\n\n // Undo the collapse side padding for navbars with containers to ensure\n // alignment of right-aligned contents.\n .navbar-fixed-top &,\n .navbar-static-top &,\n .navbar-fixed-bottom & {\n padding-left: 0;\n padding-right: 0;\n }\n }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n .navbar-collapse {\n max-height: @navbar-collapse-max-height;\n\n @media (max-device-width: @screen-xs-min) and (orientation: landscape) {\n max-height: 200px;\n }\n }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n > .navbar-header,\n > .navbar-collapse {\n margin-right: -@navbar-padding-horizontal;\n margin-left: -@navbar-padding-horizontal;\n\n @media (min-width: @grid-float-breakpoint) {\n margin-right: 0;\n margin-left: 0;\n }\n }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n z-index: @zindex-navbar;\n border-width: 0 0 1px;\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: @zindex-navbar-fixed;\n\n // Undo the rounded corners\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0; // override .navbar defaults\n border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n float: left;\n padding: @navbar-padding-vertical @navbar-padding-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-computed;\n height: @navbar-height;\n\n &:hover,\n &:focus {\n text-decoration: none;\n }\n\n > img {\n display: block;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n .navbar > .container &,\n .navbar > .container-fluid & {\n margin-left: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: @navbar-padding-horizontal;\n padding: 9px 10px;\n .navbar-vertical-align(34px);\n background-color: transparent;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n border-radius: @border-radius-base;\n\n // We remove the `outline` here, but later compensate by attaching `:hover`\n // styles to `:focus`.\n &:focus {\n outline: 0;\n }\n\n // Bars\n .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n }\n .icon-bar + .icon-bar {\n margin-top: 4px;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n display: none;\n }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: @line-height-computed;\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n > li > a,\n .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n > li > a {\n line-height: @line-height-computed;\n &:hover,\n &:focus {\n background-image: none;\n }\n }\n }\n }\n\n // Uncollapse the nav\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin: 0;\n\n > li {\n float: left;\n > a {\n padding-top: @navbar-padding-vertical;\n padding-bottom: @navbar-padding-vertical;\n }\n }\n }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n margin-left: -@navbar-padding-horizontal;\n margin-right: -@navbar-padding-horizontal;\n padding: 10px @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n\n // Mixin behavior for optimum display\n .form-inline();\n\n .form-group {\n @media (max-width: @grid-float-breakpoint-max) {\n margin-bottom: 5px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n }\n\n // Vertically center in expanded, horizontal navbar\n .navbar-vertical-align(@input-height-base);\n\n // Undo 100% width for pull classes\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n .box-shadow(none);\n }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n .border-top-radius(@navbar-border-radius);\n .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n .navbar-vertical-align(@input-height-base);\n\n &.btn-sm {\n .navbar-vertical-align(@input-height-small);\n }\n &.btn-xs {\n .navbar-vertical-align(22);\n }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n .navbar-vertical-align(@line-height-computed);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin-left: @navbar-padding-horizontal;\n margin-right: @navbar-padding-horizontal;\n }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n//\n// Declared after the navbar components to ensure more specificity on the margins.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-left { .pull-left(); }\n .navbar-right {\n .pull-right();\n margin-right: -@navbar-padding-horizontal;\n\n ~ .navbar-right {\n margin-right: 0;\n }\n }\n}\n\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n background-color: @navbar-default-bg;\n border-color: @navbar-default-border;\n\n .navbar-brand {\n color: @navbar-default-brand-color;\n &:hover,\n &:focus {\n color: @navbar-default-brand-hover-color;\n background-color: @navbar-default-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-default-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-default-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n\n .navbar-toggle {\n border-color: @navbar-default-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-default-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-default-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: @navbar-default-border;\n }\n\n // Dropdown menu items\n .navbar-nav {\n // Remove background color from open dropdown\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-default-link-active-bg;\n color: @navbar-default-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n > li > a {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n }\n }\n\n\n // Links in navbars\n //\n // Add a class to ensure links outside the navbar nav are colored correctly.\n\n .navbar-link {\n color: @navbar-default-link-color;\n &:hover {\n color: @navbar-default-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n }\n }\n }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n background-color: @navbar-inverse-bg;\n border-color: @navbar-inverse-border;\n\n .navbar-brand {\n color: @navbar-inverse-brand-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-brand-hover-color;\n background-color: @navbar-inverse-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-inverse-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-inverse-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n\n // Darken the responsive nav toggle\n .navbar-toggle {\n border-color: @navbar-inverse-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-inverse-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-inverse-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: darken(@navbar-inverse-bg, 7%);\n }\n\n // Dropdowns\n .navbar-nav {\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-inverse-link-active-bg;\n color: @navbar-inverse-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display\n .open .dropdown-menu {\n > .dropdown-header {\n border-color: @navbar-inverse-border;\n }\n .divider {\n background-color: @navbar-inverse-border;\n }\n > li > a {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n }\n }\n\n .navbar-link {\n color: @navbar-inverse-link-color;\n &:hover {\n color: @navbar-inverse-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n }\n }\n }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n.navbar-vertical-align(@element-height) {\n margin-top: ((@navbar-height - @element-height) / 2);\n margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n .clearfix();\n}\n.center-block {\n .center-block();\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n display: none !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n position: fixed;\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n margin-bottom: @line-height-computed;\n list-style: none;\n background-color: @breadcrumb-bg;\n border-radius: @border-radius-base;\n\n > li {\n display: inline-block;\n\n + li:before {\n content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n padding: 0 5px;\n color: @breadcrumb-color;\n }\n }\n\n > .active {\n color: @breadcrumb-active-color;\n }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: @line-height-computed 0;\n border-radius: @border-radius-base;\n\n > li {\n display: inline; // Remove list-style and block-level defaults\n > a,\n > span {\n position: relative;\n float: left; // Collapse white-space\n padding: @padding-base-vertical @padding-base-horizontal;\n line-height: @line-height-base;\n text-decoration: none;\n color: @pagination-color;\n background-color: @pagination-bg;\n border: 1px solid @pagination-border;\n margin-left: -1px;\n }\n &:first-child {\n > a,\n > span {\n margin-left: 0;\n .border-left-radius(@border-radius-base);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius-base);\n }\n }\n }\n\n > li > a,\n > li > span {\n &:hover,\n &:focus {\n z-index: 3;\n color: @pagination-hover-color;\n background-color: @pagination-hover-bg;\n border-color: @pagination-hover-border;\n }\n }\n\n > .active > a,\n > .active > span {\n &,\n &:hover,\n &:focus {\n z-index: 2;\n color: @pagination-active-color;\n background-color: @pagination-active-bg;\n border-color: @pagination-active-border;\n cursor: default;\n }\n }\n\n > .disabled {\n > span,\n > span:hover,\n > span:focus,\n > a,\n > a:hover,\n > a:focus {\n color: @pagination-disabled-color;\n background-color: @pagination-disabled-bg;\n border-color: @pagination-disabled-border;\n cursor: @cursor-disabled;\n }\n }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n","// Pagination\n\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n > li {\n > a,\n > span {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n }\n &:first-child {\n > a,\n > span {\n .border-left-radius(@border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius);\n }\n }\n }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n padding-left: 0;\n margin: @line-height-computed 0;\n list-style: none;\n text-align: center;\n &:extend(.clearfix all);\n li {\n display: inline;\n > a,\n > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: @pager-bg;\n border: 1px solid @pager-border;\n border-radius: @pager-border-radius;\n }\n\n > a:hover,\n > a:focus {\n text-decoration: none;\n background-color: @pager-hover-bg;\n }\n }\n\n .next {\n > a,\n > span {\n float: right;\n }\n }\n\n .previous {\n > a,\n > span {\n float: left;\n }\n }\n\n .disabled {\n > a,\n > a:hover,\n > a:focus,\n > span {\n color: @pager-disabled-color;\n background-color: @pager-bg;\n cursor: @cursor-disabled;\n }\n }\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: @label-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n\n // Add hover effects, but only for links\n a& {\n &:hover,\n &:focus {\n color: @label-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Empty labels collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for labels in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n .label-variant(@label-default-bg);\n}\n\n.label-primary {\n .label-variant(@label-primary-bg);\n}\n\n.label-success {\n .label-variant(@label-success-bg);\n}\n\n.label-info {\n .label-variant(@label-info-bg);\n}\n\n.label-warning {\n .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n .label-variant(@label-danger-bg);\n}\n","// Labels\n\n.label-variant(@color) {\n background-color: @color;\n\n &[href] {\n &:hover,\n &:focus {\n background-color: darken(@color, 10%);\n }\n }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: @font-size-small;\n font-weight: @badge-font-weight;\n color: @badge-color;\n line-height: @badge-line-height;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: @badge-bg;\n border-radius: @badge-border-radius;\n\n // Empty badges collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for badges in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n\n .btn-xs &,\n .btn-group-xs > .btn & {\n top: 0;\n padding: 1px 5px;\n }\n\n // Hover state, but only for links\n a& {\n &:hover,\n &:focus {\n color: @badge-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Account for badges in navs\n .list-group-item.active > &,\n .nav-pills > .active > a > & {\n color: @badge-active-color;\n background-color: @badge-active-bg;\n }\n\n .list-group-item > & {\n float: right;\n }\n\n .list-group-item > & + & {\n margin-right: 5px;\n }\n\n .nav-pills > li > a > & {\n margin-left: 3px;\n }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n padding-top: @jumbotron-padding;\n padding-bottom: @jumbotron-padding;\n margin-bottom: @jumbotron-padding;\n color: @jumbotron-color;\n background-color: @jumbotron-bg;\n\n h1,\n .h1 {\n color: @jumbotron-heading-color;\n }\n\n p {\n margin-bottom: (@jumbotron-padding / 2);\n font-size: @jumbotron-font-size;\n font-weight: 200;\n }\n\n > hr {\n border-top-color: darken(@jumbotron-bg, 10%);\n }\n\n .container &,\n .container-fluid & {\n border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n }\n\n .container {\n max-width: 100%;\n }\n\n @media screen and (min-width: @screen-sm-min) {\n padding-top: (@jumbotron-padding * 1.6);\n padding-bottom: (@jumbotron-padding * 1.6);\n\n .container &,\n .container-fluid & {\n padding-left: (@jumbotron-padding * 2);\n padding-right: (@jumbotron-padding * 2);\n }\n\n h1,\n .h1 {\n font-size: @jumbotron-heading-font-size;\n }\n }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n display: block;\n padding: @thumbnail-padding;\n margin-bottom: @line-height-computed;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(border .2s ease-in-out);\n\n > img,\n a > img {\n &:extend(.img-responsive);\n margin-left: auto;\n margin-right: auto;\n }\n\n // Add a hover state for linked versions only\n a&:hover,\n a&:focus,\n a&.active {\n border-color: @link-color;\n }\n\n // Image captions\n .caption {\n padding: @thumbnail-caption-padding;\n color: @thumbnail-caption-color;\n }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n padding: @alert-padding;\n margin-bottom: @line-height-computed;\n border: 1px solid transparent;\n border-radius: @alert-border-radius;\n\n // Headings for larger alerts\n h4 {\n margin-top: 0;\n // Specified for the h4 to prevent conflicts of changing @headings-color\n color: inherit;\n }\n\n // Provide class for links that match alerts\n .alert-link {\n font-weight: @alert-link-font-weight;\n }\n\n // Improve alignment and spacing of inner content\n > p,\n > ul {\n margin-bottom: 0;\n }\n\n > p + p {\n margin-top: 5px;\n }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n padding-right: (@alert-padding + 20);\n\n // Adjust close link position\n .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n\n.alert-info {\n .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n\n.alert-warning {\n .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n\n.alert-danger {\n .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","// Alerts\n\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;\n color: @text-color;\n\n hr {\n border-top-color: darken(@border, 5%);\n }\n .alert-link {\n color: darken(@text-color, 10%);\n }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n overflow: hidden;\n height: @line-height-computed;\n margin-bottom: @line-height-computed;\n background-color: @progress-bg;\n border-radius: @progress-border-radius;\n .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: @font-size-small;\n line-height: @line-height-computed;\n color: @progress-bar-color;\n text-align: center;\n background-color: @progress-bar-bg;\n .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n .transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n #gradient > .striped();\n background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n .progress-bar-variant(@progress-bar-danger-bg);\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Progress bars\n\n.progress-bar-variant(@color) {\n background-color: @color;\n\n // Deprecated parent class requirement as of v3.2.0\n .progress-striped & {\n #gradient > .striped();\n }\n}\n",".media {\n // Proper spacing between instances of .media\n margin-top: 15px;\n\n &:first-child {\n margin-top: 0;\n }\n}\n\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n\n.media-body {\n width: 10000px;\n}\n\n.media-object {\n display: block;\n\n // Fix collapse in webkit from max-width: 100% and display: table-cell.\n &.img-thumbnail {\n max-width: none;\n }\n}\n\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n\n.media-middle {\n vertical-align: middle;\n}\n\n.media-bottom {\n vertical-align: bottom;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n\n// Media list variation\n//\n// Undo default ul/ol styles\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n // No need to set list-style: none; since .list-group-item is block level\n margin-bottom: 20px;\n padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: @list-group-bg;\n border: 1px solid @list-group-border;\n\n // Round the first and last items\n &:first-child {\n .border-top-radius(@list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n .border-bottom-radius(@list-group-border-radius);\n }\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item,\nbutton.list-group-item {\n color: @list-group-link-color;\n\n .list-group-item-heading {\n color: @list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n text-decoration: none;\n color: @list-group-link-hover-color;\n background-color: @list-group-hover-bg;\n }\n}\n\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n\n.list-group-item {\n // Disabled state\n &.disabled,\n &.disabled:hover,\n &.disabled:focus {\n background-color: @list-group-disabled-bg;\n color: @list-group-disabled-color;\n cursor: @cursor-disabled;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-disabled-text-color;\n }\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: @list-group-active-color;\n background-color: @list-group-active-bg;\n border-color: @list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading,\n .list-group-item-heading > small,\n .list-group-item-heading > .small {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-active-text-color;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n","// List Groups\n\n.list-group-item-variant(@state; @background; @color) {\n .list-group-item-@{state} {\n color: @color;\n background-color: @background;\n\n a&,\n button& {\n color: @color;\n\n .list-group-item-heading {\n color: inherit;\n }\n\n &:hover,\n &:focus {\n color: @color;\n background-color: darken(@background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: @color;\n border-color: @color;\n }\n }\n }\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: @line-height-computed;\n background-color: @panel-bg;\n border: 1px solid transparent;\n border-radius: @panel-border-radius;\n .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n padding: @panel-body-padding;\n &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n padding: @panel-heading-padding;\n border-bottom: 1px solid transparent;\n .border-top-radius((@panel-border-radius - 1));\n\n > .dropdown .dropdown-toggle {\n color: inherit;\n }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: ceil((@font-size-base * 1.125));\n color: inherit;\n\n > a,\n > small,\n > .small,\n > small > a,\n > .small > a {\n color: inherit;\n }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n padding: @panel-footer-padding;\n background-color: @panel-footer-bg;\n border-top: 1px solid @panel-inner-border;\n .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n > .list-group,\n > .panel-collapse > .list-group {\n margin-bottom: 0;\n\n .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n }\n\n // Add border top radius for first one\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n .border-top-radius((@panel-border-radius - 1));\n }\n }\n\n // Add border bottom radius for last one\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n .border-bottom-radius((@panel-border-radius - 1));\n }\n }\n }\n > .panel-heading + .panel-collapse > .list-group {\n .list-group-item:first-child {\n .border-top-radius(0);\n }\n }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n .list-group-item:first-child {\n border-top-width: 0;\n }\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n > .table,\n > .table-responsive > .table,\n > .panel-collapse > .table {\n margin-bottom: 0;\n\n caption {\n padding-left: @panel-body-padding;\n padding-right: @panel-body-padding;\n }\n }\n // Add border top radius for first one\n > .table:first-child,\n > .table-responsive:first-child > .table:first-child {\n .border-top-radius((@panel-border-radius - 1));\n\n > thead:first-child,\n > tbody:first-child {\n > tr:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n border-top-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-top-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n // Add border bottom radius for last one\n > .table:last-child,\n > .table-responsive:last-child > .table:last-child {\n .border-bottom-radius((@panel-border-radius - 1));\n\n > tbody:last-child,\n > tfoot:last-child {\n > tr:last-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n border-bottom-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-bottom-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n > .panel-body + .table,\n > .panel-body + .table-responsive,\n > .table + .panel-body,\n > .table-responsive + .panel-body {\n border-top: 1px solid @table-border-color;\n }\n > .table > tbody:first-child > tr:first-child th,\n > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n }\n > .table-bordered,\n > .table-responsive > .table-bordered {\n border: 0;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n > thead,\n > tbody {\n > tr:first-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n > tbody,\n > tfoot {\n > tr:last-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n }\n > .table-responsive {\n border: 0;\n margin-bottom: 0;\n }\n}\n\n\n// Collapsable panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n margin-bottom: @line-height-computed;\n\n // Tighten up margin so it's only between panels\n .panel {\n margin-bottom: 0;\n border-radius: @panel-border-radius;\n\n + .panel {\n margin-top: 5px;\n }\n }\n\n .panel-heading {\n border-bottom: 0;\n\n + .panel-collapse > .panel-body,\n + .panel-collapse > .list-group {\n border-top: 1px solid @panel-inner-border;\n }\n }\n\n .panel-footer {\n border-top: 0;\n + .panel-collapse .panel-body {\n border-bottom: 1px solid @panel-inner-border;\n }\n }\n}\n\n\n// Contextual variations\n.panel-default {\n .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n","// Panels\n\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n border-color: @border;\n\n & > .panel-heading {\n color: @heading-text-color;\n background-color: @heading-bg-color;\n border-color: @heading-border;\n\n + .panel-collapse > .panel-body {\n border-top-color: @border;\n }\n .badge {\n color: @heading-bg-color;\n background-color: @heading-text-color;\n }\n }\n & > .panel-footer {\n + .panel-collapse > .panel-body {\n border-bottom-color: @border;\n }\n }\n}\n","// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n\n .embed-responsive-item,\n iframe,\n embed,\n object,\n video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n }\n}\n\n// Modifier class for 16:9 aspect ratio\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n\n// Modifier class for 4:3 aspect ratio\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: @well-bg;\n border: 1px solid @well-border;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0,0,0,.15);\n }\n}\n\n// Sizes\n.well-lg {\n padding: 24px;\n border-radius: @border-radius-large;\n}\n.well-sm {\n padding: 9px;\n border-radius: @border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: (@font-size-base * 1.5);\n font-weight: @close-font-weight;\n line-height: 1;\n color: @close-color;\n text-shadow: @close-text-shadow;\n .opacity(.2);\n\n &:hover,\n &:focus {\n color: @close-color;\n text-decoration: none;\n cursor: pointer;\n .opacity(.5);\n }\n\n // Additional properties for button version\n // iOS requires the button element instead of an anchor tag.\n // If you want the anchor version, it requires `href=\"#\"`.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n button& {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n }\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal;\n -webkit-overflow-scrolling: touch;\n\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n .translate(0, -25%);\n .transition-transform(~\"0.3s ease-out\");\n }\n &.in .modal-dialog { .translate(0, 0) }\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n background-color: @modal-content-bg;\n border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n border: 1px solid @modal-content-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 3px 9px rgba(0,0,0,.5));\n background-clip: padding-box;\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal-background;\n background-color: @modal-backdrop-bg;\n // Fade for backdrop\n &.fade { .opacity(0); }\n &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n padding: @modal-title-padding;\n border-bottom: 1px solid @modal-header-border-color;\n min-height: (@modal-title-padding + @modal-title-line-height);\n}\n// Close icon\n.modal-header .close {\n margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n margin: 0;\n line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n padding: @modal-inner-padding;\n text-align: right; // right align buttons\n border-top: 1px solid @modal-footer-border-color;\n &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n // Properly space out buttons\n .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n }\n // but override that for button groups\n .btn-group .btn + .btn {\n margin-left: -1px;\n }\n // and override it for block buttons as well\n .btn-block + .btn-block {\n margin-left: 0;\n }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n width: @modal-md;\n margin: 30px auto;\n }\n .modal-content {\n .box-shadow(0 5px 15px rgba(0,0,0,.5));\n }\n\n // Modal sizes\n .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n .modal-lg { width: @modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n z-index: @zindex-tooltip;\n display: block;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n .reset-text();\n font-size: @font-size-small;\n\n .opacity(0);\n\n &.in { .opacity(@tooltip-opacity); }\n &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; }\n &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; }\n &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; }\n &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: @tooltip-max-width;\n padding: 3px 8px;\n color: @tooltip-color;\n text-align: center;\n background-color: @tooltip-bg;\n border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1\n.tooltip {\n &.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-left .tooltip-arrow {\n bottom: 0;\n right: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-right .tooltip-arrow {\n bottom: 0;\n left: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n border-right-color: @tooltip-arrow-color;\n }\n &.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-left-color: @tooltip-arrow-color;\n }\n &.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-left .tooltip-arrow {\n top: 0;\n right: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-right .tooltip-arrow {\n top: 0;\n left: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n}\n",".reset-text() {\n font-family: @font-family-base;\n // We deliberately do NOT reset font-size.\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: @line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: @zindex-popover;\n display: none;\n max-width: @popover-max-width;\n padding: 1px;\n // Our parent element can be arbitrary since popovers are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n .reset-text();\n font-size: @font-size-base;\n\n background-color: @popover-bg;\n background-clip: padding-box;\n border: 1px solid @popover-fallback-border-color;\n border: 1px solid @popover-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n // Offset the popover to account for the popover arrow\n &.top { margin-top: -@popover-arrow-width; }\n &.right { margin-left: @popover-arrow-width; }\n &.bottom { margin-top: @popover-arrow-width; }\n &.left { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n margin: 0; // reset heading margin\n padding: 8px 14px;\n font-size: @font-size-base;\n background-color: @popover-title-bg;\n border-bottom: 1px solid darken(@popover-title-bg, 5%);\n border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n &,\n &:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n }\n}\n.popover > .arrow {\n border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n border-width: @popover-arrow-width;\n content: \"\";\n}\n\n.popover {\n &.top > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-top-color: @popover-arrow-outer-color;\n bottom: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n bottom: 1px;\n margin-left: -@popover-arrow-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-color;\n }\n }\n &.right > .arrow {\n top: 50%;\n left: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-right-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n left: 1px;\n bottom: -@popover-arrow-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-color;\n }\n }\n &.bottom > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-bottom-color: @popover-arrow-outer-color;\n top: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n top: 1px;\n margin-left: -@popover-arrow-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-color;\n }\n }\n\n &.left > .arrow {\n top: 50%;\n right: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-right-width: 0;\n border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-left-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: @popover-arrow-color;\n bottom: -@popover-arrow-width;\n }\n }\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n\n > .item {\n display: none;\n position: relative;\n .transition(.6s ease-in-out left);\n\n // Account for jankitude on images\n > img,\n > a > img {\n &:extend(.img-responsive);\n line-height: 1;\n }\n\n // WebKit CSS3 transforms for supported devices\n @media all and (transform-3d), (-webkit-transform-3d) {\n .transition-transform(~'0.6s ease-in-out');\n .backface-visibility(~'hidden');\n .perspective(1000px);\n\n &.next,\n &.active.right {\n .translate3d(100%, 0, 0);\n left: 0;\n }\n &.prev,\n &.active.left {\n .translate3d(-100%, 0, 0);\n left: 0;\n }\n &.next.left,\n &.prev.right,\n &.active {\n .translate3d(0, 0, 0);\n left: 0;\n }\n }\n }\n\n > .active,\n > .next,\n > .prev {\n display: block;\n }\n\n > .active {\n left: 0;\n }\n\n > .next,\n > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n }\n\n > .next {\n left: 100%;\n }\n > .prev {\n left: -100%;\n }\n > .next.left,\n > .prev.right {\n left: 0;\n }\n\n > .active.left {\n left: -100%;\n }\n > .active.right {\n left: 100%;\n }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: @carousel-control-width;\n .opacity(@carousel-control-opacity);\n font-size: @carousel-control-font-size;\n color: @carousel-control-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n // We can't have this transition here because WebKit cancels the carousel\n // animation if you trip this while in the middle of another animation.\n\n // Set gradients for backgrounds\n &.left {\n #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n }\n &.right {\n left: auto;\n right: 0;\n #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n }\n\n // Hover/focus state\n &:hover,\n &:focus {\n outline: 0;\n color: @carousel-control-color;\n text-decoration: none;\n .opacity(.9);\n }\n\n // Toggles\n .icon-prev,\n .icon-next,\n .glyphicon-chevron-left,\n .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n }\n .icon-prev,\n .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n }\n .icon-next,\n .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n }\n .icon-prev,\n .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n }\n\n\n .icon-prev {\n &:before {\n content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n }\n }\n .icon-next {\n &:before {\n content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n }\n }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n\n li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid @carousel-indicator-border-color;\n border-radius: 10px;\n cursor: pointer;\n\n // IE8-9 hack for event handling\n //\n // Internet Explorer 8-9 does not support clicks on elements without a set\n // `background-color`. We cannot use `filter` since that's not viewed as a\n // background color by the browser. Thus, a hack is needed.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer\n //\n // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n // set alpha transparency for the best results possible.\n background-color: #000 \\9; // IE8\n background-color: rgba(0,0,0,0); // IE9\n }\n .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: @carousel-indicator-active-bg;\n }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: @carousel-caption-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n & .btn {\n text-shadow: none; // No shadow for button elements in carousel-caption\n }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n // Scale up the controls a smidge\n .carousel-control {\n .glyphicon-chevron-left,\n .glyphicon-chevron-right,\n .icon-prev,\n .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -15px;\n font-size: 30px;\n }\n .glyphicon-chevron-left,\n .icon-prev {\n margin-left: -15px;\n }\n .glyphicon-chevron-right,\n .icon-next {\n margin-right: -15px;\n }\n }\n\n // Show and left align the captions\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n\n // Move up the indicators\n .carousel-indicators {\n bottom: 20px;\n }\n}\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n &:before,\n &:after {\n content: \" \"; // 1\n display: table; // 2\n }\n &:after {\n clear: both;\n }\n}\n","// Center-align a block level element\n\n.center-block() {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n","// CSS image replacement\n//\n// Heads up! v3 launched with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (will be removed in v4)\n.hide-text() {\n font: ~\"0/0\" a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n// New mixin to use as of v3.0.1\n.text-hide() {\n .hide-text();\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n width: device-width;\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n .responsive-invisibility();\n}\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n\n.visible-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-visibility();\n }\n}\n.visible-xs-block {\n @media (max-width: @screen-xs-max) {\n display: block !important;\n }\n}\n.visible-xs-inline {\n @media (max-width: @screen-xs-max) {\n display: inline !important;\n }\n}\n.visible-xs-inline-block {\n @media (max-width: @screen-xs-max) {\n display: inline-block !important;\n }\n}\n\n.visible-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-visibility();\n }\n}\n.visible-sm-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: block !important;\n }\n}\n.visible-sm-inline {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline !important;\n }\n}\n.visible-sm-inline-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline-block !important;\n }\n}\n\n.visible-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-visibility();\n }\n}\n.visible-md-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: block !important;\n }\n}\n.visible-md-inline {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline !important;\n }\n}\n.visible-md-inline-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline-block !important;\n }\n}\n\n.visible-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-visibility();\n }\n}\n.visible-lg-block {\n @media (min-width: @screen-lg-min) {\n display: block !important;\n }\n}\n.visible-lg-inline {\n @media (min-width: @screen-lg-min) {\n display: inline !important;\n }\n}\n.visible-lg-inline-block {\n @media (min-width: @screen-lg-min) {\n display: inline-block !important;\n }\n}\n\n.hidden-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-invisibility();\n }\n}\n.hidden-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-invisibility();\n }\n}\n.hidden-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-invisibility();\n }\n}\n.hidden-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-invisibility();\n }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n.visible-print {\n .responsive-invisibility();\n\n @media print {\n .responsive-visibility();\n }\n}\n.visible-print-block {\n display: none !important;\n\n @media print {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n\n @media print {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n\n @media print {\n display: inline-block !important;\n }\n}\n\n.hidden-print {\n @media print {\n .responsive-invisibility();\n }\n}\n","// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n display: block !important;\n table& { display: table !important; }\n tr& { display: table-row !important; }\n th&,\n td& { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n display: none !important;\n}\n"]} \ No newline at end of file diff --git a/flask_admin/static/bootstrap/bootstrap3/css/bootstrap.min.css b/flask_admin/static/bootstrap/bootstrap3/css/bootstrap.min.css deleted file mode 100644 index d65c66b1b..000000000 --- a/flask_admin/static/bootstrap/bootstrap3/css/bootstrap.min.css +++ /dev/null @@ -1,5 +0,0 @@ -/*! - * Bootstrap v3.3.5 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.33px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:3;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file diff --git a/flask_admin/static/bootstrap/bootstrap3/js/bootstrap.js b/flask_admin/static/bootstrap/bootstrap3/js/bootstrap.js deleted file mode 100644 index 5debfd7de..000000000 --- a/flask_admin/static/bootstrap/bootstrap3/js/bootstrap.js +++ /dev/null @@ -1,2363 +0,0 @@ -/*! - * Bootstrap v3.3.5 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under the MIT license - */ - -if (typeof jQuery === 'undefined') { - throw new Error('Bootstrap\'s JavaScript requires jQuery') -} - -+function ($) { - 'use strict'; - var version = $.fn.jquery.split(' ')[0].split('.') - if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1)) { - throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher') - } -}(jQuery); - -/* ======================================================================== - * Bootstrap: transition.js v3.3.5 - * http://getbootstrap.com/javascript/#transitions - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) - // ============================================================ - - function transitionEnd() { - var el = document.createElement('bootstrap') - - var transEndEventNames = { - WebkitTransition : 'webkitTransitionEnd', - MozTransition : 'transitionend', - OTransition : 'oTransitionEnd otransitionend', - transition : 'transitionend' - } - - for (var name in transEndEventNames) { - if (el.style[name] !== undefined) { - return { end: transEndEventNames[name] } - } - } - - return false // explicit for ie8 ( ._.) - } - - // http://blog.alexmaccaw.com/css-transitions - $.fn.emulateTransitionEnd = function (duration) { - var called = false - var $el = this - $(this).one('bsTransitionEnd', function () { called = true }) - var callback = function () { if (!called) $($el).trigger($.support.transition.end) } - setTimeout(callback, duration) - return this - } - - $(function () { - $.support.transition = transitionEnd() - - if (!$.support.transition) return - - $.event.special.bsTransitionEnd = { - bindType: $.support.transition.end, - delegateType: $.support.transition.end, - handle: function (e) { - if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) - } - } - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: alert.js v3.3.5 - * http://getbootstrap.com/javascript/#alerts - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // ALERT CLASS DEFINITION - // ====================== - - var dismiss = '[data-dismiss="alert"]' - var Alert = function (el) { - $(el).on('click', dismiss, this.close) - } - - Alert.VERSION = '3.3.5' - - Alert.TRANSITION_DURATION = 150 - - Alert.prototype.close = function (e) { - var $this = $(this) - var selector = $this.attr('data-target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 - } - - var $parent = $(selector) - - if (e) e.preventDefault() - - if (!$parent.length) { - $parent = $this.closest('.alert') - } - - $parent.trigger(e = $.Event('close.bs.alert')) - - if (e.isDefaultPrevented()) return - - $parent.removeClass('in') - - function removeElement() { - // detach from parent, fire event then clean up data - $parent.detach().trigger('closed.bs.alert').remove() - } - - $.support.transition && $parent.hasClass('fade') ? - $parent - .one('bsTransitionEnd', removeElement) - .emulateTransitionEnd(Alert.TRANSITION_DURATION) : - removeElement() - } - - - // ALERT PLUGIN DEFINITION - // ======================= - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.alert') - - if (!data) $this.data('bs.alert', (data = new Alert(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - var old = $.fn.alert - - $.fn.alert = Plugin - $.fn.alert.Constructor = Alert - - - // ALERT NO CONFLICT - // ================= - - $.fn.alert.noConflict = function () { - $.fn.alert = old - return this - } - - - // ALERT DATA-API - // ============== - - $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: button.js v3.3.5 - * http://getbootstrap.com/javascript/#buttons - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // BUTTON PUBLIC CLASS DEFINITION - // ============================== - - var Button = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, Button.DEFAULTS, options) - this.isLoading = false - } - - Button.VERSION = '3.3.5' - - Button.DEFAULTS = { - loadingText: 'loading...' - } - - Button.prototype.setState = function (state) { - var d = 'disabled' - var $el = this.$element - var val = $el.is('input') ? 'val' : 'html' - var data = $el.data() - - state += 'Text' - - if (data.resetText == null) $el.data('resetText', $el[val]()) - - // push to event loop to allow forms to submit - setTimeout($.proxy(function () { - $el[val](data[state] == null ? this.options[state] : data[state]) - - if (state == 'loadingText') { - this.isLoading = true - $el.addClass(d).attr(d, d) - } else if (this.isLoading) { - this.isLoading = false - $el.removeClass(d).removeAttr(d) - } - }, this), 0) - } - - Button.prototype.toggle = function () { - var changed = true - var $parent = this.$element.closest('[data-toggle="buttons"]') - - if ($parent.length) { - var $input = this.$element.find('input') - if ($input.prop('type') == 'radio') { - if ($input.prop('checked')) changed = false - $parent.find('.active').removeClass('active') - this.$element.addClass('active') - } else if ($input.prop('type') == 'checkbox') { - if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false - this.$element.toggleClass('active') - } - $input.prop('checked', this.$element.hasClass('active')) - if (changed) $input.trigger('change') - } else { - this.$element.attr('aria-pressed', !this.$element.hasClass('active')) - this.$element.toggleClass('active') - } - } - - - // BUTTON PLUGIN DEFINITION - // ======================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.button') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.button', (data = new Button(this, options))) - - if (option == 'toggle') data.toggle() - else if (option) data.setState(option) - }) - } - - var old = $.fn.button - - $.fn.button = Plugin - $.fn.button.Constructor = Button - - - // BUTTON NO CONFLICT - // ================== - - $.fn.button.noConflict = function () { - $.fn.button = old - return this - } - - - // BUTTON DATA-API - // =============== - - $(document) - .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { - var $btn = $(e.target) - if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') - Plugin.call($btn, 'toggle') - if (!($(e.target).is('input[type="radio"]') || $(e.target).is('input[type="checkbox"]'))) e.preventDefault() - }) - .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { - $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type)) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: carousel.js v3.3.5 - * http://getbootstrap.com/javascript/#carousel - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // CAROUSEL CLASS DEFINITION - // ========================= - - var Carousel = function (element, options) { - this.$element = $(element) - this.$indicators = this.$element.find('.carousel-indicators') - this.options = options - this.paused = null - this.sliding = null - this.interval = null - this.$active = null - this.$items = null - - this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) - - this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element - .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) - .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) - } - - Carousel.VERSION = '3.3.5' - - Carousel.TRANSITION_DURATION = 600 - - Carousel.DEFAULTS = { - interval: 5000, - pause: 'hover', - wrap: true, - keyboard: true - } - - Carousel.prototype.keydown = function (e) { - if (/input|textarea/i.test(e.target.tagName)) return - switch (e.which) { - case 37: this.prev(); break - case 39: this.next(); break - default: return - } - - e.preventDefault() - } - - Carousel.prototype.cycle = function (e) { - e || (this.paused = false) - - this.interval && clearInterval(this.interval) - - this.options.interval - && !this.paused - && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) - - return this - } - - Carousel.prototype.getItemIndex = function (item) { - this.$items = item.parent().children('.item') - return this.$items.index(item || this.$active) - } - - Carousel.prototype.getItemForDirection = function (direction, active) { - var activeIndex = this.getItemIndex(active) - var willWrap = (direction == 'prev' && activeIndex === 0) - || (direction == 'next' && activeIndex == (this.$items.length - 1)) - if (willWrap && !this.options.wrap) return active - var delta = direction == 'prev' ? -1 : 1 - var itemIndex = (activeIndex + delta) % this.$items.length - return this.$items.eq(itemIndex) - } - - Carousel.prototype.to = function (pos) { - var that = this - var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) - - if (pos > (this.$items.length - 1) || pos < 0) return - - if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" - if (activeIndex == pos) return this.pause().cycle() - - return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) - } - - Carousel.prototype.pause = function (e) { - e || (this.paused = true) - - if (this.$element.find('.next, .prev').length && $.support.transition) { - this.$element.trigger($.support.transition.end) - this.cycle(true) - } - - this.interval = clearInterval(this.interval) - - return this - } - - Carousel.prototype.next = function () { - if (this.sliding) return - return this.slide('next') - } - - Carousel.prototype.prev = function () { - if (this.sliding) return - return this.slide('prev') - } - - Carousel.prototype.slide = function (type, next) { - var $active = this.$element.find('.item.active') - var $next = next || this.getItemForDirection(type, $active) - var isCycling = this.interval - var direction = type == 'next' ? 'left' : 'right' - var that = this - - if ($next.hasClass('active')) return (this.sliding = false) - - var relatedTarget = $next[0] - var slideEvent = $.Event('slide.bs.carousel', { - relatedTarget: relatedTarget, - direction: direction - }) - this.$element.trigger(slideEvent) - if (slideEvent.isDefaultPrevented()) return - - this.sliding = true - - isCycling && this.pause() - - if (this.$indicators.length) { - this.$indicators.find('.active').removeClass('active') - var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) - $nextIndicator && $nextIndicator.addClass('active') - } - - var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" - if ($.support.transition && this.$element.hasClass('slide')) { - $next.addClass(type) - $next[0].offsetWidth // force reflow - $active.addClass(direction) - $next.addClass(direction) - $active - .one('bsTransitionEnd', function () { - $next.removeClass([type, direction].join(' ')).addClass('active') - $active.removeClass(['active', direction].join(' ')) - that.sliding = false - setTimeout(function () { - that.$element.trigger(slidEvent) - }, 0) - }) - .emulateTransitionEnd(Carousel.TRANSITION_DURATION) - } else { - $active.removeClass('active') - $next.addClass('active') - this.sliding = false - this.$element.trigger(slidEvent) - } - - isCycling && this.cycle() - - return this - } - - - // CAROUSEL PLUGIN DEFINITION - // ========================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.carousel') - var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) - var action = typeof option == 'string' ? option : options.slide - - if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) - if (typeof option == 'number') data.to(option) - else if (action) data[action]() - else if (options.interval) data.pause().cycle() - }) - } - - var old = $.fn.carousel - - $.fn.carousel = Plugin - $.fn.carousel.Constructor = Carousel - - - // CAROUSEL NO CONFLICT - // ==================== - - $.fn.carousel.noConflict = function () { - $.fn.carousel = old - return this - } - - - // CAROUSEL DATA-API - // ================= - - var clickHandler = function (e) { - var href - var $this = $(this) - var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 - if (!$target.hasClass('carousel')) return - var options = $.extend({}, $target.data(), $this.data()) - var slideIndex = $this.attr('data-slide-to') - if (slideIndex) options.interval = false - - Plugin.call($target, options) - - if (slideIndex) { - $target.data('bs.carousel').to(slideIndex) - } - - e.preventDefault() - } - - $(document) - .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) - .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) - - $(window).on('load', function () { - $('[data-ride="carousel"]').each(function () { - var $carousel = $(this) - Plugin.call($carousel, $carousel.data()) - }) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: collapse.js v3.3.5 - * http://getbootstrap.com/javascript/#collapse - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // COLLAPSE PUBLIC CLASS DEFINITION - // ================================ - - var Collapse = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, Collapse.DEFAULTS, options) - this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' + - '[data-toggle="collapse"][data-target="#' + element.id + '"]') - this.transitioning = null - - if (this.options.parent) { - this.$parent = this.getParent() - } else { - this.addAriaAndCollapsedClass(this.$element, this.$trigger) - } - - if (this.options.toggle) this.toggle() - } - - Collapse.VERSION = '3.3.5' - - Collapse.TRANSITION_DURATION = 350 - - Collapse.DEFAULTS = { - toggle: true - } - - Collapse.prototype.dimension = function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } - - Collapse.prototype.show = function () { - if (this.transitioning || this.$element.hasClass('in')) return - - var activesData - var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing') - - if (actives && actives.length) { - activesData = actives.data('bs.collapse') - if (activesData && activesData.transitioning) return - } - - var startEvent = $.Event('show.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return - - if (actives && actives.length) { - Plugin.call(actives, 'hide') - activesData || actives.data('bs.collapse', null) - } - - var dimension = this.dimension() - - this.$element - .removeClass('collapse') - .addClass('collapsing')[dimension](0) - .attr('aria-expanded', true) - - this.$trigger - .removeClass('collapsed') - .attr('aria-expanded', true) - - this.transitioning = 1 - - var complete = function () { - this.$element - .removeClass('collapsing') - .addClass('collapse in')[dimension]('') - this.transitioning = 0 - this.$element - .trigger('shown.bs.collapse') - } - - if (!$.support.transition) return complete.call(this) - - var scrollSize = $.camelCase(['scroll', dimension].join('-')) - - this.$element - .one('bsTransitionEnd', $.proxy(complete, this)) - .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize]) - } - - Collapse.prototype.hide = function () { - if (this.transitioning || !this.$element.hasClass('in')) return - - var startEvent = $.Event('hide.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return - - var dimension = this.dimension() - - this.$element[dimension](this.$element[dimension]())[0].offsetHeight - - this.$element - .addClass('collapsing') - .removeClass('collapse in') - .attr('aria-expanded', false) - - this.$trigger - .addClass('collapsed') - .attr('aria-expanded', false) - - this.transitioning = 1 - - var complete = function () { - this.transitioning = 0 - this.$element - .removeClass('collapsing') - .addClass('collapse') - .trigger('hidden.bs.collapse') - } - - if (!$.support.transition) return complete.call(this) - - this.$element - [dimension](0) - .one('bsTransitionEnd', $.proxy(complete, this)) - .emulateTransitionEnd(Collapse.TRANSITION_DURATION) - } - - Collapse.prototype.toggle = function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } - - Collapse.prototype.getParent = function () { - return $(this.options.parent) - .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]') - .each($.proxy(function (i, element) { - var $element = $(element) - this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element) - }, this)) - .end() - } - - Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) { - var isOpen = $element.hasClass('in') - - $element.attr('aria-expanded', isOpen) - $trigger - .toggleClass('collapsed', !isOpen) - .attr('aria-expanded', isOpen) - } - - function getTargetFromTrigger($trigger) { - var href - var target = $trigger.attr('data-target') - || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 - - return $(target) - } - - - // COLLAPSE PLUGIN DEFINITION - // ========================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.collapse') - var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) - - if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false - if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.collapse - - $.fn.collapse = Plugin - $.fn.collapse.Constructor = Collapse - - - // COLLAPSE NO CONFLICT - // ==================== - - $.fn.collapse.noConflict = function () { - $.fn.collapse = old - return this - } - - - // COLLAPSE DATA-API - // ================= - - $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { - var $this = $(this) - - if (!$this.attr('data-target')) e.preventDefault() - - var $target = getTargetFromTrigger($this) - var data = $target.data('bs.collapse') - var option = data ? 'toggle' : $this.data() - - Plugin.call($target, option) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: dropdown.js v3.3.5 - * http://getbootstrap.com/javascript/#dropdowns - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // DROPDOWN CLASS DEFINITION - // ========================= - - var backdrop = '.dropdown-backdrop' - var toggle = '[data-toggle="dropdown"]' - var Dropdown = function (element) { - $(element).on('click.bs.dropdown', this.toggle) - } - - Dropdown.VERSION = '3.3.5' - - function getParent($this) { - var selector = $this.attr('data-target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 - } - - var $parent = selector && $(selector) - - return $parent && $parent.length ? $parent : $this.parent() - } - - function clearMenus(e) { - if (e && e.which === 3) return - $(backdrop).remove() - $(toggle).each(function () { - var $this = $(this) - var $parent = getParent($this) - var relatedTarget = { relatedTarget: this } - - if (!$parent.hasClass('open')) return - - if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return - - $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) - - if (e.isDefaultPrevented()) return - - $this.attr('aria-expanded', 'false') - $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget) - }) - } - - Dropdown.prototype.toggle = function (e) { - var $this = $(this) - - if ($this.is('.disabled, :disabled')) return - - var $parent = getParent($this) - var isActive = $parent.hasClass('open') - - clearMenus() - - if (!isActive) { - if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { - // if mobile we use a backdrop because click events don't delegate - $(document.createElement('div')) - .addClass('dropdown-backdrop') - .insertAfter($(this)) - .on('click', clearMenus) - } - - var relatedTarget = { relatedTarget: this } - $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget)) - - if (e.isDefaultPrevented()) return - - $this - .trigger('focus') - .attr('aria-expanded', 'true') - - $parent - .toggleClass('open') - .trigger('shown.bs.dropdown', relatedTarget) - } - - return false - } - - Dropdown.prototype.keydown = function (e) { - if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return - - var $this = $(this) - - e.preventDefault() - e.stopPropagation() - - if ($this.is('.disabled, :disabled')) return - - var $parent = getParent($this) - var isActive = $parent.hasClass('open') - - if (!isActive && e.which != 27 || isActive && e.which == 27) { - if (e.which == 27) $parent.find(toggle).trigger('focus') - return $this.trigger('click') - } - - var desc = ' li:not(.disabled):visible a' - var $items = $parent.find('.dropdown-menu' + desc) - - if (!$items.length) return - - var index = $items.index(e.target) - - if (e.which == 38 && index > 0) index-- // up - if (e.which == 40 && index < $items.length - 1) index++ // down - if (!~index) index = 0 - - $items.eq(index).trigger('focus') - } - - - // DROPDOWN PLUGIN DEFINITION - // ========================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.dropdown') - - if (!data) $this.data('bs.dropdown', (data = new Dropdown(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - var old = $.fn.dropdown - - $.fn.dropdown = Plugin - $.fn.dropdown.Constructor = Dropdown - - - // DROPDOWN NO CONFLICT - // ==================== - - $.fn.dropdown.noConflict = function () { - $.fn.dropdown = old - return this - } - - - // APPLY TO STANDARD DROPDOWN ELEMENTS - // =================================== - - $(document) - .on('click.bs.dropdown.data-api', clearMenus) - .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) - .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) - .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown) - .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: modal.js v3.3.5 - * http://getbootstrap.com/javascript/#modals - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // MODAL CLASS DEFINITION - // ====================== - - var Modal = function (element, options) { - this.options = options - this.$body = $(document.body) - this.$element = $(element) - this.$dialog = this.$element.find('.modal-dialog') - this.$backdrop = null - this.isShown = null - this.originalBodyPad = null - this.scrollbarWidth = 0 - this.ignoreBackdropClick = false - - if (this.options.remote) { - this.$element - .find('.modal-content') - .load(this.options.remote, $.proxy(function () { - this.$element.trigger('loaded.bs.modal') - }, this)) - } - } - - Modal.VERSION = '3.3.5' - - Modal.TRANSITION_DURATION = 300 - Modal.BACKDROP_TRANSITION_DURATION = 150 - - Modal.DEFAULTS = { - backdrop: true, - keyboard: true, - show: true - } - - Modal.prototype.toggle = function (_relatedTarget) { - return this.isShown ? this.hide() : this.show(_relatedTarget) - } - - Modal.prototype.show = function (_relatedTarget) { - var that = this - var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) - - this.$element.trigger(e) - - if (this.isShown || e.isDefaultPrevented()) return - - this.isShown = true - - this.checkScrollbar() - this.setScrollbar() - this.$body.addClass('modal-open') - - this.escape() - this.resize() - - this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) - - this.$dialog.on('mousedown.dismiss.bs.modal', function () { - that.$element.one('mouseup.dismiss.bs.modal', function (e) { - if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true - }) - }) - - this.backdrop(function () { - var transition = $.support.transition && that.$element.hasClass('fade') - - if (!that.$element.parent().length) { - that.$element.appendTo(that.$body) // don't move modals dom position - } - - that.$element - .show() - .scrollTop(0) - - that.adjustDialog() - - if (transition) { - that.$element[0].offsetWidth // force reflow - } - - that.$element.addClass('in') - - that.enforceFocus() - - var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) - - transition ? - that.$dialog // wait for modal to slide in - .one('bsTransitionEnd', function () { - that.$element.trigger('focus').trigger(e) - }) - .emulateTransitionEnd(Modal.TRANSITION_DURATION) : - that.$element.trigger('focus').trigger(e) - }) - } - - Modal.prototype.hide = function (e) { - if (e) e.preventDefault() - - e = $.Event('hide.bs.modal') - - this.$element.trigger(e) - - if (!this.isShown || e.isDefaultPrevented()) return - - this.isShown = false - - this.escape() - this.resize() - - $(document).off('focusin.bs.modal') - - this.$element - .removeClass('in') - .off('click.dismiss.bs.modal') - .off('mouseup.dismiss.bs.modal') - - this.$dialog.off('mousedown.dismiss.bs.modal') - - $.support.transition && this.$element.hasClass('fade') ? - this.$element - .one('bsTransitionEnd', $.proxy(this.hideModal, this)) - .emulateTransitionEnd(Modal.TRANSITION_DURATION) : - this.hideModal() - } - - Modal.prototype.enforceFocus = function () { - $(document) - .off('focusin.bs.modal') // guard against infinite focus loop - .on('focusin.bs.modal', $.proxy(function (e) { - if (this.$element[0] !== e.target && !this.$element.has(e.target).length) { - this.$element.trigger('focus') - } - }, this)) - } - - Modal.prototype.escape = function () { - if (this.isShown && this.options.keyboard) { - this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) { - e.which == 27 && this.hide() - }, this)) - } else if (!this.isShown) { - this.$element.off('keydown.dismiss.bs.modal') - } - } - - Modal.prototype.resize = function () { - if (this.isShown) { - $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this)) - } else { - $(window).off('resize.bs.modal') - } - } - - Modal.prototype.hideModal = function () { - var that = this - this.$element.hide() - this.backdrop(function () { - that.$body.removeClass('modal-open') - that.resetAdjustments() - that.resetScrollbar() - that.$element.trigger('hidden.bs.modal') - }) - } - - Modal.prototype.removeBackdrop = function () { - this.$backdrop && this.$backdrop.remove() - this.$backdrop = null - } - - Modal.prototype.backdrop = function (callback) { - var that = this - var animate = this.$element.hasClass('fade') ? 'fade' : '' - - if (this.isShown && this.options.backdrop) { - var doAnimate = $.support.transition && animate - - this.$backdrop = $(document.createElement('div')) - .addClass('modal-backdrop ' + animate) - .appendTo(this.$body) - - this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { - if (this.ignoreBackdropClick) { - this.ignoreBackdropClick = false - return - } - if (e.target !== e.currentTarget) return - this.options.backdrop == 'static' - ? this.$element[0].focus() - : this.hide() - }, this)) - - if (doAnimate) this.$backdrop[0].offsetWidth // force reflow - - this.$backdrop.addClass('in') - - if (!callback) return - - doAnimate ? - this.$backdrop - .one('bsTransitionEnd', callback) - .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : - callback() - - } else if (!this.isShown && this.$backdrop) { - this.$backdrop.removeClass('in') - - var callbackRemove = function () { - that.removeBackdrop() - callback && callback() - } - $.support.transition && this.$element.hasClass('fade') ? - this.$backdrop - .one('bsTransitionEnd', callbackRemove) - .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : - callbackRemove() - - } else if (callback) { - callback() - } - } - - // these following methods are used to handle overflowing modals - - Modal.prototype.handleUpdate = function () { - this.adjustDialog() - } - - Modal.prototype.adjustDialog = function () { - var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight - - this.$element.css({ - paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '', - paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : '' - }) - } - - Modal.prototype.resetAdjustments = function () { - this.$element.css({ - paddingLeft: '', - paddingRight: '' - }) - } - - Modal.prototype.checkScrollbar = function () { - var fullWindowWidth = window.innerWidth - if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8 - var documentElementRect = document.documentElement.getBoundingClientRect() - fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left) - } - this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth - this.scrollbarWidth = this.measureScrollbar() - } - - Modal.prototype.setScrollbar = function () { - var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10) - this.originalBodyPad = document.body.style.paddingRight || '' - if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth) - } - - Modal.prototype.resetScrollbar = function () { - this.$body.css('padding-right', this.originalBodyPad) - } - - Modal.prototype.measureScrollbar = function () { // thx walsh - var scrollDiv = document.createElement('div') - scrollDiv.className = 'modal-scrollbar-measure' - this.$body.append(scrollDiv) - var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth - this.$body[0].removeChild(scrollDiv) - return scrollbarWidth - } - - - // MODAL PLUGIN DEFINITION - // ======================= - - function Plugin(option, _relatedTarget) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.modal') - var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) - - if (!data) $this.data('bs.modal', (data = new Modal(this, options))) - if (typeof option == 'string') data[option](_relatedTarget) - else if (options.show) data.show(_relatedTarget) - }) - } - - var old = $.fn.modal - - $.fn.modal = Plugin - $.fn.modal.Constructor = Modal - - - // MODAL NO CONFLICT - // ================= - - $.fn.modal.noConflict = function () { - $.fn.modal = old - return this - } - - - // MODAL DATA-API - // ============== - - $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { - var $this = $(this) - var href = $this.attr('href') - var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7 - var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) - - if ($this.is('a')) e.preventDefault() - - $target.one('show.bs.modal', function (showEvent) { - if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown - $target.one('hidden.bs.modal', function () { - $this.is(':visible') && $this.trigger('focus') - }) - }) - Plugin.call($target, option, this) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: tooltip.js v3.3.5 - * http://getbootstrap.com/javascript/#tooltip - * Inspired by the original jQuery.tipsy by Jason Frame - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // TOOLTIP PUBLIC CLASS DEFINITION - // =============================== - - var Tooltip = function (element, options) { - this.type = null - this.options = null - this.enabled = null - this.timeout = null - this.hoverState = null - this.$element = null - this.inState = null - - this.init('tooltip', element, options) - } - - Tooltip.VERSION = '3.3.5' - - Tooltip.TRANSITION_DURATION = 150 - - Tooltip.DEFAULTS = { - animation: true, - placement: 'top', - selector: false, - template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>', - trigger: 'hover focus', - title: '', - delay: 0, - html: false, - container: false, - viewport: { - selector: 'body', - padding: 0 - } - } - - Tooltip.prototype.init = function (type, element, options) { - this.enabled = true - this.type = type - this.$element = $(element) - this.options = this.getOptions(options) - this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport)) - this.inState = { click: false, hover: false, focus: false } - - if (this.$element[0] instanceof document.constructor && !this.options.selector) { - throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!') - } - - var triggers = this.options.trigger.split(' ') - - for (var i = triggers.length; i--;) { - var trigger = triggers[i] - - if (trigger == 'click') { - this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) - } else if (trigger != 'manual') { - var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' - var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' - - this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) - this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) - } - } - - this.options.selector ? - (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : - this.fixTitle() - } - - Tooltip.prototype.getDefaults = function () { - return Tooltip.DEFAULTS - } - - Tooltip.prototype.getOptions = function (options) { - options = $.extend({}, this.getDefaults(), this.$element.data(), options) - - if (options.delay && typeof options.delay == 'number') { - options.delay = { - show: options.delay, - hide: options.delay - } - } - - return options - } - - Tooltip.prototype.getDelegateOptions = function () { - var options = {} - var defaults = this.getDefaults() - - this._options && $.each(this._options, function (key, value) { - if (defaults[key] != value) options[key] = value - }) - - return options - } - - Tooltip.prototype.enter = function (obj) { - var self = obj instanceof this.constructor ? - obj : $(obj.currentTarget).data('bs.' + this.type) - - if (!self) { - self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) - $(obj.currentTarget).data('bs.' + this.type, self) - } - - if (obj instanceof $.Event) { - self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true - } - - if (self.tip().hasClass('in') || self.hoverState == 'in') { - self.hoverState = 'in' - return - } - - clearTimeout(self.timeout) - - self.hoverState = 'in' - - if (!self.options.delay || !self.options.delay.show) return self.show() - - self.timeout = setTimeout(function () { - if (self.hoverState == 'in') self.show() - }, self.options.delay.show) - } - - Tooltip.prototype.isInStateTrue = function () { - for (var key in this.inState) { - if (this.inState[key]) return true - } - - return false - } - - Tooltip.prototype.leave = function (obj) { - var self = obj instanceof this.constructor ? - obj : $(obj.currentTarget).data('bs.' + this.type) - - if (!self) { - self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) - $(obj.currentTarget).data('bs.' + this.type, self) - } - - if (obj instanceof $.Event) { - self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false - } - - if (self.isInStateTrue()) return - - clearTimeout(self.timeout) - - self.hoverState = 'out' - - if (!self.options.delay || !self.options.delay.hide) return self.hide() - - self.timeout = setTimeout(function () { - if (self.hoverState == 'out') self.hide() - }, self.options.delay.hide) - } - - Tooltip.prototype.show = function () { - var e = $.Event('show.bs.' + this.type) - - if (this.hasContent() && this.enabled) { - this.$element.trigger(e) - - var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]) - if (e.isDefaultPrevented() || !inDom) return - var that = this - - var $tip = this.tip() - - var tipId = this.getUID(this.type) - - this.setContent() - $tip.attr('id', tipId) - this.$element.attr('aria-describedby', tipId) - - if (this.options.animation) $tip.addClass('fade') - - var placement = typeof this.options.placement == 'function' ? - this.options.placement.call(this, $tip[0], this.$element[0]) : - this.options.placement - - var autoToken = /\s?auto?\s?/i - var autoPlace = autoToken.test(placement) - if (autoPlace) placement = placement.replace(autoToken, '') || 'top' - - $tip - .detach() - .css({ top: 0, left: 0, display: 'block' }) - .addClass(placement) - .data('bs.' + this.type, this) - - this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) - this.$element.trigger('inserted.bs.' + this.type) - - var pos = this.getPosition() - var actualWidth = $tip[0].offsetWidth - var actualHeight = $tip[0].offsetHeight - - if (autoPlace) { - var orgPlacement = placement - var viewportDim = this.getPosition(this.$viewport) - - placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' : - placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' : - placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' : - placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' : - placement - - $tip - .removeClass(orgPlacement) - .addClass(placement) - } - - var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) - - this.applyPlacement(calculatedOffset, placement) - - var complete = function () { - var prevHoverState = that.hoverState - that.$element.trigger('shown.bs.' + that.type) - that.hoverState = null - - if (prevHoverState == 'out') that.leave(that) - } - - $.support.transition && this.$tip.hasClass('fade') ? - $tip - .one('bsTransitionEnd', complete) - .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : - complete() - } - } - - Tooltip.prototype.applyPlacement = function (offset, placement) { - var $tip = this.tip() - var width = $tip[0].offsetWidth - var height = $tip[0].offsetHeight - - // manually read margins because getBoundingClientRect includes difference - var marginTop = parseInt($tip.css('margin-top'), 10) - var marginLeft = parseInt($tip.css('margin-left'), 10) - - // we must check for NaN for ie 8/9 - if (isNaN(marginTop)) marginTop = 0 - if (isNaN(marginLeft)) marginLeft = 0 - - offset.top += marginTop - offset.left += marginLeft - - // $.fn.offset doesn't round pixel values - // so we use setOffset directly with our own function B-0 - $.offset.setOffset($tip[0], $.extend({ - using: function (props) { - $tip.css({ - top: Math.round(props.top), - left: Math.round(props.left) - }) - } - }, offset), 0) - - $tip.addClass('in') - - // check to see if placing tip in new offset caused the tip to resize itself - var actualWidth = $tip[0].offsetWidth - var actualHeight = $tip[0].offsetHeight - - if (placement == 'top' && actualHeight != height) { - offset.top = offset.top + height - actualHeight - } - - var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight) - - if (delta.left) offset.left += delta.left - else offset.top += delta.top - - var isVertical = /top|bottom/.test(placement) - var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight - var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight' - - $tip.offset(offset) - this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical) - } - - Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) { - this.arrow() - .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%') - .css(isVertical ? 'top' : 'left', '') - } - - Tooltip.prototype.setContent = function () { - var $tip = this.tip() - var title = this.getTitle() - - $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) - $tip.removeClass('fade in top bottom left right') - } - - Tooltip.prototype.hide = function (callback) { - var that = this - var $tip = $(this.$tip) - var e = $.Event('hide.bs.' + this.type) - - function complete() { - if (that.hoverState != 'in') $tip.detach() - that.$element - .removeAttr('aria-describedby') - .trigger('hidden.bs.' + that.type) - callback && callback() - } - - this.$element.trigger(e) - - if (e.isDefaultPrevented()) return - - $tip.removeClass('in') - - $.support.transition && $tip.hasClass('fade') ? - $tip - .one('bsTransitionEnd', complete) - .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : - complete() - - this.hoverState = null - - return this - } - - Tooltip.prototype.fixTitle = function () { - var $e = this.$element - if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') { - $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') - } - } - - Tooltip.prototype.hasContent = function () { - return this.getTitle() - } - - Tooltip.prototype.getPosition = function ($element) { - $element = $element || this.$element - - var el = $element[0] - var isBody = el.tagName == 'BODY' - - var elRect = el.getBoundingClientRect() - if (elRect.width == null) { - // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093 - elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top }) - } - var elOffset = isBody ? { top: 0, left: 0 } : $element.offset() - var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() } - var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null - - return $.extend({}, elRect, scroll, outerDims, elOffset) - } - - Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { - return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : - placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : - placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : - /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } - - } - - Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) { - var delta = { top: 0, left: 0 } - if (!this.$viewport) return delta - - var viewportPadding = this.options.viewport && this.options.viewport.padding || 0 - var viewportDimensions = this.getPosition(this.$viewport) - - if (/right|left/.test(placement)) { - var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll - var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight - if (topEdgeOffset < viewportDimensions.top) { // top overflow - delta.top = viewportDimensions.top - topEdgeOffset - } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow - delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset - } - } else { - var leftEdgeOffset = pos.left - viewportPadding - var rightEdgeOffset = pos.left + viewportPadding + actualWidth - if (leftEdgeOffset < viewportDimensions.left) { // left overflow - delta.left = viewportDimensions.left - leftEdgeOffset - } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow - delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset - } - } - - return delta - } - - Tooltip.prototype.getTitle = function () { - var title - var $e = this.$element - var o = this.options - - title = $e.attr('data-original-title') - || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) - - return title - } - - Tooltip.prototype.getUID = function (prefix) { - do prefix += ~~(Math.random() * 1000000) - while (document.getElementById(prefix)) - return prefix - } - - Tooltip.prototype.tip = function () { - if (!this.$tip) { - this.$tip = $(this.options.template) - if (this.$tip.length != 1) { - throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!') - } - } - return this.$tip - } - - Tooltip.prototype.arrow = function () { - return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')) - } - - Tooltip.prototype.enable = function () { - this.enabled = true - } - - Tooltip.prototype.disable = function () { - this.enabled = false - } - - Tooltip.prototype.toggleEnabled = function () { - this.enabled = !this.enabled - } - - Tooltip.prototype.toggle = function (e) { - var self = this - if (e) { - self = $(e.currentTarget).data('bs.' + this.type) - if (!self) { - self = new this.constructor(e.currentTarget, this.getDelegateOptions()) - $(e.currentTarget).data('bs.' + this.type, self) - } - } - - if (e) { - self.inState.click = !self.inState.click - if (self.isInStateTrue()) self.enter(self) - else self.leave(self) - } else { - self.tip().hasClass('in') ? self.leave(self) : self.enter(self) - } - } - - Tooltip.prototype.destroy = function () { - var that = this - clearTimeout(this.timeout) - this.hide(function () { - that.$element.off('.' + that.type).removeData('bs.' + that.type) - if (that.$tip) { - that.$tip.detach() - } - that.$tip = null - that.$arrow = null - that.$viewport = null - }) - } - - - // TOOLTIP PLUGIN DEFINITION - // ========================= - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.tooltip') - var options = typeof option == 'object' && option - - if (!data && /destroy|hide/.test(option)) return - if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.tooltip - - $.fn.tooltip = Plugin - $.fn.tooltip.Constructor = Tooltip - - - // TOOLTIP NO CONFLICT - // =================== - - $.fn.tooltip.noConflict = function () { - $.fn.tooltip = old - return this - } - -}(jQuery); - -/* ======================================================================== - * Bootstrap: popover.js v3.3.5 - * http://getbootstrap.com/javascript/#popovers - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // POPOVER PUBLIC CLASS DEFINITION - // =============================== - - var Popover = function (element, options) { - this.init('popover', element, options) - } - - if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') - - Popover.VERSION = '3.3.5' - - Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { - placement: 'right', - trigger: 'click', - content: '', - template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>' - }) - - - // NOTE: POPOVER EXTENDS tooltip.js - // ================================ - - Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) - - Popover.prototype.constructor = Popover - - Popover.prototype.getDefaults = function () { - return Popover.DEFAULTS - } - - Popover.prototype.setContent = function () { - var $tip = this.tip() - var title = this.getTitle() - var content = this.getContent() - - $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) - $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events - this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text' - ](content) - - $tip.removeClass('fade top bottom left right in') - - // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do - // this manually by checking the contents. - if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() - } - - Popover.prototype.hasContent = function () { - return this.getTitle() || this.getContent() - } - - Popover.prototype.getContent = function () { - var $e = this.$element - var o = this.options - - return $e.attr('data-content') - || (typeof o.content == 'function' ? - o.content.call($e[0]) : - o.content) - } - - Popover.prototype.arrow = function () { - return (this.$arrow = this.$arrow || this.tip().find('.arrow')) - } - - - // POPOVER PLUGIN DEFINITION - // ========================= - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.popover') - var options = typeof option == 'object' && option - - if (!data && /destroy|hide/.test(option)) return - if (!data) $this.data('bs.popover', (data = new Popover(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.popover - - $.fn.popover = Plugin - $.fn.popover.Constructor = Popover - - - // POPOVER NO CONFLICT - // =================== - - $.fn.popover.noConflict = function () { - $.fn.popover = old - return this - } - -}(jQuery); - -/* ======================================================================== - * Bootstrap: scrollspy.js v3.3.5 - * http://getbootstrap.com/javascript/#scrollspy - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // SCROLLSPY CLASS DEFINITION - // ========================== - - function ScrollSpy(element, options) { - this.$body = $(document.body) - this.$scrollElement = $(element).is(document.body) ? $(window) : $(element) - this.options = $.extend({}, ScrollSpy.DEFAULTS, options) - this.selector = (this.options.target || '') + ' .nav li > a' - this.offsets = [] - this.targets = [] - this.activeTarget = null - this.scrollHeight = 0 - - this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this)) - this.refresh() - this.process() - } - - ScrollSpy.VERSION = '3.3.5' - - ScrollSpy.DEFAULTS = { - offset: 10 - } - - ScrollSpy.prototype.getScrollHeight = function () { - return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) - } - - ScrollSpy.prototype.refresh = function () { - var that = this - var offsetMethod = 'offset' - var offsetBase = 0 - - this.offsets = [] - this.targets = [] - this.scrollHeight = this.getScrollHeight() - - if (!$.isWindow(this.$scrollElement[0])) { - offsetMethod = 'position' - offsetBase = this.$scrollElement.scrollTop() - } - - this.$body - .find(this.selector) - .map(function () { - var $el = $(this) - var href = $el.data('target') || $el.attr('href') - var $href = /^#./.test(href) && $(href) - - return ($href - && $href.length - && $href.is(':visible') - && [[$href[offsetMethod]().top + offsetBase, href]]) || null - }) - .sort(function (a, b) { return a[0] - b[0] }) - .each(function () { - that.offsets.push(this[0]) - that.targets.push(this[1]) - }) - } - - ScrollSpy.prototype.process = function () { - var scrollTop = this.$scrollElement.scrollTop() + this.options.offset - var scrollHeight = this.getScrollHeight() - var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height() - var offsets = this.offsets - var targets = this.targets - var activeTarget = this.activeTarget - var i - - if (this.scrollHeight != scrollHeight) { - this.refresh() - } - - if (scrollTop >= maxScroll) { - return activeTarget != (i = targets[targets.length - 1]) && this.activate(i) - } - - if (activeTarget && scrollTop < offsets[0]) { - this.activeTarget = null - return this.clear() - } - - for (i = offsets.length; i--;) { - activeTarget != targets[i] - && scrollTop >= offsets[i] - && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1]) - && this.activate(targets[i]) - } - } - - ScrollSpy.prototype.activate = function (target) { - this.activeTarget = target - - this.clear() - - var selector = this.selector + - '[data-target="' + target + '"],' + - this.selector + '[href="' + target + '"]' - - var active = $(selector) - .parents('li') - .addClass('active') - - if (active.parent('.dropdown-menu').length) { - active = active - .closest('li.dropdown') - .addClass('active') - } - - active.trigger('activate.bs.scrollspy') - } - - ScrollSpy.prototype.clear = function () { - $(this.selector) - .parentsUntil(this.options.target, '.active') - .removeClass('active') - } - - - // SCROLLSPY PLUGIN DEFINITION - // =========================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.scrollspy') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.scrollspy - - $.fn.scrollspy = Plugin - $.fn.scrollspy.Constructor = ScrollSpy - - - // SCROLLSPY NO CONFLICT - // ===================== - - $.fn.scrollspy.noConflict = function () { - $.fn.scrollspy = old - return this - } - - - // SCROLLSPY DATA-API - // ================== - - $(window).on('load.bs.scrollspy.data-api', function () { - $('[data-spy="scroll"]').each(function () { - var $spy = $(this) - Plugin.call($spy, $spy.data()) - }) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: tab.js v3.3.5 - * http://getbootstrap.com/javascript/#tabs - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // TAB CLASS DEFINITION - // ==================== - - var Tab = function (element) { - // jscs:disable requireDollarBeforejQueryAssignment - this.element = $(element) - // jscs:enable requireDollarBeforejQueryAssignment - } - - Tab.VERSION = '3.3.5' - - Tab.TRANSITION_DURATION = 150 - - Tab.prototype.show = function () { - var $this = this.element - var $ul = $this.closest('ul:not(.dropdown-menu)') - var selector = $this.data('target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 - } - - if ($this.parent('li').hasClass('active')) return - - var $previous = $ul.find('.active:last a') - var hideEvent = $.Event('hide.bs.tab', { - relatedTarget: $this[0] - }) - var showEvent = $.Event('show.bs.tab', { - relatedTarget: $previous[0] - }) - - $previous.trigger(hideEvent) - $this.trigger(showEvent) - - if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return - - var $target = $(selector) - - this.activate($this.closest('li'), $ul) - this.activate($target, $target.parent(), function () { - $previous.trigger({ - type: 'hidden.bs.tab', - relatedTarget: $this[0] - }) - $this.trigger({ - type: 'shown.bs.tab', - relatedTarget: $previous[0] - }) - }) - } - - Tab.prototype.activate = function (element, container, callback) { - var $active = container.find('> .active') - var transition = callback - && $.support.transition - && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length) - - function next() { - $active - .removeClass('active') - .find('> .dropdown-menu > .active') - .removeClass('active') - .end() - .find('[data-toggle="tab"]') - .attr('aria-expanded', false) - - element - .addClass('active') - .find('[data-toggle="tab"]') - .attr('aria-expanded', true) - - if (transition) { - element[0].offsetWidth // reflow for transition - element.addClass('in') - } else { - element.removeClass('fade') - } - - if (element.parent('.dropdown-menu').length) { - element - .closest('li.dropdown') - .addClass('active') - .end() - .find('[data-toggle="tab"]') - .attr('aria-expanded', true) - } - - callback && callback() - } - - $active.length && transition ? - $active - .one('bsTransitionEnd', next) - .emulateTransitionEnd(Tab.TRANSITION_DURATION) : - next() - - $active.removeClass('in') - } - - - // TAB PLUGIN DEFINITION - // ===================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.tab') - - if (!data) $this.data('bs.tab', (data = new Tab(this))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.tab - - $.fn.tab = Plugin - $.fn.tab.Constructor = Tab - - - // TAB NO CONFLICT - // =============== - - $.fn.tab.noConflict = function () { - $.fn.tab = old - return this - } - - - // TAB DATA-API - // ============ - - var clickHandler = function (e) { - e.preventDefault() - Plugin.call($(this), 'show') - } - - $(document) - .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler) - .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: affix.js v3.3.5 - * http://getbootstrap.com/javascript/#affix - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // AFFIX CLASS DEFINITION - // ====================== - - var Affix = function (element, options) { - this.options = $.extend({}, Affix.DEFAULTS, options) - - this.$target = $(this.options.target) - .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) - .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) - - this.$element = $(element) - this.affixed = null - this.unpin = null - this.pinnedOffset = null - - this.checkPosition() - } - - Affix.VERSION = '3.3.5' - - Affix.RESET = 'affix affix-top affix-bottom' - - Affix.DEFAULTS = { - offset: 0, - target: window - } - - Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) { - var scrollTop = this.$target.scrollTop() - var position = this.$element.offset() - var targetHeight = this.$target.height() - - if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false - - if (this.affixed == 'bottom') { - if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom' - return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom' - } - - var initializing = this.affixed == null - var colliderTop = initializing ? scrollTop : position.top - var colliderHeight = initializing ? targetHeight : height - - if (offsetTop != null && scrollTop <= offsetTop) return 'top' - if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom' - - return false - } - - Affix.prototype.getPinnedOffset = function () { - if (this.pinnedOffset) return this.pinnedOffset - this.$element.removeClass(Affix.RESET).addClass('affix') - var scrollTop = this.$target.scrollTop() - var position = this.$element.offset() - return (this.pinnedOffset = position.top - scrollTop) - } - - Affix.prototype.checkPositionWithEventLoop = function () { - setTimeout($.proxy(this.checkPosition, this), 1) - } - - Affix.prototype.checkPosition = function () { - if (!this.$element.is(':visible')) return - - var height = this.$element.height() - var offset = this.options.offset - var offsetTop = offset.top - var offsetBottom = offset.bottom - var scrollHeight = Math.max($(document).height(), $(document.body).height()) - - if (typeof offset != 'object') offsetBottom = offsetTop = offset - if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) - if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) - - var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom) - - if (this.affixed != affix) { - if (this.unpin != null) this.$element.css('top', '') - - var affixType = 'affix' + (affix ? '-' + affix : '') - var e = $.Event(affixType + '.bs.affix') - - this.$element.trigger(e) - - if (e.isDefaultPrevented()) return - - this.affixed = affix - this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null - - this.$element - .removeClass(Affix.RESET) - .addClass(affixType) - .trigger(affixType.replace('affix', 'affixed') + '.bs.affix') - } - - if (affix == 'bottom') { - this.$element.offset({ - top: scrollHeight - height - offsetBottom - }) - } - } - - - // AFFIX PLUGIN DEFINITION - // ======================= - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.affix') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.affix', (data = new Affix(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.affix - - $.fn.affix = Plugin - $.fn.affix.Constructor = Affix - - - // AFFIX NO CONFLICT - // ================= - - $.fn.affix.noConflict = function () { - $.fn.affix = old - return this - } - - - // AFFIX DATA-API - // ============== - - $(window).on('load', function () { - $('[data-spy="affix"]').each(function () { - var $spy = $(this) - var data = $spy.data() - - data.offset = data.offset || {} - - if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom - if (data.offsetTop != null) data.offset.top = data.offsetTop - - Plugin.call($spy, data) - }) - }) - -}(jQuery); diff --git a/flask_admin/static/bootstrap/bootstrap3/js/bootstrap.min.js b/flask_admin/static/bootstrap/bootstrap3/js/bootstrap.min.js deleted file mode 100644 index 133aeecb9..000000000 --- a/flask_admin/static/bootstrap/bootstrap3/js/bootstrap.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v3.3.5 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under the MIT license - */ -if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.5",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.5",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.5",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.5",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.5",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",c).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",".dropdown-menu",g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.3.5",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){d.$element.one("mouseup.dismiss.bs.modal",function(b){a(b.target).is(d.$element)&&(d.ignoreBackdropClick=!0)})}),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass("fade");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass("in"),d.enforceFocus();var f=a.Event("shown.bs.modal",{relatedTarget:b});e?d.$dialog.one("bsTransitionEnd",function(){d.$element.trigger("focus").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger("focus").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},c.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass("modal-open"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a(document.createElement("div")).addClass("modal-backdrop "+e).appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.adjustDialog()},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth<a,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.inState=null,this.init("tooltip",a,b)};c.VERSION="3.3.5",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),c.isInStateTrue()?void 0:(clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide())},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-m<o.top?"bottom":"right"==h&&k.right+l>o.width?"left":"left"==h&&k.left-l<o.left?"right":h,f.removeClass(n).addClass(h)}var p=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(p,h);var q=function(){var a=e.hoverState;e.$element.trigger("shown.bs."+e.type),e.hoverState=null,"out"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",q).emulateTransitionEnd(c.TRANSITION_DURATION):q()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top+=g,b.left+=h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?"left":"top",50*(1-a/b)+"%").css(c?"top":"left","")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(b){function d(){"in"!=e.hoverState&&f.detach(),e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),b&&b()}var e=this,f=a(this.$tip),g=a.Event("hide.bs."+this.type);return this.$element.trigger(g),g.isDefaultPrevented()?void 0:(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=d?{top:0,left:0}:b.offset(),g={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},h=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,g,h,f)},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.5",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.5",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<e[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(void 0===e[a+1]||b<e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")), -d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.5",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.5",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file diff --git a/flask_admin/static/bootstrap/bootstrap3/swatch/cerulean/bootstrap.min.css b/flask_admin/static/bootstrap/bootstrap3/swatch/cerulean/bootstrap.min.css deleted file mode 100644 index dcf099628..000000000 --- a/flask_admin/static/bootstrap/bootstrap3/swatch/cerulean/bootstrap.min.css +++ /dev/null @@ -1,11 +0,0 @@ -/*! - * bootswatch v3.3.5 - * Homepage: http://bootswatch.com - * Copyright 2012-2015 Thomas Park - * Licensed under MIT - * Based on Bootstrap -*//*! - * Bootstrap v3.3.5 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;-webkit-box-shadow:none !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#555555;background-color:#ffffff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#2fa4e7;text-decoration:none}a:hover,a:focus{color:#157ab5;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,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#ffffff;border:1px solid #dddddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eeeeee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1;color:#317eac}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#999999}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#999999}.text-primary{color:#2fa4e7}a.text-primary:hover,a.text-primary:focus{color:#178acc}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-danger{color:#b94a48}a.text-danger:hover,a.text-danger:focus{color:#953b39}.bg-primary{color:#fff;background-color:#2fa4e7}a.bg-primary:hover,a.bg-primary:focus{background-color:#178acc}.bg-success{background-color:#dff0d8}a.bg-success:hover,a.bg-success:focus{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover,a.bg-info:focus{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover,a.bg-warning:focus{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover,a.bg-danger:focus{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eeeeee}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;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eeeeee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#999999}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eeeeee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#ffffff;background-color:#333333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333333;background-color:#f5f5f5;border:1px solid #cccccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0%}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0%}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0%}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0%}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#999999;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #dddddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #dddddd}.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 #dddddd}.table .table{background-color:#ffffff}.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 #dddddd}.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 #dddddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*="col-"]{position:static;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:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #dddddd}.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:#555555;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:9px;font-size:14px;line-height:1.42857143;color:#555555}.form-control{display:block;width:100%;height:38px;padding:8px 12px;font-size:14px;line-height:1.42857143;color:#555555;background-color:#ffffff;background-image:none;border:1px solid #cccccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control::-moz-placeholder{color:#999999;opacity:1}.form-control:-ms-input-placeholder{color:#999999}.form-control::-webkit-input-placeholder{color:#999999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eeeeee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:38px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:54px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:9px;padding-bottom:9px;margin-bottom:0;min-height:34px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:54px;padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:54px;line-height:54px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:54px;padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:54px;line-height:54px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:54px;min-height:38px;padding:15px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:47.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:38px;height:38px;line-height:38px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:54px;height:54px;line-height:54px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#468847}.has-success .form-control{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.has-success .input-group-addon{color:#468847;border-color:#468847;background-color:#dff0d8}.has-success .form-control-feedback{color:#468847}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#c09853}.has-warning .form-control{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.has-warning .input-group-addon{color:#c09853;border-color:#c09853;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#c09853}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#b94a48}.has-error .form-control{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.has-error .input-group-addon{color:#b94a48;border-color:#b94a48;background-color:#f2dede}.has-error .form-control-feedback{color:#b94a48}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#959595}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:9px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:29px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:9px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:19.6666662px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:8px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#555555;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#555555;background-color:#ffffff;border-color:rgba(0,0,0,0.1)}.btn-default:focus,.btn-default.focus{color:#555555;background-color:#e6e6e6;border-color:rgba(0,0,0,0.1)}.btn-default:hover{color:#555555;background-color:#e6e6e6;border-color:rgba(0,0,0,0.1)}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#555555;background-color:#e6e6e6;border-color:rgba(0,0,0,0.1)}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#555555;background-color:#d4d4d4;border-color:rgba(0,0,0,0.1)}.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.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:#ffffff;border-color:rgba(0,0,0,0.1)}.btn-default .badge{color:#ffffff;background-color:#555555}.btn-primary{color:#ffffff;background-color:#2fa4e7;border-color:#2fa4e7}.btn-primary:focus,.btn-primary.focus{color:#ffffff;background-color:#178acc;border-color:#105b87}.btn-primary:hover{color:#ffffff;background-color:#178acc;border-color:#1684c2}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#ffffff;background-color:#178acc;border-color:#1684c2}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#ffffff;background-color:#1474ac;border-color:#105b87}.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.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:#2fa4e7;border-color:#2fa4e7}.btn-primary .badge{color:#2fa4e7;background-color:#ffffff}.btn-success{color:#ffffff;background-color:#73a839;border-color:#73a839}.btn-success:focus,.btn-success.focus{color:#ffffff;background-color:#59822c;border-color:#324919}.btn-success:hover{color:#ffffff;background-color:#59822c;border-color:#547a29}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#ffffff;background-color:#59822c;border-color:#547a29}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#ffffff;background-color:#476723;border-color:#324919}.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.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:#73a839;border-color:#73a839}.btn-success .badge{color:#73a839;background-color:#ffffff}.btn-info{color:#ffffff;background-color:#033c73;border-color:#033c73}.btn-info:focus,.btn-info.focus{color:#ffffff;background-color:#022241;border-color:#000000}.btn-info:hover{color:#ffffff;background-color:#022241;border-color:#011d37}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#ffffff;background-color:#022241;border-color:#011d37}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#ffffff;background-color:#01101f;border-color:#000000}.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.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:#033c73;border-color:#033c73}.btn-info .badge{color:#033c73;background-color:#ffffff}.btn-warning{color:#ffffff;background-color:#dd5600;border-color:#dd5600}.btn-warning:focus,.btn-warning.focus{color:#ffffff;background-color:#aa4200;border-color:#5e2400}.btn-warning:hover{color:#ffffff;background-color:#aa4200;border-color:#a03e00}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#ffffff;background-color:#aa4200;border-color:#a03e00}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#ffffff;background-color:#863400;border-color:#5e2400}.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.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:#dd5600;border-color:#dd5600}.btn-warning .badge{color:#dd5600;background-color:#ffffff}.btn-danger{color:#ffffff;background-color:#c71c22;border-color:#c71c22}.btn-danger:focus,.btn-danger.focus{color:#ffffff;background-color:#9a161a;border-color:#570c0f}.btn-danger:hover{color:#ffffff;background-color:#9a161a;border-color:#911419}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#ffffff;background-color:#9a161a;border-color:#911419}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#ffffff;background-color:#7b1115;border-color:#570c0f}.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.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:#c71c22;border-color:#c71c22}.btn-danger .badge{color:#c71c22;background-color:#ffffff}.btn-link{color:#2fa4e7;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#157ab5;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999999;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;-o-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:0.35s;-o-transition-duration:0.35s;transition-duration:0.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#ffffff;border:1px solid #cccccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#333333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#ffffff;background-color:#2fa4e7}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#ffffff;text-decoration:none;outline:0;background-color:#2fa4e7}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#999999;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:54px;padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:54px;line-height:54px}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:8px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555555;text-align:center;background-color:#eeeeee;border:1px solid #cccccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:14px 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{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eeeeee}.nav>li.disabled>a{color:#999999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999999;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eeeeee;border-color:#2fa4e7}.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 #dddddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555555;background-color:#ffffff;border:1px solid #dddddd;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 #dddddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #dddddd;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:#ffffff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#ffffff;background-color:#2fa4e7}.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 #dddddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #dddddd;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:#ffffff}}.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{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top: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;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:6px;margin-bottom:6px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:6px;margin-bottom:6px}.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}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#2fa4e7;border-color:#1995dc}.navbar-default .navbar-brand{color:#ffffff}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#ffffff;background-color:none}.navbar-default .navbar-text{color:#dddddd}.navbar-default .navbar-nav>li>a{color:#ffffff}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#ffffff;background-color:#178acc}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#ffffff;background-color:#178acc}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#dddddd;background-color:transparent}.navbar-default .navbar-toggle{border-color:#178acc}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#178acc}.navbar-default .navbar-toggle .icon-bar{background-color:#ffffff}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#1995dc}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#178acc;color:#ffffff}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#ffffff}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#ffffff;background-color:#178acc}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#178acc}.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:#dddddd;background-color:transparent}}.navbar-default .navbar-link{color:#ffffff}.navbar-default .navbar-link:hover{color:#ffffff}.navbar-default .btn-link{color:#ffffff}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#ffffff}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#dddddd}.navbar-inverse{background-color:#033c73;border-color:#022f5a}.navbar-inverse .navbar-brand{color:#ffffff}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#ffffff;background-color:none}.navbar-inverse .navbar-text{color:#ffffff}.navbar-inverse .navbar-nav>li>a{color:#ffffff}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#ffffff;background-color:#022f5a}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#ffffff;background-color:#022f5a}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#cccccc;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#022f5a}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#022f5a}.navbar-inverse .navbar-toggle .icon-bar{background-color:#ffffff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#022a50}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#022f5a;color:#ffffff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#022f5a}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#022f5a}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#ffffff}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#ffffff;background-color:#022f5a}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#022f5a}.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:#cccccc;background-color:transparent}}.navbar-inverse .navbar-link{color:#ffffff}.navbar-inverse .navbar-link:hover{color:#ffffff}.navbar-inverse .btn-link{color:#ffffff}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#ffffff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#cccccc}.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:#cccccc}.breadcrumb>.active{color:#999999}.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:8px 12px;line-height:1.42857143;text-decoration:none;color:#2fa4e7;background-color:#ffffff;border:1px solid #dddddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{z-index:3;color:#157ab5;background-color:#eeeeee;border-color:#dddddd}.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:#999999;background-color:#f5f5f5;border-color:#dddddd;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:#999999;background-color:#ffffff;border-color:#dddddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:14px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin: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:#ffffff;border:1px solid #dddddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eeeeee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999999;background-color:#ffffff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#ffffff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#ffffff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999999}.label-default[href]:hover,.label-default[href]:focus{background-color:#808080}.label-primary{background-color:#2fa4e7}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#178acc}.label-success{background-color:#73a839}.label-success[href]:hover,.label-success[href]:focus{background-color:#59822c}.label-info{background-color:#033c73}.label-info[href]:hover,.label-info[href]:focus{background-color:#022241}.label-warning{background-color:#dd5600}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#aa4200}.label-danger{background-color:#c71c22}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#9a161a}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;color:#ffffff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#2fa4e7;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#ffffff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#2fa4e7;background-color:#ffffff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eeeeee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#ffffff;border:1px solid #dddddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#2fa4e7}.thumbnail .caption{padding:9px;color:#555555}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#468847}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#356635}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#3a87ad}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#2d6987}.alert-warning{background-color:#fcf8e3;border-color:#fbeed5;color:#c09853}.alert-warning hr{border-top-color:#f8e5be}.alert-warning .alert-link{color:#a47e3c}.alert-danger{background-color:#f2dede;border-color:#eed3d7;color:#b94a48}.alert-danger hr{border-top-color:#e6c1c7}.alert-danger .alert-link{color:#953b39}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:20px;color:#ffffff;text-align:center;background-color:#2fa4e7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#73a839}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#033c73}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#dd5600}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#c71c22}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#ffffff;border:1px solid #dddddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333333}a.list-group-item:hover,button.list-group-item:hover,a.list-group-item:focus,button.list-group-item:focus{text-decoration:none;color:#555555;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#eeeeee;color:#999999;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#999999}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#ffffff;background-color:#2fa4e7;border-color:#2fa4e7}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#e6f4fc}.list-group-item-success{color:#468847;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#468847}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,button.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:focus{color:#468847;background-color:#d0e9c6}a.list-group-item-success.active,button.list-group-item-success.active,a.list-group-item-success.active:hover,button.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active:focus{color:#fff;background-color:#468847;border-color:#468847}.list-group-item-info{color:#3a87ad;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#3a87ad}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,button.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:focus{color:#3a87ad;background-color:#c4e3f3}a.list-group-item-info.active,button.list-group-item-info.active,a.list-group-item-info.active:hover,button.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active:focus{color:#fff;background-color:#3a87ad;border-color:#3a87ad}.list-group-item-warning{color:#c09853;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#c09853}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,button.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:focus{color:#c09853;background-color:#faf2cc}a.list-group-item-warning.active,button.list-group-item-warning.active,a.list-group-item-warning.active:hover,button.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active:focus{color:#fff;background-color:#c09853;border-color:#c09853}.list-group-item-danger{color:#b94a48;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#b94a48}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,button.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:focus{color:#b94a48;background-color:#ebcccc}a.list-group-item-danger.active,button.list-group-item-danger.active,a.list-group-item-danger.active:hover,button.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active:focus{color:#fff;background-color:#b94a48;border-color:#b94a48}.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:#ffffff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #dddddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #dddddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #dddddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #dddddd}.panel-default{border-color:#dddddd}.panel-default>.panel-heading{color:#555555;background-color:#f5f5f5;border-color:#dddddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#dddddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#555555}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#dddddd}.panel-primary{border-color:#dddddd}.panel-primary>.panel-heading{color:#ffffff;background-color:#2fa4e7;border-color:#dddddd}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#dddddd}.panel-primary>.panel-heading .badge{color:#2fa4e7;background-color:#ffffff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#dddddd}.panel-success{border-color:#dddddd}.panel-success>.panel-heading{color:#468847;background-color:#73a839;border-color:#dddddd}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#dddddd}.panel-success>.panel-heading .badge{color:#73a839;background-color:#468847}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#dddddd}.panel-info{border-color:#dddddd}.panel-info>.panel-heading{color:#3a87ad;background-color:#033c73;border-color:#dddddd}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#dddddd}.panel-info>.panel-heading .badge{color:#033c73;background-color:#3a87ad}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#dddddd}.panel-warning{border-color:#dddddd}.panel-warning>.panel-heading{color:#c09853;background-color:#dd5600;border-color:#dddddd}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#dddddd}.panel-warning>.panel-heading .badge{color:#dd5600;background-color:#c09853}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#dddddd}.panel-danger{border-color:#dddddd}.panel-danger>.panel-heading{color:#b94a48;background-color:#c71c22;border-color:#dddddd}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#dddddd}.panel-danger>.panel-heading .badge{color:#c71c22;background-color:#b94a48}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#dddddd}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000000;text-decoration:none;cursor:pointer;opacity:0.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#ffffff;border:1px solid #999999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:0.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{padding:20px;text-align:right;border-top:1px solid #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}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:12px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:0.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;background-color:#000000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:14px;background-color:#ffffff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #cccccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#ffffff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999999;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#ffffff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#ffffff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999999;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#ffffff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:0.5;filter:alpha(opacity=50);font-size:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.5)), to(rgba(0,0,0,0.0001)));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.0001)), to(rgba(0,0,0,0.5)));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #ffffff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#ffffff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}.navbar{background-image:-webkit-linear-gradient(#54b4eb, #2fa4e7 60%, #1d9ce5);background-image:-o-linear-gradient(#54b4eb, #2fa4e7 60%, #1d9ce5);background-image:-webkit-gradient(linear, left top, left bottom, from(#54b4eb), color-stop(60%, #2fa4e7), to(#1d9ce5));background-image:linear-gradient(#54b4eb, #2fa4e7 60%, #1d9ce5);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff54b4eb', endColorstr='#ff1d9ce5', GradientType=0);border-bottom:1px solid #178acc;-webkit-filter:none;filter:none;-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-default .badge{background-color:#fff;color:#2fa4e7}.navbar-inverse{background-image:-webkit-linear-gradient(#04519b, #044687 60%, #033769);background-image:-o-linear-gradient(#04519b, #044687 60%, #033769);background-image:-webkit-gradient(linear, left top, left bottom, from(#04519b), color-stop(60%, #044687), to(#033769));background-image:linear-gradient(#04519b, #044687 60%, #033769);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff04519b', endColorstr='#ff033769', GradientType=0);-webkit-filter:none;filter:none;border-bottom:1px solid #022241}.navbar-inverse .badge{background-color:#fff;color:#033c73}.navbar .navbar-nav>li>a,.navbar-brand{text-shadow:0 1px 0 rgba(0,0,0,0.1)}@media (max-width:767px){.navbar .dropdown-header{color:#fff}.navbar .dropdown-menu a{color:#fff}}.btn{text-shadow:0 1px 0 rgba(0,0,0,0.1)}.btn .caret{border-top-color:#fff}.btn-default{background-image:-webkit-linear-gradient(#fff, #fff 60%, #f5f5f5);background-image:-o-linear-gradient(#fff, #fff 60%, #f5f5f5);background-image:-webkit-gradient(linear, left top, left bottom, from(#fff), color-stop(60%, #fff), to(#f5f5f5));background-image:linear-gradient(#fff, #fff 60%, #f5f5f5);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff5f5f5', GradientType=0);-webkit-filter:none;filter:none;border-bottom:1px solid #e6e6e6}.btn-default:hover{color:#555555}.btn-default .caret{border-top-color:#555555}.btn-default{background-image:-webkit-linear-gradient(#fff, #fff 60%, #f5f5f5);background-image:-o-linear-gradient(#fff, #fff 60%, #f5f5f5);background-image:-webkit-gradient(linear, left top, left bottom, from(#fff), color-stop(60%, #fff), to(#f5f5f5));background-image:linear-gradient(#fff, #fff 60%, #f5f5f5);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff5f5f5', GradientType=0);-webkit-filter:none;filter:none;border-bottom:1px solid #e6e6e6}.btn-primary{background-image:-webkit-linear-gradient(#54b4eb, #2fa4e7 60%, #1d9ce5);background-image:-o-linear-gradient(#54b4eb, #2fa4e7 60%, #1d9ce5);background-image:-webkit-gradient(linear, left top, left bottom, from(#54b4eb), color-stop(60%, #2fa4e7), to(#1d9ce5));background-image:linear-gradient(#54b4eb, #2fa4e7 60%, #1d9ce5);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff54b4eb', endColorstr='#ff1d9ce5', GradientType=0);-webkit-filter:none;filter:none;border-bottom:1px solid #178acc}.btn-success{background-image:-webkit-linear-gradient(#88c149, #73a839 60%, #699934);background-image:-o-linear-gradient(#88c149, #73a839 60%, #699934);background-image:-webkit-gradient(linear, left top, left bottom, from(#88c149), color-stop(60%, #73a839), to(#699934));background-image:linear-gradient(#88c149, #73a839 60%, #699934);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff88c149', endColorstr='#ff699934', GradientType=0);-webkit-filter:none;filter:none;border-bottom:1px solid #59822c}.btn-info{background-image:-webkit-linear-gradient(#04519b, #033c73 60%, #02325f);background-image:-o-linear-gradient(#04519b, #033c73 60%, #02325f);background-image:-webkit-gradient(linear, left top, left bottom, from(#04519b), color-stop(60%, #033c73), to(#02325f));background-image:linear-gradient(#04519b, #033c73 60%, #02325f);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff04519b', endColorstr='#ff02325f', GradientType=0);-webkit-filter:none;filter:none;border-bottom:1px solid #022241}.btn-warning{background-image:-webkit-linear-gradient(#ff6707, #dd5600 60%, #c94e00);background-image:-o-linear-gradient(#ff6707, #dd5600 60%, #c94e00);background-image:-webkit-gradient(linear, left top, left bottom, from(#ff6707), color-stop(60%, #dd5600), to(#c94e00));background-image:linear-gradient(#ff6707, #dd5600 60%, #c94e00);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff6707', endColorstr='#ffc94e00', GradientType=0);-webkit-filter:none;filter:none;border-bottom:1px solid #aa4200}.btn-danger{background-image:-webkit-linear-gradient(#e12b31, #c71c22 60%, #b5191f);background-image:-o-linear-gradient(#e12b31, #c71c22 60%, #b5191f);background-image:-webkit-gradient(linear, left top, left bottom, from(#e12b31), color-stop(60%, #c71c22), to(#b5191f));background-image:linear-gradient(#e12b31, #c71c22 60%, #b5191f);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe12b31', endColorstr='#ffb5191f', GradientType=0);-webkit-filter:none;filter:none;border-bottom:1px solid #9a161a}.panel-primary .panel-heading,.panel-success .panel-heading,.panel-warning .panel-heading,.panel-danger .panel-heading,.panel-info .panel-heading,.panel-primary .panel-title,.panel-success .panel-title,.panel-warning .panel-title,.panel-danger .panel-title,.panel-info .panel-title{color:#fff} \ No newline at end of file diff --git a/flask_admin/static/bootstrap/bootstrap3/swatch/cosmo/bootstrap.min.css b/flask_admin/static/bootstrap/bootstrap3/swatch/cosmo/bootstrap.min.css deleted file mode 100644 index 2c959bdc6..000000000 --- a/flask_admin/static/bootstrap/bootstrap3/swatch/cosmo/bootstrap.min.css +++ /dev/null @@ -1,11 +0,0 @@ -@import url("https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,700");/*! - * bootswatch v3.3.5 - * Homepage: http://bootswatch.com - * Copyright 2012-2015 Thomas Park - * Licensed under MIT - * Based on Bootstrap -*//*! - * Bootstrap v3.3.5 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;-webkit-box-shadow:none !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Source Sans Pro",Calibri,Candara,Arial,sans-serif;font-size:15px;line-height:1.42857143;color:#333333;background-color:#ffffff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#2780e3;text-decoration:none}a:hover,a:focus{color:#165ba8;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,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:0}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#ffffff;border:1px solid #dddddd;border-radius:0;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:21px;margin-bottom:21px;border:0;border-top:1px solid #e6e6e6}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Source Sans Pro",Calibri,Candara,Arial,sans-serif;font-weight:300;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#999999}h1,.h1,h2,.h2,h3,.h3{margin-top:21px;margin-bottom:10.5px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10.5px;margin-bottom:10.5px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:39px}h2,.h2{font-size:32px}h3,.h3{font-size:26px}h4,.h4{font-size:19px}h5,.h5{font-size:15px}h6,.h6{font-size:13px}p{margin:0 0 10.5px}.lead{margin-bottom:21px;font-size:17px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:22.5px}}small,.small{font-size:86%}mark,.mark{background-color:#ff7518;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#999999}.text-primary{color:#2780e3}a.text-primary:hover,a.text-primary:focus{color:#1967be}.text-success{color:#ffffff}a.text-success:hover,a.text-success:focus{color:#e6e6e6}.text-info{color:#ffffff}a.text-info:hover,a.text-info:focus{color:#e6e6e6}.text-warning{color:#ffffff}a.text-warning:hover,a.text-warning:focus{color:#e6e6e6}.text-danger{color:#ffffff}a.text-danger:hover,a.text-danger:focus{color:#e6e6e6}.bg-primary{color:#fff;background-color:#2780e3}a.bg-primary:hover,a.bg-primary:focus{background-color:#1967be}.bg-success{background-color:#3fb618}a.bg-success:hover,a.bg-success:focus{background-color:#2f8912}.bg-info{background-color:#9954bb}a.bg-info:hover,a.bg-info:focus{background-color:#7e3f9d}.bg-warning{background-color:#ff7518}a.bg-warning:hover,a.bg-warning:focus{background-color:#e45c00}.bg-danger{background-color:#ff0039}a.bg-danger:hover,a.bg-danger:focus{background-color:#cc002e}.page-header{padding-bottom:9.5px;margin:42px 0 21px;border-bottom:1px solid #e6e6e6}ul,ol{margin-top:0;margin-bottom:10.5px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:21px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10.5px 21px;margin:0 0 21px;font-size:18.75px;border-left:5px solid #e6e6e6}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#999999}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #e6e6e6;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:21px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:0}kbd{padding:2px 4px;font-size:90%;color:#ffffff;background-color:#333333;border-radius:0;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:10px;margin:0 0 10.5px;font-size:14px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333333;background-color:#f5f5f5;border:1px solid #cccccc;border-radius:0}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0%}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0%}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0%}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0%}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#999999;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:21px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #dddddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #dddddd}.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 #dddddd}.table .table{background-color:#ffffff}.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 #dddddd}.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 #dddddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*="col-"]{position:static;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:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#3fb618}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#379f15}.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:#9954bb}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#8d46b0}.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:#ff7518}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#fe6600}.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:#ff0039}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#e60033}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15.75px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #dddddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:21px;font-size:22.5px;line-height:inherit;color:#333333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:11px;font-size:15px;line-height:1.42857143;color:#333333}.form-control{display:block;width:100%;height:43px;padding:10px 18px;font-size:15px;line-height:1.42857143;color:#333333;background-color:#ffffff;background-image:none;border:1px solid #cccccc;border-radius:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control::-moz-placeholder{color:#999999;opacity:1}.form-control:-ms-input-placeholder{color:#999999}.form-control::-webkit-input-placeholder{color:#999999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#e6e6e6;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:43px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:31px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:64px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:21px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:11px;padding-bottom:11px;margin-bottom:0;min-height:36px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:31px;padding:5px 10px;font-size:13px;line-height:1.5;border-radius:0}select.input-sm{height:31px;line-height:31px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:31px;padding:5px 10px;font-size:13px;line-height:1.5;border-radius:0}.form-group-sm select.form-control{height:31px;line-height:31px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:31px;min-height:34px;padding:6px 10px;font-size:13px;line-height:1.5}.input-lg{height:64px;padding:18px 30px;font-size:19px;line-height:1.3333333;border-radius:0}select.input-lg{height:64px;line-height:64px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:64px;padding:18px 30px;font-size:19px;line-height:1.3333333;border-radius:0}.form-group-lg select.form-control{height:64px;line-height:64px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:64px;min-height:40px;padding:19px 30px;font-size:19px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:53.75px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:43px;height:43px;line-height:43px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:64px;height:64px;line-height:64px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:31px;height:31px;line-height:31px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#ffffff}.has-success .form-control{border-color:#ffffff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-success .input-group-addon{color:#ffffff;border-color:#ffffff;background-color:#3fb618}.has-success .form-control-feedback{color:#ffffff}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#ffffff}.has-warning .form-control{border-color:#ffffff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-warning .input-group-addon{color:#ffffff;border-color:#ffffff;background-color:#ff7518}.has-warning .form-control-feedback{color:#ffffff}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#ffffff}.has-error .form-control{border-color:#ffffff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-error .input-group-addon{color:#ffffff;border-color:#ffffff;background-color:#ff0039}.has-error .form-control-feedback{color:#ffffff}.has-feedback label~.form-control-feedback{top:26px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:11px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:32px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:11px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:24.9999994px;font-size:19px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:13px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:10px 18px;font-size:15px;line-height:1.42857143;border-radius:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#ffffff;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#ffffff;background-color:#222222;border-color:#222222}.btn-default:focus,.btn-default.focus{color:#ffffff;background-color:#090909;border-color:#000000}.btn-default:hover{color:#ffffff;background-color:#090909;border-color:#040404}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#ffffff;background-color:#090909;border-color:#040404}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#ffffff;background-color:#000000;border-color:#000000}.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.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:#222222;border-color:#222222}.btn-default .badge{color:#222222;background-color:#ffffff}.btn-primary{color:#ffffff;background-color:#2780e3;border-color:#2780e3}.btn-primary:focus,.btn-primary.focus{color:#ffffff;background-color:#1967be;border-color:#10427b}.btn-primary:hover{color:#ffffff;background-color:#1967be;border-color:#1862b5}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#ffffff;background-color:#1967be;border-color:#1862b5}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#ffffff;background-color:#15569f;border-color:#10427b}.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.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:#2780e3;border-color:#2780e3}.btn-primary .badge{color:#2780e3;background-color:#ffffff}.btn-success{color:#ffffff;background-color:#3fb618;border-color:#3fb618}.btn-success:focus,.btn-success.focus{color:#ffffff;background-color:#2f8912;border-color:#184509}.btn-success:hover{color:#ffffff;background-color:#2f8912;border-color:#2c8011}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#ffffff;background-color:#2f8912;border-color:#2c8011}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#ffffff;background-color:#24690e;border-color:#184509}.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.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:#3fb618;border-color:#3fb618}.btn-success .badge{color:#3fb618;background-color:#ffffff}.btn-info{color:#ffffff;background-color:#9954bb;border-color:#9954bb}.btn-info:focus,.btn-info.focus{color:#ffffff;background-color:#7e3f9d;border-color:#522967}.btn-info:hover{color:#ffffff;background-color:#7e3f9d;border-color:#783c96}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#ffffff;background-color:#7e3f9d;border-color:#783c96}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#ffffff;background-color:#6a3484;border-color:#522967}.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.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:#9954bb;border-color:#9954bb}.btn-info .badge{color:#9954bb;background-color:#ffffff}.btn-warning{color:#ffffff;background-color:#ff7518;border-color:#ff7518}.btn-warning:focus,.btn-warning.focus{color:#ffffff;background-color:#e45c00;border-color:#983d00}.btn-warning:hover{color:#ffffff;background-color:#e45c00;border-color:#da5800}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#ffffff;background-color:#e45c00;border-color:#da5800}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#ffffff;background-color:#c04d00;border-color:#983d00}.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.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:#ff7518;border-color:#ff7518}.btn-warning .badge{color:#ff7518;background-color:#ffffff}.btn-danger{color:#ffffff;background-color:#ff0039;border-color:#ff0039}.btn-danger:focus,.btn-danger.focus{color:#ffffff;background-color:#cc002e;border-color:#80001c}.btn-danger:hover{color:#ffffff;background-color:#cc002e;border-color:#c2002b}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#ffffff;background-color:#cc002e;border-color:#c2002b}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#ffffff;background-color:#a80026;border-color:#80001c}.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.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:#ff0039;border-color:#ff0039}.btn-danger .badge{color:#ff0039;background-color:#ffffff}.btn-link{color:#2780e3;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#165ba8;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999999;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:18px 30px;font-size:19px;line-height:1.3333333;border-radius:0}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:13px;line-height:1.5;border-radius:0}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:13px;line-height:1.5;border-radius:0}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;-o-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:0.35s;-o-transition-duration:0.35s;transition-duration:0.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:15px;text-align:left;background-color:#ffffff;border:1px solid #cccccc;border:1px solid rgba(0,0,0,0.15);border-radius:0;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#333333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#ffffff;background-color:#2780e3}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#ffffff;text-decoration:none;outline:0;background-color:#2780e3}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:13px;line-height:1.42857143;color:#999999;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:0;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:64px;padding:18px 30px;font-size:19px;line-height:1.3333333;border-radius:0}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:64px;line-height:64px}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:31px;padding:5px 10px;font-size:13px;line-height:1.5;border-radius:0}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:31px;line-height:31px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:10px 18px;font-size:15px;font-weight:normal;line-height:1;color:#333333;text-align:center;background-color:#e6e6e6;border:1px solid #cccccc;border-radius:0}.input-group-addon.input-sm{padding:5px 10px;font-size:13px;border-radius:0}.input-group-addon.input-lg{padding:18px 30px;font-size:19px;border-radius:0}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#e6e6e6}.nav>li.disabled>a{color:#999999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999999;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#e6e6e6;border-color:#2780e3}.nav .nav-divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #dddddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:0 0 0 0}.nav-tabs>li>a:hover{border-color:#e6e6e6 #e6e6e6 #dddddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555555;background-color:#ffffff;border:1px solid #dddddd;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:0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #dddddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #dddddd;border-radius:0 0 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:#ffffff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:0}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#ffffff;background-color:#2780e3}.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:0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #dddddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #dddddd;border-radius:0 0 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#ffffff}}.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:21px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:0}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:14.5px 15px;font-size:19px;line-height:21px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:0}.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.25px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:21px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:21px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:14.5px;padding-bottom:14.5px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:3.5px;margin-bottom:3.5px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:3.5px;margin-bottom:3.5px}.navbar-btn.btn-sm{margin-top:9.5px;margin-bottom:9.5px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:14.5px;margin-bottom:14.5px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#222222;border-color:#121212}.navbar-default .navbar-brand{color:#ffffff}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#ffffff;background-color:none}.navbar-default .navbar-text{color:#ffffff}.navbar-default .navbar-nav>li>a{color:#ffffff}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#ffffff;background-color:#090909}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#ffffff;background-color:#090909}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#cccccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:transparent}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#090909}.navbar-default .navbar-toggle .icon-bar{background-color:#ffffff}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#121212}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#090909;color:#ffffff}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#ffffff}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#ffffff;background-color:#090909}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#090909}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#cccccc;background-color:transparent}}.navbar-default .navbar-link{color:#ffffff}.navbar-default .navbar-link:hover{color:#ffffff}.navbar-default .btn-link{color:#ffffff}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#ffffff}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#cccccc}.navbar-inverse{background-color:#2780e3;border-color:#1967be}.navbar-inverse .navbar-brand{color:#ffffff}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#ffffff;background-color:none}.navbar-inverse .navbar-text{color:#ffffff}.navbar-inverse .navbar-nav>li>a{color:#ffffff}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#ffffff;background-color:#1967be}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#ffffff;background-color:#1967be}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#ffffff;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:transparent}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#1967be}.navbar-inverse .navbar-toggle .icon-bar{background-color:#ffffff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#1a6ecc}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#1967be;color:#ffffff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#1967be}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#1967be}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#ffffff}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#ffffff;background-color:#1967be}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#1967be}.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:#ffffff;background-color:transparent}}.navbar-inverse .navbar-link{color:#ffffff}.navbar-inverse .navbar-link:hover{color:#ffffff}.navbar-inverse .btn-link{color:#ffffff}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#ffffff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#ffffff}.breadcrumb{padding:8px 15px;margin-bottom:21px;list-style:none;background-color:#f5f5f5;border-radius:0}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#cccccc}.breadcrumb>.active{color:#999999}.pagination{display:inline-block;padding-left:0;margin:21px 0;border-radius:0}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:10px 18px;line-height:1.42857143;text-decoration:none;color:#2780e3;background-color:#ffffff;border:1px solid #dddddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:0;border-top-left-radius:0}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:0;border-top-right-radius:0}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{z-index:3;color:#165ba8;background-color:#e6e6e6;border-color:#dddddd}.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:#999999;background-color:#f5f5f5;border-color:#dddddd;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:#999999;background-color:#ffffff;border-color:#dddddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:18px 30px;font-size:19px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:0;border-top-left-radius:0}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:0;border-top-right-radius:0}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:13px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:0;border-top-left-radius:0}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:0;border-top-right-radius:0}.pager{padding-left:0;margin:21px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#ffffff;border:1px solid #dddddd;border-radius:0}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#e6e6e6}.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:#999999;background-color:#ffffff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#ffffff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#ffffff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#222222}.label-default[href]:hover,.label-default[href]:focus{background-color:#090909}.label-primary{background-color:#2780e3}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#1967be}.label-success{background-color:#3fb618}.label-success[href]:hover,.label-success[href]:focus{background-color:#2f8912}.label-info{background-color:#9954bb}.label-info[href]:hover,.label-info[href]:focus{background-color:#7e3f9d}.label-warning{background-color:#ff7518}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#e45c00}.label-danger{background-color:#ff0039}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#cc002e}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:13px;font-weight:bold;color:#ffffff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#2780e3;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#ffffff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#2780e3;background-color:#ffffff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#e6e6e6}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:23px;font-weight:200}.jumbotron>hr{border-top-color:#cccccc}.container .jumbotron,.container-fluid .jumbotron{border-radius:0}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:68px}}.thumbnail{display:block;padding:4px;margin-bottom:21px;line-height:1.42857143;background-color:#ffffff;border:1px solid #dddddd;border-radius:0;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#2780e3}.thumbnail .caption{padding:9px;color:#333333}.alert{padding:15px;margin-bottom:21px;border:1px solid transparent;border-radius:0}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#3fb618;border-color:#4e9f15;color:#ffffff}.alert-success hr{border-top-color:#438912}.alert-success .alert-link{color:#e6e6e6}.alert-info{background-color:#9954bb;border-color:#7643a8;color:#ffffff}.alert-info hr{border-top-color:#693c96}.alert-info .alert-link{color:#e6e6e6}.alert-warning{background-color:#ff7518;border-color:#ff4309;color:#ffffff}.alert-warning hr{border-top-color:#ee3800}.alert-warning .alert-link{color:#e6e6e6}.alert-danger{background-color:#ff0039;border-color:#f0005e;color:#ffffff}.alert-danger hr{border-top-color:#d60054}.alert-danger .alert-link{color:#e6e6e6}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:21px;margin-bottom:21px;background-color:#cccccc;border-radius:0;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:13px;line-height:21px;color:#ffffff;text-align:center;background-color:#2780e3;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#3fb618}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#9954bb}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#ff7518}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#ff0039}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#ffffff;border:1px solid #dddddd}.list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}a.list-group-item,button.list-group-item{color:#555555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333333}a.list-group-item:hover,button.list-group-item:hover,a.list-group-item:focus,button.list-group-item:focus{text-decoration:none;color:#555555;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#e6e6e6;color:#999999;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#999999}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#ffffff;background-color:#2780e3;border-color:#dddddd}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#dceafa}.list-group-item-success{color:#ffffff;background-color:#3fb618}a.list-group-item-success,button.list-group-item-success{color:#ffffff}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,button.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:focus{color:#ffffff;background-color:#379f15}a.list-group-item-success.active,button.list-group-item-success.active,a.list-group-item-success.active:hover,button.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-info{color:#ffffff;background-color:#9954bb}a.list-group-item-info,button.list-group-item-info{color:#ffffff}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,button.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:focus{color:#ffffff;background-color:#8d46b0}a.list-group-item-info.active,button.list-group-item-info.active,a.list-group-item-info.active:hover,button.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-warning{color:#ffffff;background-color:#ff7518}a.list-group-item-warning,button.list-group-item-warning{color:#ffffff}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,button.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:focus{color:#ffffff;background-color:#fe6600}a.list-group-item-warning.active,button.list-group-item-warning.active,a.list-group-item-warning.active:hover,button.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-danger{color:#ffffff;background-color:#ff0039}a.list-group-item-danger,button.list-group-item-danger{color:#ffffff}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,button.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:focus{color:#ffffff;background-color:#e60033}a.list-group-item-danger.active,button.list-group-item-danger.active,a.list-group-item-danger.active:hover,button.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:21px;background-color:#ffffff;border:1px solid transparent;border-radius:0;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:-1;border-top-left-radius:-1}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:17px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #dddddd;border-bottom-right-radius:-1;border-bottom-left-radius:-1}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:-1;border-top-left-radius:-1}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:-1;border-bottom-left-radius:-1}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:-1;border-top-left-radius:-1}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:-1;border-top-right-radius:-1}.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:-1}.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:-1}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:-1;border-bottom-left-radius:-1}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:-1;border-bottom-right-radius:-1}.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:-1}.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:-1}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #dddddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:21px}.panel-group .panel{margin-bottom:0;border-radius:0}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #dddddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #dddddd}.panel-default{border-color:#dddddd}.panel-default>.panel-heading{color:#333333;background-color:#f5f5f5;border-color:#dddddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#dddddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#dddddd}.panel-primary{border-color:#2780e3}.panel-primary>.panel-heading{color:#ffffff;background-color:#2780e3;border-color:#2780e3}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#2780e3}.panel-primary>.panel-heading .badge{color:#2780e3;background-color:#ffffff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#2780e3}.panel-success{border-color:#4e9f15}.panel-success>.panel-heading{color:#ffffff;background-color:#3fb618;border-color:#4e9f15}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#4e9f15}.panel-success>.panel-heading .badge{color:#3fb618;background-color:#ffffff}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#4e9f15}.panel-info{border-color:#7643a8}.panel-info>.panel-heading{color:#ffffff;background-color:#9954bb;border-color:#7643a8}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#7643a8}.panel-info>.panel-heading .badge{color:#9954bb;background-color:#ffffff}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#7643a8}.panel-warning{border-color:#ff4309}.panel-warning>.panel-heading{color:#ffffff;background-color:#ff7518;border-color:#ff4309}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ff4309}.panel-warning>.panel-heading .badge{color:#ff7518;background-color:#ffffff}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ff4309}.panel-danger{border-color:#f0005e}.panel-danger>.panel-heading{color:#ffffff;background-color:#ff0039;border-color:#f0005e}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#f0005e}.panel-danger>.panel-heading .badge{color:#ff0039;background-color:#ffffff}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#f0005e}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:0}.well-sm{padding:9px;border-radius:0}.close{float:right;font-size:22.5px;font-weight:bold;line-height:1;color:#ffffff;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#ffffff;text-decoration:none;cursor:pointer;opacity:0.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#ffffff;border:1px solid #999999;border:1px solid transparent;border-radius:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:0.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{padding:20px;text-align:right;border-top:1px solid #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}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Source Sans Pro",Calibri,Candara,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:13px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:0.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;background-color:#000000;border-radius:0}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Source Sans Pro",Calibri,Candara,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:15px;background-color:#ffffff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #cccccc;border:1px solid rgba(0,0,0,0.2);border-radius:0;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:15px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:-1 -1 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#ffffff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999999;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#ffffff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#ffffff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999999;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#ffffff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:0.5;filter:alpha(opacity=50);font-size:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.5)), to(rgba(0,0,0,0.0001)));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.0001)), to(rgba(0,0,0,0.5)));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #ffffff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#ffffff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}.navbar-inverse .badge{background-color:#fff;color:#2780e3}body{-webkit-font-smoothing:antialiased}.text-primary,.text-primary:hover{color:#2780e3}.text-success,.text-success:hover{color:#3fb618}.text-danger,.text-danger:hover{color:#ff0039}.text-warning,.text-warning:hover{color:#ff7518}.text-info,.text-info:hover{color:#9954bb}table a:not(.btn),.table a:not(.btn){text-decoration:underline}table .dropdown-menu a,.table .dropdown-menu a{text-decoration:none}table .success,.table .success,table .warning,.table .warning,table .danger,.table .danger,table .info,.table .info{color:#fff}table .success a,.table .success a,table .warning a,.table .warning a,table .danger a,.table .danger a,table .info a,.table .info a{color:#fff}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label,.has-warning .form-control-feedback{color:#ff7518}.has-warning .form-control,.has-warning .form-control:focus,.has-warning .input-group-addon{border:1px solid #ff7518}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label,.has-error .form-control-feedback{color:#ff0039}.has-error .form-control,.has-error .form-control:focus,.has-error .input-group-addon{border:1px solid #ff0039}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label,.has-success .form-control-feedback{color:#3fb618}.has-success .form-control,.has-success .form-control:focus,.has-success .input-group-addon{border:1px solid #3fb618}.nav-pills>li>a{border-radius:0}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-image:none}.close{text-decoration:none;text-shadow:none;opacity:0.4}.close:hover,.close:focus{opacity:1}.alert{border:none}.alert .alert-link{text-decoration:underline;color:#fff}.label{border-radius:0}.progress{height:8px;-webkit-box-shadow:none;box-shadow:none}.progress .progress-bar{font-size:8px;line-height:8px}.panel-heading,.panel-footer{border-top-right-radius:0;border-top-left-radius:0}.panel-default .close{color:#333333}a.list-group-item-success.active{background-color:#3fb618}a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{background-color:#379f15}a.list-group-item-warning.active{background-color:#ff7518}a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{background-color:#fe6600}a.list-group-item-danger.active{background-color:#ff0039}a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{background-color:#e60033}.modal .close{color:#333333}.popover{color:#333333} \ No newline at end of file diff --git a/flask_admin/static/bootstrap/bootstrap3/swatch/cyborg/bootstrap.min.css b/flask_admin/static/bootstrap/bootstrap3/swatch/cyborg/bootstrap.min.css deleted file mode 100644 index b3d808f98..000000000 --- a/flask_admin/static/bootstrap/bootstrap3/swatch/cyborg/bootstrap.min.css +++ /dev/null @@ -1,11 +0,0 @@ -@import url("https://fonts.googleapis.com/css?family=Roboto:400,700");/*! - * bootswatch v3.3.5 - * Homepage: http://bootswatch.com - * Copyright 2012-2015 Thomas Park - * Licensed under MIT - * Based on Bootstrap -*//*! - * Bootstrap v3.3.5 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;-webkit-box-shadow:none !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#888888;background-color:#060606}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#2a9fd6;text-decoration:none}a:hover,a:focus{color:#2a9fd6;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,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#282828;border:1px solid #282828;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #282828}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1;color:#ffffff}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#888888}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:56px}h2,.h2{font-size:45px}h3,.h3{font-size:34px}h4,.h4{font-size:24px}h5,.h5{font-size:20px}h6,.h6{font-size:16px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{background-color:#ff8800;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#888888}.text-primary{color:#2a9fd6}a.text-primary:hover,a.text-primary:focus{color:#2180ac}.text-success{color:#ffffff}a.text-success:hover,a.text-success:focus{color:#e6e6e6}.text-info{color:#ffffff}a.text-info:hover,a.text-info:focus{color:#e6e6e6}.text-warning{color:#ffffff}a.text-warning:hover,a.text-warning:focus{color:#e6e6e6}.text-danger{color:#ffffff}a.text-danger:hover,a.text-danger:focus{color:#e6e6e6}.bg-primary{color:#fff;background-color:#2a9fd6}a.bg-primary:hover,a.bg-primary:focus{background-color:#2180ac}.bg-success{background-color:#77b300}a.bg-success:hover,a.bg-success:focus{background-color:#558000}.bg-info{background-color:#9933cc}a.bg-info:hover,a.bg-info:focus{background-color:#7a29a3}.bg-warning{background-color:#ff8800}a.bg-warning:hover,a.bg-warning:focus{background-color:#cc6d00}.bg-danger{background-color:#cc0000}a.bg-danger:hover,a.bg-danger:focus{background-color:#990000}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #282828}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;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #888888}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #282828}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#555555}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 #282828;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#ffffff;background-color:#333333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#282828;background-color:#f5f5f5;border:1px solid #cccccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0%}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0%}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0%}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0%}}table{background-color:#181818}caption{padding-top:8px;padding-bottom:8px;color:#888888;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #282828}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #282828}.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 #282828}.table .table{background-color:#060606}.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 #282828}.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 #282828}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#080808}.table-hover>tbody>tr:hover{background-color:#282828}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:#282828}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#1b1b1b}.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:#77b300}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#669a00}.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:#9933cc}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#8a2eb8}.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:#ff8800}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#e67a00}.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:#cc0000}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#b30000}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #282828}.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:#888888;border:0;border-bottom:1px solid #282828}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:9px;font-size:14px;line-height:1.42857143;color:#888888}.form-control{display:block;width:100%;height:38px;padding:8px 12px;font-size:14px;line-height:1.42857143;color:#888888;background-color:#ffffff;background-image:none;border:1px solid #282828;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control::-moz-placeholder{color:#888888;opacity:1}.form-control:-ms-input-placeholder{color:#888888}.form-control::-webkit-input-placeholder{color:#888888}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#adafae;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:38px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:54px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:9px;padding-bottom:9px;margin-bottom:0;min-height:34px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:54px;padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:54px;line-height:54px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:54px;padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:54px;line-height:54px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:54px;min-height:38px;padding:15px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:47.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:38px;height:38px;line-height:38px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:54px;height:54px;line-height:54px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#ffffff}.has-success .form-control{border-color:#ffffff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-success .input-group-addon{color:#ffffff;border-color:#ffffff;background-color:#77b300}.has-success .form-control-feedback{color:#ffffff}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#ffffff}.has-warning .form-control{border-color:#ffffff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-warning .input-group-addon{color:#ffffff;border-color:#ffffff;background-color:#ff8800}.has-warning .form-control-feedback{color:#ffffff}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#ffffff}.has-error .form-control{border-color:#ffffff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-error .input-group-addon{color:#ffffff;border-color:#ffffff;background-color:#cc0000}.has-error .form-control-feedback{color:#ffffff}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#c8c8c8}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:9px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:29px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:9px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:19.6666662px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:8px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#ffffff;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#ffffff;background-color:#424242;border-color:#424242}.btn-default:focus,.btn-default.focus{color:#ffffff;background-color:#282828;border-color:#020202}.btn-default:hover{color:#ffffff;background-color:#282828;border-color:#232323}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#ffffff;background-color:#282828;border-color:#232323}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#ffffff;background-color:#161616;border-color:#020202}.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.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:#424242;border-color:#424242}.btn-default .badge{color:#424242;background-color:#ffffff}.btn-primary{color:#ffffff;background-color:#2a9fd6;border-color:#2a9fd6}.btn-primary:focus,.btn-primary.focus{color:#ffffff;background-color:#2180ac;border-color:#15506c}.btn-primary:hover{color:#ffffff;background-color:#2180ac;border-color:#1f79a3}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#ffffff;background-color:#2180ac;border-color:#1f79a3}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#ffffff;background-color:#1b698e;border-color:#15506c}.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.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:#2a9fd6;border-color:#2a9fd6}.btn-primary .badge{color:#2a9fd6;background-color:#ffffff}.btn-success{color:#ffffff;background-color:#77b300;border-color:#77b300}.btn-success:focus,.btn-success.focus{color:#ffffff;background-color:#558000;border-color:#223300}.btn-success:hover{color:#ffffff;background-color:#558000;border-color:#4e7600}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#ffffff;background-color:#558000;border-color:#4e7600}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#ffffff;background-color:#3d5c00;border-color:#223300}.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.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:#77b300;border-color:#77b300}.btn-success .badge{color:#77b300;background-color:#ffffff}.btn-info{color:#ffffff;background-color:#9933cc;border-color:#9933cc}.btn-info:focus,.btn-info.focus{color:#ffffff;background-color:#7a29a3;border-color:#4c1966}.btn-info:hover{color:#ffffff;background-color:#7a29a3;border-color:#74279b}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#ffffff;background-color:#7a29a3;border-color:#74279b}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#ffffff;background-color:#652287;border-color:#4c1966}.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.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:#9933cc;border-color:#9933cc}.btn-info .badge{color:#9933cc;background-color:#ffffff}.btn-warning{color:#ffffff;background-color:#ff8800;border-color:#ff8800}.btn-warning:focus,.btn-warning.focus{color:#ffffff;background-color:#cc6d00;border-color:#804400}.btn-warning:hover{color:#ffffff;background-color:#cc6d00;border-color:#c26700}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#ffffff;background-color:#cc6d00;border-color:#c26700}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#ffffff;background-color:#a85a00;border-color:#804400}.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.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:#ff8800;border-color:#ff8800}.btn-warning .badge{color:#ff8800;background-color:#ffffff}.btn-danger{color:#ffffff;background-color:#cc0000;border-color:#cc0000}.btn-danger:focus,.btn-danger.focus{color:#ffffff;background-color:#990000;border-color:#4d0000}.btn-danger:hover{color:#ffffff;background-color:#990000;border-color:#8f0000}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#ffffff;background-color:#990000;border-color:#8f0000}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#ffffff;background-color:#750000;border-color:#4d0000}.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.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:#cc0000;border-color:#cc0000}.btn-danger .badge{color:#cc0000;background-color:#ffffff}.btn-link{color:#2a9fd6;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a9fd6;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:#888888;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;-o-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:0.35s;-o-transition-duration:0.35s;transition-duration:0.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#222222;border:1px solid #444444;border:1px solid rgba(255,255,255,0.1);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:rgba(255,255,255,0.1)}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#ffffff;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#ffffff;background-color:#2a9fd6}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#ffffff;text-decoration:none;outline:0;background-color:#2a9fd6}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#888888}.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.42857143;color:#888888;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:54px;padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:54px;line-height:54px}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:8px 12px;font-size:14px;font-weight:normal;line-height:1;color:#888888;text-align:center;background-color:#adafae;border:1px solid #282828;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:14px 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{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#222222}.nav>li.disabled>a{color:#888888}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#888888;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#222222;border-color:#2a9fd6}.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 #282828}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:transparent transparent #282828}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#ffffff;background-color:#2a9fd6;border:1px solid #282828;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 #dddddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #dddddd;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:#060606}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#ffffff;background-color:#2a9fd6}.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 #dddddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #dddddd;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:#060606}}.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{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top: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;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:6px;margin-bottom:6px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:6px;margin-bottom:6px}.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}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#060606;border-color:#282828}.navbar-default .navbar-brand{color:#ffffff}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#ffffff;background-color:transparent}.navbar-default .navbar-text{color:#888888}.navbar-default .navbar-nav>li>a{color:#888888}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#ffffff;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#ffffff;background-color:transparent}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#888888;background-color:transparent}.navbar-default .navbar-toggle{border-color:#282828}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#282828}.navbar-default .navbar-toggle .icon-bar{background-color:#cccccc}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#282828}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:transparent;color:#ffffff}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#888888}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#ffffff;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:transparent}.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:#888888;background-color:transparent}}.navbar-default .navbar-link{color:#888888}.navbar-default .navbar-link:hover{color:#ffffff}.navbar-default .btn-link{color:#888888}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#ffffff}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#888888}.navbar-inverse{background-color:#222222;border-color:#080808}.navbar-inverse .navbar-brand{color:#ffffff}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#ffffff;background-color:transparent}.navbar-inverse .navbar-text{color:#888888}.navbar-inverse .navbar-nav>li>a{color:#888888}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#ffffff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#ffffff;background-color:transparent}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#aaaaaa;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#ffffff}.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:transparent;color:#ffffff}@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:#888888}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#ffffff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#aaaaaa;background-color:transparent}}.navbar-inverse .navbar-link{color:#888888}.navbar-inverse .navbar-link:hover{color:#ffffff}.navbar-inverse .btn-link{color:#888888}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#ffffff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#aaaaaa}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#222222;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ffffff}.breadcrumb>.active{color:#888888}.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:8px 12px;line-height:1.42857143;text-decoration:none;color:#ffffff;background-color:#222222;border:1px solid #282828;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{z-index:3;color:#ffffff;background-color:#2a9fd6;border-color:transparent}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#ffffff;background-color:#2a9fd6;border-color:transparent;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#888888;background-color:#222222;border-color:#282828;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:14px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin: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:#222222;border:1px solid #282828;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#2a9fd6}.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:#888888;background-color:#222222;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#ffffff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#ffffff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#424242}.label-default[href]:hover,.label-default[href]:focus{background-color:#282828}.label-primary{background-color:#2a9fd6}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#2180ac}.label-success{background-color:#77b300}.label-success[href]:hover,.label-success[href]:focus{background-color:#558000}.label-info{background-color:#9933cc}.label-info[href]:hover,.label-info[href]:focus{background-color:#7a29a3}.label-warning{background-color:#ff8800}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#cc6d00}.label-danger{background-color:#cc0000}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#990000}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;color:#ffffff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#2a9fd6;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#ffffff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#2a9fd6;background-color:#ffffff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#151515}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#000000}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#282828;border:1px solid #282828;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#2a9fd6}.thumbnail .caption{padding:9px;color:#888888}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#77b300;border-color:#809a00;color:#ffffff}.alert-success hr{border-top-color:#6a8000}.alert-success .alert-link{color:#e6e6e6}.alert-info{background-color:#9933cc;border-color:#6e2caf;color:#ffffff}.alert-info hr{border-top-color:#61279b}.alert-info .alert-link{color:#e6e6e6}.alert-warning{background-color:#ff8800;border-color:#f05800;color:#ffffff}.alert-warning hr{border-top-color:#d64f00}.alert-warning .alert-link{color:#e6e6e6}.alert-danger{background-color:#cc0000;border-color:#bd001f;color:#ffffff}.alert-danger hr{border-top-color:#a3001b}.alert-danger .alert-link{color:#e6e6e6}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#222222;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:20px;color:#ffffff;text-align:center;background-color:#2a9fd6;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#77b300}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#9933cc}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#ff8800}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#cc0000}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#222222;border:1px solid #282828}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#888888}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#ffffff}a.list-group-item:hover,button.list-group-item:hover,a.list-group-item:focus,button.list-group-item:focus{text-decoration:none;color:#888888;background-color:#484848}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#adafae;color:#888888;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#888888}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#ffffff;background-color:#2a9fd6;border-color:#2a9fd6}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#d5ecf7}.list-group-item-success{color:#ffffff;background-color:#77b300}a.list-group-item-success,button.list-group-item-success{color:#ffffff}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,button.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:focus{color:#ffffff;background-color:#669a00}a.list-group-item-success.active,button.list-group-item-success.active,a.list-group-item-success.active:hover,button.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-info{color:#ffffff;background-color:#9933cc}a.list-group-item-info,button.list-group-item-info{color:#ffffff}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,button.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:focus{color:#ffffff;background-color:#8a2eb8}a.list-group-item-info.active,button.list-group-item-info.active,a.list-group-item-info.active:hover,button.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-warning{color:#ffffff;background-color:#ff8800}a.list-group-item-warning,button.list-group-item-warning{color:#ffffff}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,button.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:focus{color:#ffffff;background-color:#e67a00}a.list-group-item-warning.active,button.list-group-item-warning.active,a.list-group-item-warning.active:hover,button.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-danger{color:#ffffff;background-color:#cc0000}a.list-group-item-danger,button.list-group-item-danger{color:#ffffff}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,button.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:focus{color:#ffffff;background-color:#b30000}a.list-group-item-danger.active,button.list-group-item-danger.active,a.list-group-item-danger.active:hover,button.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#222222;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#3c3c3c;border-top:1px solid #282828;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #282828}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #282828}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #282828}.panel-default{border-color:#282828}.panel-default>.panel-heading{color:#888888;background-color:#3c3c3c;border-color:#282828}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#282828}.panel-default>.panel-heading .badge{color:#3c3c3c;background-color:#888888}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#282828}.panel-primary{border-color:#2a9fd6}.panel-primary>.panel-heading{color:#ffffff;background-color:#2a9fd6;border-color:#2a9fd6}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#2a9fd6}.panel-primary>.panel-heading .badge{color:#2a9fd6;background-color:#ffffff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#2a9fd6}.panel-success{border-color:#809a00}.panel-success>.panel-heading{color:#ffffff;background-color:#77b300;border-color:#809a00}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#809a00}.panel-success>.panel-heading .badge{color:#77b300;background-color:#ffffff}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#809a00}.panel-info{border-color:#6e2caf}.panel-info>.panel-heading{color:#ffffff;background-color:#9933cc;border-color:#6e2caf}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#6e2caf}.panel-info>.panel-heading .badge{color:#9933cc;background-color:#ffffff}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#6e2caf}.panel-warning{border-color:#f05800}.panel-warning>.panel-heading{color:#ffffff;background-color:#ff8800;border-color:#f05800}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#f05800}.panel-warning>.panel-heading .badge{color:#ff8800;background-color:#ffffff}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#f05800}.panel-danger{border-color:#bd001f}.panel-danger>.panel-heading{color:#ffffff;background-color:#cc0000;border-color:#bd001f}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bd001f}.panel-danger>.panel-heading .badge{color:#cc0000;background-color:#ffffff}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bd001f}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#151515;border:1px solid #030303;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000000;text-decoration:none;cursor:pointer;opacity:0.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#202020;border:1px solid #999999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:0.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #282828;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{padding:20px;text-align:right;border-top:1px solid #282828}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:12px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:0.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;background-color:#000000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:14px;background-color:#202020;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;background-color:#181818;border-bottom:1px solid #0b0b0b;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#666666;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#202020}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#666666;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#202020}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#666666;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#202020}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#666666;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#202020;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:0.5;filter:alpha(opacity=50);font-size:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.5)), to(rgba(0,0,0,0.0001)));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.0001)), to(rgba(0,0,0,0.5)));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #ffffff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#ffffff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}.text-primary,.text-primary:hover{color:#2a9fd6}.text-success,.text-success:hover{color:#77b300}.text-danger,.text-danger:hover{color:#cc0000}.text-warning,.text-warning:hover{color:#ff8800}.text-info,.text-info:hover{color:#9933cc}.bg-success,.bg-info,.bg-warning,.bg-danger{color:#fff}table,.table{color:#fff}table a:not(.btn),.table a:not(.btn){color:#fff;text-decoration:underline}table .dropdown-menu a,.table .dropdown-menu a{text-decoration:none}table .text-muted,.table .text-muted{color:#888888}.table-responsive>.table{background-color:#181818}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label,.has-warning .form-control-feedback{color:#ff8800}.has-warning .form-control,.has-warning .form-control:focus,.has-warning .input-group-addon{border-color:#ff8800}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label,.has-error .form-control-feedback{color:#cc0000}.has-error .form-control,.has-error .form-control:focus,.has-error .input-group-addon{border-color:#cc0000}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label,.has-success .form-control-feedback{color:#77b300}.has-success .form-control,.has-success .form-control:focus,.has-success .input-group-addon{border-color:#77b300}legend{color:#fff}.input-group-addon{background-color:#424242}.nav-tabs a,.nav-pills a,.breadcrumb a,.pager a{color:#fff}.alert .alert-link,.alert a{color:#ffffff;text-decoration:underline}.alert .close{text-decoration:none}.close{color:#fff;text-decoration:none;opacity:0.4}.close:hover,.close:focus{color:#fff;opacity:1}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#282828}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{border-color:#282828}a.list-group-item-success.active{background-color:#77b300}a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{background-color:#669a00}a.list-group-item-warning.active{background-color:#ff8800}a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{background-color:#e67a00}a.list-group-item-danger.active{background-color:#cc0000}a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{background-color:#b30000}.jumbotron h1,.jumbotron h2,.jumbotron h3,.jumbotron h4,.jumbotron h5,.jumbotron h6{color:#fff} \ No newline at end of file diff --git a/flask_admin/static/bootstrap/bootstrap3/swatch/darkly/bootstrap.min.css b/flask_admin/static/bootstrap/bootstrap3/swatch/darkly/bootstrap.min.css deleted file mode 100644 index c64060734..000000000 --- a/flask_admin/static/bootstrap/bootstrap3/swatch/darkly/bootstrap.min.css +++ /dev/null @@ -1,11 +0,0 @@ -@import url("https://fonts.googleapis.com/css?family=Lato:400,700,400italic");/*! - * bootswatch v3.3.5 - * Homepage: http://bootswatch.com - * Copyright 2012-2015 Thomas Park - * Licensed under MIT - * Based on Bootstrap -*//*! - * Bootstrap v3.3.5 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;-webkit-box-shadow:none !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:15px;line-height:1.42857143;color:#ffffff;background-color:#222222}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#0ce3ac;text-decoration:none}a:hover,a:focus{color:#0ce3ac;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:2px;line-height:1.42857143;background-color:#222222;border:1px solid #464545;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:21px;margin-bottom:21px;border:0;border-top:1px solid #464545}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#999999}h1,.h1,h2,.h2,h3,.h3{margin-top:21px;margin-bottom:10.5px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10.5px;margin-bottom:10.5px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:39px}h2,.h2{font-size:32px}h3,.h3{font-size:26px}h4,.h4{font-size:19px}h5,.h5{font-size:15px}h6,.h6{font-size:13px}p{margin:0 0 10.5px}.lead{margin-bottom:21px;font-size:17px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:22.5px}}small,.small{font-size:86%}mark,.mark{background-color:#f39c12;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#999999}.text-primary{color:#375a7f}a.text-primary:hover,a.text-primary:focus{color:#28415b}.text-success{color:#ffffff}a.text-success:hover,a.text-success:focus{color:#e6e6e6}.text-info{color:#ffffff}a.text-info:hover,a.text-info:focus{color:#e6e6e6}.text-warning{color:#ffffff}a.text-warning:hover,a.text-warning:focus{color:#e6e6e6}.text-danger{color:#ffffff}a.text-danger:hover,a.text-danger:focus{color:#e6e6e6}.bg-primary{color:#fff;background-color:#375a7f}a.bg-primary:hover,a.bg-primary:focus{background-color:#28415b}.bg-success{background-color:#00bc8c}a.bg-success:hover,a.bg-success:focus{background-color:#008966}.bg-info{background-color:#3498db}a.bg-info:hover,a.bg-info:focus{background-color:#217dbb}.bg-warning{background-color:#f39c12}a.bg-warning:hover,a.bg-warning:focus{background-color:#c87f0a}.bg-danger{background-color:#e74c3c}a.bg-danger:hover,a.bg-danger:focus{background-color:#d62c1a}.page-header{padding-bottom:9.5px;margin:42px 0 21px;border-bottom:1px solid transparent}ul,ol{margin-top:0;margin-bottom:10.5px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:21px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10.5px 21px;margin:0 0 21px;font-size:18.75px;border-left:5px solid #464545}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#999999}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #464545;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:21px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#ffffff;background-color:#333333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:10px;margin:0 0 10.5px;font-size:14px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#303030;background-color:#ebebeb;border:1px solid #cccccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0%}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0%}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0%}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0%}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#999999;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:21px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #464545}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #464545}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #464545}.table .table{background-color:#222222}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #464545}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #464545}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#3d3d3d}.table-hover>tbody>tr:hover{background-color:#464545}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#464545}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#393838}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#00bc8c}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#00a379}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#3498db}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#258cd1}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#f39c12}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#e08e0b}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#e74c3c}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#e43725}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15.75px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #464545}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:21px;font-size:22.5px;line-height:inherit;color:#ffffff;border:0;border-bottom:1px solid transparent}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:11px;font-size:15px;line-height:1.42857143;color:#464545}.form-control{display:block;width:100%;height:45px;padding:10px 15px;font-size:15px;line-height:1.42857143;color:#464545;background-color:#ffffff;background-image:none;border:1px solid #f1f1f1;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#ffffff;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(255,255,255,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(255,255,255,0.6)}.form-control::-moz-placeholder{color:#999999;opacity:1}.form-control:-ms-input-placeholder{color:#999999}.form-control::-webkit-input-placeholder{color:#999999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#ebebeb;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:45px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:35px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:66px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:21px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:11px;padding-bottom:11px;margin-bottom:0;min-height:36px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:35px;padding:6px 9px;font-size:13px;line-height:1.5;border-radius:3px}select.input-sm{height:35px;line-height:35px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:35px;padding:6px 9px;font-size:13px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:35px;line-height:35px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:35px;min-height:34px;padding:7px 9px;font-size:13px;line-height:1.5}.input-lg{height:66px;padding:18px 27px;font-size:19px;line-height:1.3333333;border-radius:6px}select.input-lg{height:66px;line-height:66px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:66px;padding:18px 27px;font-size:19px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:66px;line-height:66px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:66px;min-height:40px;padding:19px 27px;font-size:19px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:56.25px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:45px;height:45px;line-height:45px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:66px;height:66px;line-height:66px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:35px;height:35px;line-height:35px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#ffffff}.has-success .form-control{border-color:#ffffff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-success .input-group-addon{color:#ffffff;border-color:#ffffff;background-color:#00bc8c}.has-success .form-control-feedback{color:#ffffff}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#ffffff}.has-warning .form-control{border-color:#ffffff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-warning .input-group-addon{color:#ffffff;border-color:#ffffff;background-color:#f39c12}.has-warning .form-control-feedback{color:#ffffff}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#ffffff}.has-error .form-control{border-color:#ffffff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-error .input-group-addon{color:#ffffff;border-color:#ffffff;background-color:#e74c3c}.has-error .form-control-feedback{color:#ffffff}.has-feedback label~.form-control-feedback{top:26px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#ffffff}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:11px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:32px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:11px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:24.9999994px;font-size:19px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:7px;font-size:13px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:10px 15px;font-size:15px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#ffffff;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#ffffff;background-color:#464545;border-color:#464545}.btn-default:focus,.btn-default.focus{color:#ffffff;background-color:#2c2c2c;border-color:#060606}.btn-default:hover{color:#ffffff;background-color:#2c2c2c;border-color:#272727}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#ffffff;background-color:#2c2c2c;border-color:#272727}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#ffffff;background-color:#1a1a1a;border-color:#060606}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#464545;border-color:#464545}.btn-default .badge{color:#464545;background-color:#ffffff}.btn-primary{color:#ffffff;background-color:#375a7f;border-color:#375a7f}.btn-primary:focus,.btn-primary.focus{color:#ffffff;background-color:#28415b;border-color:#101b26}.btn-primary:hover{color:#ffffff;background-color:#28415b;border-color:#253c54}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#ffffff;background-color:#28415b;border-color:#253c54}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#ffffff;background-color:#1d2f43;border-color:#101b26}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#375a7f;border-color:#375a7f}.btn-primary .badge{color:#375a7f;background-color:#ffffff}.btn-success{color:#ffffff;background-color:#00bc8c;border-color:#00bc8c}.btn-success:focus,.btn-success.focus{color:#ffffff;background-color:#008966;border-color:#003d2d}.btn-success:hover{color:#ffffff;background-color:#008966;border-color:#007f5e}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#ffffff;background-color:#008966;border-color:#007f5e}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#ffffff;background-color:#00654b;border-color:#003d2d}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#00bc8c;border-color:#00bc8c}.btn-success .badge{color:#00bc8c;background-color:#ffffff}.btn-info{color:#ffffff;background-color:#3498db;border-color:#3498db}.btn-info:focus,.btn-info.focus{color:#ffffff;background-color:#217dbb;border-color:#16527a}.btn-info:hover{color:#ffffff;background-color:#217dbb;border-color:#2077b2}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#ffffff;background-color:#217dbb;border-color:#2077b2}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#ffffff;background-color:#1c699d;border-color:#16527a}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#3498db;border-color:#3498db}.btn-info .badge{color:#3498db;background-color:#ffffff}.btn-warning{color:#ffffff;background-color:#f39c12;border-color:#f39c12}.btn-warning:focus,.btn-warning.focus{color:#ffffff;background-color:#c87f0a;border-color:#7f5006}.btn-warning:hover{color:#ffffff;background-color:#c87f0a;border-color:#be780a}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#ffffff;background-color:#c87f0a;border-color:#be780a}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#ffffff;background-color:#a66908;border-color:#7f5006}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f39c12;border-color:#f39c12}.btn-warning .badge{color:#f39c12;background-color:#ffffff}.btn-danger{color:#ffffff;background-color:#e74c3c;border-color:#e74c3c}.btn-danger:focus,.btn-danger.focus{color:#ffffff;background-color:#d62c1a;border-color:#921e12}.btn-danger:hover{color:#ffffff;background-color:#d62c1a;border-color:#cd2a19}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#ffffff;background-color:#d62c1a;border-color:#cd2a19}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#ffffff;background-color:#b62516;border-color:#921e12}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#e74c3c;border-color:#e74c3c}.btn-danger .badge{color:#e74c3c;background-color:#ffffff}.btn-link{color:#0ce3ac;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#0ce3ac;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999999;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:18px 27px;font-size:19px;line-height:1.3333333;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:6px 9px;font-size:13px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:13px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;-o-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:0.35s;-o-transition-duration:0.35s;transition-duration:0.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:15px;text-align:left;background-color:#303030;border:1px solid #cccccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:#464545}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#ebebeb;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#ffffff;background-color:#375a7f}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#ffffff;text-decoration:none;outline:0;background-color:#375a7f}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:13px;line-height:1.42857143;color:#999999;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:66px;padding:18px 27px;font-size:19px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:66px;line-height:66px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:35px;padding:6px 9px;font-size:13px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:35px;line-height:35px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:10px 15px;font-size:15px;font-weight:normal;line-height:1;color:#464545;text-align:center;background-color:#464545;border:1px solid transparent;border-radius:4px}.input-group-addon.input-sm{padding:6px 9px;font-size:13px;border-radius:3px}.input-group-addon.input-lg{padding:18px 27px;font-size:19px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#303030}.nav>li.disabled>a{color:#605e5e}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#605e5e;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#303030;border-color:#0ce3ac}.nav .nav-divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #464545}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#464545 #464545 #464545}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#00bc8c;background-color:#222222;border:1px solid #464545;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ebebeb}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ebebeb;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#222222}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#ffffff;background-color:#375a7f}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ebebeb}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ebebeb;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#222222}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:60px;margin-bottom:21px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:19.5px 15px;font-size:19px;line-height:21px;height:60px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:13px;margin-bottom:13px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:9.75px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:21px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:21px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:19.5px;padding-bottom:19.5px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:7.5px;margin-bottom:7.5px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:7.5px;margin-bottom:7.5px}.navbar-btn.btn-sm{margin-top:12.5px;margin-bottom:12.5px}.navbar-btn.btn-xs{margin-top:19px;margin-bottom:19px}.navbar-text{margin-top:19.5px;margin-bottom:19.5px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#375a7f;border-color:transparent}.navbar-default .navbar-brand{color:#ffffff}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#00bc8c;background-color:transparent}.navbar-default .navbar-text{color:#777777}.navbar-default .navbar-nav>li>a{color:#ffffff}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#00bc8c;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#ffffff;background-color:#28415b}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#cccccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#28415b}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#28415b}.navbar-default .navbar-toggle .icon-bar{background-color:#ffffff}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:transparent}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#28415b;color:#ffffff}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#ffffff}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#00bc8c;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#28415b}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#cccccc;background-color:transparent}}.navbar-default .navbar-link{color:#ffffff}.navbar-default .navbar-link:hover{color:#00bc8c}.navbar-default .btn-link{color:#ffffff}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#00bc8c}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#cccccc}.navbar-inverse{background-color:#00bc8c;border-color:transparent}.navbar-inverse .navbar-brand{color:#ffffff}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#375a7f;background-color:transparent}.navbar-inverse .navbar-text{color:#ffffff}.navbar-inverse .navbar-nav>li>a{color:#ffffff}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#375a7f;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#ffffff;background-color:#00a379}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#aaaaaa;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#008966}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#008966}.navbar-inverse .navbar-toggle .icon-bar{background-color:#ffffff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#009871}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#00a379;color:#ffffff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#ffffff}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#375a7f;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#00a379}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#aaaaaa;background-color:transparent}}.navbar-inverse .navbar-link{color:#ffffff}.navbar-inverse .navbar-link:hover{color:#375a7f}.navbar-inverse .btn-link{color:#ffffff}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#375a7f}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#aaaaaa}.breadcrumb{padding:8px 15px;margin-bottom:21px;list-style:none;background-color:#464545;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ffffff}.breadcrumb>.active{color:#999999}.pagination{display:inline-block;padding-left:0;margin:21px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:10px 15px;line-height:1.42857143;text-decoration:none;color:#ffffff;background-color:#00bc8c;border:1px solid transparent;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{z-index:3;color:#ffffff;background-color:#00dba3;border-color:transparent}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#ffffff;background-color:#00dba3;border-color:transparent;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#ffffff;background-color:#007053;border-color:transparent;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:18px 27px;font-size:19px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:6px 9px;font-size:13px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:21px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#00bc8c;border:1px solid transparent;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#00dba3}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#dddddd;background-color:#00bc8c;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#ffffff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#ffffff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#464545}.label-default[href]:hover,.label-default[href]:focus{background-color:#2c2c2c}.label-primary{background-color:#375a7f}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#28415b}.label-success{background-color:#00bc8c}.label-success[href]:hover,.label-success[href]:focus{background-color:#008966}.label-info{background-color:#3498db}.label-info[href]:hover,.label-info[href]:focus{background-color:#217dbb}.label-warning{background-color:#f39c12}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#c87f0a}.label-danger{background-color:#e74c3c}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#d62c1a}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:13px;font-weight:bold;color:#ffffff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#464545;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#ffffff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#375a7f;background-color:#ffffff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#303030}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:23px;font-weight:200}.jumbotron>hr{border-top-color:#161616}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:68px}}.thumbnail{display:block;padding:2px;margin-bottom:21px;line-height:1.42857143;background-color:#222222;border:1px solid #464545;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#0ce3ac}.thumbnail .caption{padding:9px;color:#ffffff}.alert{padding:15px;margin-bottom:21px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#00bc8c;border-color:#00bc8c;color:#ffffff}.alert-success hr{border-top-color:#00a379}.alert-success .alert-link{color:#e6e6e6}.alert-info{background-color:#3498db;border-color:#3498db;color:#ffffff}.alert-info hr{border-top-color:#258cd1}.alert-info .alert-link{color:#e6e6e6}.alert-warning{background-color:#f39c12;border-color:#f39c12;color:#ffffff}.alert-warning hr{border-top-color:#e08e0b}.alert-warning .alert-link{color:#e6e6e6}.alert-danger{background-color:#e74c3c;border-color:#e74c3c;color:#ffffff}.alert-danger hr{border-top-color:#e43725}.alert-danger .alert-link{color:#e6e6e6}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:21px;margin-bottom:21px;background-color:#ebebeb;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:13px;line-height:21px;color:#ffffff;text-align:center;background-color:#375a7f;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#00bc8c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#3498db}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#f39c12}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#e74c3c}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#303030;border:1px solid #464545}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#0ce3ac}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#0bcb9a}a.list-group-item:hover,button.list-group-item:hover,a.list-group-item:focus,button.list-group-item:focus{text-decoration:none;color:#0ce3ac;background-color:transparent}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#ebebeb;color:#999999;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#999999}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#ffffff;background-color:#375a7f;border-color:#375a7f}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#a8c0da}.list-group-item-success{color:#ffffff;background-color:#00bc8c}a.list-group-item-success,button.list-group-item-success{color:#ffffff}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,button.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:focus{color:#ffffff;background-color:#00a379}a.list-group-item-success.active,button.list-group-item-success.active,a.list-group-item-success.active:hover,button.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-info{color:#ffffff;background-color:#3498db}a.list-group-item-info,button.list-group-item-info{color:#ffffff}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,button.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:focus{color:#ffffff;background-color:#258cd1}a.list-group-item-info.active,button.list-group-item-info.active,a.list-group-item-info.active:hover,button.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-warning{color:#ffffff;background-color:#f39c12}a.list-group-item-warning,button.list-group-item-warning{color:#ffffff}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,button.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:focus{color:#ffffff;background-color:#e08e0b}a.list-group-item-warning.active,button.list-group-item-warning.active,a.list-group-item-warning.active:hover,button.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-danger{color:#ffffff;background-color:#e74c3c}a.list-group-item-danger,button.list-group-item-danger{color:#ffffff}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,button.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:focus{color:#ffffff;background-color:#e43725}a.list-group-item-danger.active,button.list-group-item-danger.active,a.list-group-item-danger.active:hover,button.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:21px;background-color:#303030;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:17px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#464545;border-top:1px solid #464545;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #464545}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:21px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #464545}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #464545}.panel-default{border-color:#464545}.panel-default>.panel-heading{color:#ffffff;background-color:#303030;border-color:#464545}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#464545}.panel-default>.panel-heading .badge{color:#303030;background-color:#ffffff}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#464545}.panel-primary{border-color:#375a7f}.panel-primary>.panel-heading{color:#ffffff;background-color:#375a7f;border-color:#375a7f}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#375a7f}.panel-primary>.panel-heading .badge{color:#375a7f;background-color:#ffffff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#375a7f}.panel-success{border-color:#00bc8c}.panel-success>.panel-heading{color:#ffffff;background-color:#00bc8c;border-color:#00bc8c}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#00bc8c}.panel-success>.panel-heading .badge{color:#00bc8c;background-color:#ffffff}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#00bc8c}.panel-info{border-color:#3498db}.panel-info>.panel-heading{color:#ffffff;background-color:#3498db;border-color:#3498db}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#3498db}.panel-info>.panel-heading .badge{color:#3498db;background-color:#ffffff}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#3498db}.panel-warning{border-color:#f39c12}.panel-warning>.panel-heading{color:#ffffff;background-color:#f39c12;border-color:#f39c12}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#f39c12}.panel-warning>.panel-heading .badge{color:#f39c12;background-color:#ffffff}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#f39c12}.panel-danger{border-color:#e74c3c}.panel-danger>.panel-heading{color:#ffffff;background-color:#e74c3c;border-color:#e74c3c}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#e74c3c}.panel-danger>.panel-heading .badge{color:#e74c3c;background-color:#ffffff}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#e74c3c}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#303030;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:22.5px;font-weight:bold;line-height:1;color:#ffffff;text-shadow:none;opacity:0.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#ffffff;text-decoration:none;cursor:pointer;opacity:0.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#303030;border:1px solid #999999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:0.7;filter:alpha(opacity=70)}.modal-header{padding:15px;border-bottom:1px solid #464545;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{padding:20px;text-align:right;border-top:1px solid #464545}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:13px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:0.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;background-color:#000000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:15px;background-color:#303030;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:15px;background-color:#282828;border-bottom:1px solid #1c1c1c;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#666666;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#303030}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#666666;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#303030}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#666666;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#303030}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#666666;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#303030;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:0.5;filter:alpha(opacity=50);font-size:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.5)), to(rgba(0,0,0,0.0001)));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.0001)), to(rgba(0,0,0,0.5)));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #ffffff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#ffffff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}.navbar{border-width:0}.navbar-default .badge{background-color:#fff;color:#375a7f}.navbar-inverse .badge{background-color:#fff;color:#00bc8c}.navbar-brand{line-height:1}.navbar-form .form-control{background-color:white}.navbar-form .form-control:focus{border-color:white}.btn{border-width:2px}.btn:active{-webkit-box-shadow:none;box-shadow:none}.btn-group.open .dropdown-toggle{-webkit-box-shadow:none;box-shadow:none}.text-primary,.text-primary:hover{color:#4673a3}.text-success,.text-success:hover{color:#00bc8c}.text-danger,.text-danger:hover{color:#e74c3c}.text-warning,.text-warning:hover{color:#f39c12}.text-info,.text-info:hover{color:#3498db}table a:not(.btn),.table a:not(.btn){text-decoration:underline}table .dropdown-menu a,.table .dropdown-menu a{text-decoration:none}table .success,.table .success,table .warning,.table .warning,table .danger,.table .danger,table .info,.table .info{color:#fff}table .success>th>a,.table .success>th>a,table .warning>th>a,.table .warning>th>a,table .danger>th>a,.table .danger>th>a,table .info>th>a,.table .info>th>a,table .success>td>a,.table .success>td>a,table .warning>td>a,.table .warning>td>a,table .danger>td>a,.table .danger>td>a,table .info>td>a,.table .info>td>a,table .success>a,.table .success>a,table .warning>a,.table .warning>a,table .danger>a,.table .danger>a,table .info>a,.table .info>a{color:#fff}table>thead>tr>th,.table>thead>tr>th,table>tbody>tr>th,.table>tbody>tr>th,table>tfoot>tr>th,.table>tfoot>tr>th,table>thead>tr>td,.table>thead>tr>td,table>tbody>tr>td,.table>tbody>tr>td,table>tfoot>tr>td,.table>tfoot>tr>td{border:none}table-bordered>thead>tr>th,.table-bordered>thead>tr>th,table-bordered>tbody>tr>th,.table-bordered>tbody>tr>th,table-bordered>tfoot>tr>th,.table-bordered>tfoot>tr>th,table-bordered>thead>tr>td,.table-bordered>thead>tr>td,table-bordered>tbody>tr>td,.table-bordered>tbody>tr>td,table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #464545}input,textarea{color:#464545}.form-control,input,textarea{border:2px hidden transparent;-webkit-box-shadow:none;box-shadow:none}.form-control:focus,input:focus,textarea:focus{-webkit-box-shadow:none;box-shadow:none}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label,.has-warning .form-control-feedback{color:#f39c12}.has-warning .form-control,.has-warning .form-control:focus{-webkit-box-shadow:none;box-shadow:none}.has-warning .input-group-addon{border-color:#f39c12}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label,.has-error .form-control-feedback{color:#e74c3c}.has-error .form-control,.has-error .form-control:focus{-webkit-box-shadow:none;box-shadow:none}.has-error .input-group-addon{border-color:#e74c3c}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label,.has-success .form-control-feedback{color:#00bc8c}.has-success .form-control,.has-success .form-control:focus{-webkit-box-shadow:none;box-shadow:none}.has-success .input-group-addon{border-color:#00bc8c}.input-group-addon{color:#ffffff}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{border-color:#464545}.nav-tabs>li>a,.nav-pills>li>a{color:#fff}.pager a,.pager a:hover{color:#fff}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{background-color:#007053}.breadcrumb a{color:#fff}.close{text-decoration:none;text-shadow:none;opacity:0.4}.close:hover,.close:focus{opacity:1}.alert .alert-link{color:#fff;text-decoration:underline}.progress{height:10px;-webkit-box-shadow:none;box-shadow:none}.progress .progress-bar{font-size:10px;line-height:10px}.well{-webkit-box-shadow:none;box-shadow:none}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{border-color:#464545}a.list-group-item-success.active{background-color:#00bc8c}a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{background-color:#00a379}a.list-group-item-warning.active{background-color:#f39c12}a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{background-color:#e08e0b}a.list-group-item-danger.active{background-color:#e74c3c}a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{background-color:#e43725}.popover{color:#ffffff}.panel-default>.panel-heading{background-color:#464545} \ No newline at end of file diff --git a/flask_admin/static/bootstrap/bootstrap3/swatch/default/bootstrap.min.css b/flask_admin/static/bootstrap/bootstrap3/swatch/default/bootstrap.min.css deleted file mode 100644 index d65c66b1b..000000000 --- a/flask_admin/static/bootstrap/bootstrap3/swatch/default/bootstrap.min.css +++ /dev/null @@ -1,5 +0,0 @@ -/*! - * Bootstrap v3.3.5 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.33px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:3;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file diff --git a/flask_admin/static/bootstrap/bootstrap3/swatch/flatly/bootstrap.min.css b/flask_admin/static/bootstrap/bootstrap3/swatch/flatly/bootstrap.min.css deleted file mode 100644 index e1980738f..000000000 --- a/flask_admin/static/bootstrap/bootstrap3/swatch/flatly/bootstrap.min.css +++ /dev/null @@ -1,11 +0,0 @@ -@import url("https://fonts.googleapis.com/css?family=Lato:400,700,400italic");/*! - * bootswatch v3.3.5 - * Homepage: http://bootswatch.com - * Copyright 2012-2015 Thomas Park - * Licensed under MIT - * Based on Bootstrap -*//*! - * Bootstrap v3.3.5 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;-webkit-box-shadow:none !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:15px;line-height:1.42857143;color:#2c3e50;background-color:#ffffff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#18bc9c;text-decoration:none}a:hover,a:focus{color:#18bc9c;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,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#ffffff;border:1px solid #ecf0f1;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:21px;margin-bottom:21px;border:0;border-top:1px solid #ecf0f1}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#b4bcc2}h1,.h1,h2,.h2,h3,.h3{margin-top:21px;margin-bottom:10.5px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10.5px;margin-bottom:10.5px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:39px}h2,.h2{font-size:32px}h3,.h3{font-size:26px}h4,.h4{font-size:19px}h5,.h5{font-size:15px}h6,.h6{font-size:13px}p{margin:0 0 10.5px}.lead{margin-bottom:21px;font-size:17px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:22.5px}}small,.small{font-size:86%}mark,.mark{background-color:#f39c12;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#b4bcc2}.text-primary{color:#2c3e50}a.text-primary:hover,a.text-primary:focus{color:#1a242f}.text-success{color:#ffffff}a.text-success:hover,a.text-success:focus{color:#e6e6e6}.text-info{color:#ffffff}a.text-info:hover,a.text-info:focus{color:#e6e6e6}.text-warning{color:#ffffff}a.text-warning:hover,a.text-warning:focus{color:#e6e6e6}.text-danger{color:#ffffff}a.text-danger:hover,a.text-danger:focus{color:#e6e6e6}.bg-primary{color:#fff;background-color:#2c3e50}a.bg-primary:hover,a.bg-primary:focus{background-color:#1a242f}.bg-success{background-color:#18bc9c}a.bg-success:hover,a.bg-success:focus{background-color:#128f76}.bg-info{background-color:#3498db}a.bg-info:hover,a.bg-info:focus{background-color:#217dbb}.bg-warning{background-color:#f39c12}a.bg-warning:hover,a.bg-warning:focus{background-color:#c87f0a}.bg-danger{background-color:#e74c3c}a.bg-danger:hover,a.bg-danger:focus{background-color:#d62c1a}.page-header{padding-bottom:9.5px;margin:42px 0 21px;border-bottom:1px solid transparent}ul,ol{margin-top:0;margin-bottom:10.5px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:21px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #b4bcc2}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10.5px 21px;margin:0 0 21px;font-size:18.75px;border-left:5px solid #ecf0f1}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#b4bcc2}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 #ecf0f1;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:21px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#ffffff;background-color:#333333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:10px;margin:0 0 10.5px;font-size:14px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#7b8a8b;background-color:#ecf0f1;border:1px solid #cccccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0%}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0%}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0%}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0%}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#b4bcc2;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:21px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ecf0f1}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ecf0f1}.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 #ecf0f1}.table .table{background-color:#ffffff}.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 #ecf0f1}.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 #ecf0f1}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#ecf0f1}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:#ecf0f1}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#dde4e6}.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:#18bc9c}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#15a589}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#3498db}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#258cd1}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#f39c12}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#e08e0b}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#e74c3c}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#e43725}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15.75px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ecf0f1}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:21px;font-size:22.5px;line-height:inherit;color:#2c3e50;border:0;border-bottom:1px solid transparent}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:11px;font-size:15px;line-height:1.42857143;color:#2c3e50}.form-control{display:block;width:100%;height:45px;padding:10px 15px;font-size:15px;line-height:1.42857143;color:#2c3e50;background-color:#ffffff;background-image:none;border:1px solid #dce4ec;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#2c3e50;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(44,62,80,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(44,62,80,0.6)}.form-control::-moz-placeholder{color:#acb6c0;opacity:1}.form-control:-ms-input-placeholder{color:#acb6c0}.form-control::-webkit-input-placeholder{color:#acb6c0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#ecf0f1;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:45px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:35px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:66px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:21px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:11px;padding-bottom:11px;margin-bottom:0;min-height:36px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:35px;padding:6px 9px;font-size:13px;line-height:1.5;border-radius:3px}select.input-sm{height:35px;line-height:35px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:35px;padding:6px 9px;font-size:13px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:35px;line-height:35px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:35px;min-height:34px;padding:7px 9px;font-size:13px;line-height:1.5}.input-lg{height:66px;padding:18px 27px;font-size:19px;line-height:1.3333333;border-radius:6px}select.input-lg{height:66px;line-height:66px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:66px;padding:18px 27px;font-size:19px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:66px;line-height:66px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:66px;min-height:40px;padding:19px 27px;font-size:19px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:56.25px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:45px;height:45px;line-height:45px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:66px;height:66px;line-height:66px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:35px;height:35px;line-height:35px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#ffffff}.has-success .form-control{border-color:#ffffff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-success .input-group-addon{color:#ffffff;border-color:#ffffff;background-color:#18bc9c}.has-success .form-control-feedback{color:#ffffff}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#ffffff}.has-warning .form-control{border-color:#ffffff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-warning .input-group-addon{color:#ffffff;border-color:#ffffff;background-color:#f39c12}.has-warning .form-control-feedback{color:#ffffff}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#ffffff}.has-error .form-control{border-color:#ffffff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-error .input-group-addon{color:#ffffff;border-color:#ffffff;background-color:#e74c3c}.has-error .form-control-feedback{color:#ffffff}.has-feedback label~.form-control-feedback{top:26px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#597ea2}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:11px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:32px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:11px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:24.9999994px;font-size:19px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:7px;font-size:13px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:10px 15px;font-size:15px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#ffffff;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#ffffff;background-color:#95a5a6;border-color:#95a5a6}.btn-default:focus,.btn-default.focus{color:#ffffff;background-color:#798d8f;border-color:#566566}.btn-default:hover{color:#ffffff;background-color:#798d8f;border-color:#74898a}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#ffffff;background-color:#798d8f;border-color:#74898a}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#ffffff;background-color:#687b7c;border-color:#566566}.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.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:#95a5a6;border-color:#95a5a6}.btn-default .badge{color:#95a5a6;background-color:#ffffff}.btn-primary{color:#ffffff;background-color:#2c3e50;border-color:#2c3e50}.btn-primary:focus,.btn-primary.focus{color:#ffffff;background-color:#1a242f;border-color:#000000}.btn-primary:hover{color:#ffffff;background-color:#1a242f;border-color:#161f29}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#ffffff;background-color:#1a242f;border-color:#161f29}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#ffffff;background-color:#0d1318;border-color:#000000}.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.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:#2c3e50;border-color:#2c3e50}.btn-primary .badge{color:#2c3e50;background-color:#ffffff}.btn-success{color:#ffffff;background-color:#18bc9c;border-color:#18bc9c}.btn-success:focus,.btn-success.focus{color:#ffffff;background-color:#128f76;border-color:#0a4b3e}.btn-success:hover{color:#ffffff;background-color:#128f76;border-color:#11866f}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#ffffff;background-color:#128f76;border-color:#11866f}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#ffffff;background-color:#0e6f5c;border-color:#0a4b3e}.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.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:#18bc9c;border-color:#18bc9c}.btn-success .badge{color:#18bc9c;background-color:#ffffff}.btn-info{color:#ffffff;background-color:#3498db;border-color:#3498db}.btn-info:focus,.btn-info.focus{color:#ffffff;background-color:#217dbb;border-color:#16527a}.btn-info:hover{color:#ffffff;background-color:#217dbb;border-color:#2077b2}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#ffffff;background-color:#217dbb;border-color:#2077b2}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#ffffff;background-color:#1c699d;border-color:#16527a}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#3498db;border-color:#3498db}.btn-info .badge{color:#3498db;background-color:#ffffff}.btn-warning{color:#ffffff;background-color:#f39c12;border-color:#f39c12}.btn-warning:focus,.btn-warning.focus{color:#ffffff;background-color:#c87f0a;border-color:#7f5006}.btn-warning:hover{color:#ffffff;background-color:#c87f0a;border-color:#be780a}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#ffffff;background-color:#c87f0a;border-color:#be780a}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#ffffff;background-color:#a66908;border-color:#7f5006}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f39c12;border-color:#f39c12}.btn-warning .badge{color:#f39c12;background-color:#ffffff}.btn-danger{color:#ffffff;background-color:#e74c3c;border-color:#e74c3c}.btn-danger:focus,.btn-danger.focus{color:#ffffff;background-color:#d62c1a;border-color:#921e12}.btn-danger:hover{color:#ffffff;background-color:#d62c1a;border-color:#cd2a19}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#ffffff;background-color:#d62c1a;border-color:#cd2a19}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#ffffff;background-color:#b62516;border-color:#921e12}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#e74c3c;border-color:#e74c3c}.btn-danger .badge{color:#e74c3c;background-color:#ffffff}.btn-link{color:#18bc9c;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#18bc9c;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:#b4bcc2;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:18px 27px;font-size:19px;line-height:1.3333333;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:6px 9px;font-size:13px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:13px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;-o-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:0.35s;-o-transition-duration:0.35s;transition-duration:0.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:15px;text-align:left;background-color:#ffffff;border:1px solid #cccccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#7b8a8b;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#ffffff;background-color:#2c3e50}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#ffffff;text-decoration:none;outline:0;background-color:#2c3e50}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#b4bcc2}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:13px;line-height:1.42857143;color:#b4bcc2;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:66px;padding:18px 27px;font-size:19px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:66px;line-height:66px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:35px;padding:6px 9px;font-size:13px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:35px;line-height:35px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:10px 15px;font-size:15px;font-weight:normal;line-height:1;color:#2c3e50;text-align:center;background-color:#ecf0f1;border:1px solid #dce4ec;border-radius:4px}.input-group-addon.input-sm{padding:6px 9px;font-size:13px;border-radius:3px}.input-group-addon.input-lg{padding:18px 27px;font-size:19px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#ecf0f1}.nav>li.disabled>a{color:#b4bcc2}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#b4bcc2;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#ecf0f1;border-color:#18bc9c}.nav .nav-divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ecf0f1}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#ecf0f1 #ecf0f1 #ecf0f1}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#2c3e50;background-color:#ffffff;border:1px solid #ecf0f1;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 #ecf0f1}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ecf0f1;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:#ffffff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#ffffff;background-color:#2c3e50}.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 #ecf0f1}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ecf0f1;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:#ffffff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:60px;margin-bottom:21px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:19.5px 15px;font-size:19px;line-height:21px;height:60px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:13px;margin-bottom:13px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:9.75px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:21px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:21px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:19.5px;padding-bottom:19.5px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:7.5px;margin-bottom:7.5px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:7.5px;margin-bottom:7.5px}.navbar-btn.btn-sm{margin-top:12.5px;margin-bottom:12.5px}.navbar-btn.btn-xs{margin-top:19px;margin-bottom:19px}.navbar-text{margin-top:19.5px;margin-bottom:19.5px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#2c3e50;border-color:transparent}.navbar-default .navbar-brand{color:#ffffff}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#18bc9c;background-color:transparent}.navbar-default .navbar-text{color:#777777}.navbar-default .navbar-nav>li>a{color:#ffffff}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#18bc9c;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#ffffff;background-color:#1a242f}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#cccccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#1a242f}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#1a242f}.navbar-default .navbar-toggle .icon-bar{background-color:#ffffff}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:transparent}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#1a242f;color:#ffffff}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#ffffff}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#18bc9c;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#1a242f}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#cccccc;background-color:transparent}}.navbar-default .navbar-link{color:#ffffff}.navbar-default .navbar-link:hover{color:#18bc9c}.navbar-default .btn-link{color:#ffffff}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#18bc9c}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#cccccc}.navbar-inverse{background-color:#18bc9c;border-color:transparent}.navbar-inverse .navbar-brand{color:#ffffff}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#2c3e50;background-color:transparent}.navbar-inverse .navbar-text{color:#ffffff}.navbar-inverse .navbar-nav>li>a{color:#ffffff}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#2c3e50;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#ffffff;background-color:#15a589}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#cccccc;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#128f76}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#128f76}.navbar-inverse .navbar-toggle .icon-bar{background-color:#ffffff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#149c82}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#15a589;color:#ffffff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#ffffff}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#2c3e50;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#15a589}.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:#cccccc;background-color:transparent}}.navbar-inverse .navbar-link{color:#ffffff}.navbar-inverse .navbar-link:hover{color:#2c3e50}.navbar-inverse .btn-link{color:#ffffff}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#2c3e50}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#cccccc}.breadcrumb{padding:8px 15px;margin-bottom:21px;list-style:none;background-color:#ecf0f1;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#cccccc}.breadcrumb>.active{color:#95a5a6}.pagination{display:inline-block;padding-left:0;margin:21px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:10px 15px;line-height:1.42857143;text-decoration:none;color:#ffffff;background-color:#18bc9c;border:1px solid transparent;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{z-index:3;color:#ffffff;background-color:#0f7864;border-color:transparent}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#ffffff;background-color:#0f7864;border-color:transparent;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#ecf0f1;background-color:#3be6c4;border-color:transparent;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:18px 27px;font-size:19px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:6px 9px;font-size:13px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:21px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#18bc9c;border:1px solid transparent;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#0f7864}.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:#ffffff;background-color:#18bc9c;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#ffffff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#ffffff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#95a5a6}.label-default[href]:hover,.label-default[href]:focus{background-color:#798d8f}.label-primary{background-color:#2c3e50}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#1a242f}.label-success{background-color:#18bc9c}.label-success[href]:hover,.label-success[href]:focus{background-color:#128f76}.label-info{background-color:#3498db}.label-info[href]:hover,.label-info[href]:focus{background-color:#217dbb}.label-warning{background-color:#f39c12}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#c87f0a}.label-danger{background-color:#e74c3c}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#d62c1a}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:13px;font-weight:bold;color:#ffffff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#2c3e50;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#ffffff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#2c3e50;background-color:#ffffff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#ecf0f1}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:23px;font-weight:200}.jumbotron>hr{border-top-color:#cfd9db}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:68px}}.thumbnail{display:block;padding:4px;margin-bottom:21px;line-height:1.42857143;background-color:#ffffff;border:1px solid #ecf0f1;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#18bc9c}.thumbnail .caption{padding:9px;color:#2c3e50}.alert{padding:15px;margin-bottom:21px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#18bc9c;border-color:#18bc9c;color:#ffffff}.alert-success hr{border-top-color:#15a589}.alert-success .alert-link{color:#e6e6e6}.alert-info{background-color:#3498db;border-color:#3498db;color:#ffffff}.alert-info hr{border-top-color:#258cd1}.alert-info .alert-link{color:#e6e6e6}.alert-warning{background-color:#f39c12;border-color:#f39c12;color:#ffffff}.alert-warning hr{border-top-color:#e08e0b}.alert-warning .alert-link{color:#e6e6e6}.alert-danger{background-color:#e74c3c;border-color:#e74c3c;color:#ffffff}.alert-danger hr{border-top-color:#e43725}.alert-danger .alert-link{color:#e6e6e6}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:21px;margin-bottom:21px;background-color:#ecf0f1;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:13px;line-height:21px;color:#ffffff;text-align:center;background-color:#2c3e50;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#18bc9c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#3498db}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#f39c12}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#e74c3c}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#ffffff;border:1px solid #ecf0f1}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333333}a.list-group-item:hover,button.list-group-item:hover,a.list-group-item:focus,button.list-group-item:focus{text-decoration:none;color:#555555;background-color:#ecf0f1}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#ecf0f1;color:#b4bcc2;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#b4bcc2}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#ffffff;background-color:#2c3e50;border-color:#2c3e50}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#8aa4be}.list-group-item-success{color:#ffffff;background-color:#18bc9c}a.list-group-item-success,button.list-group-item-success{color:#ffffff}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,button.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:focus{color:#ffffff;background-color:#15a589}a.list-group-item-success.active,button.list-group-item-success.active,a.list-group-item-success.active:hover,button.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-info{color:#ffffff;background-color:#3498db}a.list-group-item-info,button.list-group-item-info{color:#ffffff}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,button.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:focus{color:#ffffff;background-color:#258cd1}a.list-group-item-info.active,button.list-group-item-info.active,a.list-group-item-info.active:hover,button.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-warning{color:#ffffff;background-color:#f39c12}a.list-group-item-warning,button.list-group-item-warning{color:#ffffff}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,button.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:focus{color:#ffffff;background-color:#e08e0b}a.list-group-item-warning.active,button.list-group-item-warning.active,a.list-group-item-warning.active:hover,button.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-danger{color:#ffffff;background-color:#e74c3c}a.list-group-item-danger,button.list-group-item-danger{color:#ffffff}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,button.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:focus{color:#ffffff;background-color:#e43725}a.list-group-item-danger.active,button.list-group-item-danger.active,a.list-group-item-danger.active:hover,button.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:21px;background-color:#ffffff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:17px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#ecf0f1;border-top:1px solid #ecf0f1;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ecf0f1}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:21px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #ecf0f1}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ecf0f1}.panel-default{border-color:#ecf0f1}.panel-default>.panel-heading{color:#2c3e50;background-color:#ecf0f1;border-color:#ecf0f1}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ecf0f1}.panel-default>.panel-heading .badge{color:#ecf0f1;background-color:#2c3e50}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ecf0f1}.panel-primary{border-color:#2c3e50}.panel-primary>.panel-heading{color:#ffffff;background-color:#2c3e50;border-color:#2c3e50}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#2c3e50}.panel-primary>.panel-heading .badge{color:#2c3e50;background-color:#ffffff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#2c3e50}.panel-success{border-color:#18bc9c}.panel-success>.panel-heading{color:#ffffff;background-color:#18bc9c;border-color:#18bc9c}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#18bc9c}.panel-success>.panel-heading .badge{color:#18bc9c;background-color:#ffffff}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#18bc9c}.panel-info{border-color:#3498db}.panel-info>.panel-heading{color:#ffffff;background-color:#3498db;border-color:#3498db}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#3498db}.panel-info>.panel-heading .badge{color:#3498db;background-color:#ffffff}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#3498db}.panel-warning{border-color:#f39c12}.panel-warning>.panel-heading{color:#ffffff;background-color:#f39c12;border-color:#f39c12}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#f39c12}.panel-warning>.panel-heading .badge{color:#f39c12;background-color:#ffffff}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#f39c12}.panel-danger{border-color:#e74c3c}.panel-danger>.panel-heading{color:#ffffff;background-color:#e74c3c;border-color:#e74c3c}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#e74c3c}.panel-danger>.panel-heading .badge{color:#e74c3c;background-color:#ffffff}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#e74c3c}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#ecf0f1;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:22.5px;font-weight:bold;line-height:1;color:#000000;text-shadow:none;opacity:0.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000000;text-decoration:none;cursor:pointer;opacity:0.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#ffffff;border:1px solid #999999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:0.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{padding:20px;text-align:right;border-top:1px solid #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}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:13px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:0.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;background-color:#000000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:15px;background-color:#ffffff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #cccccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:15px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#ffffff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999999;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#ffffff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#ffffff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999999;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#ffffff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:0.5;filter:alpha(opacity=50);font-size:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.5)), to(rgba(0,0,0,0.0001)));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.0001)), to(rgba(0,0,0,0.5)));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #ffffff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#ffffff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}.navbar{border-width:0}.navbar-default .badge{background-color:#fff;color:#2c3e50}.navbar-inverse .badge{background-color:#fff;color:#18bc9c}.navbar-brand{line-height:1}.btn{border-width:2px}.btn:active{-webkit-box-shadow:none;box-shadow:none}.btn-group.open .dropdown-toggle{-webkit-box-shadow:none;box-shadow:none}.text-primary,.text-primary:hover{color:#2c3e50}.text-success,.text-success:hover{color:#18bc9c}.text-danger,.text-danger:hover{color:#e74c3c}.text-warning,.text-warning:hover{color:#f39c12}.text-info,.text-info:hover{color:#3498db}table a:not(.btn),.table a:not(.btn){text-decoration:underline}table .dropdown-menu a,.table .dropdown-menu a{text-decoration:none}table .success,.table .success,table .warning,.table .warning,table .danger,.table .danger,table .info,.table .info{color:#fff}table .success>th>a,.table .success>th>a,table .warning>th>a,.table .warning>th>a,table .danger>th>a,.table .danger>th>a,table .info>th>a,.table .info>th>a,table .success>td>a,.table .success>td>a,table .warning>td>a,.table .warning>td>a,table .danger>td>a,.table .danger>td>a,table .info>td>a,.table .info>td>a,table .success>a,.table .success>a,table .warning>a,.table .warning>a,table .danger>a,.table .danger>a,table .info>a,.table .info>a{color:#fff}table>thead>tr>th,.table>thead>tr>th,table>tbody>tr>th,.table>tbody>tr>th,table>tfoot>tr>th,.table>tfoot>tr>th,table>thead>tr>td,.table>thead>tr>td,table>tbody>tr>td,.table>tbody>tr>td,table>tfoot>tr>td,.table>tfoot>tr>td{border:none}table-bordered>thead>tr>th,.table-bordered>thead>tr>th,table-bordered>tbody>tr>th,.table-bordered>tbody>tr>th,table-bordered>tfoot>tr>th,.table-bordered>tfoot>tr>th,table-bordered>thead>tr>td,.table-bordered>thead>tr>td,table-bordered>tbody>tr>td,.table-bordered>tbody>tr>td,table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ecf0f1}.form-control,input{border-width:2px;-webkit-box-shadow:none;box-shadow:none}.form-control:focus,input:focus{-webkit-box-shadow:none;box-shadow:none}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label,.has-warning .form-control-feedback{color:#f39c12}.has-warning .form-control,.has-warning .form-control:focus{border:2px solid #f39c12}.has-warning .input-group-addon{border-color:#f39c12}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label,.has-error .form-control-feedback{color:#e74c3c}.has-error .form-control,.has-error .form-control:focus{border:2px solid #e74c3c}.has-error .input-group-addon{border-color:#e74c3c}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label,.has-success .form-control-feedback{color:#18bc9c}.has-success .form-control,.has-success .form-control:focus{border:2px solid #18bc9c}.has-success .input-group-addon{border-color:#18bc9c}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{border-color:transparent}.pager a,.pager a:hover{color:#fff}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{background-color:#3be6c4}.close{color:#fff;text-decoration:none;opacity:0.4}.close:hover,.close:focus{color:#fff;opacity:1}.alert .alert-link{color:#fff;text-decoration:underline}.progress{height:10px;-webkit-box-shadow:none;box-shadow:none}.progress .progress-bar{font-size:10px;line-height:10px}.well{-webkit-box-shadow:none;box-shadow:none}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{border-color:#ecf0f1}a.list-group-item-success.active{background-color:#18bc9c}a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{background-color:#15a589}a.list-group-item-warning.active{background-color:#f39c12}a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{background-color:#e08e0b}a.list-group-item-danger.active{background-color:#e74c3c}a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{background-color:#e43725}.panel-default .close{color:#2c3e50}.modal .close{color:#2c3e50}.popover{color:#2c3e50} \ No newline at end of file diff --git a/flask_admin/static/bootstrap/bootstrap3/swatch/fonts/glyphicons-halflings-regular.eot b/flask_admin/static/bootstrap/bootstrap3/swatch/fonts/glyphicons-halflings-regular.eot deleted file mode 100644 index b93a4953fff68df523aa7656497ee339d6026d64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20127 zcma%hV{j!vx9y2-`@~L8?1^pLwlPU2wr$&<*tR|KBoo`2;LUg6eW-eW-tKDb)vH%` z^`A!Vd<6hNSRMcX|Cb;E|1qflDggj6Kmr)xA10^t-vIc3*Z+F{r%|K(GyE^?|I{=9 zNq`(c8=wS`0!RZy0g3<xfGPm^&oc(t0WAJyYk&j565#r82r@tgVE(V|{tq<<xco!B z02==gmw&z10LOnkAb<tH1OWX@JOI9bn*UMykN1D0R{xl80Mq~Cd;ISaOaQKbJU)Q^ zKV{p0n*ZTg{L}i+{3Za_e=Uyx%G?09e;&`jxw-$pR}TDt)(rrNs7n5?o%-LK0RgDo z0?1<k<naI!SC})WF>{M(8^tv41d}oRU?8#IBFtJy*9zAN5dcxqGlMZGL>GG%R#)4J zDJ2;)4*E1pyHia%>lMv3X7Q`UoFyoB@|xvh^)kOE3)IL&0(G&i;g08s>c%~pHkN&6 z($7!kyv|A2DsV2mq-5Ku)D#$Kn$CzqD-wm5Q*OtEOEZe^&T$<q%?GPI*ug?*jFCZ7 zl1X3>xIb0NUL<TDAlC~xMcGnHsPe)Gh+nESIamgk2)5Ql^6QPK&XkQ+!qk}`TYc#I zf~KwkK>}$)W)Ck`6oter6KcQG9Zcy>lXip)%e&!lQgtQ*N`#abOlytt!&i3fo)cKV zP0BWmLxS1gQv(r_r|?9>rR0ZeEJPx;Vi|h1!Eo*dohr<W65y|5+tpvz!HDS=Q}DgN z;O&E^rmV416<Hj_N10HwLk^Lwyhx2j;kDE@F*S-tuqy|n(-6~PPF09Xvxq56At8OG z4-2Gj5=K^(f;q@WOp+9uP|<!09J~a(Y%m)hsl;TbWEvvuQ7(qWx_eKYE@rH9B(V+` zF8+p6+N8}}{zS_o7#)%b=2DFYa}JT{_i@;_#xxEDZ)+D4Lz{Pv;LE}#`N2bQP*W;6 z(wPX2S3Zb<sNz$mW_!uE^K&d`O<hkRPv<3DnX$`Y*)_qR>&^lJgqJZns>&vexP@fs zkPv93Nyw$-kM5Mw^{@wPU47Y1dSkiHyl3dtHLwV&6Tm1iv{ve;sYA}Z&kmH802s9Z zyJEn+cfl7yFu#1^#DbtP7k&aR06|n{LnYFYEphKd@dJEq@)s#S)UA&8VJY@S2+{~> z(4?M();zvayyd^j`@4>xCqH|Au>Sfzb$mEOcD7e4z8pPVRTiMUWiw;|gXHw7LS#U< zsT(}Z5SJ)CRMXloh$qPnK77w_)ctHmgh}QAe<2S{DU^`!uwptCoq!Owz$u6bF)vnb zL`bM$%>baN7l#)vtS3y6h*2?xC<XQJNpZVS!tVtuR(<D$%K=CTVlwa)G)}qDJup|w z!YRUAk-}+0)MFG#RuE2vlb~4*bP&)ex6`$^%6ySxf}MiQja9&+C4)UgIK)TIHVp>k z>w+s)@`O4(4_<t2L?B1i*y6fuRi+P?QZCG2j9(btWTetUT@0Q|8XO(SqEH6LSB!2L z<;M1lya0G`cm9UEex~so>I{L-!+b%)NZcQ&ND=2lyP+xI#9OzsiY8$c)ys-MI?TG6 zEP6f=vuLo!G>J7F4v|s#lJ+7A`^nEQScH3e?B_jC&{<S@1dd<&?JtuP@v(wA>sj>m zYD?!1z4nDG_Afi$!J(<{>z{~Q)$SaXWjj~%ZvF152Hd^VoG14rFykR=_TO)mCn&K$ z-TfZ!vMBvnToyBoKRkD{3=&=qD|L!vb#jf1f}2338z)e)g>7#NPe!FoaY*jY{f)<G z+9IWTnFJO0p&^rK`xODpSZARax-jN9(N|ZWyg~(MGSuQYzXBQR*+_`oO>Bf>ohk-K z4{>fVS}ZCicCqgLuYR_fYx2;*-4k>kffuywghn?15s1dIOOYfl+XLf5w?wtU2Og*f z%X5x`H55F6g1>m~%F`655-W1wFJtY>>qNSdVT`M`1Mlh!5Q6#3j={n5#za;!X&^OJ zgq;d4UJV-F>gg?c3Y?d=kvn3e<VW2IarGgIy4I@#ozBH$Q(a($^uvXS?@=l>V)Jb^ zO5vg0G0yN0%}xy#(6oTDSVw8l=_*2k;zTP?+N=*18H5wp`s90K-C67q{W3d8vQGmr zhpW^>1HEQV2TG#8_P_0q91h8QgHT~8=-Ij5snJ3cj?Jn5_66uV=*pq(j}yHn<uy|J zh=_`9%JG63kQPJ-Et!mF@={HFp+sB-S+XTFvdzD^x19Lbj{TXx=?FGKvX;|1-3-zU zl2DyEls20Izb)isO0?xrx(b1`<I3ZDSNBd*<5l=jC`?Re`XCFaI(ny#9KlP!NYbU= z^;IWB5he_V3}{Xdl1>f$<x%N5|7+dpJoB>Ft;5VVC?bz%9X31asJeQF2jEa47H#j` zk<KNJ>&uxf3t?g!tltVP|B#G_UfDD}`<#B#iY^i>oDd-LGF}A@Fno~dR72c&hs6bR z2F}9(i8+PR%R|~FV$;Ke^Q_E_B<teU&M|M>c;$)xN4Ti>Lgg4vaip!%M<tZtx+eW> z06oxAF_*)LH57w|gCW3SwoEHwjO{}}U=pKhjKSZ{u!K<P`9nrZXY)DCi*vvJQDx`q za_kyA2Qus4JQ%8kM3_Gd%I1O+cF3~V6=ZM1u9*Ea+iXPId}M`kd7I1T0d7Zx)Wa&? z{PLQlHM^=&Y!og~I(XQ;5lJScjK~IrV<F7J6v`iM&M1#EkRsHYX8V%Dip>?1zm1q? zXyA6y@)}_sONiJopF}_}(~}d4FDyp|(@w}Vb;Fl5bZL%{1`}gdw#i{KMjp2@Fb9pg ziO|u7qP{$kxH$qh8%L+)AvwZNgUT6^zsZq-MRyZid{D?t`f|KzSAD~C?WT3d0rO`0 z=qQ6{)&UXXuHY{9g|P7l_nd-%eh}4%VVaK#Nik*tOu9lBM$<%FS@`NwGEbP0&;Xbo zObCq=y%a`jSJmx_uTLa{@2@}^&F<l?4N8$IoqA~y`|!rgD24&AtvbWWlPF%K!I`Fp zMCDiMrV(MWM2!hiB6=^)Er#O8q+%t)I4l3iuF$d;cBXqGAn?Z0Z*?MZRuh=zmPo~- z_rOvv7sERj79T<uPMWCHIto@agn)X&#=QQyY*6wt){yHQ7~yFoEezd#C<dQF+u)2- zEIMy-5P*TYpqPxY25dY9J+f-E^3<^@G(=jU{U&hQ3#o`a)dOUR&JT?mTRlBfHE<p| zO&J|*26{JJ28qC1saVtkQ1WW^G58Smr^%f>4c%z6oe-TN&idjv+8E|$FHOvBqg5hT zMB=7SHq`_-E?5g=()*!V>rIa&LcX(RU}aLm*38U_V$C_g4)7GrW5$GnvTwJZdBmy6 z*X)wi3=R8L=esOhY0a&eH`^fSpUHV8h$J1|o^3fKO<edeL`~4AS}?bGhbI@wd%7ob z;HUsAzX8f<5Tcj`x1L`~p_%qxb{Gobu+`2Hh*bfnN@EZ$w1F5i32YXO9vreTkznl= zRv&F3;kE3d@_Cys2UVvUxUU=oDO~U>|9QzaiKu>yZ9wmRkW?HTkc<*v7i*ylJ#u#j zD1-n&{B`04oG>0Jn{5PKP*4Qsz{~`VVA3578gA+JUkiPc$Iq!^K|}*p_z3(-c&5z@ zKxmdNpp2&wg&%xL<cX5MdFnpzW;X?cI|~qZbhDWm)F_t}i=(x><xZ|=$k6lbFWo~R z1yEA-t+BaHz`?1Zi{N`F<t?_rS*zpAEN-Lg7L9qKTVj|Ih7gOmTvLqTlA1e51SXNm zeA`1UhC`&)%k?V^ii%`|O+coBH9$HjP#Fy1CjYhyW0DPZC>3xZNzG-5Xt7jnI@{?c z25=M>-VF|;an2Os$Nn%HgQz7m(ujC}Ii0Oesa(y#8>D+P*_m^X##E|h$M6tJr%#=P zWP*)Px>7z`E~U^2LNCNiy%Z7!!6RI%6fF@#ZY3z`CK91}^J<kz;gXvl4j_QvxfXmA ze1j4n*Hru_ge<*I;p<wHXN`XVFAk2bTG~Vl5{?nXF6K!!HeqOu6_U-movw7Gx`O<C zM~<jbZlSC}oXeAQr_Y8Tq)(9YogPgPY{6ELohD$98O2Fj5_M2=J84FuR#dyoS!A-| z*c)!)9^dk4^<2$Ks79AAMW;%o-!%g7j{1(Pnwwy1tca#dUTE1+4y#<A6VSeCR)wQ` zCEFu?oS$y=05cpTr}VLe+YU$GFp$#&tfXaK<ia*q3-&+6KDQP!)!Ru(yh0c}7za6= ziFP^Nq3))g21c{b{ESQRdZN3Xnpa8jUP0DA2r&uofBU7TtM^7^s}7#&aUnGsvE`fu z>$F!EB0YF1je9<lP78|=Z6bmMhpLsL)Tz)Cn&pP#eF?{kB>hJKU7!S5MnXV{+#K;y zF~s*H%p@vj&-ru7#(F2L+_;IH46X(z{~HTfcThqD%b{>~u@lSc<+f5#xgt9L7$gSK ziDJ6D*R%4&YeUB@yu@4+&70MBNTnjRyqMRd+@&lU#rV%0t3OmouhC`mkN}pL>tXin zY*p)mt=}$EGT2E<4Q>E2`6)gZ`QJhGDNpI}bZL9}m+R>q?l`OzFjW?)Y)P`fUH(_4 zCb?sm1=DD0+Q5v}BW#0n5;Nm(@RTEa3(Y17H2H67La+>ptQHJ@WMy2xRQT$|7l`8c zYHCxYw2o-rI?(fR2-%}pbs$I%w_&LPYE{4bo}vRoAW>3!SY_zH3`ofx3F1PsQ?&iq z*BRG>?<6%z=x#`NhlEq{K~&rU7Kc7Y-90aRnoj~rVoKae)L$3^z*Utppk?I`)CX&& zZ^@Go<Q-E-9qdDk;`1UZ+I6D_?B@62xgSC03f%4S8VtH3(P3D_6<1>9fm&fN`b`XY zt0xE5aw4t@qTg_k=!-5LXU+_~DlW?53!afv6W(k@FPPX-`nA!FBMp7b!ODbL1zh58 z*69I}P_-?qSLKj}JW7gP!la}K@M}L>v?rDD!DY-tu+onu9kLoJz20M4urX_xf2dfZ zORd9Zp&28_ff=wdMpXi%IiTTNegC}~RLkdYjA39kWqlA?jO~o1`*B&85Hd%VPkYZT z48MPe62;TOq#c%H(`wX5(Bu>nlh4Fbd*Npasdhh?oRy8a;NB2(eb}6DgwXtx=n}fE zx67rYw=(s0r?EsPjaya}^Qc-_UT5|*@|$Q}*|>V3O~USkIe6a0_>vd~6kHuP8=m}_ zo2IGKbv;yA+TBtlCpnw)8hDn&eq?26gN$Bh;SdxaS04Fsaih_Cfb98s39xbv)=mS0 z6M<@pM2#pe32w*lYSWG>DYqB95XhgAA)*9dOxHr{t)er0Xugoy)!Vz#2C3FaUMzYl zCxy{igFB901*<tiyD63(hW(uERHv;@J~7F`;-e`O5Ld!(Fl>R2*F4>grPF}+G`;Yh zGi@nRjWyG3mR(BVOeBPOF=_&}2IWT%)pqdNAcL{eP`L*^FDv#Rzq<iCP<KO7gjv}{ z^5ElYuo)cUV9?9{6e*c7eWVK@LCOKKaBR<2_;6r+GhH1i-~$};rNpE_D*2ZJ=O+cz zyj}kfz8;}sw88^SYgzvxpkB>l5U&Suq_X%JfR_lC!S|y|xd5mQ0{0!G#9hV46S~A` z0B!{yI-4FZEtol5)mNWXcX(`x&Pc*&gh4k{w%0S#EI>rqqlH2xv7mR=9XNCI$V#NG z4wb-@u{PfQP;tTbzK>(DF(~bKp3;L1-A*HS!VB)Ae>Acnvde15Anb`h;I&0)aZBS6 z55ZS7mL5Wp!LCt45^{2_70<L`Ib`SKM1Oi<HkO)Y>YiI_Py=X{I3>$Px5Ez0ahLQ+ z9EWUWSyzA|+g-Axp*Lx-M{!ReQO07EG7r4^)K(xbj@%ZU=0tBC5shl)1a!ifM5OkF z0<aV&1|hwix;hV`l{C+KeqEjnn@aQGS~k&rcJ^K626yC8@~#qf$xT7;xJLzv3M&rA z)MirFFpng+&}hRJHKQ6_3l{ABCJLmIrj8g#cem2@!i;W7Q+}Wr^IrTp((?iq1h?Cq z7Z^k%ps^N^e})9!YkyNa0;x`m&~<4yTQHl1+dFNY1CE<&_PZ=1v!ch(qU_a1lHd~T zC&a1>w2xQ-<+r-h1fi7B6waX15|*GGqfva)S)dVcgea`lQ~SQ$KXPR+(3Tn2I2R<0 z9tK`L*pa^+*n%>tZPiqt{_`%v?Bb7CR-!GhMON_Fbs0$#|H}G?rW|{q5fQhvw!FxI zs-5ZK>hAbnCS#ZQVi5K0X3PjL1JRdQO+&)*!oRCqB{wen60P6!7bGiWn@vD|+E@Xq zb!!_WiU^I|@1M}Hz6fN-m04x=><rLlCfwyIrOU}U)<7QivZH0Rm_-}Sg~$eCMDR*Z zx`cVPn__}6Q+CU!>Exm{b@>UCW|c8<K+|Vc^j#>vC`aNbt<B+h3ox;kC6?34Wa#|Y zXq?n@d6k6MUBqn%SYLX5^>A@KCHujh^2RWZC}iYhL^<*Z93chIBJYU&w>$CGZDR<q ztx<5t>cHuIgF&oyesDZ#&mA;?wxx4Cm#c0V$xYG?9OL(Smh}#fFuX(K;otJmvRP{h ze^f-qv;)HKC7geB92_@3a9@M<H_?qNxE&=>GijS(hNNVd%-rZ;%@F_f7?Fjinbe1( zn#jQ*jKZTqE+AUTEd3y6t>*=;AO##cmdwU4gc2&rT8l`rtKW2JF<`_M#p>cj+)yCG zgKF)y8jrfxTjGO&ccm8RU>qn|HxQ7Z#sUo$q)P5H%8iBF$({0Ya51-rA@!I<SEC1_ zHUdTwrTB3a?*}j?j1(f*^9G0kG<5JX4@l|rR&H;`Qa2VcYZ3UxZL+D>t#NHN8MxqK zrYyl_&=}WVfQ?+ykV4*@F6)=u_~3BebR2G2>>mKaEBPm<p!ix>SW3(qYGGXj??m3L zHec{@jWCsSD8`xUy0pqT?Sw0oD?AUK*WxZn#D>-$`eI+IT)6ki>ic}W)t$V32^ITD zR497@LO}S|re%A+#vdv-?fXsQGVnP?QB_d0cGE+U84Q=aM=XrOwGFN3`Lpl@P0fL$ zKN1PqOwojH*($uaQFh8_)H#>Acl&UBSZ>!2W1Dinei`R4dJGX$;~60X=|SG6#jci} z&t4*dVDR*;+6Y(G{KGj1B2!qjvDYOyPC}%hnPbJ@g(4yBJrViG1#$$X75y+Ul1{%x zBAuD}Q@w?MFNqF-m39FGpq7RGI?%Bvyyig&oGv)lR>d<`Bqh=p>urib5DE;u$c|$J zwim~nPb19t?LJZsm{<(Iyyt@~H!a4yywmHKW&=1r5+oj*Fx6c89heW@(2R`i!Uiy* zp)=`Vr8sR!)KChE-6SEIy<Vn-l!RzPhNVxOkQU85Nng*5JUtkAg)b6wP&$wmih=Au zKs;dHW6q)pI2VT$E`W=7aAbKSJnb;$l%#?edH=)1)avHvVH)345mJ;(*l$Ed1MA<a z72%vbZD4`I;B-RS=m{iM`7(#1x>i(dvG3<1KoVt>kGV=zZiG<Y+hj@$zd#Q#=4iVE z)x-IdMbP%iC;0pg$QUoVt(A;lO{-jJjH=;buR+E#0Eulb^`hidN&<0Z-tju^RGPcG z(C4$AS6l7m-h>7LGonH1+~yOK-`g0)r#+O|Q>)a`I2FVW%wr3lhO(P{ksNQuR!G_d zeTx(M!%brW_vS9?IF>bzZ2A3mWX-MEaOk^V|4d38{1D|KOlZSjBKrj7Fgf^>JyL0k zLoI$adZJ0T+8i_Idsuj}C;6jgx9LY#Ukh;!8eJ^B1N}q=Gn4onF*a2vY7~`x$r@rJ z`*hi&Z2lazgu{&nz>gjd>#eq*IFlXed(%$s5!HR<!{AgXHWD~USVRvxKdGTp>XKNm zDZld+DwDI`O6hyn2uJ)F^{^;ESf9sjJ)wMSKD~R=DqPBHyP!?cGAvL<1|7K-(=?VO zGcKcF1spUa+ki<qEk7@%dE~%eGpEl!oK*hA!YE+isq^GFdJ#{KfWIULzmRCaF}4(* z-$*W)k94bSp|#5~htGbQ<~v1feWKv$%wM~TX}E><`6K#@QxOTsd847N8WSWztG~?~ z!gUJn>z0O=_)VCE|56hkT~n5xXTp}Ucx$Ii%bQ{5;-a4~I2e|{l9ur#*ghd*hSqO= z)GD@ev^w&5%k}YYB~!A%3*XbPPU-N6&3Lp1LxyP@|C<{qcn&?l54+zyMk&I3YDT|E z{lXH-e?C{huu<@~li+73lMOk&k)3s7Asn$t6!PtXJV!RkA`qdo4|OC_a?vR!kE_}k zK5R9KB%V@R7gt@9=TGL{=#r2gl!@3G;k-6sXp&E4u20DgvbY$iE**Xqj3TyxK>3AU z!b9}NXuINqt>Htt6fXIy5mj7oZ{A&$XJ&thR5ySE{mkxq_YooME#VCHm2+3D!f`{) zvR^WSjy_h4v^|!RJV-RaIT2Ctv=)UMMn@fAgjQV$2G+4?&dGA8vK35c-8r<daDqE- zlIJCF%-7v?-xOAOA*Z$Wv;j3$ldn=}pR52aU>)z9Qqa=%k(FU)?iec14<^olkOU3p zF-6`zHiDKPafKK<gsO-HjX!gIc-J@mlI}lqM!qAHMA?>^USUU+D01>C&Wh{{q?>5m zGQp|z*+#>IIo=|ae8CtrN@@t~uLFOeT{}vX(IY*;>wAU=u1Qo4c+a&R);$^VCr>;! zv4L{`lHgc9$BeM)pQ#XA_(Q#=_i<x#Kw|T_b{oltLKCCP2b6F_+)lx3b*Vc?@JD8p z>SZL4>L~8Hx}NmOC$&*Q*bq|9Aq}rWgFnMDl~d*;7c44GipcpH9PWaBy-G$*MI^F0 z?Tdxir1D<2ui+Q#^c4?uKvq=p>)lq56<F6-{L-8bs~8_dC8J3p4CdV*Iq;6IOvBJh z^E(Ti1wkp{O6qebTnBYm)da^xs3^-TV5tGhoGrFBA^b?UK`APfD~Y+F8!rz@iSNu3 zFO1o9o^S3!%nw&2bpBxHF!V{IaC(n}+(HqYMb(3!l`YX-ru;2?$oSZD;K6*RvAS8r zf1jgZer>=Eb|N^qz~w7rsZu)@E4$;~snz+wIxi+980O6M#RmtgLYh@|2}9BiHSpTs zacjGKvwkUwR3lwTSsCHlwb&*(onU;)$yvdhikonn|B44JMgs*&Lo!jn`6AE>XvBiO z*LKNX3FVz9yLcsnmL!cRVO_qv=yIM#X|u&}#f%_?Tj0>8)8P_0r0!AjWNw;S44tst zv+NXY1{zRLf9OYMr6H-z?4CF$Y%MdbpFIN@a-LEnmkcOF>h16cH_;A|e)pJTuCJ4O zY7!4FxT4>4aFT8a92}84>q0&?46h>&0Vv0p>u~k&qd5$C1A6Q$I4V(5X~6{15;PD@ ze6!s9xh#^QI`J+%8*=^(-!P!@9%~buBmN2VSAp@TOo6}C?az+ALP8~&a0FWZk*F5N z^8P8IREnN`N0i@>O0?{i-FoFShYbUB`D7O4HB`Im2{yzXmyrg$k>cY6A@>bf7i3n0 z5y&cf2#`zctT>dz+hNF&+d3g;2)U!#vsb-%LC+pqKRTiiSn#FH#e!bVwR1nAf*TG^ z!RKcCy$P>?Sfq6n<%M{T0I8?p@HlgwC!<R%oqdMv88ghhaN5z;w29c{kLz0?InueY zuDv#J^DHLyGoyzt8(sCID)#E6<WCYlz7uC1Xvs8QhV{45h-M4rLYe7xw;{g462-zX zIV>HoWO>~mT+X<{Ylm+$Vtj9};H3$EB}P2wR$3y!TO#$iY8eO-!}+F&jMu4%E6S>m zB(N4w9O@2=<`WNJay5PwP8javDp~o~xkSbd4t4t8)<Wt_Xc73S;VOmD#Fsb|nTsJs z59;v?-{=r}I{BDxTN)Iz2&5m`sG^%wjY0*@1I`W29gtM7#wwIQTHvQhS2gB?6J62R zJXy=)7L1!%o4(?3j6J3Pc%v5LFvsR9gKoej%77dCetZylr9&mT=u=p$Kn1Z^C3ySy z3|Tg>9jqu@bHmJHq=MV~Pt|(TghCA}fhMS?s-{klV>~=VrT$nsp7mf{?cze~KKOD4 z_1Y!F)*7^W+BBTt1R2h4f1X4Oy2%?=IMhZU8c{qk3xI1=!na*Sg<=A$?K=Y=GUR9@ zQ(ylIm4Lgm>pt#%p`zHxok%vx_=8Fap1|?OM02|N%X-g5_#S~sT@A!x&8k#wVI2lo z1Uyj{tDQRpb*>c}mjU^gYA9{7mNhFAlM=wZkXcA#MHXWMEs^3>p9X)Oa?dx7b%N*y zLz@K^%1JaArjgri;8ptNHwz1<0y8tcURSbHsm=26^@CYJ3hwMaE<khA9_uuFNLm1L zw+Fp#304~-S;vdG5Nug~K2qs}yD1rrg&9Fcvifn@KphT~L22BKMX?U^9@?Ph`>vC7 z3Wi-@AaXIQ)%F6#i@%M>?Mw7$6(kW@?et@wbk-APcvMCC{>iew#vkZej8%9h0JSc? zCb~K|!9cBU+))^q*co(E^9jRl7gR4Jihyqa(Z(P&ID#TPyysVNL7(^;?Gan!OU>au zN}miBc&XX-M$mSv%3xs)bh>Jq9#aD_l|zO?I+p4_5qI0Ms*OZyyxA`sXcyiy>-{YN zA70%HmibZYcHW&YOHk6S&PQ+$rJ3(utuUra3V0~@=_~QZy&nc~)AS>v&<6$gErZC3 zcbC=eVkV4Vu0#}E*r=&{X)<H<fOshUJUO>Kgq|8MGCh(wsH4geLj@#8EGYa})K2;n z{1~=ghoz=9TSCxgzr5x3@sQZZ0FZ+t{?klSI_IZa16pSx6*;=O%n!uXVZ@1IL;JEV zfOS&yyfE9dtS*^jmgt6>jQDOIJM5Gx#Y2eAcC3l^lmoJ{o0T>IHpEC<k{}Rs{I@x* zb<od>TbfYgPI4#LZq0<d#zAXFmb<Y9lgw&{$vCxBQ~RnTL=zZ7D-RwUE3~Z#wraN% z_E{llZ?GrX#>PKqnPC<SBsRloBYG4ZO7Eeh-Bv2C$rMVb@bcKn3t2`<&0ke8{h|+| z29&HD`tAtGV2ZA(;c{wT$(NWY+fHTL0b7Km+3IMcIX(?D)PQ;HB*^`ex$kl}K>D}_ zyKxz;(`fE0z~nA1s?d{X2!#ZP8wUHzFSOoTWQrk%;wCnBV_3D%3@EC|u$Ao)tO|AO z$4&aa!wbf}rbNc<V}`mLC?8U0y^+E9xuE>P{6=ajgg(`p5kTeu$ji20`zw)X1SH*x zN?T36{d9TY*S896Ijc^!35LLUByY4QO=ARCQ#MMCjudFc7s!z%P$6DESz%zZ#>H|i zw3Mc@v4~{Eke;FWs`5i@ifeYPh-Sb#vCa#qJPL|&quSKF%sp8*n#t?vIE7kFWjNFh zJC@u^bRQ^?ra|%39Ux^Dn4I}QICyDKF0mpe+Bk}!lFlqS^WpYm&xwIYxUoS-rJ)N9 z1Tz*6Rl9;x`4lwS1cgW^H_M*)Dt*DX*W?ArBf?-t|1~ge&S}xM0K;U9Ibf{okZHf~ z#4v4qc6s6Zgm8iKch5VMbQc~_V-ZviirnKCi*ouN^c_2lo&-M;YSA>W>>^5tlXObg zacX$k0=9Tf$Eg+#9k6yV(R5-&F{=DHP8!yvSQ`Y~XRnUx@{O$-bGCksk~3&qH^dqX zkf+ZZ?Nv5u>LBM@2?k%k&_aUb5Xjqf#!&7%zN#VZwmv65ezo^Y4S#(ed0yUn4tFOB zh1f1SJ6_s?a{)u6VdwUC!Hv=8`%T9(^c`2hc9nt$(q{Dm2X)dK49ba+KEheQ;7^0) ziFKw$%EHy_B1)M>=yK^=Z$U-LT36yX<F=`VawpD(xy$9hZLKdS9NJ`Zn_|f^uS`)c z-Rl}C$-9t=SeW=txVx%`NS&LLwx4tQT@F-lQnBqQ-sOH}Jc&bP@MTU&SQLci>>EKT zvD8IAom2&2?bTmX@_PBR4W|p?6?LQ+&UMzXxqHC5VHzf@Eb1u)kwyfy+NOM8Wa2y@ zNNDL0PE$F;yFyf^jy&RGwDXQwYw6yz>OMWvJt98X@;yr<mIFkh{a&op3>!*RQDBE- zE*l*u=($Zi1}0-Y4lGaK?J$yQjgb<Bq)i+tJ7(x$;ieC4!=clV5G5IPlSyhAR$E4= z$1c&+)JfppzZ*VSL$xH3n1^iI1K%)!-^sJU%xwj7WT8t7w6499b3QQ%J+gW)4)JMb z8GVT`4`(VvLA^xbTV6K2V_8Mv*?gDDUBYV!P-qg?Dq*YIhGKXu$p#?E9&(-}opTbz zZ#J#VgX+|T3gSW)eF}>+*ljUvNQ!;QYAoCq@>70=sJ{o{^21^?zT@r~hhf&O;Qiq+ ziGQQLG*D@5;LZ%09mwMiE4Q{IPUx-emo*;a6#DrmWr(zY27d@ezre)Z1BGZdo&pXn z+);gOFelKDmnjq#8dL7CTiVH)dHOqWi~uE|NM^QI3EqxE6+_n>IW67~UB#J==QOGF zp_S)c8TJ}uiaEiaER}MyB(grNn=2m&0yztA=!%3xUREyuG_jmadN*D&1nxvjZ6^+2 zORi7iX1iPi$tKasppaR9$a3IUmrrX)m*)fg1>H+$KpqeB*G>AQV((-G{}h=qItj|d zz~{5@{?&Dab6;0c7!!%Se>w($RmlG7Jlv_zV3Ru8b2rugY0MVPOOYGlokI7%nhIy& z-B&wE=lh2dtD!F?noD{z^O1~Tq4MhxvchzuT_oF3-t4YyA*MJ*n&+1X3<j>~6quEN z@m~aEp=b2~mP+}TUP^FmkRS_PDMA{B<dV*k52^3iWFIaXBr1MC#nA4rRMbI6g1e0> zaSy(P=$T~R!yc^Ye0*pl5xcpm_JWI;@-di+nruhqZ4gy7cq-)I&s&Bt3BkgT(Zdjf zTvvv0)8xzntEtp4iXm}~cT+pi5k{w{(Z@l2XU9lHr4Vy~3ycA_T?V(QS{qwt?v|}k z_ST!s;C4!jyV5)^6xC#v!o<DVtBeh%T7qnQl{H-3DV=+H*Qr*Tk6W^hU(ZD0kJnpt z6l*<^aakgBhlA+xpS}v`t7iyV?zu_V<U{&GBzBLYIuzDQe~f#6w^zD>*uS%a-jQ6< z)>o?z7=+zNNtIz1*F_HJ(w@=`E+T|9TqhC(g7kKDc8z~?RbKQ)LRMn7A1p*PcX2YR zUAr{);~c7I#3Ssv<0i-Woj0&Z4a!u|@Xt2J1>N-|ED<3$o2V?OwL4oQ%$@!zLamVz zB)K&Ik^~GOmDAa143{I4?XUk1<3-k{<%?&OID&>Ud%z*Rkt*)mko0RwC2=qFf-^OV z=d@47?tY=A;=2VAh0mF(3x;!#X!%{|vn;U2XW{(nu5b&8kOr)Kop3-5_xnK5oO_3y z!EaIb{r%D{7zwtGgFVri4_!yUIGwR(xEV3YWSI_+E}Gdl>TINWsIrfj+7DE?xp+5^ zlr3pM-Cbse*WGKOd3+*Qen^*uHk)+EpH-{u@i%y}Z!YSid<}~kA*IRSk|nf+I1N=2 zIKi+&ej%Al-M5`cP^XU>9A(m7G>58>o|}j0ZWbMg&x`*$B9j#Rnyo0#=BMLdo%=ks zLa3(2EinQLXQ(3zDe7Bce%Oszu%?8PO648TNst4SMFvj=+{b%)ELyB!0`B?9R6<HO z0ZCx8TWpL$G_aCzv{2o6N{#z3g%x>aO{i-63|s@|raSQGL~s)9R#J#duFaTSZ2M{X z1?YuM*a!!|jP^QJ(hAisJuPOM`8Y-Hzl~%d@latwj}t&0{DNNC+zJARnuQfiN`HQ# z?boY_2?*q;Qk)LUB)s8(Lz5elaW56p&fDH*AWAq7Zrbeq1!?FBGYHCnFgRu5y1jwD zc|yBz+UW|X`zDsc{W~8m<GsO<mO_1`^L`RbrG?Z6Us2*=^_x$`JV{a_LYEsuJtJYL ziPBF7dm}M2=6vrP;RB?Z6!7)Zvt4B!$rUPf{RA&_8%VD|7)NrR9*=&gO*sOzLhB*~ z^{cR)lY*pt9GGm(POd`WZo!H=s$8fLl_}-xnV5A+4*BbLUMGLAzH|i9_k(p_(`_J- zjFFqtuzWuLa;BGl;mNUQM^&@rL--@GcC@@A*GDUdTjOrweNe5I+671K_l#WVI|@LM z6mSs@4|l^kTD;Gvy}KaDi)#o4AD~D*LX@4{{bfG+FoqQ?-6%VkN)4{7vy<hZ9gNX| zQxtE>$sh@VVnZD$lLnKlq@Hg^;ky!}ZuPdKNi2BI70;hrpvaA4+Q_+K)I@|)q1N-H zrycZU`*YUW``Qi^`bDX-j7j^&bO+-Xg$cz2#i##($uyW{Nl&{DK{=lLWV<rkzZltE zVX#Q@q!0kD+4jwZ#haJNHLSu>3|=<&si||2)l=8^8_z+Vho-#5LB0EqQ3v5U#*DF7 zxT)1j^`m+lW}p$>WSIG1eZ>L|YR-@Feu!YNWiw*IZYh03mq+2QVtQ}1ezRJM?0PA< z;mK(J5@N8>u@<6Y$QAHWNE};rR|)U_&bv8dsnsza7{=zD1VBcxrALqnOf-qW(zzTn zTAp|pEo#FsQ$~*$j|~Q;$Zy&Liu9OM;VF@#_&*nL!N2hH!Q6l*OeTxq!l>dEc{;Hw zCQni{iN%jHU*C;?M-VUaXxf0FEJ_G=C8)C-wD!DvhY+qQ#FT3}Th8;GgV&AV94F`D ztT6=w_Xm8)*)dBnDkZd~UWL|W=Gl<gto;(*wC9U9tZbpA!j<N3*HCbtKUlby_Vyr4 z!?d@=(#f`*(ud3VsGC{9IRi#5(w*FK!J}~s9(p0ap?ykZJBp1cTUR*jPbbAP&K)BP zDUly$`B#Sn(aWroZGbyL&=Dg67A>u!$hc|1w7_7l!3MAt95oIp4Xp{M%clu&TXehO z+L-1#{mjkpTF@?|w1P98OCky~S%@OR&o75P<Wn%&Jm$EVDF7;}E<;f25{W=vmcPFf zmJVk81ZR1bRmlb|#0}DPdayCjq(27hQh>&ZHvC}Y=(2_{ib(-Al_7aZ^U?s34#H}= zGfFi5%KnFVCKtdO^>Htpb07#BeCXMDO8U}crpe1Gm`>Q=6qB4i=nLoLZ%p$TY=OcP z)r}Et-Ed??u~f09d3Nx3bS@ja!fV(Dfa5lXxRs#;8?Y8G+Qvz+iv7fiRkL3liip}) z&G0u8RdEC9c$$rdU53=<QkS9aMArWJ!P8{(D~hr9YfM2Q0nl|;=ukHlQj%<P$wYfa z?$=heR#}yGJkpA2LI#>MH`p!Jn|DHjhOxHK$tW_pw9wCTf0Eo<){HoN=zG!!Gq4z4 z7PwGh)V<N7ESN6`*^`^Q73fj(wcMs7=5Iu(yJo@Q_F?W?yk3)SdLai+cM6GrKPrjs za_NJm=uOAmRL5F_{*Yjb_BZNY?)kCB%$WE8;A{ZK>NPXW-cE#MtofE`-$9~nmmj}m zlzZscQ2+Jq%gaB9rMgVJkbhup0Ggpb)&L01T=%>n7-?v@I8!Q(p&+!fd+Y^Pu9l+u zek(_$^HYFVRRIFt@0Fp52g5Q#I`tC3li`;UtDLP*rA{-#Yoa5qp{cD)QYhldihWe+ zG~zuaqLY~$-1sjh2lkbXCX;lq+p~!2Z=76cvuQe*Fl>IFwpUBP+d^<W!tp~MwxCaj zHBQw{tTF&?2^15<bHvmlCS|A$khwaGVZw*2lw&_pOQz;LcFj@Ysq%CZ)?t&74A|dB z4WL~cZpG-0G^KuK)}aNOTySm-Lt#QyW&mN^>&E4BGc<j4bbw_-4Ttv5`+q&kCfaBq z#Rl}~m+g*DG5=zM=t?z8cf%Vr>{m#l%Kuo6#{XGoRyFc%Hqhf|%nYd<;yiC>tyEyk z4I+a<QbTvlzlVm5v2!^bF)s*0Cw+t*kzz%N#&QZ42CimT6ySz~?+nd>`(%%Ie=-*n z-{mg=j&t12)LH3R?@-B1tEb7FLMePI1HK0`Ae@#)KcS%!Qt9p4_fmBl5zhO10n401 zBSfnfJ;?_r{%R)hh}BBNSl=$BiAKbuWrNGQUZ)+0=Mt&5!X*D@yGCSaMNY&@`;^a4 z;v=%D_!K!WXV1!3%4P-M*s%V2b#2jF2bk!)#2GLVuGKd#vNpRMyg`kstw0GQ8@^k^ zuqK5uR<>FeRZ#3{%!|4X!hh7hgirQ@Mwg%%ez8pF!N$xhMNQN((yS(F2-OfduxxKE zxY#7O(VGfNuLv-ImAw5+h@gwn%!ER;*Q+001;W7W^waWT%@(T+5k!c3A-j)a8y11t zx4~rSN0s$M8HEOzkcWW4YbKK9GQez2XJ|Nq?TFy;jmGbg;`m&%U4hIiarKmdTHt#l zL=H;ZHE?fYxKQQXKnC+K!TAU}r086{4m}r()-QaFmU(qWhJlc$eas&y<Oz%^3FaFm z1?*33BSANpZbOjV<(WE=T(DuY)_XOR{Jho+f)Z}g61HjnqKKN*8E0S?ATVoi0{#On zGn@2R)R+{|FLX_EYm8{*=&UqzSkXCnZ)vWGS!9t02v^*;nhYk{U}PXVkPhlRc3UH{ zA-5Xc>?=H9EYQy8N$8^bni9TpD<bzO7YS=tCt}zYcl)|7!PRQIoif~D7yjeqW#(B3 zmpkmPyyRt85TQV!liLz!S@Olwr9!I#6DL45xU1kD`j8+MN!ST75vIA5J=~k_se^q# zaC@(uVW_ra*o|Fs!(sX4Ik6k-(M%QP2;-Z@Rf=+&=pE`Dv8K9?k1Fg2pF%vW*HO>p zkA^WRs?KgYgjxX4T6?`SMs$`s3vlut(YU~f2F+id(Rf_)$BIMibk9lACI~LA+i7xn z%-+=DHV*0TCTJp~-|$VZ@g2vmd*|2QXV;HeTzt530KyK>v&253N1l}bP_J#UjLy4) zBJili9#-ey8Kj(dxmW^ctorxd;te|xo)%46l%5qE-YhAjP`Cc03vT)vV&GAV%#Cgb zX~2}uWNvh`2<*AuxuJpq>SyNtZwzuU)r@@dqC@v=Ocd(HnnzytN+M&|Qi#f4Q8D=h ziE<3ziFW%+!yy(q{il8H44g^5{_+pH60Mx5Z*FgC_3hKxmeJ+wVuX?T#ZfOOD3E4C zRJsj#wA@3uvwZwHKKGN{{Ag+8^cs?S4N@6(Wkd$CkoCst(Z&hp+l=ffZ?2m%%ffI3 zdV7coR`R+*dPbNx=*ivWeNJK=Iy_vKd`-_Hng{l?hmp=|T3U&epbmgXXWs9ySE|=G zeQ|^ioL}tve<e`!rDYCFUej_ysJ2z(4AIN3g4xGaB0&Y<^`&A^@AOml<{gmBP!-y6 z!IsbSiZ8eH@;)gbXcV?N4*>N{s72_&h+F+W;G}?;?_s@h5>DX(rp#eaZ!E=NivgLI zWykLKev+}sHH41NCRm7W>K+_qdoJ8x9o5Cf!)|qLtF7Izxk*p|fX8UqEY)_sI_45O zL2u>x=r5xLE%s|d%MO>zU%KV6QKFiEeo12g#bhei4!Hm+`~Fo~4h|BJ)%ENxy9)Up zOxupSf1QZWun=)gF{L0YWJ<(r0?$bPFANrmphJ>kG`&7E+RgrWQi}ZS#-CQJ*i#8j zM_A0?w@4Mq@xvk^>QSvEU|VYQoVI=TaOrsLTa`RZfe8{9F~mM{L+C`9YP9?Okn<Y+ zQ`?h`EW57j4Qxm_DjacY`kEKG93n7#6{CBssPbH&1L2KSo|Htm*KD+0p<wD8e>Lw| zmkvz>cS6`pF0FYeLdY%>u&XpPj5$*iYkj=m7wMzHqzZ5SG~$i_^f@QEPEC+<2nf-{ zE7W+n%)q$!5@2pBuXMxhUSi*%F>e_g!$T-_`ovjBh(3jK9Q^~OR{)}!0}vdTE^M+m z9QWsA?xG>EW;U~5gEuKR)Ubfi&YWnXV;3H6Zt^NE725*`;lpSK4HS1sN?{~9a4JkD z%}23oAovytUKfRN87XTH2c=kq1)O<qRzRUy={bH%*8V=pA##jg=-EE6(Lotu<IYEm zZ71>5(fH_M3M-o{{@&~KD`~TRot-gqg7Q2U2o-iiF}K>m?CokhmO<lc^{s0_OssMw zc*3nzZ5WN~$;I6TzaKlN9W+6*SX5vHzSUyIfdtNx5K}gB*a}Ei-T%?Pusx0i{k6zW zVCCXrjNT1#YIkZ%s$(OfAJ`FBR*66B?{y$nkK6iXlBVVr@2#yGM6%0i_(U5#>DaLB z1p6(6JYGntNOg(s!(>ZU&lzDf+Ur)^Lirm%*}Z>T)9)fAZ9>k(kvnM;ab$ptA=hoh zVgsVaveXbMpm{|4*d<0>?l_JUFOO8A3xNLQOh%nVXjYI6X8h?a@6kDe5-m&;M0xqx z+1U$s>(P9P)f0!{z%M@E7|9nn#IWgEx6A6JNJ(7dk`%6$3@!C!l;JK-p2?gg+W|d- ziEzgk$w7k48NMqg$CM*4O~Abj3+_yUKTyK1p6GDsGEs;}=E_q>^LI-~pym$qhXPJf z2`!PJDp4l(TTm#|n@bN!j;-FFOM__eLl!6{*}z=)UAcGYloj?bv!-XY1TA6Xz;82J zLRaF{8ayzGa|}c--}|^xh)xgX>6R(sZD|Z|qX50gu=d`gEwHqC@WYU7{%<5VOnf9+ zB<I4+b1=sZ53G|-kvYcPViY)E5R#f6q2$x?f020VY)3|@p~2oGrySSwa~uPN4nC&g zX!I>@FX?|UL%`8EIAe!*UdYl|6wRz6Y>(#8x92$#y}wMeE|ZM2X*c}dKJ^4NIf;Fm zNwzq%QcO?$NR-7`su!*$dlIKo2y(N;qgH@1|8QNo$0wbyyJ2^}$iZ>M{BhBjTdMjK z>gPEzgX4;g3$rU?jvDeOq`X=>)zdt|jk1Lv3u~bjHI=EGLfIR&+K3ldcc4D&Um&04 z3^F*}WaxR(ZyaB>DlmF_UP@+Q*h$&nsOB#gwLt{1#F4i-{A5J@`>B9@{^i?g_Ce&O z<<}_We-RUFU&&MHa1#t56u<quT+%|#XvIpRJ?co{{tU0{tvlHG=;UJAM%ZgS1Wk*< zbzK}T;?L5YLE4NLu9J0u#X!J<y<O?uV#gKBNVOZ@7SW<kFyslWRX@_C90;+zxGfEz zb5V;-W-;gzJ|=>_oM(Ljn7djja!T|gcxSoR=)@?owC*NkDarpBj=W4}=i1@)@L|C) zQKA+o<(pMVp*Su(`zBC0l1yTa$MRfQ#uby|$mlOM<xEsq_18&vqMDMD7Zoz%Fkm7A z3)Py9=vTp8h$K)n9Uvzc$sVOT&zol^a%bZk8R4Y8^rZSJmY_uRt<`DC1F!?x#33tZ ze&XW>s=G`4J|?apMzKei%jZql#gP@IkOaOjB7MJM=@1j(&!jNnyVkn5;4lvro1!vq ztXiV8HYj5%)r1PPpIOj)f!><jg)vV+x8*ZL<Q!-CP7F3VXp#~OA}`YkX&1&s!htsT z^$c2`mPAtTVX<qUk`r6!8Vb=Uc23%M)2;P#-xg0%R+ozayS`Bp$+go_wMt83+CODc z2B}|cG;*tiKwHPYIq{X<`rJQAk*7&QC@O%H3Z553ow$9gREC4~b(*v-N%(bN;Y@mL zsmAcMVly_+3OO{6?K&3Aei;$vMv!82h}`Bdn#~L=J)xK(4o*51?I7`(&5m9X))pa; zLPfmH5<-xa-W%$*L{V<;N$-)VdNT!&jA&vHrEgBjjo5UU0If7Vhz3vkcHNAY5aT+C zc5euR<}4<-qaBP_Zef)X2|HW=07DGXb>pc^3#LvfZ(hz}C@-3R(Cx7R427*Fwd!XO z4~j&IkPHcBm0h_|iG;ZNrYdJ4HI!$rSyo&sibmwIgm1|J#g6%>=ML1r!kcEhm(XY& zD@mIJt;!O%WP7CE&wwE3?1-dt;RTHdm~LvP7K`ccWXkZ0kfFa2S;wGtx_a}S2lslw z$<4^Jg-n#Ypc(3t2N67Juasu=h)j&UNTPNDil4MQMTlnI81kY46uMH5B^U{~nmc6+ z9>(lGhhvRK9ITfpAD!XQ&BPphL3p8B4PVBN0NF6U49;ZA0Tr75AgGw7(S=Yio+xg_ zepZ*?V#KD;sHH+15ix&yCs0eSB-Z%D%uujlXvT#V$Rz@$+w!u#3GIo*AwMI#Bm^oO zLr1e}k5W~G0xaO!C%Mb{sarxWZ4%Dn9vG`KHmPC9GWZwOOm11XJp#o0-P-${3m4g( z6~)X9FXw%Xm~&99tj>a-ri})ZcnsfJtc10F@t9xF5vq6E)X!iUXHq-ohlO`gQdS&k zZl})3k||u)!_=nNlvMbz%AuIr89l#I$;rG}qvDGiK?xTd5HzMQkw*p$YvFLGyQM!J zNC^gD!kP{A84nGosi~@MLKqWQNacfs7O$dkZtm4-BZ~iA8xWZPkTK!Hp<LTap+x4* zUK;Ha0;Jc=$HCCwcHw+aadnOZR281fO)q}D^z9=|qH9;-;e${xK|?9elJ8=LaM<65 zE6;>A5zr!9Z&+icfAJ1)NWkTd!-9`NWU>9uXXUr;`Js#NbKFgrNhTcY4GNv*71}}T zFJh?>=EcbUd2<|fiL+H=wMw8hbX6?+_cl4XnCB#ddwdG><R|vBc*yG=?!<`t>bki* zt*&6Dy&EIPluL@A3_;R%)shA-tDQA1!Tw4ffBRyy;2n)vm_JV06(4O<t|JggQ(KZT zsYO62-6u^^mX>r&QAOKNZB5f(MVC}&_!B>098R{Simr!UG}?CW1Ah+X+0#~0`X)od zLYablwmFxN21L))!_zc`IfzWi<Gu||u|EiUx`=l}NMzvxMP68pmmwjICH*y4{3)P@ z%y44Q*AVc4<$z9@nMeRAeVJ+>`5>MxPe(Dm<mb5oz44!o-XIzF2v`EK`q7j%sCMv2 zL>jjO1}HHt7TJtAW+VXHt!aKZk>y6PoMsbDXRJnov;D~Ur~2R_7(Xr)aa%wJwZh<i zvMmaF%EvU)a6S{Gh%whrx@S36i|iv5oL=QhR4YK<CK74@mwN~dH00RX{_e6r+#l%j z7OK<7e3kn;@H(@8>S3gr7IGgt%@;`jpL@gyc6bGCVx!9CE7NgIbUNZ!Ur1RHror0~ zr(j$^yM4j`#c2KxSP61;(Tk^pe7b~}LWj~SZC=MEpdKf;B@on9=?_n|R|0q;Y*1_@ z>nGq>)&q!;u-8H)WCwtL<LrD$x{Fa((5#4K!l=^|krt6e2?!PZN=Rmwt*1$d&$Q{J zCgeI0rGg+wn3iR*eck$cFmbQ~E3GYxr&dJb(4{lgPt?n#^<GT#&j{om5`|wE6bW}} ze{Pav1oDZnak%Fz$PD1ZH8xBo#FnqUG6u>&7F4vbnnfSAlK1mwnRq2&gZrEr!b1MA z(3%vAbh3aU-IX`d7b@q`-WiT6eitu}ZH9x#d&qx}?CtDuAXak%5<-P!{a`V=$|XmJ zUn@4lX6#ulB@a=&-9HG)a>KkH=jE7>&S&N~0X0zD=Q=t|7w;kuh#cU=NN7gBGbQTT z;?<kJaO{>bdSt8V&IIi}<ThZP?O{MP;s77svl-cIdCj)d-BZGJap1Ull?cz;BdUt4 zMAS0={#2iyI>sDTzA0dkU}Z-Qvg;RDe8v>468p3*&hbG<I%;HTx8<Z&Ih@Xrl%AO4 zEZ252P#-|8MJE+L5IXho^0!PtBR61%3tAJ8RP$~a8%~<+5(4Lyh@;kvSLVbDc4PRn z?4(9&{Rpo>T1I3hi9hh~Z(!H}{+>eUyF)H&gdrX=k$aB%J6I<Mis<6rrEG;E4zw&M zYsQ6$FFc_^cwkYGT9ds?4^G_w2+$2L@}W#bXUf0JW}7J?EgbIp`jFFailmTZXuEyM z?LcqfTM!s>;6+^^kn1mL+E+?A!A}@xV(Qa@M%HD5C@+-4Mb4lI=Xp=@9+^x+jhtOc zYgF2aVa(uSR*n(O)e6tf3JEg2xs#dJfhEmi1iOmDYWk|wXNHU?g23^IGKB&yHnsm7 zm_+;p?YpA#N*7vXCkeN2LTNG`{QDa#U3fcFz7SB)83=<8rF)|udrEbrZL$o6W?oDR zQx!178Ih9B#D9Ko$H(jD{4MME&<|6%MPu|TfOc#E0B}!j^MMpV69D#h2`vsEQ{(?c zJ3Lh!3&=yS5fWL~;1wCZ?)%nmK`Eqgcu)O6rD^3%ijcxL50^z?OI(LaVDvfL0#zjZ z2?cPvC$QCzpxpt5jMFp05OxhK0F!Q<m=7hVYzR||ecS~Bi9y8}>`rPhDi5)y=-0C} zIM~ku&S@pl1&0=jl+rlS<4`riV~LC-#pqNde@44MB(j%)On$0Ko(@q?4`1?4149Z_ zZi!5aU@2vM$dHR6WSZpj+VboK+>u-CbNi7*lw4K^ZxxM#24_Yc`<w`lM<_9<AjZra zPf9|W$q@ib+eT6)aN(T>jvb9NPVi75L+MlM^U~`;a7`4H0L|TYK>%hfEfXLsu1JGM zbh|8{wuc7ucV+`Ys1kqxsj`dajwyM;^X^`)#<+a~$WFy8b2t_RS{8yNYKKlnv+>vB zX(QTf$kqrJ;%I@EwEs{cIcH@Z3|#^S@M+5jsP<^`@8^I4_8MlBb`~cE^n+{{;qW2q z=p1=&+fUo%T{GhVX@;56kH8K_%?X=;$OTYqW1L*)hzelm^$*?_K;9JyIWhsn4SK(| zSmXLTUE8VQX{se#8#Rj*lz`xHtT<61V~fb;WZUpu(M)f#<N`ZtP}(nwt@v*JXMv*g zTjkPmLef!CJNB3?7*>;I+2_zR+)y5Jv?l`CxAinx|EY!`IJ*x9_gf_k&Gx2alL!hK zUWj1T_pk|?iv}4EP#PZvYD_-LpzU!NfcL<ZIyO_4myXe0OU}<Cprr_|XIrM73FXg` zNRt~K9+=_-Laa5&Rt6kJaobEvjFnh>L%fK&r$W8O1KH9c2&GV~N#T$kaXGvAOl)|T zuF9%6(i=Y3q?X%VK-D2YIY<MPA*$`<$Z)_O$(a?^Bnjd_-qk6atAX5(s0D1W1}`G9 zl)%h^mai+5Kwy1+I$Zaauh0oNm3mQUQ=`8aEAo=0zrm72grj|c8&W!-^+^6zMgm-+ zSpJe{_P`h~;t1=21VLIQ5n~@Q5Y=~VMN|L<mJfGW44?>FPH3f|g$TrXW->&^Ab`WT z7>Oo!u1u40?jAJ8H<j_H`^tLy@LZ5-N)dU$=t?bXuTI1>y`bv}qb<AzbCJ<X7c~}% z50@S(*;X)_P8TrUWZGQQn`AI#Eve&0+FNaAqg<m^ZNYdEveME+t5Q5DV5-rT<{g7@ zG+rSFooLii=nDW~qWOU#YzUJee#V*XI!cGhpz&<{SF!$pIm@`rT3A99J?qG9DPU@z z9jawkO0(cqfU^RIM<K3r*yl0SKgPT>gs8)cF0&qeVjD?e+3Ggn1Im>K77ZSpbU*08 zfZkIFcv?y)!*B{|>nx@cE{KoutP+seQU?bCGE`tS0GKUO3PN~t=2u7q_6$l;uw^4c zVu^f{uaqsZ{*a-N?2B8ngrLS8<WR!m{e>E&s6}Xtv9rR9C^b`@q8*iH)pFz<!x=AK zf6E-O(MiUN4a^nRWR%`TBl@CGu2cFmmpRkBUAPvyvw&qDg1_6Y)ycUoITv4yV(Mk5 z=Dtmg6tsakVjdG2BV~=LD3YcTEr=j6ou|^*Qem;+#vOz?`MQ>f1|kCfiLw6u{Z%aC z!X^5CzF6qofFJgkl<Rtc72CagCpKF^gmhb1CH>JV3oc|Qc2XdFl+y5M9*P8}A>Kh{ zWRgRwMSZ(?Jw;m%0etU5BsWT-Dj-5F;Q$OQJrQd+lv`i6>MhVo^p*^w6{~=fhe|bN z*37oV0kji)4an^%3ABbg5RC;CS50@PV5_hKfXjYx+(DqQdKC^JIEMo6X66$qDdLRc z!YJPSKnbY`#Ht6`g@xGzJmKzz<St<)P9XB^ZWQT2VtTE^8HdQx8o;%`J{lUpkn0!& z^d*IdfCW?sDnD#zV!vee5Xd}&#I@u4z;`)LVXVayyf`~NUMeM>n|abYbP+_Q(v?~~ z96%cd{E0BCsH^0HaWt{y(Cuto4VE7jhB1Z??#UaU(*R&Eo+J`UN+8mcb51F|I|n*J zJCZ3R*OdyeS9hWkc_mA7-br>3Tw=CX2bl(=TpVt#WP8Bg^vE_9bP&6ccAf3lFMgr` z{3=h@?Ftb$RTe&@IQtiJf<Z$(x)W;Yibdk0Eou)O=h)|ox2XJhbM7gDjm$)%o0c)W z!;CM_%5jr$Dk{vl7{DX~*^!MCEDILf;SGbcLK^kRyl}+&4r>V;O&4fzh)e1>7seG; z=%mA4@c7{aXeJnhEg2J@Bm;=)j=O=cl#^NNkQ<{r;Bm|8Hg}bJ-S^g4`|itx)~!LN zXtL}?f1Hs6UQ+f0-X6&TBCW=A4>bU0{rv8C4T!(wD-h>VCK4YJk`6C9$by!fxOYw- zV#n+0{E(0ttq<e;u-JNg<=7mR)Baf(#XbsMPDR?mv12UXo+AuGM*TW4&Dbw3MHmyv zzQ)3g$Jc}F5k_3<jP&G5r+akl<UzYyi9?xB4hK@h8+B`?3~Bn5^eKgTbZcatPPir( zn|7xaL9v;L3{V1l&DQSp%TOnp^O8OS$m-yD0^r7mU@qJQ<RvUSI@G_}IuDMi8mq0p z?O{gor*9fmQL7Mrb|ducn%AQOk@nhAYv{%&-E+j$)7Bpd*!L2Cg%7pf&3ZLxA5Fwj z%8~}*Sw2G<h3E&$jhO(1=)P&U%mN)4Rk5JcPDUdUN*FM8j0Mg^@Z|6~Ym*2e3TCV6 z?5B1NxqE*aMe#2m&+Fz%OG!n`J`B2Ww|QiS6U=1^3d+6`ls$U%hB`nu)=J>_#16B} ze8$E#X9o{B!0vbq#WUwmv5Xz6{(!^~+}sBW{xctdNHL4^vDk!0E}(g|W_q;jR|ZK< z8w>H-8G{%R#%f!E7cO_^B?yFRKLOH)RT9GJsb+kAKq~}WIF)NRLwKZ^Q;>!2MNa|} z-mh?=B;*&D{Nd-mQRcfVnHkChI=DRHU4ga%xJ%+QkBd|-d9uRI76@BT(bjsjwS+r) zvx=lGNLv1?SzZ;P)Gnn>04fO7Culg*?LmbEF0fATG8S@)oJ>NT3pYAXa*vX!eUTDF ziBrp(QyDqr0ZMTr?4uG_Nqs6f%S0g?h`1vO5fo=5S&u#wI2d4+3hWiolEU!=3_oFo zfie<EEFWI+<HRR}kMBRY{{xT?Ubu+n1E+3-XyZ@DlC1|CziB+t8LH;pSr1_{$txb2 z{LD6Cutu@sVLZ$sgxfHzi88%ifnz%FWxPwItQ=UFSeRQ?XX#H8uXPtSY1Da8V^-Nz zx}G&3QUOW&pFuYAPt>?+4W#`;1dd#X@g9Yj<53S<6OB!TM8w8})7k-$&q5(smc%;r z(BlXkTp`C47+%4JA{2X}MIaPbVF!35P#p;u7+fR*46{T+LR8+<Ms(<(ewo92Plp}^ z0K5%%0PpyoHDM$82Vjt^Jp>j25oduCfDzDv6R-hU{TVVo9fz?^N3ShMt!t0NsH)pB zRK8-S{Dn*y3b|k^*?_B70<2gHt==l7c&cT>r`C#{S}J2;s#d{M)ncW(#Y$C*lByLQ z&?+{dR7*gpdT~(1;<m}fXp@S^XBCFbD&Le<rzooSQB^d8r#S^ok_xS36-~w}kc?Ej z7^zYrQY=EF$c06)iin^U556ixd{lb)^l<R>M(FfF==3z`^eW)=5a9RqvF-)2?S-(G zhS;p(u~_qBum*q}On@$#08}ynd0+spzyVco0%G6;<-i5&016cV5UKzhQ~)fX03|>L z8ej+HzzgVr6_5ZUpa4HW0Ca!=r1%*}Oo;2no&Zz8DfR)L!@r<<lmB!F&$32&71xdc zAQ}KMGyqI!0F2N8;eY{y00CwIf0+QV$OUD<C@ujha0p9)KwJUh;0%`lShxaZKm`>5 z2viSZpmvo5XqXyAz{Ms7`7kX>fnr1gi4X~7KpznRT0{Xc5Cfz@43PjBMBoH@z_{~( z(Wd}IPJ9hH+%)Fc)0!hrV+(A;76rhtI|YHbEDeERV~Ya>SQg^IvlazFkSK(KG9&{q zkPIR~EeQaaBmwA<20}m<i2yt#0ML*D!NB+q2RLvyLxH9o41nNb1p??O7J)#e3I!NY z1wlX)g#bnj0Jty$0KoMI0Cb7`0i50h9gE~g7Om;jPg0kO>BO?)N$(z1@p)5?%}rM| zGF()~Z&Kx@OIDRI$d0T8;JX@vj3^2%pd_+@l9~a4lntZ;AvUIjqIZbuNTR6@hNJoV zk4F;ut)LN4ARuyn2M6F~eg-e#UH%2P;8uPGFW^vq1vj8mdIayFOZo(tphk8C7hpT~ z1Fv8?b_LNR3QD9J+!v=p%}#<WkmT3SAH~zHvL~<r009F5U;qFWp(o;x5Q1O?TufB{ c@Yw=E7;q9obAc&xg(1}n;wTCO(gbOOU|30r`2YX_ diff --git a/flask_admin/static/bootstrap/bootstrap3/swatch/fonts/glyphicons-halflings-regular.svg b/flask_admin/static/bootstrap/bootstrap3/swatch/fonts/glyphicons-halflings-regular.svg deleted file mode 100644 index 94fb5490a..000000000 --- a/flask_admin/static/bootstrap/bootstrap3/swatch/fonts/glyphicons-halflings-regular.svg +++ /dev/null @@ -1,288 +0,0 @@ -<?xml version="1.0" standalone="no"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > -<svg xmlns="http://www.w3.org/2000/svg"> -<metadata></metadata> -<defs> -<font id="glyphicons_halflingsregular" horiz-adv-x="1200" > -<font-face units-per-em="1200" ascent="960" descent="-240" /> -<missing-glyph horiz-adv-x="500" /> -<glyph horiz-adv-x="0" /> -<glyph horiz-adv-x="400" /> -<glyph unicode=" " /> -<glyph unicode="*" d="M600 1100q15 0 34 -1.5t30 -3.5l11 -1q10 -2 17.5 -10.5t7.5 -18.5v-224l158 158q7 7 18 8t19 -6l106 -106q7 -8 6 -19t-8 -18l-158 -158h224q10 0 18.5 -7.5t10.5 -17.5q6 -41 6 -75q0 -15 -1.5 -34t-3.5 -30l-1 -11q-2 -10 -10.5 -17.5t-18.5 -7.5h-224l158 -158 q7 -7 8 -18t-6 -19l-106 -106q-8 -7 -19 -6t-18 8l-158 158v-224q0 -10 -7.5 -18.5t-17.5 -10.5q-41 -6 -75 -6q-15 0 -34 1.5t-30 3.5l-11 1q-10 2 -17.5 10.5t-7.5 18.5v224l-158 -158q-7 -7 -18 -8t-19 6l-106 106q-7 8 -6 19t8 18l158 158h-224q-10 0 -18.5 7.5 t-10.5 17.5q-6 41 -6 75q0 15 1.5 34t3.5 30l1 11q2 10 10.5 17.5t18.5 7.5h224l-158 158q-7 7 -8 18t6 19l106 106q8 7 19 6t18 -8l158 -158v224q0 10 7.5 18.5t17.5 10.5q41 6 75 6z" /> -<glyph unicode="+" d="M450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-350h350q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-350v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v350h-350q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5 h350v350q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode=" " /> -<glyph unicode="¥" d="M825 1100h250q10 0 12.5 -5t-5.5 -13l-364 -364q-6 -6 -11 -18h268q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-100h275q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-174q0 -11 -7.5 -18.5t-18.5 -7.5h-148q-11 0 -18.5 7.5t-7.5 18.5v174 h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h125v100h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h118q-5 12 -11 18l-364 364q-8 8 -5.5 13t12.5 5h250q25 0 43 -18l164 -164q8 -8 18 -8t18 8l164 164q18 18 43 18z" /> -<glyph unicode=" " horiz-adv-x="650" /> -<glyph unicode=" " horiz-adv-x="1300" /> -<glyph unicode=" " horiz-adv-x="650" /> -<glyph unicode=" " horiz-adv-x="1300" /> -<glyph unicode=" " horiz-adv-x="433" /> -<glyph unicode=" " horiz-adv-x="325" /> -<glyph unicode=" " horiz-adv-x="216" /> -<glyph unicode=" " horiz-adv-x="216" /> -<glyph unicode=" " horiz-adv-x="162" /> -<glyph unicode=" " horiz-adv-x="260" /> -<glyph unicode=" " horiz-adv-x="72" /> -<glyph unicode=" " horiz-adv-x="260" /> -<glyph unicode=" " horiz-adv-x="325" /> -<glyph unicode="€" d="M744 1198q242 0 354 -189q60 -104 66 -209h-181q0 45 -17.5 82.5t-43.5 61.5t-58 40.5t-60.5 24t-51.5 7.5q-19 0 -40.5 -5.5t-49.5 -20.5t-53 -38t-49 -62.5t-39 -89.5h379l-100 -100h-300q-6 -50 -6 -100h406l-100 -100h-300q9 -74 33 -132t52.5 -91t61.5 -54.5t59 -29 t47 -7.5q22 0 50.5 7.5t60.5 24.5t58 41t43.5 61t17.5 80h174q-30 -171 -128 -278q-107 -117 -274 -117q-206 0 -324 158q-36 48 -69 133t-45 204h-217l100 100h112q1 47 6 100h-218l100 100h134q20 87 51 153.5t62 103.5q117 141 297 141z" /> -<glyph unicode="₽" d="M428 1200h350q67 0 120 -13t86 -31t57 -49.5t35 -56.5t17 -64.5t6.5 -60.5t0.5 -57v-16.5v-16.5q0 -36 -0.5 -57t-6.5 -61t-17 -65t-35 -57t-57 -50.5t-86 -31.5t-120 -13h-178l-2 -100h288q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-138v-175q0 -11 -5.5 -18 t-15.5 -7h-149q-10 0 -17.5 7.5t-7.5 17.5v175h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v100h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v475q0 10 7.5 17.5t17.5 7.5zM600 1000v-300h203q64 0 86.5 33t22.5 119q0 84 -22.5 116t-86.5 32h-203z" /> -<glyph unicode="−" d="M250 700h800q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="⌛" d="M1000 1200v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-50v-100q0 -91 -49.5 -165.5t-130.5 -109.5q81 -35 130.5 -109.5t49.5 -165.5v-150h50q21 0 35.5 -14.5t14.5 -35.5v-150h-800v150q0 21 14.5 35.5t35.5 14.5h50v150q0 91 49.5 165.5t130.5 109.5q-81 35 -130.5 109.5 t-49.5 165.5v100h-50q-21 0 -35.5 14.5t-14.5 35.5v150h800zM400 1000v-100q0 -60 32.5 -109.5t87.5 -73.5q28 -12 44 -37t16 -55t-16 -55t-44 -37q-55 -24 -87.5 -73.5t-32.5 -109.5v-150h400v150q0 60 -32.5 109.5t-87.5 73.5q-28 12 -44 37t-16 55t16 55t44 37 q55 24 87.5 73.5t32.5 109.5v100h-400z" /> -<glyph unicode="◼" horiz-adv-x="500" d="M0 0z" /> -<glyph unicode="☁" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -206.5q0 -121 -85 -207.5t-205 -86.5h-750q-79 0 -135.5 57t-56.5 137q0 69 42.5 122.5t108.5 67.5q-2 12 -2 37q0 153 108 260.5t260 107.5z" /> -<glyph unicode="⛺" d="M774 1193.5q16 -9.5 20.5 -27t-5.5 -33.5l-136 -187l467 -746h30q20 0 35 -18.5t15 -39.5v-42h-1200v42q0 21 15 39.5t35 18.5h30l468 746l-135 183q-10 16 -5.5 34t20.5 28t34 5.5t28 -20.5l111 -148l112 150q9 16 27 20.5t34 -5zM600 200h377l-182 112l-195 534v-646z " /> -<glyph unicode="✉" d="M25 1100h1150q10 0 12.5 -5t-5.5 -13l-564 -567q-8 -8 -18 -8t-18 8l-564 567q-8 8 -5.5 13t12.5 5zM18 882l264 -264q8 -8 8 -18t-8 -18l-264 -264q-8 -8 -13 -5.5t-5 12.5v550q0 10 5 12.5t13 -5.5zM918 618l264 264q8 8 13 5.5t5 -12.5v-550q0 -10 -5 -12.5t-13 5.5 l-264 264q-8 8 -8 18t8 18zM818 482l364 -364q8 -8 5.5 -13t-12.5 -5h-1150q-10 0 -12.5 5t5.5 13l364 364q8 8 18 8t18 -8l164 -164q8 -8 18 -8t18 8l164 164q8 8 18 8t18 -8z" /> -<glyph unicode="✏" d="M1011 1210q19 0 33 -13l153 -153q13 -14 13 -33t-13 -33l-99 -92l-214 214l95 96q13 14 32 14zM1013 800l-615 -614l-214 214l614 614zM317 96l-333 -112l110 335z" /> -<glyph unicode="" d="M700 650v-550h250q21 0 35.5 -14.5t14.5 -35.5v-50h-800v50q0 21 14.5 35.5t35.5 14.5h250v550l-500 550h1200z" /> -<glyph unicode="" d="M368 1017l645 163q39 15 63 0t24 -49v-831q0 -55 -41.5 -95.5t-111.5 -63.5q-79 -25 -147 -4.5t-86 75t25.5 111.5t122.5 82q72 24 138 8v521l-600 -155v-606q0 -42 -44 -90t-109 -69q-79 -26 -147 -5.5t-86 75.5t25.5 111.5t122.5 82.5q72 24 138 7v639q0 38 14.5 59 t53.5 34z" /> -<glyph unicode="" d="M500 1191q100 0 191 -39t156.5 -104.5t104.5 -156.5t39 -191l-1 -2l1 -5q0 -141 -78 -262l275 -274q23 -26 22.5 -44.5t-22.5 -42.5l-59 -58q-26 -20 -46.5 -20t-39.5 20l-275 274q-119 -77 -261 -77l-5 1l-2 -1q-100 0 -191 39t-156.5 104.5t-104.5 156.5t-39 191 t39 191t104.5 156.5t156.5 104.5t191 39zM500 1022q-88 0 -162 -43t-117 -117t-43 -162t43 -162t117 -117t162 -43t162 43t117 117t43 162t-43 162t-117 117t-162 43z" /> -<glyph unicode="" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104z" /> -<glyph unicode="" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429z" /> -<glyph unicode="" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429zM477 700h-240l197 -142l-74 -226 l193 139l195 -140l-74 229l192 140h-234l-78 211z" /> -<glyph unicode="" d="M600 1200q124 0 212 -88t88 -212v-250q0 -46 -31 -98t-69 -52v-75q0 -10 6 -21.5t15 -17.5l358 -230q9 -5 15 -16.5t6 -21.5v-93q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v93q0 10 6 21.5t15 16.5l358 230q9 6 15 17.5t6 21.5v75q-38 0 -69 52 t-31 98v250q0 124 88 212t212 88z" /> -<glyph unicode="" d="M25 1100h1150q10 0 17.5 -7.5t7.5 -17.5v-1050q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v1050q0 10 7.5 17.5t17.5 7.5zM100 1000v-100h100v100h-100zM875 1000h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5t17.5 -7.5h550 q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM1000 1000v-100h100v100h-100zM100 800v-100h100v100h-100zM1000 800v-100h100v100h-100zM100 600v-100h100v100h-100zM1000 600v-100h100v100h-100zM875 500h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5 t17.5 -7.5h550q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM100 400v-100h100v100h-100zM1000 400v-100h100v100h-100zM100 200v-100h100v100h-100zM1000 200v-100h100v100h-100z" /> -<glyph unicode="" d="M50 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM50 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM850 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 700h200q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5 t35.5 14.5z" /> -<glyph unicode="" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h700q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M465 477l571 571q8 8 18 8t17 -8l177 -177q8 -7 8 -17t-8 -18l-783 -784q-7 -8 -17.5 -8t-17.5 8l-384 384q-8 8 -8 18t8 17l177 177q7 8 17 8t18 -8l171 -171q7 -7 18 -7t18 7z" /> -<glyph unicode="" d="M904 1083l178 -179q8 -8 8 -18.5t-8 -17.5l-267 -268l267 -268q8 -7 8 -17.5t-8 -18.5l-178 -178q-8 -8 -18.5 -8t-17.5 8l-268 267l-268 -267q-7 -8 -17.5 -8t-18.5 8l-178 178q-8 8 -8 18.5t8 17.5l267 268l-267 268q-8 7 -8 17.5t8 18.5l178 178q8 8 18.5 8t17.5 -8 l268 -267l268 268q7 7 17.5 7t18.5 -7z" /> -<glyph unicode="" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM425 900h150q10 0 17.5 -7.5t7.5 -17.5v-75h75q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5 t-17.5 -7.5h-75v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-75q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v75q0 10 7.5 17.5t17.5 7.5z" /> -<glyph unicode="" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM325 800h350q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-350q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" /> -<glyph unicode="" d="M550 1200h100q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM800 975v166q167 -62 272 -209.5t105 -331.5q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5 t-184.5 123t-123 184.5t-45.5 224q0 184 105 331.5t272 209.5v-166q-103 -55 -165 -155t-62 -220q0 -116 57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5q0 120 -62 220t-165 155z" /> -<glyph unicode="" d="M1025 1200h150q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM725 800h150q10 0 17.5 -7.5t7.5 -17.5v-750q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v750 q0 10 7.5 17.5t17.5 7.5zM425 500h150q10 0 17.5 -7.5t7.5 -17.5v-450q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v450q0 10 7.5 17.5t17.5 7.5zM125 300h150q10 0 17.5 -7.5t7.5 -17.5v-250q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5 v250q0 10 7.5 17.5t17.5 7.5z" /> -<glyph unicode="" d="M600 1174q33 0 74 -5l38 -152l5 -1q49 -14 94 -39l5 -2l134 80q61 -48 104 -105l-80 -134l3 -5q25 -44 39 -93l1 -6l152 -38q5 -43 5 -73q0 -34 -5 -74l-152 -38l-1 -6q-15 -49 -39 -93l-3 -5l80 -134q-48 -61 -104 -105l-134 81l-5 -3q-44 -25 -94 -39l-5 -2l-38 -151 q-43 -5 -74 -5q-33 0 -74 5l-38 151l-5 2q-49 14 -94 39l-5 3l-134 -81q-60 48 -104 105l80 134l-3 5q-25 45 -38 93l-2 6l-151 38q-6 42 -6 74q0 33 6 73l151 38l2 6q13 48 38 93l3 5l-80 134q47 61 105 105l133 -80l5 2q45 25 94 39l5 1l38 152q43 5 74 5zM600 815 q-89 0 -152 -63t-63 -151.5t63 -151.5t152 -63t152 63t63 151.5t-63 151.5t-152 63z" /> -<glyph unicode="" d="M500 1300h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-75h-1100v75q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5zM500 1200v-100h300v100h-300zM1100 900v-800q0 -41 -29.5 -70.5t-70.5 -29.5h-700q-41 0 -70.5 29.5t-29.5 70.5 v800h900zM300 800v-700h100v700h-100zM500 800v-700h100v700h-100zM700 800v-700h100v700h-100zM900 800v-700h100v700h-100z" /> -<glyph unicode="" d="M18 618l620 608q8 7 18.5 7t17.5 -7l608 -608q8 -8 5.5 -13t-12.5 -5h-175v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v375h-300v-375q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v575h-175q-10 0 -12.5 5t5.5 13z" /> -<glyph unicode="" d="M600 1200v-400q0 -41 29.5 -70.5t70.5 -29.5h300v-650q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5h450zM1000 800h-250q-21 0 -35.5 14.5t-14.5 35.5v250z" /> -<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h50q10 0 17.5 -7.5t7.5 -17.5v-275h175q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5z" /> -<glyph unicode="" d="M1300 0h-538l-41 400h-242l-41 -400h-538l431 1200h209l-21 -300h162l-20 300h208zM515 800l-27 -300h224l-27 300h-170z" /> -<glyph unicode="" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-450h191q20 0 25.5 -11.5t-7.5 -27.5l-327 -400q-13 -16 -32 -16t-32 16l-327 400q-13 16 -7.5 27.5t25.5 11.5h191v450q0 21 14.5 35.5t35.5 14.5zM1125 400h50q10 0 17.5 -7.5t7.5 -17.5v-350q0 -10 -7.5 -17.5t-17.5 -7.5 h-1050q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h50q10 0 17.5 -7.5t7.5 -17.5v-175h900v175q0 10 7.5 17.5t17.5 7.5z" /> -<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -275q-13 -16 -32 -16t-32 16l-223 275q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z " /> -<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM632 914l223 -275q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5l223 275q13 16 32 16 t32 -16z" /> -<glyph unicode="" d="M225 1200h750q10 0 19.5 -7t12.5 -17l186 -652q7 -24 7 -49v-425q0 -12 -4 -27t-9 -17q-12 -6 -37 -6h-1100q-12 0 -27 4t-17 8q-6 13 -6 38l1 425q0 25 7 49l185 652q3 10 12.5 17t19.5 7zM878 1000h-556q-10 0 -19 -7t-11 -18l-87 -450q-2 -11 4 -18t16 -7h150 q10 0 19.5 -7t11.5 -17l38 -152q2 -10 11.5 -17t19.5 -7h250q10 0 19.5 7t11.5 17l38 152q2 10 11.5 17t19.5 7h150q10 0 16 7t4 18l-87 450q-2 11 -11 18t-19 7z" /> -<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM540 820l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" /> -<glyph unicode="" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-362q0 -10 -7.5 -17.5t-17.5 -7.5h-362q-11 0 -13 5.5t5 12.5l133 133q-109 76 -238 76q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5h150q0 -117 -45.5 -224 t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117z" /> -<glyph unicode="" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-361q0 -11 -7.5 -18.5t-18.5 -7.5h-361q-11 0 -13 5.5t5 12.5l134 134q-110 75 -239 75q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5h-150q0 117 45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117zM1027 600h150 q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5q-192 0 -348 118l-134 -134q-7 -8 -12.5 -5.5t-5.5 12.5v360q0 11 7.5 18.5t18.5 7.5h360q10 0 12.5 -5.5t-5.5 -12.5l-133 -133q110 -76 240 -76q116 0 214.5 57t155.5 155.5t57 214.5z" /> -<glyph unicode="" d="M125 1200h1050q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-1050q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM1075 1000h-850q-10 0 -17.5 -7.5t-7.5 -17.5v-850q0 -10 7.5 -17.5t17.5 -7.5h850q10 0 17.5 7.5t7.5 17.5v850 q0 10 -7.5 17.5t-17.5 7.5zM325 900h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 900h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 700h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 700h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 500h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 500h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 300h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 300h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5z" /> -<glyph unicode="" d="M900 800v200q0 83 -58.5 141.5t-141.5 58.5h-300q-82 0 -141 -59t-59 -141v-200h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h900q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-100zM400 800v150q0 21 15 35.5t35 14.5h200 q20 0 35 -14.5t15 -35.5v-150h-300z" /> -<glyph unicode="" d="M125 1100h50q10 0 17.5 -7.5t7.5 -17.5v-1075h-100v1075q0 10 7.5 17.5t17.5 7.5zM1075 1052q4 0 9 -2q16 -6 16 -23v-421q0 -6 -3 -12q-33 -59 -66.5 -99t-65.5 -58t-56.5 -24.5t-52.5 -6.5q-26 0 -57.5 6.5t-52.5 13.5t-60 21q-41 15 -63 22.5t-57.5 15t-65.5 7.5 q-85 0 -160 -57q-7 -5 -15 -5q-6 0 -11 3q-14 7 -14 22v438q22 55 82 98.5t119 46.5q23 2 43 0.5t43 -7t32.5 -8.5t38 -13t32.5 -11q41 -14 63.5 -21t57 -14t63.5 -7q103 0 183 87q7 8 18 8z" /> -<glyph unicode="" d="M600 1175q116 0 227 -49.5t192.5 -131t131 -192.5t49.5 -227v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v300q0 127 -70.5 231.5t-184.5 161.5t-245 57t-245 -57t-184.5 -161.5t-70.5 -231.5v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50 q-10 0 -17.5 7.5t-7.5 17.5v300q0 116 49.5 227t131 192.5t192.5 131t227 49.5zM220 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6zM820 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460 q0 8 6 14t14 6z" /> -<glyph unicode="" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM900 668l120 120q7 7 17 7t17 -7l34 -34q7 -7 7 -17t-7 -17l-120 -120l120 -120q7 -7 7 -17 t-7 -17l-34 -34q-7 -7 -17 -7t-17 7l-120 119l-120 -119q-7 -7 -17 -7t-17 7l-34 34q-7 7 -7 17t7 17l119 120l-119 120q-7 7 -7 17t7 17l34 34q7 8 17 8t17 -8z" /> -<glyph unicode="" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6 l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238q-6 8 -4.5 18t9.5 17l29 22q7 5 15 5z" /> -<glyph unicode="" d="M967 1004h3q11 -1 17 -10q135 -179 135 -396q0 -105 -34 -206.5t-98 -185.5q-7 -9 -17 -10h-3q-9 0 -16 6l-42 34q-8 6 -9 16t5 18q111 150 111 328q0 90 -29.5 176t-84.5 157q-6 9 -5 19t10 16l42 33q7 5 15 5zM321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5 t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238 q-6 8 -4.5 18.5t9.5 16.5l29 22q7 5 15 5z" /> -<glyph unicode="" d="M500 900h100v-100h-100v-100h-400v-100h-100v600h500v-300zM1200 700h-200v-100h200v-200h-300v300h-200v300h-100v200h600v-500zM100 1100v-300h300v300h-300zM800 1100v-300h300v300h-300zM300 900h-100v100h100v-100zM1000 900h-100v100h100v-100zM300 500h200v-500 h-500v500h200v100h100v-100zM800 300h200v-100h-100v-100h-200v100h-100v100h100v200h-200v100h300v-300zM100 400v-300h300v300h-300zM300 200h-100v100h100v-100zM1200 200h-100v100h100v-100zM700 0h-100v100h100v-100zM1200 0h-300v100h300v-100z" /> -<glyph unicode="" d="M100 200h-100v1000h100v-1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 200h-200v1000h200v-1000zM400 0h-300v100h300v-100zM600 0h-100v91h100v-91zM800 0h-100v91h100v-91zM1100 0h-200v91h200v-91z" /> -<glyph unicode="" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" /> -<glyph unicode="" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM800 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-56 56l424 426l-700 700h150zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5 t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" /> -<glyph unicode="" d="M300 1200h825q75 0 75 -75v-900q0 -25 -18 -43l-64 -64q-8 -8 -13 -5.5t-5 12.5v950q0 10 -7.5 17.5t-17.5 7.5h-700q-25 0 -43 -18l-64 -64q-8 -8 -5.5 -13t12.5 -5h700q10 0 17.5 -7.5t7.5 -17.5v-950q0 -10 -7.5 -17.5t-17.5 -7.5h-850q-10 0 -17.5 7.5t-7.5 17.5v975 q0 25 18 43l139 139q18 18 43 18z" /> -<glyph unicode="" d="M250 1200h800q21 0 35.5 -14.5t14.5 -35.5v-1150l-450 444l-450 -445v1151q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M822 1200h-444q-11 0 -19 -7.5t-9 -17.5l-78 -301q-7 -24 7 -45l57 -108q6 -9 17.5 -15t21.5 -6h450q10 0 21.5 6t17.5 15l62 108q14 21 7 45l-83 301q-1 10 -9 17.5t-19 7.5zM1175 800h-150q-10 0 -21 -6.5t-15 -15.5l-78 -156q-4 -9 -15 -15.5t-21 -6.5h-550 q-10 0 -21 6.5t-15 15.5l-78 156q-4 9 -15 15.5t-21 6.5h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-650q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h750q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5 t7.5 17.5v650q0 10 -7.5 17.5t-17.5 7.5zM850 200h-500q-10 0 -19.5 -7t-11.5 -17l-38 -152q-2 -10 3.5 -17t15.5 -7h600q10 0 15.5 7t3.5 17l-38 152q-2 10 -11.5 17t-19.5 7z" /> -<glyph unicode="" d="M500 1100h200q56 0 102.5 -20.5t72.5 -50t44 -59t25 -50.5l6 -20h150q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5h150q2 8 6.5 21.5t24 48t45 61t72 48t102.5 21.5zM900 800v-100 h100v100h-100zM600 730q-95 0 -162.5 -67.5t-67.5 -162.5t67.5 -162.5t162.5 -67.5t162.5 67.5t67.5 162.5t-67.5 162.5t-162.5 67.5zM600 603q43 0 73 -30t30 -73t-30 -73t-73 -30t-73 30t-30 73t30 73t73 30z" /> -<glyph unicode="" d="M681 1199l385 -998q20 -50 60 -92q18 -19 36.5 -29.5t27.5 -11.5l10 -2v-66h-417v66q53 0 75 43.5t5 88.5l-82 222h-391q-58 -145 -92 -234q-11 -34 -6.5 -57t25.5 -37t46 -20t55 -6v-66h-365v66q56 24 84 52q12 12 25 30.5t20 31.5l7 13l399 1006h93zM416 521h340 l-162 457z" /> -<glyph unicode="" d="M753 641q5 -1 14.5 -4.5t36 -15.5t50.5 -26.5t53.5 -40t50.5 -54.5t35.5 -70t14.5 -87q0 -67 -27.5 -125.5t-71.5 -97.5t-98.5 -66.5t-108.5 -40.5t-102 -13h-500v89q41 7 70.5 32.5t29.5 65.5v827q0 24 -0.5 34t-3.5 24t-8.5 19.5t-17 13.5t-28 12.5t-42.5 11.5v71 l471 -1q57 0 115.5 -20.5t108 -57t80.5 -94t31 -124.5q0 -51 -15.5 -96.5t-38 -74.5t-45 -50.5t-38.5 -30.5zM400 700h139q78 0 130.5 48.5t52.5 122.5q0 41 -8.5 70.5t-29.5 55.5t-62.5 39.5t-103.5 13.5h-118v-350zM400 200h216q80 0 121 50.5t41 130.5q0 90 -62.5 154.5 t-156.5 64.5h-159v-400z" /> -<glyph unicode="" d="M877 1200l2 -57q-83 -19 -116 -45.5t-40 -66.5l-132 -839q-9 -49 13 -69t96 -26v-97h-500v97q186 16 200 98l173 832q3 17 3 30t-1.5 22.5t-9 17.5t-13.5 12.5t-21.5 10t-26 8.5t-33.5 10q-13 3 -19 5v57h425z" /> -<glyph unicode="" d="M1300 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM175 1000h-75v-800h75l-125 -167l-125 167h75v800h-75l125 167z" /> -<glyph unicode="" d="M1100 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-650q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v650h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM1167 50l-167 -125v75h-800v-75l-167 125l167 125v-75h800v75z" /> -<glyph unicode="" d="M50 1100h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M250 1100h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM250 500h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000 q-21 0 -35.5 14.5t-14.5 35.5zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5z" /> -<glyph unicode="" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 1100h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 800h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 500h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 500h800q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 200h800 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M400 0h-100v1100h100v-1100zM550 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM267 550l-167 -125v75h-200v100h200v75zM550 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM900 0h-100v1100h100v-1100zM50 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM1100 600h200v-100h-200v-75l-167 125l167 125v-75zM50 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M75 1000h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53v650q0 31 22 53t53 22zM1200 300l-300 300l300 300v-600z" /> -<glyph unicode="" d="M44 1100h1112q18 0 31 -13t13 -31v-1012q0 -18 -13 -31t-31 -13h-1112q-18 0 -31 13t-13 31v1012q0 18 13 31t31 13zM100 1000v-737l247 182l298 -131l-74 156l293 318l236 -288v500h-1000zM342 884q56 0 95 -39t39 -94.5t-39 -95t-95 -39.5t-95 39.5t-39 95t39 94.5 t95 39z" /> -<glyph unicode="" d="M648 1169q117 0 216 -60t156.5 -161t57.5 -218q0 -115 -70 -258q-69 -109 -158 -225.5t-143 -179.5l-54 -62q-9 8 -25.5 24.5t-63.5 67.5t-91 103t-98.5 128t-95.5 148q-60 132 -60 249q0 88 34 169.5t91.5 142t137 96.5t166.5 36zM652.5 974q-91.5 0 -156.5 -65 t-65 -157t65 -156.5t156.5 -64.5t156.5 64.5t65 156.5t-65 157t-156.5 65z" /> -<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 173v854q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57z" /> -<glyph unicode="" d="M554 1295q21 -72 57.5 -143.5t76 -130t83 -118t82.5 -117t70 -116t49.5 -126t18.5 -136.5q0 -71 -25.5 -135t-68.5 -111t-99 -82t-118.5 -54t-125.5 -23q-84 5 -161.5 34t-139.5 78.5t-99 125t-37 164.5q0 69 18 136.5t49.5 126.5t69.5 116.5t81.5 117.5t83.5 119 t76.5 131t58.5 143zM344 710q-23 -33 -43.5 -70.5t-40.5 -102.5t-17 -123q1 -37 14.5 -69.5t30 -52t41 -37t38.5 -24.5t33 -15q21 -7 32 -1t13 22l6 34q2 10 -2.5 22t-13.5 19q-5 4 -14 12t-29.5 40.5t-32.5 73.5q-26 89 6 271q2 11 -6 11q-8 1 -15 -10z" /> -<glyph unicode="" d="M1000 1013l108 115q2 1 5 2t13 2t20.5 -1t25 -9.5t28.5 -21.5q22 -22 27 -43t0 -32l-6 -10l-108 -115zM350 1100h400q50 0 105 -13l-187 -187h-368q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v182l200 200v-332 q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM1009 803l-362 -362l-161 -50l55 170l355 355z" /> -<glyph unicode="" d="M350 1100h361q-164 -146 -216 -200h-195q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-103q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M824 1073l339 -301q8 -7 8 -17.5t-8 -17.5l-340 -306q-7 -6 -12.5 -4t-6.5 11v203q-26 1 -54.5 0t-78.5 -7.5t-92 -17.5t-86 -35t-70 -57q10 59 33 108t51.5 81.5t65 58.5t68.5 40.5t67 24.5t56 13.5t40 4.5v210q1 10 6.5 12.5t13.5 -4.5z" /> -<glyph unicode="" d="M350 1100h350q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-219q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M643 639l395 395q7 7 17.5 7t17.5 -7l101 -101q7 -7 7 -17.5t-7 -17.5l-531 -532q-7 -7 -17.5 -7t-17.5 7l-248 248q-7 7 -7 17.5t7 17.5l101 101q7 7 17.5 7t17.5 -7l111 -111q8 -7 18 -7t18 7z" /> -<glyph unicode="" d="M318 918l264 264q8 8 18 8t18 -8l260 -264q7 -8 4.5 -13t-12.5 -5h-170v-200h200v173q0 10 5 12t13 -5l264 -260q8 -7 8 -17.5t-8 -17.5l-264 -265q-8 -7 -13 -5t-5 12v173h-200v-200h170q10 0 12.5 -5t-4.5 -13l-260 -264q-8 -8 -18 -8t-18 8l-264 264q-8 8 -5.5 13 t12.5 5h175v200h-200v-173q0 -10 -5 -12t-13 5l-264 265q-8 7 -8 17.5t8 17.5l264 260q8 7 13 5t5 -12v-173h200v200h-175q-10 0 -12.5 5t5.5 13z" /> -<glyph unicode="" d="M250 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5 t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M1200 1050v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-492 480q-15 14 -15 35t15 35l492 480q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25z" /> -<glyph unicode="" d="M243 1074l814 -498q18 -11 18 -26t-18 -26l-814 -498q-18 -11 -30.5 -4t-12.5 28v1000q0 21 12.5 28t30.5 -4z" /> -<glyph unicode="" d="M250 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM650 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800 q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M1100 950v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5z" /> -<glyph unicode="" d="M500 612v438q0 21 10.5 25t25.5 -10l492 -480q15 -14 15 -35t-15 -35l-492 -480q-15 -14 -25.5 -10t-10.5 25v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10z" /> -<glyph unicode="" d="M1048 1102l100 1q20 0 35 -14.5t15 -35.5l5 -1000q0 -21 -14.5 -35.5t-35.5 -14.5l-100 -1q-21 0 -35.5 14.5t-14.5 35.5l-2 437l-463 -454q-14 -15 -24.5 -10.5t-10.5 25.5l-2 437l-462 -455q-15 -14 -25.5 -9.5t-10.5 24.5l-5 1000q0 21 10.5 25.5t25.5 -10.5l466 -450 l-2 438q0 20 10.5 24.5t25.5 -9.5l466 -451l-2 438q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M850 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10l464 -453v438q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M686 1081l501 -540q15 -15 10.5 -26t-26.5 -11h-1042q-22 0 -26.5 11t10.5 26l501 540q15 15 36 15t36 -15zM150 400h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M885 900l-352 -353l352 -353l-197 -198l-552 552l552 550z" /> -<glyph unicode="" d="M1064 547l-551 -551l-198 198l353 353l-353 353l198 198z" /> -<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM650 900h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-150 q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5h150v-150q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v150h150q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-150v150q0 21 -14.5 35.5t-35.5 14.5z" /> -<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM850 700h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5 t35.5 -14.5h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5z" /> -<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM741.5 913q-12.5 0 -21.5 -9l-120 -120l-120 120q-9 9 -21.5 9 t-21.5 -9l-141 -141q-9 -9 -9 -21.5t9 -21.5l120 -120l-120 -120q-9 -9 -9 -21.5t9 -21.5l141 -141q9 -9 21.5 -9t21.5 9l120 120l120 -120q9 -9 21.5 -9t21.5 9l141 141q9 9 9 21.5t-9 21.5l-120 120l120 120q9 9 9 21.5t-9 21.5l-141 141q-9 9 -21.5 9z" /> -<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM546 623l-84 85q-7 7 -17.5 7t-18.5 -7l-139 -139q-7 -8 -7 -18t7 -18 l242 -241q7 -8 17.5 -8t17.5 8l375 375q7 7 7 17.5t-7 18.5l-139 139q-7 7 -17.5 7t-17.5 -7z" /> -<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM588 941q-29 0 -59 -5.5t-63 -20.5t-58 -38.5t-41.5 -63t-16.5 -89.5 q0 -25 20 -25h131q30 -5 35 11q6 20 20.5 28t45.5 8q20 0 31.5 -10.5t11.5 -28.5q0 -23 -7 -34t-26 -18q-1 0 -13.5 -4t-19.5 -7.5t-20 -10.5t-22 -17t-18.5 -24t-15.5 -35t-8 -46q-1 -8 5.5 -16.5t20.5 -8.5h173q7 0 22 8t35 28t37.5 48t29.5 74t12 100q0 47 -17 83 t-42.5 57t-59.5 34.5t-64 18t-59 4.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" /> -<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM675 1000h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5 t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5zM675 700h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h75v-200h-75q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h350q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5 t-17.5 7.5h-75v275q0 10 -7.5 17.5t-17.5 7.5z" /> -<glyph unicode="" d="M525 1200h150q10 0 17.5 -7.5t7.5 -17.5v-194q103 -27 178.5 -102.5t102.5 -178.5h194q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-194q-27 -103 -102.5 -178.5t-178.5 -102.5v-194q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v194 q-103 27 -178.5 102.5t-102.5 178.5h-194q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h194q27 103 102.5 178.5t178.5 102.5v194q0 10 7.5 17.5t17.5 7.5zM700 893v-168q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v168q-68 -23 -119 -74 t-74 -119h168q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-168q23 -68 74 -119t119 -74v168q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-168q68 23 119 74t74 119h-168q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h168 q-23 68 -74 119t-119 74z" /> -<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM759 823l64 -64q7 -7 7 -17.5t-7 -17.5l-124 -124l124 -124q7 -7 7 -17.5t-7 -17.5l-64 -64q-7 -7 -17.5 -7t-17.5 7l-124 124l-124 -124q-7 -7 -17.5 -7t-17.5 7l-64 64 q-7 7 -7 17.5t7 17.5l124 124l-124 124q-7 7 -7 17.5t7 17.5l64 64q7 7 17.5 7t17.5 -7l124 -124l124 124q7 7 17.5 7t17.5 -7z" /> -<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM782 788l106 -106q7 -7 7 -17.5t-7 -17.5l-320 -321q-8 -7 -18 -7t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l197 197q7 7 17.5 7t17.5 -7z" /> -<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5q0 -120 65 -225 l587 587q-105 65 -225 65zM965 819l-584 -584q104 -62 219 -62q116 0 214.5 57t155.5 155.5t57 214.5q0 115 -62 219z" /> -<glyph unicode="" d="M39 582l522 427q16 13 27.5 8t11.5 -26v-291h550q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-550v-291q0 -21 -11.5 -26t-27.5 8l-522 427q-16 13 -16 32t16 32z" /> -<glyph unicode="" d="M639 1009l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291h-550q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h550v291q0 21 11.5 26t27.5 -8z" /> -<glyph unicode="" d="M682 1161l427 -522q13 -16 8 -27.5t-26 -11.5h-291v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v550h-291q-21 0 -26 11.5t8 27.5l427 522q13 16 32 16t32 -16z" /> -<glyph unicode="" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-550h291q21 0 26 -11.5t-8 -27.5l-427 -522q-13 -16 -32 -16t-32 16l-427 522q-13 16 -8 27.5t26 11.5h291v550q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M639 1109l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291q-94 -2 -182 -20t-170.5 -52t-147 -92.5t-100.5 -135.5q5 105 27 193.5t67.5 167t113 135t167 91.5t225.5 42v262q0 21 11.5 26t27.5 -8z" /> -<glyph unicode="" d="M850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5zM350 0h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249 q8 7 18 7t18 -7l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5z" /> -<glyph unicode="" d="M1014 1120l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249q8 7 18 7t18 -7zM250 600h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5z" /> -<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM704 900h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5 t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" /> -<glyph unicode="" d="M260 1200q9 0 19 -2t15 -4l5 -2q22 -10 44 -23l196 -118q21 -13 36 -24q29 -21 37 -12q11 13 49 35l196 118q22 13 45 23q17 7 38 7q23 0 47 -16.5t37 -33.5l13 -16q14 -21 18 -45l25 -123l8 -44q1 -9 8.5 -14.5t17.5 -5.5h61q10 0 17.5 -7.5t7.5 -17.5v-50 q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 -7.5t-7.5 -17.5v-175h-400v300h-200v-300h-400v175q0 10 -7.5 17.5t-17.5 7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5h61q11 0 18 3t7 8q0 4 9 52l25 128q5 25 19 45q2 3 5 7t13.5 15t21.5 19.5t26.5 15.5 t29.5 7zM915 1079l-166 -162q-7 -7 -5 -12t12 -5h219q10 0 15 7t2 17l-51 149q-3 10 -11 12t-15 -6zM463 917l-177 157q-8 7 -16 5t-11 -12l-51 -143q-3 -10 2 -17t15 -7h231q11 0 12.5 5t-5.5 12zM500 0h-375q-10 0 -17.5 7.5t-7.5 17.5v375h400v-400zM1100 400v-375 q0 -10 -7.5 -17.5t-17.5 -7.5h-375v400h400z" /> -<glyph unicode="" d="M1165 1190q8 3 21 -6.5t13 -17.5q-2 -178 -24.5 -323.5t-55.5 -245.5t-87 -174.5t-102.5 -118.5t-118 -68.5t-118.5 -33t-120 -4.5t-105 9.5t-90 16.5q-61 12 -78 11q-4 1 -12.5 0t-34 -14.5t-52.5 -40.5l-153 -153q-26 -24 -37 -14.5t-11 43.5q0 64 42 102q8 8 50.5 45 t66.5 58q19 17 35 47t13 61q-9 55 -10 102.5t7 111t37 130t78 129.5q39 51 80 88t89.5 63.5t94.5 45t113.5 36t129 31t157.5 37t182 47.5zM1116 1098q-8 9 -22.5 -3t-45.5 -50q-38 -47 -119 -103.5t-142 -89.5l-62 -33q-56 -30 -102 -57t-104 -68t-102.5 -80.5t-85.5 -91 t-64 -104.5q-24 -56 -31 -86t2 -32t31.5 17.5t55.5 59.5q25 30 94 75.5t125.5 77.5t147.5 81q70 37 118.5 69t102 79.5t99 111t86.5 148.5q22 50 24 60t-6 19z" /> -<glyph unicode="" d="M653 1231q-39 -67 -54.5 -131t-10.5 -114.5t24.5 -96.5t47.5 -80t63.5 -62.5t68.5 -46.5t65 -30q-4 7 -17.5 35t-18.5 39.5t-17 39.5t-17 43t-13 42t-9.5 44.5t-2 42t4 43t13.5 39t23 38.5q96 -42 165 -107.5t105 -138t52 -156t13 -159t-19 -149.5q-13 -55 -44 -106.5 t-68 -87t-78.5 -64.5t-72.5 -45t-53 -22q-72 -22 -127 -11q-31 6 -13 19q6 3 17 7q13 5 32.5 21t41 44t38.5 63.5t21.5 81.5t-6.5 94.5t-50 107t-104 115.5q10 -104 -0.5 -189t-37 -140.5t-65 -93t-84 -52t-93.5 -11t-95 24.5q-80 36 -131.5 114t-53.5 171q-2 23 0 49.5 t4.5 52.5t13.5 56t27.5 60t46 64.5t69.5 68.5q-8 -53 -5 -102.5t17.5 -90t34 -68.5t44.5 -39t49 -2q31 13 38.5 36t-4.5 55t-29 64.5t-36 75t-26 75.5q-15 85 2 161.5t53.5 128.5t85.5 92.5t93.5 61t81.5 25.5z" /> -<glyph unicode="" d="M600 1094q82 0 160.5 -22.5t140 -59t116.5 -82.5t94.5 -95t68 -95t42.5 -82.5t14 -57.5t-14 -57.5t-43 -82.5t-68.5 -95t-94.5 -95t-116.5 -82.5t-140 -59t-159.5 -22.5t-159.5 22.5t-140 59t-116.5 82.5t-94.5 95t-68.5 95t-43 82.5t-14 57.5t14 57.5t42.5 82.5t68 95 t94.5 95t116.5 82.5t140 59t160.5 22.5zM888 829q-15 15 -18 12t5 -22q25 -57 25 -119q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 59 23 114q8 19 4.5 22t-17.5 -12q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q22 -36 47 -71t70 -82t92.5 -81t113 -58.5t133.5 -24.5 t133.5 24t113 58.5t92.5 81.5t70 81.5t47 70.5q11 18 9 42.5t-14 41.5q-90 117 -163 189zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l35 34q14 15 12.5 33.5t-16.5 33.5q-44 44 -89 117q-11 18 -28 20t-32 -12z" /> -<glyph unicode="" d="M592 0h-148l31 120q-91 20 -175.5 68.5t-143.5 106.5t-103.5 119t-66.5 110t-22 76q0 21 14 57.5t42.5 82.5t68 95t94.5 95t116.5 82.5t140 59t160.5 22.5q61 0 126 -15l32 121h148zM944 770l47 181q108 -85 176.5 -192t68.5 -159q0 -26 -19.5 -71t-59.5 -102t-93 -112 t-129 -104.5t-158 -75.5l46 173q77 49 136 117t97 131q11 18 9 42.5t-14 41.5q-54 70 -107 130zM310 824q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q18 -30 39 -60t57 -70.5t74 -73t90 -61t105 -41.5l41 154q-107 18 -178.5 101.5t-71.5 193.5q0 59 23 114q8 19 4.5 22 t-17.5 -12zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l12 11l22 86l-3 4q-44 44 -89 117q-11 18 -28 20t-32 -12z" /> -<glyph unicode="" d="M-90 100l642 1066q20 31 48 28.5t48 -35.5l642 -1056q21 -32 7.5 -67.5t-50.5 -35.5h-1294q-37 0 -50.5 34t7.5 66zM155 200h345v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h345l-445 723zM496 700h208q20 0 32 -14.5t8 -34.5l-58 -252 q-4 -20 -21.5 -34.5t-37.5 -14.5h-54q-20 0 -37.5 14.5t-21.5 34.5l-58 252q-4 20 8 34.5t32 14.5z" /> -<glyph unicode="" d="M650 1200q62 0 106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -93 100 -113v-64q0 -21 -13 -29t-32 1l-205 128l-205 -128q-19 -9 -32 -1t-13 29v64q0 20 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5v41 q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44z" /> -<glyph unicode="" d="M850 1200h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-150h-1100v150q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-50h500v50q0 21 14.5 35.5t35.5 14.5zM1100 800v-750q0 -21 -14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v750h1100zM100 600v-100h100v100h-100zM300 600v-100h100v100h-100zM500 600v-100h100v100h-100zM700 600v-100h100v100h-100zM900 600v-100h100v100h-100zM100 400v-100h100v100h-100zM300 400v-100h100v100h-100zM500 400 v-100h100v100h-100zM700 400v-100h100v100h-100zM900 400v-100h100v100h-100zM100 200v-100h100v100h-100zM300 200v-100h100v100h-100zM500 200v-100h100v100h-100zM700 200v-100h100v100h-100zM900 200v-100h100v100h-100z" /> -<glyph unicode="" d="M1135 1165l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-159l-600 -600h-291q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h209l600 600h241v150q0 21 10.5 25t24.5 -10zM522 819l-141 -141l-122 122h-209q-21 0 -35.5 14.5 t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h291zM1135 565l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-241l-181 181l141 141l122 -122h159v150q0 21 10.5 25t24.5 -10z" /> -<glyph unicode="" d="M100 1100h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5z" /> -<glyph unicode="" d="M150 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM850 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM1100 800v-300q0 -41 -3 -77.5t-15 -89.5t-32 -96t-58 -89t-89 -77t-129 -51t-174 -20t-174 20 t-129 51t-89 77t-58 89t-32 96t-15 89.5t-3 77.5v300h300v-250v-27v-42.5t1.5 -41t5 -38t10 -35t16.5 -30t25.5 -24.5t35 -19t46.5 -12t60 -4t60 4.5t46.5 12.5t35 19.5t25 25.5t17 30.5t10 35t5 38t2 40.5t-0.5 42v25v250h300z" /> -<glyph unicode="" d="M1100 411l-198 -199l-353 353l-353 -353l-197 199l551 551z" /> -<glyph unicode="" d="M1101 789l-550 -551l-551 551l198 199l353 -353l353 353z" /> -<glyph unicode="" d="M404 1000h746q21 0 35.5 -14.5t14.5 -35.5v-551h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v401h-381zM135 984l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-400h385l215 -200h-750q-21 0 -35.5 14.5 t-14.5 35.5v550h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" /> -<glyph unicode="" d="M56 1200h94q17 0 31 -11t18 -27l38 -162h896q24 0 39 -18.5t10 -42.5l-100 -475q-5 -21 -27 -42.5t-55 -21.5h-633l48 -200h535q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-50q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-300v-50 q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-31q-18 0 -32.5 10t-20.5 19l-5 10l-201 961h-54q-20 0 -35 14.5t-15 35.5t15 35.5t35 14.5z" /> -<glyph unicode="" d="M1200 1000v-100h-1200v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500zM0 800h1200v-800h-1200v800z" /> -<glyph unicode="" d="M200 800l-200 -400v600h200q0 41 29.5 70.5t70.5 29.5h300q42 0 71 -29.5t29 -70.5h500v-200h-1000zM1500 700l-300 -700h-1200l300 700h1200z" /> -<glyph unicode="" d="M635 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-601h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v601h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" /> -<glyph unicode="" d="M936 864l249 -229q14 -15 14 -35.5t-14 -35.5l-249 -229q-15 -15 -25.5 -10.5t-10.5 24.5v151h-600v-151q0 -20 -10.5 -24.5t-25.5 10.5l-249 229q-14 15 -14 35.5t14 35.5l249 229q15 15 25.5 10.5t10.5 -25.5v-149h600v149q0 21 10.5 25.5t25.5 -10.5z" /> -<glyph unicode="" d="M1169 400l-172 732q-5 23 -23 45.5t-38 22.5h-672q-20 0 -38 -20t-23 -41l-172 -739h1138zM1100 300h-1000q-41 0 -70.5 -29.5t-29.5 -70.5v-100q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v100q0 41 -29.5 70.5t-70.5 29.5zM800 100v100h100v-100h-100 zM1000 100v100h100v-100h-100z" /> -<glyph unicode="" d="M1150 1100q21 0 35.5 -14.5t14.5 -35.5v-850q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v850q0 21 14.5 35.5t35.5 14.5zM1000 200l-675 200h-38l47 -276q3 -16 -5.5 -20t-29.5 -4h-7h-84q-20 0 -34.5 14t-18.5 35q-55 337 -55 351v250v6q0 16 1 23.5t6.5 14 t17.5 6.5h200l675 250v-850zM0 750v-250q-4 0 -11 0.5t-24 6t-30 15t-24 30t-11 48.5v50q0 26 10.5 46t25 30t29 16t25.5 7z" /> -<glyph unicode="" d="M553 1200h94q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q19 0 33 -14.5t14 -35t-13 -40.5t-31 -27q-8 -4 -23 -9.5t-65 -19.5t-103 -25t-132.5 -20t-158.5 -9q-57 0 -115 5t-104 12t-88.5 15.5t-73.5 17.5t-54.5 16t-35.5 12l-11 4 q-18 8 -31 28t-13 40.5t14 35t33 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3.5 32t28.5 13zM498 110q50 -6 102 -6q53 0 102 6q-12 -49 -39.5 -79.5t-62.5 -30.5t-63 30.5t-39 79.5z" /> -<glyph unicode="" d="M800 946l224 78l-78 -224l234 -45l-180 -155l180 -155l-234 -45l78 -224l-224 78l-45 -234l-155 180l-155 -180l-45 234l-224 -78l78 224l-234 45l180 155l-180 155l234 45l-78 224l224 -78l45 234l155 -180l155 180z" /> -<glyph unicode="" d="M650 1200h50q40 0 70 -40.5t30 -84.5v-150l-28 -125h328q40 0 70 -40.5t30 -84.5v-100q0 -45 -29 -74l-238 -344q-16 -24 -38 -40.5t-45 -16.5h-250q-7 0 -42 25t-66 50l-31 25h-61q-45 0 -72.5 18t-27.5 57v400q0 36 20 63l145 196l96 198q13 28 37.5 48t51.5 20z M650 1100l-100 -212l-150 -213v-375h100l136 -100h214l250 375v125h-450l50 225v175h-50zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M600 1100h250q23 0 45 -16.5t38 -40.5l238 -344q29 -29 29 -74v-100q0 -44 -30 -84.5t-70 -40.5h-328q28 -118 28 -125v-150q0 -44 -30 -84.5t-70 -40.5h-50q-27 0 -51.5 20t-37.5 48l-96 198l-145 196q-20 27 -20 63v400q0 39 27.5 57t72.5 18h61q124 100 139 100z M50 1000h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM636 1000l-136 -100h-100v-375l150 -213l100 -212h50v175l-50 225h450v125l-250 375h-214z" /> -<glyph unicode="" d="M356 873l363 230q31 16 53 -6l110 -112q13 -13 13.5 -32t-11.5 -34l-84 -121h302q84 0 138 -38t54 -110t-55 -111t-139 -39h-106l-131 -339q-6 -21 -19.5 -41t-28.5 -20h-342q-7 0 -90 81t-83 94v525q0 17 14 35.5t28 28.5zM400 792v-503l100 -89h293l131 339 q6 21 19.5 41t28.5 20h203q21 0 30.5 25t0.5 50t-31 25h-456h-7h-6h-5.5t-6 0.5t-5 1.5t-5 2t-4 2.5t-4 4t-2.5 4.5q-12 25 5 47l146 183l-86 83zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500 q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M475 1103l366 -230q2 -1 6 -3.5t14 -10.5t18 -16.5t14.5 -20t6.5 -22.5v-525q0 -13 -86 -94t-93 -81h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-85 0 -139.5 39t-54.5 111t54 110t138 38h302l-85 121q-11 15 -10.5 34t13.5 32l110 112q22 22 53 6zM370 945l146 -183 q17 -22 5 -47q-2 -2 -3.5 -4.5t-4 -4t-4 -2.5t-5 -2t-5 -1.5t-6 -0.5h-6h-6.5h-6h-475v-100h221q15 0 29 -20t20 -41l130 -339h294l106 89v503l-342 236zM1050 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5 v500q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M550 1294q72 0 111 -55t39 -139v-106l339 -131q21 -6 41 -19.5t20 -28.5v-342q0 -7 -81 -90t-94 -83h-525q-17 0 -35.5 14t-28.5 28l-9 14l-230 363q-16 31 6 53l112 110q13 13 32 13.5t34 -11.5l121 -84v302q0 84 38 138t110 54zM600 972v203q0 21 -25 30.5t-50 0.5 t-25 -31v-456v-7v-6v-5.5t-0.5 -6t-1.5 -5t-2 -5t-2.5 -4t-4 -4t-4.5 -2.5q-25 -12 -47 5l-183 146l-83 -86l236 -339h503l89 100v293l-339 131q-21 6 -41 19.5t-20 28.5zM450 200h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M350 1100h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5zM600 306v-106q0 -84 -39 -139t-111 -55t-110 54t-38 138v302l-121 -84q-15 -12 -34 -11.5t-32 13.5l-112 110 q-22 22 -6 53l230 363q1 2 3.5 6t10.5 13.5t16.5 17t20 13.5t22.5 6h525q13 0 94 -83t81 -90v-342q0 -15 -20 -28.5t-41 -19.5zM308 900l-236 -339l83 -86l183 146q22 17 47 5q2 -1 4.5 -2.5t4 -4t2.5 -4t2 -5t1.5 -5t0.5 -6v-5.5v-6v-7v-456q0 -22 25 -31t50 0.5t25 30.5 v203q0 15 20 28.5t41 19.5l339 131v293l-89 100h-503z" /> -<glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM914 632l-275 223q-16 13 -27.5 8t-11.5 -26v-137h-275 q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h275v-137q0 -21 11.5 -26t27.5 8l275 223q16 13 16 32t-16 32z" /> -<glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM561 855l-275 -223q-16 -13 -16 -32t16 -32l275 -223q16 -13 27.5 -8 t11.5 26v137h275q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5h-275v137q0 21 -11.5 26t-27.5 -8z" /> -<glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM855 639l-223 275q-13 16 -32 16t-32 -16l-223 -275q-13 -16 -8 -27.5 t26 -11.5h137v-275q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v275h137q21 0 26 11.5t-8 27.5z" /> -<glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM675 900h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-275h-137q-21 0 -26 -11.5 t8 -27.5l223 -275q13 -16 32 -16t32 16l223 275q13 16 8 27.5t-26 11.5h-137v275q0 10 -7.5 17.5t-17.5 7.5z" /> -<glyph unicode="" d="M600 1176q116 0 222.5 -46t184 -123.5t123.5 -184t46 -222.5t-46 -222.5t-123.5 -184t-184 -123.5t-222.5 -46t-222.5 46t-184 123.5t-123.5 184t-46 222.5t46 222.5t123.5 184t184 123.5t222.5 46zM627 1101q-15 -12 -36.5 -20.5t-35.5 -12t-43 -8t-39 -6.5 q-15 -3 -45.5 0t-45.5 -2q-20 -7 -51.5 -26.5t-34.5 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -91t-29.5 -79q-9 -34 5 -93t8 -87q0 -9 17 -44.5t16 -59.5q12 0 23 -5t23.5 -15t19.5 -14q16 -8 33 -15t40.5 -15t34.5 -12q21 -9 52.5 -32t60 -38t57.5 -11 q7 -15 -3 -34t-22.5 -40t-9.5 -38q13 -21 23 -34.5t27.5 -27.5t36.5 -18q0 -7 -3.5 -16t-3.5 -14t5 -17q104 -2 221 112q30 29 46.5 47t34.5 49t21 63q-13 8 -37 8.5t-36 7.5q-15 7 -49.5 15t-51.5 19q-18 0 -41 -0.5t-43 -1.5t-42 -6.5t-38 -16.5q-51 -35 -66 -12 q-4 1 -3.5 25.5t0.5 25.5q-6 13 -26.5 17.5t-24.5 6.5q1 15 -0.5 30.5t-7 28t-18.5 11.5t-31 -21q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q7 -12 18 -24t21.5 -20.5t20 -15t15.5 -10.5l5 -3q2 12 7.5 30.5t8 34.5t-0.5 32q-3 18 3.5 29 t18 22.5t15.5 24.5q6 14 10.5 35t8 31t15.5 22.5t34 22.5q-6 18 10 36q8 0 24 -1.5t24.5 -1.5t20 4.5t20.5 15.5q-10 23 -31 42.5t-37.5 29.5t-49 27t-43.5 23q0 1 2 8t3 11.5t1.5 10.5t-1 9.5t-4.5 4.5q31 -13 58.5 -14.5t38.5 2.5l12 5q5 28 -9.5 46t-36.5 24t-50 15 t-41 20q-18 -4 -37 0zM613 994q0 -17 8 -42t17 -45t9 -23q-8 1 -39.5 5.5t-52.5 10t-37 16.5q3 11 16 29.5t16 25.5q10 -10 19 -10t14 6t13.5 14.5t16.5 12.5z" /> -<glyph unicode="" d="M756 1157q164 92 306 -9l-259 -138l145 -232l251 126q6 -89 -34 -156.5t-117 -110.5q-60 -34 -127 -39.5t-126 16.5l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5t15 37.5l600 599q-34 101 5.5 201.5t135.5 154.5z" /> -<glyph unicode="" horiz-adv-x="1220" d="M100 1196h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 1096h-200v-100h200v100zM100 796h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 696h-500v-100h500v100zM100 396h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 296h-300v-100h300v100z " /> -<glyph unicode="" d="M150 1200h900q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM700 500v-300l-200 -200v500l-350 500h900z" /> -<glyph unicode="" d="M500 1200h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5zM500 1100v-100h200v100h-200zM1200 400v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v200h1200z" /> -<glyph unicode="" d="M50 1200h300q21 0 25 -10.5t-10 -24.5l-94 -94l199 -199q7 -8 7 -18t-7 -18l-106 -106q-8 -7 -18 -7t-18 7l-199 199l-94 -94q-14 -14 -24.5 -10t-10.5 25v300q0 21 14.5 35.5t35.5 14.5zM850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-199 -199q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l199 199l-94 94q-14 14 -10 24.5t25 10.5zM364 470l106 -106q7 -8 7 -18t-7 -18l-199 -199l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l199 199 q8 7 18 7t18 -7zM1071 271l94 94q14 14 24.5 10t10.5 -25v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -25 10.5t10 24.5l94 94l-199 199q-7 8 -7 18t7 18l106 106q8 7 18 7t18 -7z" /> -<glyph unicode="" d="M596 1192q121 0 231.5 -47.5t190 -127t127 -190t47.5 -231.5t-47.5 -231.5t-127 -190.5t-190 -127t-231.5 -47t-231.5 47t-190.5 127t-127 190.5t-47 231.5t47 231.5t127 190t190.5 127t231.5 47.5zM596 1010q-112 0 -207.5 -55.5t-151 -151t-55.5 -207.5t55.5 -207.5 t151 -151t207.5 -55.5t207.5 55.5t151 151t55.5 207.5t-55.5 207.5t-151 151t-207.5 55.5zM454.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38.5 -16.5t-38.5 16.5t-16 39t16 38.5t38.5 16zM754.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38 -16.5q-14 0 -29 10l-55 -145 q17 -23 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 23 16 39t38.5 16zM345.5 709q22.5 0 38.5 -16t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16zM854.5 709q22.5 0 38.5 -16 t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16z" /> -<glyph unicode="" d="M546 173l469 470q91 91 99 192q7 98 -52 175.5t-154 94.5q-22 4 -47 4q-34 0 -66.5 -10t-56.5 -23t-55.5 -38t-48 -41.5t-48.5 -47.5q-376 -375 -391 -390q-30 -27 -45 -41.5t-37.5 -41t-32 -46.5t-16 -47.5t-1.5 -56.5q9 -62 53.5 -95t99.5 -33q74 0 125 51l548 548 q36 36 20 75q-7 16 -21.5 26t-32.5 10q-26 0 -50 -23q-13 -12 -39 -38l-341 -338q-15 -15 -35.5 -15.5t-34.5 13.5t-14 34.5t14 34.5q327 333 361 367q35 35 67.5 51.5t78.5 16.5q14 0 29 -1q44 -8 74.5 -35.5t43.5 -68.5q14 -47 2 -96.5t-47 -84.5q-12 -11 -32 -32 t-79.5 -81t-114.5 -115t-124.5 -123.5t-123 -119.5t-96.5 -89t-57 -45q-56 -27 -120 -27q-70 0 -129 32t-93 89q-48 78 -35 173t81 163l511 511q71 72 111 96q91 55 198 55q80 0 152 -33q78 -36 129.5 -103t66.5 -154q17 -93 -11 -183.5t-94 -156.5l-482 -476 q-15 -15 -36 -16t-37 14t-17.5 34t14.5 35z" /> -<glyph unicode="" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104zM896 972q-33 0 -64.5 -19t-56.5 -46t-47.5 -53.5t-43.5 -45.5t-37.5 -19t-36 19t-40 45.5t-43 53.5t-54 46t-65.5 19q-67 0 -122.5 -55.5t-55.5 -132.5q0 -23 13.5 -51t46 -65t57.5 -63t76 -75l22 -22q15 -14 44 -44t50.5 -51t46 -44t41 -35t23 -12 t23.5 12t42.5 36t46 44t52.5 52t44 43q4 4 12 13q43 41 63.5 62t52 55t46 55t26 46t11.5 44q0 79 -53 133.5t-120 54.5z" /> -<glyph unicode="" d="M776.5 1214q93.5 0 159.5 -66l141 -141q66 -66 66 -160q0 -42 -28 -95.5t-62 -87.5l-29 -29q-31 53 -77 99l-18 18l95 95l-247 248l-389 -389l212 -212l-105 -106l-19 18l-141 141q-66 66 -66 159t66 159l283 283q65 66 158.5 66zM600 706l105 105q10 -8 19 -17l141 -141 q66 -66 66 -159t-66 -159l-283 -283q-66 -66 -159 -66t-159 66l-141 141q-66 66 -66 159.5t66 159.5l55 55q29 -55 75 -102l18 -17l-95 -95l247 -248l389 389z" /> -<glyph unicode="" d="M603 1200q85 0 162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5v953q0 21 30 46.5t81 48t129 37.5t163 15zM300 1000v-700h600v700h-600zM600 254q-43 0 -73.5 -30.5t-30.5 -73.5t30.5 -73.5t73.5 -30.5t73.5 30.5 t30.5 73.5t-30.5 73.5t-73.5 30.5z" /> -<glyph unicode="" d="M902 1185l283 -282q15 -15 15 -36t-14.5 -35.5t-35.5 -14.5t-35 15l-36 35l-279 -267v-300l-212 210l-308 -307l-280 -203l203 280l307 308l-210 212h300l267 279l-35 36q-15 14 -15 35t14.5 35.5t35.5 14.5t35 -15z" /> -<glyph unicode="" d="M700 1248v-78q38 -5 72.5 -14.5t75.5 -31.5t71 -53.5t52 -84t24 -118.5h-159q-4 36 -10.5 59t-21 45t-40 35.5t-64.5 20.5v-307l64 -13q34 -7 64 -16.5t70 -32t67.5 -52.5t47.5 -80t20 -112q0 -139 -89 -224t-244 -97v-77h-100v79q-150 16 -237 103q-40 40 -52.5 93.5 t-15.5 139.5h139q5 -77 48.5 -126t117.5 -65v335l-27 8q-46 14 -79 26.5t-72 36t-63 52t-40 72.5t-16 98q0 70 25 126t67.5 92t94.5 57t110 27v77h100zM600 754v274q-29 -4 -50 -11t-42 -21.5t-31.5 -41.5t-10.5 -65q0 -29 7 -50.5t16.5 -34t28.5 -22.5t31.5 -14t37.5 -10 q9 -3 13 -4zM700 547v-310q22 2 42.5 6.5t45 15.5t41.5 27t29 42t12 59.5t-12.5 59.5t-38 44.5t-53 31t-66.5 24.5z" /> -<glyph unicode="" d="M561 1197q84 0 160.5 -40t123.5 -109.5t47 -147.5h-153q0 40 -19.5 71.5t-49.5 48.5t-59.5 26t-55.5 9q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -26 13.5 -63t26.5 -61t37 -66q6 -9 9 -14h241v-100h-197q8 -50 -2.5 -115t-31.5 -95q-45 -62 -99 -112 q34 10 83 17.5t71 7.5q32 1 102 -16t104 -17q83 0 136 30l50 -147q-31 -19 -58 -30.5t-55 -15.5t-42 -4.5t-46 -0.5q-23 0 -76 17t-111 32.5t-96 11.5q-39 -3 -82 -16t-67 -25l-23 -11l-55 145q4 3 16 11t15.5 10.5t13 9t15.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221v100h166q-23 47 -44 104q-7 20 -12 41.5t-6 55.5t6 66.5t29.5 70.5t58.5 71q97 88 263 88z" /> -<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM935 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-900h-200v900h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" /> -<glyph unicode="" d="M1000 700h-100v100h-100v-100h-100v500h300v-500zM400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM801 1100v-200h100v200h-100zM1000 350l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150z " /> -<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 1050l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150zM1000 0h-100v100h-100v-100h-100v500h300v-500zM801 400v-200h100v200h-100z " /> -<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 700h-100v400h-100v100h200v-500zM1100 0h-100v100h-200v400h300v-500zM901 400v-200h100v200h-100z" /> -<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1100 700h-100v100h-200v400h300v-500zM901 1100v-200h100v200h-100zM1000 0h-100v400h-100v100h200v-500z" /> -<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM900 1000h-200v200h200v-200zM1000 700h-300v200h300v-200zM1100 400h-400v200h400v-200zM1200 100h-500v200h500v-200z" /> -<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1200 1000h-500v200h500v-200zM1100 700h-400v200h400v-200zM1000 400h-300v200h300v-200zM900 100h-200v200h200v-200z" /> -<glyph unicode="" d="M350 1100h400q162 0 256 -93.5t94 -256.5v-400q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5z" /> -<glyph unicode="" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-163 0 -256.5 92.5t-93.5 257.5v400q0 163 94 256.5t256 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM440 770l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" /> -<glyph unicode="" d="M350 1100h400q163 0 256.5 -94t93.5 -256v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 163 92.5 256.5t257.5 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM350 700h400q21 0 26.5 -12t-6.5 -28l-190 -253q-12 -17 -30 -17t-30 17l-190 253q-12 16 -6.5 28t26.5 12z" /> -<glyph unicode="" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -163 -92.5 -256.5t-257.5 -93.5h-400q-163 0 -256.5 94t-93.5 256v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM580 693l190 -253q12 -16 6.5 -28t-26.5 -12h-400q-21 0 -26.5 12t6.5 28l190 253q12 17 30 17t30 -17z" /> -<glyph unicode="" d="M550 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h450q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-450q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM338 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" /> -<glyph unicode="" d="M793 1182l9 -9q8 -10 5 -27q-3 -11 -79 -225.5t-78 -221.5l300 1q24 0 32.5 -17.5t-5.5 -35.5q-1 0 -133.5 -155t-267 -312.5t-138.5 -162.5q-12 -15 -26 -15h-9l-9 8q-9 11 -4 32q2 9 42 123.5t79 224.5l39 110h-302q-23 0 -31 19q-10 21 6 41q75 86 209.5 237.5 t228 257t98.5 111.5q9 16 25 16h9z" /> -<glyph unicode="" d="M350 1100h400q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-450q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h450q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400 q0 165 92.5 257.5t257.5 92.5zM938 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" /> -<glyph unicode="" d="M750 1200h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -10.5 -25t-24.5 10l-109 109l-312 -312q-15 -15 -35.5 -15t-35.5 15l-141 141q-15 15 -15 35.5t15 35.5l312 312l-109 109q-14 14 -10 24.5t25 10.5zM456 900h-156q-41 0 -70.5 -29.5t-29.5 -70.5v-500 q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v148l200 200v-298q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5h300z" /> -<glyph unicode="" d="M600 1186q119 0 227.5 -46.5t187 -125t125 -187t46.5 -227.5t-46.5 -227.5t-125 -187t-187 -125t-227.5 -46.5t-227.5 46.5t-187 125t-125 187t-46.5 227.5t46.5 227.5t125 187t187 125t227.5 46.5zM600 1022q-115 0 -212 -56.5t-153.5 -153.5t-56.5 -212t56.5 -212 t153.5 -153.5t212 -56.5t212 56.5t153.5 153.5t56.5 212t-56.5 212t-153.5 153.5t-212 56.5zM600 794q80 0 137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137t57 137t137 57z" /> -<glyph unicode="" d="M450 1200h200q21 0 35.5 -14.5t14.5 -35.5v-350h245q20 0 25 -11t-9 -26l-383 -426q-14 -15 -33.5 -15t-32.5 15l-379 426q-13 15 -8.5 26t25.5 11h250v350q0 21 14.5 35.5t35.5 14.5zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" /> -<glyph unicode="" d="M583 1182l378 -435q14 -15 9 -31t-26 -16h-244v-250q0 -20 -17 -35t-39 -15h-200q-20 0 -32 14.5t-12 35.5v250h-250q-20 0 -25.5 16.5t8.5 31.5l383 431q14 16 33.5 17t33.5 -14zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" /> -<glyph unicode="" d="M396 723l369 369q7 7 17.5 7t17.5 -7l139 -139q7 -8 7 -18.5t-7 -17.5l-525 -525q-7 -8 -17.5 -8t-17.5 8l-292 291q-7 8 -7 18t7 18l139 139q8 7 18.5 7t17.5 -7zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50 h-100z" /> -<glyph unicode="" d="M135 1023l142 142q14 14 35 14t35 -14l77 -77l-212 -212l-77 76q-14 15 -14 36t14 35zM655 855l210 210q14 14 24.5 10t10.5 -25l-2 -599q-1 -20 -15.5 -35t-35.5 -15l-597 -1q-21 0 -25 10.5t10 24.5l208 208l-154 155l212 212zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5 v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" /> -<glyph unicode="" d="M350 1200l599 -2q20 -1 35 -15.5t15 -35.5l1 -597q0 -21 -10.5 -25t-24.5 10l-208 208l-155 -154l-212 212l155 154l-210 210q-14 14 -10 24.5t25 10.5zM524 512l-76 -77q-15 -14 -36 -14t-35 14l-142 142q-14 14 -14 35t14 35l77 77zM50 300h1000q21 0 35.5 -14.5 t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" /> -<glyph unicode="" d="M1200 103l-483 276l-314 -399v423h-399l1196 796v-1096zM483 424v-230l683 953z" /> -<glyph unicode="" d="M1100 1000v-850q0 -21 -14.5 -35.5t-35.5 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200z" /> -<glyph unicode="" d="M1100 1000l-2 -149l-299 -299l-95 95q-9 9 -21.5 9t-21.5 -9l-149 -147h-312v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1132 638l106 -106q7 -7 7 -17.5t-7 -17.5l-420 -421q-8 -7 -18 -7 t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l297 297q7 7 17.5 7t17.5 -7z" /> -<glyph unicode="" d="M1100 1000v-269l-103 -103l-134 134q-15 15 -33.5 16.5t-34.5 -12.5l-266 -266h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1202 572l70 -70q15 -15 15 -35.5t-15 -35.5l-131 -131 l131 -131q15 -15 15 -35.5t-15 -35.5l-70 -70q-15 -15 -35.5 -15t-35.5 15l-131 131l-131 -131q-15 -15 -35.5 -15t-35.5 15l-70 70q-15 15 -15 35.5t15 35.5l131 131l-131 131q-15 15 -15 35.5t15 35.5l70 70q15 15 35.5 15t35.5 -15l131 -131l131 131q15 15 35.5 15 t35.5 -15z" /> -<glyph unicode="" d="M1100 1000v-300h-350q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM850 600h100q21 0 35.5 -14.5t14.5 -35.5v-250h150q21 0 25 -10.5t-10 -24.5 l-230 -230q-14 -14 -35 -14t-35 14l-230 230q-14 14 -10 24.5t25 10.5h150v250q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M1100 1000v-400l-165 165q-14 15 -35 15t-35 -15l-263 -265h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM935 565l230 -229q14 -15 10 -25.5t-25 -10.5h-150v-250q0 -20 -14.5 -35 t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35v250h-150q-21 0 -25 10.5t10 25.5l230 229q14 15 35 15t35 -15z" /> -<glyph unicode="" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-150h-1200v150q0 21 14.5 35.5t35.5 14.5zM1200 800v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v550h1200zM100 500v-200h400v200h-400z" /> -<glyph unicode="" d="M935 1165l248 -230q14 -14 14 -35t-14 -35l-248 -230q-14 -14 -24.5 -10t-10.5 25v150h-400v200h400v150q0 21 10.5 25t24.5 -10zM200 800h-50q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v-200zM400 800h-100v200h100v-200zM18 435l247 230 q14 14 24.5 10t10.5 -25v-150h400v-200h-400v-150q0 -21 -10.5 -25t-24.5 10l-247 230q-15 14 -15 35t15 35zM900 300h-100v200h100v-200zM1000 500h51q20 0 34.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-34.5 -14.5h-51v200z" /> -<glyph unicode="" d="M862 1073l276 116q25 18 43.5 8t18.5 -41v-1106q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v397q-4 1 -11 5t-24 17.5t-30 29t-24 42t-11 56.5v359q0 31 18.5 65t43.5 52zM550 1200q22 0 34.5 -12.5t14.5 -24.5l1 -13v-450q0 -28 -10.5 -59.5 t-25 -56t-29 -45t-25.5 -31.5l-10 -11v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447q-4 4 -11 11.5t-24 30.5t-30 46t-24 55t-11 60v450q0 2 0.5 5.5t4 12t8.5 15t14.5 12t22.5 5.5q20 0 32.5 -12.5t14.5 -24.5l3 -13v-350h100v350v5.5t2.5 12 t7 15t15 12t25.5 5.5q23 0 35.5 -12.5t13.5 -24.5l1 -13v-350h100v350q0 2 0.5 5.5t3 12t7 15t15 12t24.5 5.5z" /> -<glyph unicode="" d="M1200 1100v-56q-4 0 -11 -0.5t-24 -3t-30 -7.5t-24 -15t-11 -24v-888q0 -22 25 -34.5t50 -13.5l25 -2v-56h-400v56q75 0 87.5 6.5t12.5 43.5v394h-500v-394q0 -37 12.5 -43.5t87.5 -6.5v-56h-400v56q4 0 11 0.5t24 3t30 7.5t24 15t11 24v888q0 22 -25 34.5t-50 13.5 l-25 2v56h400v-56q-75 0 -87.5 -6.5t-12.5 -43.5v-394h500v394q0 37 -12.5 43.5t-87.5 6.5v56h400z" /> -<glyph unicode="" d="M675 1000h375q21 0 35.5 -14.5t14.5 -35.5v-150h-105l-295 -98v98l-200 200h-400l100 100h375zM100 900h300q41 0 70.5 -29.5t29.5 -70.5v-500q0 -41 -29.5 -70.5t-70.5 -29.5h-300q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5zM100 800v-200h300v200 h-300zM1100 535l-400 -133v163l400 133v-163zM100 500v-200h300v200h-300zM1100 398v-248q0 -21 -14.5 -35.5t-35.5 -14.5h-375l-100 -100h-375l-100 100h400l200 200h105z" /> -<glyph unicode="" d="M17 1007l162 162q17 17 40 14t37 -22l139 -194q14 -20 11 -44.5t-20 -41.5l-119 -118q102 -142 228 -268t267 -227l119 118q17 17 42.5 19t44.5 -12l192 -136q19 -14 22.5 -37.5t-13.5 -40.5l-163 -162q-3 -1 -9.5 -1t-29.5 2t-47.5 6t-62.5 14.5t-77.5 26.5t-90 42.5 t-101.5 60t-111 83t-119 108.5q-74 74 -133.5 150.5t-94.5 138.5t-60 119.5t-34.5 100t-15 74.5t-4.5 48z" /> -<glyph unicode="" d="M600 1100q92 0 175 -10.5t141.5 -27t108.5 -36.5t81.5 -40t53.5 -37t31 -27l9 -10v-200q0 -21 -14.5 -33t-34.5 -9l-202 34q-20 3 -34.5 20t-14.5 38v146q-141 24 -300 24t-300 -24v-146q0 -21 -14.5 -38t-34.5 -20l-202 -34q-20 -3 -34.5 9t-14.5 33v200q3 4 9.5 10.5 t31 26t54 37.5t80.5 39.5t109 37.5t141 26.5t175 10.5zM600 795q56 0 97 -9.5t60 -23.5t30 -28t12 -24l1 -10v-50l365 -303q14 -15 24.5 -40t10.5 -45v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v212q0 20 10.5 45t24.5 40l365 303v50 q0 4 1 10.5t12 23t30 29t60 22.5t97 10z" /> -<glyph unicode="" d="M1100 700l-200 -200h-600l-200 200v500h200v-200h200v200h200v-200h200v200h200v-500zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5 t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M700 1100h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-1000h300v1000q0 41 -29.5 70.5t-70.5 29.5zM1100 800h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-700h300v700q0 41 -29.5 70.5t-70.5 29.5zM400 0h-300v400q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-400z " /> -<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" /> -<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 300h-100v200h-100v-200h-100v500h100v-200h100v200h100v-500zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" /> -<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-300h200v-100h-300v500h300v-100zM900 700h-200v-300h200v-100h-300v500h300v-100z" /> -<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 400l-300 150l300 150v-300zM900 550l-300 -150v300z" /> -<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM900 300h-700v500h700v-500zM800 700h-130q-38 0 -66.5 -43t-28.5 -108t27 -107t68 -42h130v300zM300 700v-300 h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130z" /> -<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 300h-100v400h-100v100h200v-500z M700 300h-100v100h100v-100z" /> -<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM300 700h200v-400h-300v500h100v-100zM900 300h-100v400h-100v100h200v-500zM300 600v-200h100v200h-100z M700 300h-100v100h100v-100z" /> -<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 500l-199 -200h-100v50l199 200v150h-200v100h300v-300zM900 300h-100v400h-100v100h200v-500zM701 300h-100 v100h100v-100z" /> -<glyph unicode="" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700h-300v-200h300v-100h-300l-100 100v200l100 100h300v-100z" /> -<glyph unicode="" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700v-100l-50 -50l100 -100v-50h-100l-100 100h-150v-100h-100v400h300zM500 700v-100h200v100h-200z" /> -<glyph unicode="" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -207t-85 -207t-205 -86.5h-128v250q0 21 -14.5 35.5t-35.5 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-250h-222q-80 0 -136 57.5t-56 136.5q0 69 43 122.5t108 67.5q-2 19 -2 37q0 100 49 185 t134 134t185 49zM525 500h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -244q-13 -16 -32 -16t-32 16l-223 244q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z" /> -<glyph unicode="" d="M502 1089q110 0 201 -59.5t135 -156.5q43 15 89 15q121 0 206 -86.5t86 -206.5q0 -99 -60 -181t-150 -110l-378 360q-13 16 -31.5 16t-31.5 -16l-381 -365h-9q-79 0 -135.5 57.5t-56.5 136.5q0 69 43 122.5t108 67.5q-2 19 -2 38q0 100 49 184.5t133.5 134t184.5 49.5z M632 467l223 -228q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5q199 204 223 228q19 19 31.5 19t32.5 -19z" /> -<glyph unicode="" d="M700 100v100h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170l-270 -300h400v-100h-50q-21 0 -35.5 -14.5t-14.5 -35.5v-50h400v50q0 21 -14.5 35.5t-35.5 14.5h-50z" /> -<glyph unicode="" d="M600 1179q94 0 167.5 -56.5t99.5 -145.5q89 -6 150.5 -71.5t61.5 -155.5q0 -61 -29.5 -112.5t-79.5 -82.5q9 -29 9 -55q0 -74 -52.5 -126.5t-126.5 -52.5q-55 0 -100 30v-251q21 0 35.5 -14.5t14.5 -35.5v-50h-300v50q0 21 14.5 35.5t35.5 14.5v251q-45 -30 -100 -30 q-74 0 -126.5 52.5t-52.5 126.5q0 18 4 38q-47 21 -75.5 65t-28.5 97q0 74 52.5 126.5t126.5 52.5q5 0 23 -2q0 2 -1 10t-1 13q0 116 81.5 197.5t197.5 81.5z" /> -<glyph unicode="" d="M1010 1010q111 -111 150.5 -260.5t0 -299t-150.5 -260.5q-83 -83 -191.5 -126.5t-218.5 -43.5t-218.5 43.5t-191.5 126.5q-111 111 -150.5 260.5t0 299t150.5 260.5q83 83 191.5 126.5t218.5 43.5t218.5 -43.5t191.5 -126.5zM476 1065q-4 0 -8 -1q-121 -34 -209.5 -122.5 t-122.5 -209.5q-4 -12 2.5 -23t18.5 -14l36 -9q3 -1 7 -1q23 0 29 22q27 96 98 166q70 71 166 98q11 3 17.5 13.5t3.5 22.5l-9 35q-3 13 -14 19q-7 4 -15 4zM512 920q-4 0 -9 -2q-80 -24 -138.5 -82.5t-82.5 -138.5q-4 -13 2 -24t19 -14l34 -9q4 -1 8 -1q22 0 28 21 q18 58 58.5 98.5t97.5 58.5q12 3 18 13.5t3 21.5l-9 35q-3 12 -14 19q-7 4 -15 4zM719.5 719.5q-49.5 49.5 -119.5 49.5t-119.5 -49.5t-49.5 -119.5t49.5 -119.5t119.5 -49.5t119.5 49.5t49.5 119.5t-49.5 119.5zM855 551q-22 0 -28 -21q-18 -58 -58.5 -98.5t-98.5 -57.5 q-11 -4 -17 -14.5t-3 -21.5l9 -35q3 -12 14 -19q7 -4 15 -4q4 0 9 2q80 24 138.5 82.5t82.5 138.5q4 13 -2.5 24t-18.5 14l-34 9q-4 1 -8 1zM1000 515q-23 0 -29 -22q-27 -96 -98 -166q-70 -71 -166 -98q-11 -3 -17.5 -13.5t-3.5 -22.5l9 -35q3 -13 14 -19q7 -4 15 -4 q4 0 8 1q121 34 209.5 122.5t122.5 209.5q4 12 -2.5 23t-18.5 14l-36 9q-3 1 -7 1z" /> -<glyph unicode="" d="M700 800h300v-380h-180v200h-340v-200h-380v755q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM700 300h162l-212 -212l-212 212h162v200h100v-200zM520 0h-395q-10 0 -17.5 7.5t-7.5 17.5v395zM1000 220v-195q0 -10 -7.5 -17.5t-17.5 -7.5h-195z" /> -<glyph unicode="" d="M700 800h300v-520l-350 350l-550 -550v1095q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM862 200h-162v-200h-100v200h-162l212 212zM480 0h-355q-10 0 -17.5 7.5t-7.5 17.5v55h380v-80zM1000 80v-55q0 -10 -7.5 -17.5t-17.5 -7.5h-155v80h180z" /> -<glyph unicode="" d="M1162 800h-162v-200h100l100 -100h-300v300h-162l212 212zM200 800h200q27 0 40 -2t29.5 -10.5t23.5 -30t7 -57.5h300v-100h-600l-200 -350v450h100q0 36 7 57.5t23.5 30t29.5 10.5t40 2zM800 400h240l-240 -400h-800l300 500h500v-100z" /> -<glyph unicode="" d="M650 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM1000 850v150q41 0 70.5 -29.5t29.5 -70.5v-800 q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-1 0 -20 4l246 246l-326 326v324q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM412 250l-212 -212v162h-200v100h200v162z" /> -<glyph unicode="" d="M450 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM800 850v150q41 0 70.5 -29.5t29.5 -70.5v-500 h-200v-300h200q0 -36 -7 -57.5t-23.5 -30t-29.5 -10.5t-40 -2h-600q-41 0 -70.5 29.5t-29.5 70.5v800q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM1212 250l-212 -212v162h-200v100h200v162z" /> -<glyph unicode="" d="M658 1197l637 -1104q23 -38 7 -65.5t-60 -27.5h-1276q-44 0 -60 27.5t7 65.5l637 1104q22 39 54 39t54 -39zM704 800h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM500 300v-100h200 v100h-200z" /> -<glyph unicode="" d="M425 1100h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM825 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM25 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5zM425 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5 v150q0 10 7.5 17.5t17.5 7.5zM25 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" /> -<glyph unicode="" d="M700 1200h100v-200h-100v-100h350q62 0 86.5 -39.5t-3.5 -94.5l-66 -132q-41 -83 -81 -134h-772q-40 51 -81 134l-66 132q-28 55 -3.5 94.5t86.5 39.5h350v100h-100v200h100v100h200v-100zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100 h-950l138 100h-13q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M600 1300q40 0 68.5 -29.5t28.5 -70.5h-194q0 41 28.5 70.5t68.5 29.5zM443 1100h314q18 -37 18 -75q0 -8 -3 -25h328q41 0 44.5 -16.5t-30.5 -38.5l-175 -145h-678l-178 145q-34 22 -29 38.5t46 16.5h328q-3 17 -3 25q0 38 18 75zM250 700h700q21 0 35.5 -14.5 t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-150v-200l275 -200h-950l275 200v200h-150q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M600 1181q75 0 128 -53t53 -128t-53 -128t-128 -53t-128 53t-53 128t53 128t128 53zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13 l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M600 1300q47 0 92.5 -53.5t71 -123t25.5 -123.5q0 -78 -55.5 -133.5t-133.5 -55.5t-133.5 55.5t-55.5 133.5q0 62 34 143l144 -143l111 111l-163 163q34 26 63 26zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45 zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M600 1200l300 -161v-139h-300q0 -57 18.5 -108t50 -91.5t63 -72t70 -67.5t57.5 -61h-530q-60 83 -90.5 177.5t-30.5 178.5t33 164.5t87.5 139.5t126 96.5t145.5 41.5v-98zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100 h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M600 1300q41 0 70.5 -29.5t29.5 -70.5v-78q46 -26 73 -72t27 -100v-50h-400v50q0 54 27 100t73 72v78q0 41 29.5 70.5t70.5 29.5zM400 800h400q54 0 100 -27t72 -73h-172v-100h200v-100h-200v-100h200v-100h-200v-100h200q0 -83 -58.5 -141.5t-141.5 -58.5h-400 q-83 0 -141.5 58.5t-58.5 141.5v400q0 83 58.5 141.5t141.5 58.5z" /> -<glyph unicode="" d="M150 1100h900q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM125 400h950q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-283l224 -224q13 -13 13 -31.5t-13 -32 t-31.5 -13.5t-31.5 13l-88 88h-524l-87 -88q-13 -13 -32 -13t-32 13.5t-13 32t13 31.5l224 224h-289q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM541 300l-100 -100h324l-100 100h-124z" /> -<glyph unicode="" d="M200 1100h800q83 0 141.5 -58.5t58.5 -141.5v-200h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100v200q0 83 58.5 141.5t141.5 58.5zM100 600h1000q41 0 70.5 -29.5 t29.5 -70.5v-300h-1200v300q0 41 29.5 70.5t70.5 29.5zM300 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200zM1100 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200z" /> -<glyph unicode="" d="M480 1165l682 -683q31 -31 31 -75.5t-31 -75.5l-131 -131h-481l-517 518q-32 31 -32 75.5t32 75.5l295 296q31 31 75.5 31t76.5 -31zM108 794l342 -342l303 304l-341 341zM250 100h800q21 0 35.5 -14.5t14.5 -35.5v-50h-900v50q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M1057 647l-189 506q-8 19 -27.5 33t-40.5 14h-400q-21 0 -40.5 -14t-27.5 -33l-189 -506q-8 -19 1.5 -33t30.5 -14h625v-150q0 -21 14.5 -35.5t35.5 -14.5t35.5 14.5t14.5 35.5v150h125q21 0 30.5 14t1.5 33zM897 0h-595v50q0 21 14.5 35.5t35.5 14.5h50v50 q0 21 14.5 35.5t35.5 14.5h48v300h200v-300h47q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-50z" /> -<glyph unicode="" d="M900 800h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-375v591l-300 300v84q0 10 7.5 17.5t17.5 7.5h375v-400zM1200 900h-200v200zM400 600h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-650q-10 0 -17.5 7.5t-7.5 17.5v950q0 10 7.5 17.5t17.5 7.5h375v-400zM700 700h-200v200z " /> -<glyph unicode="" d="M484 1095h195q75 0 146 -32.5t124 -86t89.5 -122.5t48.5 -142q18 -14 35 -20q31 -10 64.5 6.5t43.5 48.5q10 34 -15 71q-19 27 -9 43q5 8 12.5 11t19 -1t23.5 -16q41 -44 39 -105q-3 -63 -46 -106.5t-104 -43.5h-62q-7 -55 -35 -117t-56 -100l-39 -234q-3 -20 -20 -34.5 t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l12 70q-49 -14 -91 -14h-195q-24 0 -65 8l-11 -64q-3 -20 -20 -34.5t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l26 157q-84 74 -128 175l-159 53q-19 7 -33 26t-14 40v50q0 21 14.5 35.5t35.5 14.5h124q11 87 56 166l-111 95 q-16 14 -12.5 23.5t24.5 9.5h203q116 101 250 101zM675 1000h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h250q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5t-17.5 7.5z" /> -<glyph unicode="" d="M641 900l423 247q19 8 42 2.5t37 -21.5l32 -38q14 -15 12.5 -36t-17.5 -34l-139 -120h-390zM50 1100h106q67 0 103 -17t66 -71l102 -212h823q21 0 35.5 -14.5t14.5 -35.5v-50q0 -21 -14 -40t-33 -26l-737 -132q-23 -4 -40 6t-26 25q-42 67 -100 67h-300q-62 0 -106 44 t-44 106v200q0 62 44 106t106 44zM173 928h-80q-19 0 -28 -14t-9 -35v-56q0 -51 42 -51h134q16 0 21.5 8t5.5 24q0 11 -16 45t-27 51q-18 28 -43 28zM550 727q-32 0 -54.5 -22.5t-22.5 -54.5t22.5 -54.5t54.5 -22.5t54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5zM130 389 l152 130q18 19 34 24t31 -3.5t24.5 -17.5t25.5 -28q28 -35 50.5 -51t48.5 -13l63 5l48 -179q13 -61 -3.5 -97.5t-67.5 -79.5l-80 -69q-47 -40 -109 -35.5t-103 51.5l-130 151q-40 47 -35.5 109.5t51.5 102.5zM380 377l-102 -88q-31 -27 2 -65l37 -43q13 -15 27.5 -19.5 t31.5 6.5l61 53q19 16 14 49q-2 20 -12 56t-17 45q-11 12 -19 14t-23 -8z" /> -<glyph unicode="" d="M625 1200h150q10 0 17.5 -7.5t7.5 -17.5v-109q79 -33 131 -87.5t53 -128.5q1 -46 -15 -84.5t-39 -61t-46 -38t-39 -21.5l-17 -6q6 0 15 -1.5t35 -9t50 -17.5t53 -30t50 -45t35.5 -64t14.5 -84q0 -59 -11.5 -105.5t-28.5 -76.5t-44 -51t-49.5 -31.5t-54.5 -16t-49.5 -6.5 t-43.5 -1v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-100v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-175q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v600h-75q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5h175v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h100v75q0 10 7.5 17.5t17.5 7.5zM400 900v-200h263q28 0 48.5 10.5t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-263zM400 500v-200h363q28 0 48.5 10.5 t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-363z" /> -<glyph unicode="" d="M212 1198h780q86 0 147 -61t61 -147v-416q0 -51 -18 -142.5t-36 -157.5l-18 -66q-29 -87 -93.5 -146.5t-146.5 -59.5h-572q-82 0 -147 59t-93 147q-8 28 -20 73t-32 143.5t-20 149.5v416q0 86 61 147t147 61zM600 1045q-70 0 -132.5 -11.5t-105.5 -30.5t-78.5 -41.5 t-57 -45t-36 -41t-20.5 -30.5l-6 -12l156 -243h560l156 243q-2 5 -6 12.5t-20 29.5t-36.5 42t-57 44.5t-79 42t-105 29.5t-132.5 12zM762 703h-157l195 261z" /> -<glyph unicode="" d="M475 1300h150q103 0 189 -86t86 -189v-500q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" /> -<glyph unicode="" d="M475 1300h96q0 -150 89.5 -239.5t239.5 -89.5v-446q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" /> -<glyph unicode="" d="M1294 767l-638 -283l-378 170l-78 -60v-224l100 -150v-199l-150 148l-150 -149v200l100 150v250q0 4 -0.5 10.5t0 9.5t1 8t3 8t6.5 6l47 40l-147 65l642 283zM1000 380l-350 -166l-350 166v147l350 -165l350 165v-147z" /> -<glyph unicode="" d="M250 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM650 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM1050 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" /> -<glyph unicode="" d="M550 1100q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 700q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 300q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" /> -<glyph unicode="" d="M125 1100h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM125 700h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM125 300h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" /> -<glyph unicode="" d="M350 1200h500q162 0 256 -93.5t94 -256.5v-500q0 -165 -93.5 -257.5t-256.5 -92.5h-500q-165 0 -257.5 92.5t-92.5 257.5v500q0 165 92.5 257.5t257.5 92.5zM900 1000h-600q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h600q41 0 70.5 29.5 t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5zM350 900h500q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-500q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 14.5 35.5t35.5 14.5zM400 800v-200h400v200h-400z" /> -<glyph unicode="" d="M150 1100h1000q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M650 1187q87 -67 118.5 -156t0 -178t-118.5 -155q-87 66 -118.5 155t0 178t118.5 156zM300 800q124 0 212 -88t88 -212q-124 0 -212 88t-88 212zM1000 800q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM300 500q124 0 212 -88t88 -212q-124 0 -212 88t-88 212z M1000 500q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM700 199v-144q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v142q40 -4 43 -4q17 0 57 6z" /> -<glyph unicode="" d="M745 878l69 19q25 6 45 -12l298 -295q11 -11 15 -26.5t-2 -30.5q-5 -14 -18 -23.5t-28 -9.5h-8q1 0 1 -13q0 -29 -2 -56t-8.5 -62t-20 -63t-33 -53t-51 -39t-72.5 -14h-146q-184 0 -184 288q0 24 10 47q-20 4 -62 4t-63 -4q11 -24 11 -47q0 -288 -184 -288h-142 q-48 0 -84.5 21t-56 51t-32 71.5t-16 75t-3.5 68.5q0 13 2 13h-7q-15 0 -27.5 9.5t-18.5 23.5q-6 15 -2 30.5t15 25.5l298 296q20 18 46 11l76 -19q20 -5 30.5 -22.5t5.5 -37.5t-22.5 -31t-37.5 -5l-51 12l-182 -193h891l-182 193l-44 -12q-20 -5 -37.5 6t-22.5 31t6 37.5 t31 22.5z" /> -<glyph unicode="" d="M1200 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM500 450h-25q0 15 -4 24.5t-9 14.5t-17 7.5t-20 3t-25 0.5h-100v-425q0 -11 12.5 -17.5t25.5 -7.5h12v-50h-200v50q50 0 50 25v425h-100q-17 0 -25 -0.5t-20 -3t-17 -7.5t-9 -14.5t-4 -24.5h-25v150h500v-150z" /> -<glyph unicode="" d="M1000 300v50q-25 0 -55 32q-14 14 -25 31t-16 27l-4 11l-289 747h-69l-300 -754q-18 -35 -39 -56q-9 -9 -24.5 -18.5t-26.5 -14.5l-11 -5v-50h273v50q-49 0 -78.5 21.5t-11.5 67.5l69 176h293l61 -166q13 -34 -3.5 -66.5t-55.5 -32.5v-50h312zM412 691l134 342l121 -342 h-255zM1100 150v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5z" /> -<glyph unicode="" d="M50 1200h1100q21 0 35.5 -14.5t14.5 -35.5v-1100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5zM611 1118h-70q-13 0 -18 -12l-299 -753q-17 -32 -35 -51q-18 -18 -56 -34q-12 -5 -12 -18v-50q0 -8 5.5 -14t14.5 -6 h273q8 0 14 6t6 14v50q0 8 -6 14t-14 6q-55 0 -71 23q-10 14 0 39l63 163h266l57 -153q11 -31 -6 -55q-12 -17 -36 -17q-8 0 -14 -6t-6 -14v-50q0 -8 6 -14t14 -6h313q8 0 14 6t6 14v50q0 7 -5.5 13t-13.5 7q-17 0 -42 25q-25 27 -40 63h-1l-288 748q-5 12 -19 12zM639 611 h-197l103 264z" /> -<glyph unicode="" d="M1200 1100h-1200v100h1200v-100zM50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 1000h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM700 900v-300h300v300h-300z" /> -<glyph unicode="" d="M50 1200h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 700h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM700 600v-300h300v300h-300zM1200 0h-1200v100h1200v-100z" /> -<glyph unicode="" d="M50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-350h100v150q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-150h100v-100h-100v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v150h-100v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM700 700v-300h300v300h-300z" /> -<glyph unicode="" d="M100 0h-100v1200h100v-1200zM250 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM300 1000v-300h300v300h-300zM250 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M600 1100h150q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-100h450q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h350v100h-150q-21 0 -35.5 14.5 t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h150v100h100v-100zM400 1000v-300h300v300h-300z" /> -<glyph unicode="" d="M1200 0h-100v1200h100v-1200zM550 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM600 1000v-300h300v300h-300zM50 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M865 565l-494 -494q-23 -23 -41 -23q-14 0 -22 13.5t-8 38.5v1000q0 25 8 38.5t22 13.5q18 0 41 -23l494 -494q14 -14 14 -35t-14 -35z" /> -<glyph unicode="" d="M335 635l494 494q29 29 50 20.5t21 -49.5v-1000q0 -41 -21 -49.5t-50 20.5l-494 494q-14 14 -14 35t14 35z" /> -<glyph unicode="" d="M100 900h1000q41 0 49.5 -21t-20.5 -50l-494 -494q-14 -14 -35 -14t-35 14l-494 494q-29 29 -20.5 50t49.5 21z" /> -<glyph unicode="" d="M635 865l494 -494q29 -29 20.5 -50t-49.5 -21h-1000q-41 0 -49.5 21t20.5 50l494 494q14 14 35 14t35 -14z" /> -<glyph unicode="" d="M700 741v-182l-692 -323v221l413 193l-413 193v221zM1200 0h-800v200h800v-200z" /> -<glyph unicode="" d="M1200 900h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300zM0 700h50q0 21 4 37t9.5 26.5t18 17.5t22 11t28.5 5.5t31 2t37 0.5h100v-550q0 -22 -25 -34.5t-50 -13.5l-25 -2v-100h400v100q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v550h100q25 0 37 -0.5t31 -2 t28.5 -5.5t22 -11t18 -17.5t9.5 -26.5t4 -37h50v300h-800v-300z" /> -<glyph unicode="" d="M800 700h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-100v-550q0 -22 25 -34.5t50 -14.5l25 -1v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v550h-100q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h800v-300zM1100 200h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300z" /> -<glyph unicode="" d="M701 1098h160q16 0 21 -11t-7 -23l-464 -464l464 -464q12 -12 7 -23t-21 -11h-160q-13 0 -23 9l-471 471q-7 8 -7 18t7 18l471 471q10 9 23 9z" /> -<glyph unicode="" d="M339 1098h160q13 0 23 -9l471 -471q7 -8 7 -18t-7 -18l-471 -471q-10 -9 -23 -9h-160q-16 0 -21 11t7 23l464 464l-464 464q-12 12 -7 23t21 11z" /> -<glyph unicode="" d="M1087 882q11 -5 11 -21v-160q0 -13 -9 -23l-471 -471q-8 -7 -18 -7t-18 7l-471 471q-9 10 -9 23v160q0 16 11 21t23 -7l464 -464l464 464q12 12 23 7z" /> -<glyph unicode="" d="M618 993l471 -471q9 -10 9 -23v-160q0 -16 -11 -21t-23 7l-464 464l-464 -464q-12 -12 -23 -7t-11 21v160q0 13 9 23l471 471q8 7 18 7t18 -7z" /> -<glyph unicode="" d="M1000 1200q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM450 1000h100q21 0 40 -14t26 -33l79 -194q5 1 16 3q34 6 54 9.5t60 7t65.5 1t61 -10t56.5 -23t42.5 -42t29 -64t5 -92t-19.5 -121.5q-1 -7 -3 -19.5t-11 -50t-20.5 -73t-32.5 -81.5t-46.5 -83t-64 -70 t-82.5 -50q-13 -5 -42 -5t-65.5 2.5t-47.5 2.5q-14 0 -49.5 -3.5t-63 -3.5t-43.5 7q-57 25 -104.5 78.5t-75 111.5t-46.5 112t-26 90l-7 35q-15 63 -18 115t4.5 88.5t26 64t39.5 43.5t52 25.5t58.5 13t62.5 2t59.5 -4.5t55.5 -8l-147 192q-12 18 -5.5 30t27.5 12z" /> -<glyph unicode="🔑" d="M250 1200h600q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-500l-255 -178q-19 -9 -32 -1t-13 29v650h-150q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM400 1100v-100h300v100h-300z" /> -<glyph unicode="🚪" d="M250 1200h750q39 0 69.5 -40.5t30.5 -84.5v-933l-700 -117v950l600 125h-700v-1000h-100v1025q0 23 15.5 49t34.5 26zM500 525v-100l100 20v100z" /> -</font> -</defs></svg> \ No newline at end of file diff --git a/flask_admin/static/bootstrap/bootstrap3/swatch/fonts/glyphicons-halflings-regular.ttf b/flask_admin/static/bootstrap/bootstrap3/swatch/fonts/glyphicons-halflings-regular.ttf deleted file mode 100644 index 1413fc609ab6f21774de0cb7e01360095584f65b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45404 zcmd?Sd0-pWwLh*qi$?oCk~i6sWlOeWJC3|4juU5JNSu9hSVACzERcmjLV&P^utNzg zIE4Kr1=5g!SxTX#Ern9_%4<u(w1q<J@CsjEOL>&01rlrW`<y$HCCf?Z+y45=o|!u{ zcjlhEoqP5%FoVJ1G+bj44I8ITTQqxJ-LCg=WdK{*^eI!Pu_*@0U|>Z!56xXTGQR4C z3vR~wXq>NDx$c~e?;ia3YjJ*$!C>69a?2$lLyhpI!C<oCzO?F`i#HxWjyD@jE}WZI zU3l5~SDy9q1|;#myS}~pymONB?2*4U816rW`)#Xn!7@d1<NOHDt5&bOWb2!+g;p30 z4<NsI$%PwMp0nZD-M=sx9=^?B5SrGVvvng|Yryk+==sq4bJm^rO#Q?6;T&}k_iWs7 z@g?8i`(dlW@aQ!LgXLG3o_Fr~uM{nsXD~dq2>FfJsP=|`8@K0|bbMpWwVU<h#k=?& z2hLD3ege)J^J9<Jz!_dI-O6?vWP>Eygg0=0x_)HeHpGSJagJNLA3c!$EuOV>j$wi! zbo{vZ(s8tl>@!?}dmNHXo)ABy7ohD7_1G-P@SdJWT8*oeyB<gVy2N^Mz8Y_p4K;?4 zVT9pf!y_R}Xk_T@(1FkoDm{_X>VYVW9*vn}&VI4q++W;Z+uz=QTK}^C75!`aFYCX# zf7fC2;o`%!huaTNJAB&VWrx=szU=VLhwnbT`vc<#<`4WI6n_x@AofA~2d90o?1L3w z9!I|#P*NQ)$#9aASijuw>JRld^-t)Zhmy|i-`Iam|IWkgu<LN>aMR%lhi4p~cX-9& zjfbx}yz}s`4-6>D^+6FzihR)Y!GsUy=_MWi_v7y#KmYi-{iZ+s@ekkq!<s)V`@Q^L z`rY8W#qWgQ@xJ2-1w&;af5?RzOBGthmla=B{I%lG6(3e?tJqSpv0`mSvSMY$Srtnw z=2y(Bm|8KV{P*SWmH)c@?ebrg|GfOw@*kDIQ2vZb)ms;}`oI6t>@Wxz!~BQwiI&ti z>hC&iBe2m(dpNVvSbZe3DVgl(dxHt-k@{xv;&`^c8GJY%&^LpM;}7)B;5Qg5J^E${ z7z~k8eWOucjX6)7q1a%EVtmnND8cclz8R1=X4W@D8IDeUGXxEWe&p>Z*voO0u_2!! zj3dT(Ki+4E;uykKi*yr?w6!BW2FD55PD6SMj`OfBLwXL5EA-9KjpMo4*5Eqs^>4&> z8PezAcn!9jk-h-Oo!E9EjX8W6@EkTHeI<@AY{f|5fMW<-Ez-z)xCvW3()Z#x0oydB zzm4MzY^NdpIF9qMp-jU;99LjlgY@@s+=z`}_%V*xV7nRV*Kwrx-i`FzI0BZ#yOI8# z!SDeNA5b6u9!Imj89v0(g$;dT_y|Yz!3V`i{{_dez8U@##|X9<u78GO6Sj7w|BmAX zYy>A};s^7vEd!3AcdyVlhVk$v?$O442KIM1-wX^R{U7`JW&lPr3N(%kXfXT_`7w^? z=#ntx`tTF|N$UT?pELvw7T*2;=Q-x@KmDUIbLyXZ>f5=y7z1DT<7>Bp0k;eItHF?1 zErzhlD2B$Tm|^7DrxnTYm-tgg`Mt4Eivp5{r$o9e)8(fXBO4g|G^6Xy?y$SM*&V52 z6SR*%`%DZC^w(gOWQL?6DRoI*hBNT)xW9sxvmi@!vI^!mI$3kvAMmR_q#SGn3zRb_ zGe$=;Tv3dXN~9XuIHow*NEU4y&u}FcZEZoSlXb9IBOA}!@J3uov<cnLsMTt5KB)Lj zYZXCxu;1bqjH18<x269<Tv%)JD-Sv?wUz&5KB?<}@bC!>p}yerhPMaiI8|SDhvWVr z^BE&yx6e3&RYqIg;mYVZ*3#A-cDJ;#ms4txEmwm<RofF(aiZ;^6Sh1kbq&8p87Q}2 z)<!HT6VUck^|BOZR8X4U*lI4NmphK3T)k;q2UF1)TE2tD(Oq%0w%C5uBAc|kj54!X zjK;0TBFmM`n@u^bcUhg<U$UozsV%ZmyUQe7juv~qZStAE?UA}H^b(uR^svd6<ohSA zPN(&WybCrXyU=981ISP9mNdxHZPF8l4xGdT{y?OqQH)eNL?x_*jVgBKQggghY;ER4 z2ZJLPNi?@5u<K+P9v^?cajfyXk(LSV0q=;>@g^s`BB}KmSr7K+ruIoKs=s|gOXP|2 zb1!)87h9?(+1^QRWb(Vo8+@G=o24gyuzF3ytfsKjTHZJ}o{YznGcTDm!s)DRnmOX} z3pPL4wExoN$kyc2>#J`k+<67sy-VsfbQ-1u+HkyFR?9G`9r6g4*8!(!c65Be-5hUg zZHY$M0k(Yd+DT1*8)G(q)1<YNpB7js)5y12Eq7a-+TSy$n{z4WbFWWmXqX`NmQ;<8 z&#kMnTCG)e^Wqb#OY{bR(&}(pp3G}-_B)F+rS(l(vS<RecZ%(lx`adE6b#<MA*v6| zqhg4L;6Ok2!XZ8=`3{3lFr+}jevG<T8z$m4n8_pfbf#&K;T~jROxF%RXK8L@N{?d! z)#u0D$E0^47cxZAeVEjp$RK_kRO2h>&tDl=g9H7!bZTOvEEFnBOk_K=DXF(d4JOaH zI}*A3jGmy{gR>s}EQzyJa_q_?TYPNXR<v?#Pfy-SGCMD6($H@d06+dYtCwDuCKCO` zfTh}KuF@>U1O;fcV_&TQZhd{@*8Tgpraf~nT0BYktu*n{a~ub^UUqQPyr~yBY{k2O zgV)honv{B_CqY|*S~3up%Wn%7i*_>Lu|%5~j)}rQLT1ZN?5%QN`LTJ}vA!EE=1`So z!$$Mv?6T)xk)H8JTrZ~m)oNXxS}pwPd#);<*>zWsYoL6iK!gRSBB{JCgB28C#E{T? z5VOCMW^;h~eMke(w6vLlKvm!!TyIf;k*RtK)|Q>_@nY#J%=h%aVb)?Ni_By)X<wQw z7V$PDEtth$n$E;Ll`Y4%BO_9n-ugy!JpHdGlaMf3-bFSa<&`Z$)FNx2;bGa5ewQ9G znS9p(JK$Y-8V}<ibr6q#cKkEx`_lIfW`o_}!WDwa=VY;jm&MFX_KN*c$8NiQ<*(1K zOz-}+aK2WdJ+of=zJ0eN>NxY)E3`|}_u}fn+Kp^3p4RbhFUBRtGsDyx9Eolg77iWN z2iH-}CiM!pfYDIn7;i#Ui1KG01{3D<{e}uWTdlX4Vr*nsb^>l0%{O?0L9tP|KGw8w z+T5F}md>3qDZQ_IVkQ|BzuN08uN?SsVt$~wcHO4pB9~ykFTJO3g<4X({-Tm1w{Ufo zI03<6KK`ZjqVyQ(>{_aMxu7Zm^ck&~)Q84MOsQ-XS~{6j>0lTl@lMtfWjj;PT{nlZ zIn0YL?kK7CYJa)(8?unZ)j8L(O}%$5S#lTcq{rr5_gqqtZ@*0Yw4}OdjL*kBv+>+@ z&*24U=y{Nl<J@lPNofl42dq;77(U?JMya(0Crr4x>58qJyW1vTwqsvs=VRAzojm&V zEn6=WzdL1y+^}%Vg!ap>x%%nFi=V#wn#<ZJY+2YKgUZIdddsj}x<a~(_z&i7iw6j~ zD6-dYj8)6VXu?|^ZEI$`u2WRyTK0%)bZh&!D^9oe9c{ncschFCaT|SNh@Ip0Y7e<> zUuheBR@*<muvvX<=P{exAmqKj@)RY=k${p2#1fI%*ObNn_Svg5fBeeKm;N;8<i#ex z@xiUPeR$hjC=hitVD9x2{{y_iS9U^gG9f@6f6&^Vs3zp5qf?=KTW@F7W@hJ`ZBCj< zPCXs%#Cv+T9c^4a%MvhtBnK>KS)5Mn0`f=3fMwR|#-rPMQJg(fW*5e`7xO&^UUH<N z8S{R+VU}U8VWDBEjsa+<a|A}qi`v{;%PNhy=5G#TrE#}Jn{iFX7S1~=;h}j7?-Paq zPz1GeaZ=ceNsUv?a;Nj+<UmnU3}yC*^X?4%XYRVxg{MEFholmVGnq^}E!rMBWy|R_ zg)925;70bcj_+u_rTSN(=HrLgwiaEHUwf>{L(U8D$JtI!ac!g(Ze89<`UiO@L+)^D zjPk2_Ie0p~4|LiI?-+pHXuRaZKG$%zVT0jn!yTvvM^jlcp`|VSHRt-G@_&~<4&qW@ z?b#zIN)G(}L|60jer*P7#KCu*Af;{mpWWvYK$@Squ|n-Vtfgr@<WJYami@2Z&u=;5 z5Vc}@3ijIdgOz2E{1ewt+&m|4loMa2;l_ZQ>ZOmR5Xpl;0q~VILmjk$$mgp+`<2jP z@+nW5Oap%fF4nFwnVwR7rpFaOdmnfB$-rkO6T3#w^|*rft~acgCP|ZkgA6PHD#Of| zY%E!3tXtsWS`udLsE7cSE8g@p$ceu*tI71V31uA7jwmXUCT7+Cu3uv|W>ZwD<C#<5 zr)TgUn*z=?aQx5GtI}?)S=9!TmC))*YbR(2eeE2+a>{&O4Nfjjvl43N#A$|FWxId! z%=X!HSiQ-#4nS&smww~iXRn<-`&zc)nR~js?|Ei-cei$^$KsqtxNDZvl1oavXK#Pz zT&%Wln^Y5M95w=vJxj0a-ko_iQt(LTX_5x#*QfQLtPil;kkR|kz}`*xHiLWr35ajx zHRL-QQv$|PK-$ges|NHw8k6v?&d;{A$*q15hz9{}-`e6ys1EQ1oNNKDFGQ0xA!x^( zkG*-ueZT(GukSnK&Bs=4+w|(kuWs5V_2#3`!;f}q?>xU5IgoMl^DNf+Xd<=sl2<ov zdi9d6DbT*4=K1<NxE2(`@^$C>XvkqviJ>d?+G@Z5nxxd5Sqd$*ENUB_mb8Z+7CyyU zA6mDQ&e+S~w49csl*UePzY;^K)Fbs^%?7;+hFc(xz#mWoek4_&QvmT7Fe)*{h-9R4 zqyXuN5{)HdQ6yVi#tRUO#M%;pL>rQxN~6yoZ)*{{!?jU)RD*oOxDoTjVh6iNmhWNC zB5_{R=o{qvxEvi(k<Br-9y#p7E~9amU@sQujU02m+%O6`wmyB;RZm|f_25ZIu`sWx z9Z!xjMn{xa)<lh?>hbRS`FOXmOO|&Dj$&~><!ER!M(aXh<Y=PO>*oo)bZz%lPhEA@ zQ;;w5eu5^%i;)w?T&*=UaK?*|U3~{0tC`rvfEsRPgR~16;~{_S2&=E{fE2=c>{+y} zx1*NTv-*zO^px5TA|B```#NetKg`19O!BK*-#~wDM@KEllk^nfQ2quy25G%)l72<> zzL$^{DDM#jKt?<>m;!?E2p0l12`j+QJjr{Lx*47Nq(v6i3M&*P{jkZB{xR?NOSPN% zU>I+~d_ny=pX??qjF*E78>}Mgts@_yn`)C`wN-He_!OyE+gRI?-a>Om>Vh~3OX5+& z6MX*d1`SkdXwvb7KH&=31RCC|&H!aA1g_=ZY0hP)-Wm6?A7SG0*|$mC7N^SSBh@MG z9?V0tv_sE>X==yV{)^LsygK2=$Mo_0N!JCOU?r}rmWdHD%$h~~G3;bt`lH&<YttXG zCx4~x@x7rvSlVC8c4`|@!#-B8ZKS<EH?nhD1$CFfEvQA7q3vKKC(B@*EPV@^RffeA zqF7{q<g?nf7wl2mS$#hW3X3?XI^l_=xWmcuOlQEQZFITVPFH}vOiW=uH41qNTB4w> zAuOOZ=G1Mih**0>lB5x+r)X^8mz!0K{SScj4|a=s^VhUEp#2M=^#WRqe?T&H9GnWa zYOq{+gBn9Q0e0*Zu>C(BAX=I-Af9wIFhCW6_>TsIH$d>|{fIrs&BX?2G>GvFc=<8` zVJ`#^knMU~65dWGgXcht`Kb>{V2oo%<{NK|iH+<q(5YAazG9MX#mAntl?z6uydZjo zUFklHM_4M@0HYVoyB8BtKlWH`xbBg99hUSZMa9}uddMW%i`jRIi-g-Oj+Dcyby^(` z%RQFN&dOf4Ittp8bTTLHYY;pny(Y2BDO&N?wA-C_6&0Pd?aun4t;+U8o0V7xD{xVE zT_xFkLYF;IV~uA~NIx^oe`|Ag_zBH%@tGSHD~4^4RZ^~BcP(EUF`avIGk5b#Qq_%$ zWYy4>R^|Gx%q+env#Js*(EBT3V0=w4F@W+oLFsA)l7Qy8mx_;6Vrk;F2RjKFvmeq} zro&>@b^(?f))OoQ#^#s)tRL>b0gzhRYRG}EU%wr9GjQ#~Rpo|RSkeik^p9x2<p!Ww zwwmq`!~oDTY^~4nP7mqhE1&11QI*f_7OwLIc0Sdl0He@3A$?sO|G#_xO5%4jys!Au zz!P*LF2Fu*;<$-+ZxX4HAsc@9KfXGYIspZeD-?_4;Ohrd$nih9sE;A+xh%Yxa|I;O zMn43xybbA$h%OeU78ZAGUa0jg*n))`>+=rUr}vfnQoeFAlv=oX%YqbLpvyvcZ3l$B z5bo;hDd(fjT;9o7g9xUg3|#?wU2#BJ0G&W1#wn?mfNR{O7bq74<ru+<wkuK7q*HuJ zl3ikW@`O=kCFAR2we{1>7tc~mM%m%t+7YN}^tMa24O4@w<|$lk@pGx!;%pKiq&mZB z?3h<&w>un8r?Xua6(@Txu~Za9tI@|C4#!dmHMzDF_-_~Jolztm=e)@vG11b<LZFLt z=a@d3MJ-E4hYQZxA3y&6-j%$UZvUfp^pCgm<jTEuP^)mszD-y$n3Q&{-23}Wv_2Y8 ztp4g>ZQAs!tFvd9{C;oxC7VfWq377Y(LR^X_TyX9bn$)I765l=rJ%9uXcjggX*r?u zk|0!db_*1$&i8>d&G3C}A`{Fun_1J;Vx0gk7P_}8KBZDowr*8$@X?W<UwWy2E;b%8 zDnv;u#sg4V5Tml=Bw6)GO(a6bm@pXL5;t*}iEhY9Zim8L-OM$RpsE=-)J6=6)|MD4 z8{19*DSK107+0Kbw2EdWh!twa9HVGLVmN$BX1?}c?!DT~m@%MuO{=cju@-!?UnaO{ z9Q;H&SNsH&+9*iqK+))0P{pW#u+IR2<&dC||BFzIuVKjDIAwxj0gQDf!MLF#VHC`D zN_zXShCf+#K4Io(-dXedBI4SOK2y)rryrPZ_8G(S4~O-`iR!5u^?GLIlD&{}so=+h zoX&5625-D!az-|Zx~ma2tVY~n7Eznkush<8w1#D9lj%>6v^LYmNWI)lN92yQ;tDpN zOUdS-W4JZUjwF-X#w0r;97;i(l}ZZT$DRd4u#?pf^e2<Tp(F_Ylx9mIONs=GDOR7J z!s@{!h&%A8Er}aMdD0mk#s%bH^(p8HL6l-6iKJ%JY$!?VLmDqZL7D4xf%;gN>yaFo zbm>I@5}#8FjsmigM8w_f#m4fEP<w>~r~_?OWB%SGWcn$ThnJ@Y`ZI-O&Qs#Y14To( zWAl>9Gw7#}eT(!c%D0m>5D8**a@h;sLW=6_AsT5v1Sd_T-C4pgu_kvc?7+X&n_fct znkHy(_LExh=N%o3I-q#f$F4<wlfSnZ{aNtlaHgD*%*;+!if9}xbu`<To}#^Vl2QkO z7|r$zhjK8GE;uJ+566KrGlUndEl83;o70s<D1jcM$y_hC&+<$#S-_D`DMkXCs6&Ja zX$kb)3d(TSz&8E5_#CeAoC7l{hxp54WI)}a6Fq*MuVt{GA?j6in~9$1>QJpy>jZBW zRF7?EhqTGk)w&Koi}QQY3sVh?@e-Z3C9)P!(hMhxmX<?O%M-wa0Dx5a@<^0#9_>LC zF_+ZSTQU`Gqx@o<HpS{<a}-BAGy@<S0>(~<vXHshk{*j+nj`s1+omT#^krl>B$dbr zHlEUKoK&`2gl>zKXlEi8w6}`X3kh3as1~sX5@^`X_nYl}hlbpeeVlj#2sv)CIMe%b zBs7f|37f8qq}gA~Is9gj&=te^wN8ma?;vF)7gce;&sZ64!7LqpR!fy)?4cEZposQ8 zf;rZF7Q>YM<qvPX@rO5R|G8xB*d=47F5FbX>F1~eQ|Z*!5j0DuA=`~VG$Gg6B?Om1 z6fM@`Ck-K*k(eJ)Kvysb8sccsFf@7~3vfnC=<$q+VNv)FyVh6ZsWw}*vs>%k3$)9| zR9ek-@pA23qswe1io)(Vz!vS1o*XEN*LhVYOq#T`;rDkgt86T@O`23xW~;W_#ZS|x zvwx-XMb7_!hIte-#JNpFxskMMpo2OYhHRr0Yn8d^(jh3-+!CNs0K2B!1dL$9UuAD= zQ%7Ae(Y@}%Cd~!`h|wAdm$2WoZ(iA1(a_-1?znZ%8h72o&Mm*4x8Ta<4++;Yr6|}u zW<lfR&2thZ%arCCv7^XWW_6jB>8$p&izhdqF=m8$)HyS2J6cKyo;Yvb>DTfx4`4R{ zPSODe9E|uflE<`xTO=r>u~u=NuyB&H!(2a8vwh!jP!yfE3N>IiO1<sg)|!DAM%5V4 zImfj?oZv3;y3AIvb^=HU^uh7(X5<6aoUeyP2Mi=23DNrjwj6G-I5MpbGBBkQgLzRx z_Qg%sVsEslI2A80hOod<S>jI>7e&3rR#RO3_}G23W?gwDHgSg<QXM9d4Lsp5W&)6? zY*roO0w$UqxC4|r(Er$DV(2l9h4At3N_U`+Ukis<fpRRCK>ekzQ^PU&G5z&}V5GO? zfg#*72*$DP1T8i`S7=P;bQ8lYF9_@8^C(|;9v8ZaK2GnWz4$Th2a0$)XTiaxNWfdq z;yNi9veH<s@9We549w!!z+8C$Xr3bE8Io{iV0-^0*Z((QCVLd1<H5EqJokRheRd?M z=9-#Ba=FG%;bgG2sZn!v5}(U9c2N6|uSx2-^nZJN<Y38%>!j)ba$9pke8`y2^63BP zIyYKj^7;2don3se!P&%I2jzFf|LA&tQ=NDs{r9fIi-F{-yiG-}@2`VR^-LIFN8BC4 z&?*<A2U+2yvz#~5iMlAv#&#x?J%g>IvLiGHH5>NY(Z^CL_A;yISNdq58}=u~9!Ia7 zm7MkDiK~lsfLpvmPMo!0$keA$`%Tm`>Fx9JpG^EfEb(;}%5}B4Dw!O3BCkf$$W-dF z$BupUPgLpHvr<<+QcNX*w@+Rz&VQz)Uh!j4|DYeKm5IC05T$KqVV3Y|MSXom+Jn8c zgUEaFW1McGi^44xoG*b0JWE4T`vka7qTo#dcS4RauUpE{O!ZQ?r=-MlY#;VBzhHGU zS@kCaZ*H73XX6~HtHd*4qr2h}Pf0Re@!WOyvres_9l2!AhPiV$@O2sX>$21)-3i+_ z*sHO4Ika^!&2utZ@5%VbpH(m2wE3qOPn-I5Tbnt&yn9{k*eMr3^u6zG-~PSr(w$p> zw)x^a*8Ru$PE+{&)%VQUvAKKiWiwvc{`|GqK2K|ZMy^Tv3g|zENL86z7i<<vQD<>c zW`W>zV1u}X%P;Ajn+>A)2iXZbJ5YB_r>K-h5g^N=LkN^h0Y6dPFfSBh(L`G$D%7c` z&0RXDv$}c7#w*7!x^LUes_|V*=bd&aP+KFi((tG<uj&`TKbvJwt*s;^z;4Ys<BrXj zUcC9nsnf4nJ}oNAV^;23Huc6W7jNCNGp&VZZ68xTF&1%{6q~EkQlv<(iM7j~voh3C z@5k4r3!z`C;}lPV?5N1<S*Q-j1No*l<5(hps4yh~OUMfaqfZSw{1(}GVOnN8<B1ow zokS3`Befl=7x!u#A9>*gakSR+FA26%{QJdB5G1F=UuU&koU*^zQA=cEN9}Vd?OEh| zgzbFf1?@LlPkcXH$;YZe`WEJ3si6&R2MRb}LYK&zK9WRD=kY-JMPUurX-t4(Wy{%` zZ@0WM2+IqPa9D(^*+MXw2NWwSX-_WdF0nMWpEhAyotIgqu5Y$wA=<qv3s0%`78x7- z!YG+vXM)||6z({8VoMOb>zfuXJ0Y2lL3#ji26-P3Z?-&0^KBc*`T$+8+cqp`%g0WB zTH9L)FZ&t073H4?t=(U6{8B+uRW_J_n*vW|p`DugT^3xe8Tomh^d}0k^G7$3wLgP& zn)vTWiMA&=bR8lX9H=uh4G04R6>C&Zjnx_f@MMY!6HK5v$T%vaFm;E8q=`w2Y}ucJ zkz~dKGqv9$E80NTtnx|Rf_)|3wxpnY6nh3U9<)fv2-vhQ6v=WhKO@~@X57N-`7Ppc zF;I7)eL?RN23FmGh0s<krvL@Zi`9X>;Z#+p)}-TgTJE%&>{W+}C`^-sy{gTm<$>rR z-X7F%MB9Sf%6o7A%ZHReD4R;imU6<9h81{%avv}hqugeaf=~^3A=x(Om6Lku-Pn9i zC;LP%Q7Xw*0`Kg1)X~nAsUfdV%HWrpr8dZRpd-#%)c#Fu^mqo|^b{9Mam`^Zw_@j@ zR&ZdBr3?@<@%4Z-%LT&RLgDUFs4a(CTah_5x4X`xDRugi#vI-cw*^{ncwMtA4N<n# zKe-3R=W^+cuK>KjByYBza)Y$hozZCpuxL{IP&=tw6ZO52WY3|iwGf&IJCn+u(>icK zZB1~bWXCmwAUz|^<&ysd#*!DSp8}DLNbl5lRFat4NkvItxy;9tpp9~<f);nGGD>|@ z;JctShv^Iq4(z+y7^j&I?GCdKMVg&jCwtCkc4*@O7HY*veGDBtAIn*JgD$QftP}8= zxFAdF=(S>Ra6(4slk#h%b?EOU-96TIX$Jbfl*<nInof4ph4hK=1pB+w>_7IY-|R%H zF8u|~hYS-YwWt5+^!uGcnKL~jM;)ObZ#q68ZkA?}CzV-%6_vPIdzh_wHT_$mM%<x2 zq&@Ugp@y3#qmCWN2c()zUb2i%NHytqe#*|FOc9=9=lm37FJ~XnjPaYV#gu{Rxk3h% z6(mfsR@KE$kTrlhgn%DPo5HpDO0=1-df|X)k_Bt?_o11|zfG(qa-#Sl@L(<sfroJg zk#3es02GuhOy#7gPL>vws9lxUj;E@#1UX?WO2R^41(X!nk$+2oJGr!sgcbn1f^yl1 z#pbPB&Bf;1&2+?};Jg5qgD1{4_|%X#s48rOLE!vx3@ktstyBsDQWwDz4GYlcgu$UJ zp|z_32yN72T*oT$SF8<}>e;FN^X&vWNCz>b2W0rwK#<1#kbV)Cf`vN-F$&knLo5T& z8!sO-*^x4=kJ$L&*h%rQ@49l?7_9IG99~xJDDil00<${~D&;kiqRQqeW5*22A`8I2 z(^@`qZoF7_`CO_e;8#qF!&g>UY;wD5MxWU>az<ULIsNY$DJI@Av_2K^yD6wo0kqHs zV#M>oo=E{kW(GU#pbOi%XAn%?W{b>-bTt&2?G=E&BnK9m0zs{qr$*&g8afR_x`B~o zd#dxPpaap;I=>1j8=9Oj)i}s@V}oXhP*{R|@DAQXzQJekJnmuQ;vL90_)H_nD1g6e zS1H#dzg)U&6$fz0g%|jxDdz|FQN{KJ&Yx0vfuzAFewJjv`pdMRpY-wU`-Y6WQnJ(@ zGVb!-8DRJZvHnRFiR3PG3Tu^nCn(CcZHh7hQvyd7i6Q3&ot86XI{jo%WZqCPcTR0< zMRg$ZE=PQx66ovJDvI_JChN~k@L^Pyxv#?X^<)-TS5gk`M~d<~j%!UOWG;ZMi1af< z+86U0=sm!qAVJAIqqU`Qs1uJhQJA&n@9F1PUrYuW!-~IT>l$I!#5dB<cfvg5VibV& zDqvU$KKCo4v0yI;auEcF&ZcvUE7}qhEUthMrKK<ZZorlPhfA2o9*2RG_C6<ZwD)23 zgbU<ugZCNmzTNu!GMX!>aiAK}RUufjg{$#GdQBkxF1=KU2E@N=i^;xgG2Y4|{H>s` z$<vvU|F(3Nv^%2-!)gt%bV2|xrF9!>t`k8c-8`fS7Yfb1FM#)vPKVE4Uf(Pk&%HLe z%^4L>@Z^9Z{ZOX<^e)~adVRkKJDanJ6VBC_m@6qUq_WF<AGx+lu0P|(*RBdki}PPC zR884Dd(Bf1Tr>@Epw>AYqf%r6qDzQ~AEJ<N!$QjqcKBS<-KzqABShp7@2HODUtuI- zM1Hm0Vba1HggryAaeKKwP<qS1QZN90CS+8P%>!jtUvLp^CcqZ^G-;Kz3T;O4WG45Z zFhrluCxlY`M+OKr2SeI697btH7Kj`O>A!+2DTEQ=48cR>Gg2^5uqp(+y5Sl09MRl* zp|28!v*wvMd_~e2DdKDMMQ|({HMn3D%%ATEecGG8V9>`JeL)T0KG}=}6K8NiSN5W< z79-ZdYWRUb`T}(b{RjN8>?M~opnSRl$$^gT`B27kMym5LNHu-k;A;VF8R(HtDYJHS zU7;L{a@`>jd0svOYKbwzq+pWSC(C~SPgG~nWR3pBA8@OICK$Cy#U`kS$I;?|^-SBC zBFkoO8Z^%8Fc-@X!KebF2Ob3%`8zlVHj6H;^(m7J35(_bS;cZPd}TY~qixY{MhykQ zV&7u7s%E=?i`}Ax-7dB0ih47w*7!@GBt<*7ImM|_mYS|9_K7CH+i}?*#o~a&tF-?C zlynEu1DmiAbGurEX2Flfy$wEVk7AU;`k#=IQE*6DMWafTL|9-vT0qs{A3mmZGzOyN zcM9#Rgo7WgB_ujU+?Q@Ql?V-!E<ESfbH6cV^f<TVZZ6$j;;%C;F7k#%v)~#tDz@O9 zGjF`&rD{{KBD!Z>=jbypS+*ch<nT0vi*LE;jA`dwa7L|Pk{%Vkrl+;{Q+Icda+|DH zxbX_5rMru~l@p?-nW}qiMdIwMuOHt$v$Z->I&zA+C_3_@aJal}!Q54?qsL0In({Ly zjH;e+_SK8yi0NQB%TO+Dl77jp#2pMGtwsgaC>K!)NimXG3;m7y`W+&<(ZaV>N*K$j zLL~I+6ouPk6_(iO>61cIsinx`5}DcKSaHjYkkMuDoVl>mKO<4$F<R}h5tU~DoQW2- zb@mx6M$TIWS(5Azchs1S!C1Vg!dX-qRh*Tlox4o><>YJ5J9A2Vl}#BP7+u~L8C6~D zsk`pZ$9Bz3teQS1Wb|8&c2SZ;qo<#F&gS;j`!~!ADr(jJXMtcDJ9cVi>&p3~{bqaP zgo%s8i+8V{UrYTc9)HiUR_c?cfx{Yan2#%PqJ{%?Wux4J;T$#cumM0{Es3@$>}DJg zqe*c8##t;X(<vs5F6*OK5RBh`;EMHg+sn$v%w2!Q1AFLXOj%hwP6VgZXe#dgvNr%C zbK2>4$?A`ve)e@YU3d2Balcivot{1(ahlE5qg@S-h(mPNH&`pBX$_~HdG48~)$x5p z{>ghzqqn_t8~pY<5?-To>cy^6o~mifr;KWvx_oMtXOw$$d6jddXG)V@a#lL4o%N@A zNJlQAz6R8{7jax-kQsH6JU_u*En%k^NHlvBB!$JAK!cYmS)HkLAkm0*9G3!vwMIWv zo#)+EamIJHEUV|$d|<)2iJ`lqBQLx;HgD}c3mRu{iK23C>G{0Mp1K)bt6OU?xC4!_ zZLqpFzeu&+>O1F>%g-%U^~yRg(-wSp@vmD-PT#bCWy!%&H;qT7rfuRCEgw67V!Qob z&tvPU@*4*$YF#2_>M0(75QxqrJr3Tvh~iDeFhxl=MzV@(psx%G8|I{~9;tv#BBE`l z3)_98eZqFNwEF1h)uqhBmT~mSmT8k$7vSHdR97K~kM)P9PuZdS;|Op4A?O<*%!?h` zn`}r_j%xvffs46x2hCWuo0BfIQWCw9aKkH==#B(TJ%p}p-RuIVzsRlaPL_Co{&R0h zQrqn=g1PGjQg3&sc2IlKG0Io#v%@p>tFwF)RG0ahYs@Zng6}M*d}Xua)+h&?$`%rb z;>M=iMh5eIHuJ5c$aC`y@CYjbFsJnSPH&}LQz4}za9YjDuao>Z^EdL@%s<cic@|#d zk`VYkAA1)5&zzBlUXwX>aRm&LGQWXs*;FzwN#p<?>H&j~SLhDZ+QzhplV_ij(NyMl z;v|}a<m1KirP40Q9;?ZUGeiBO`6EQCP%m`AbDrv}WVxc|a9*xhB0zVg4PQB(Updr= z()&PI0+wG1-G5cn-?{zrU(p$hh$VW4zkc`j%O6su+dqN;>mvxRddO81LJFa~2QFUs z+<rMf(`FCeM}FJ^oJ6DQ^2{Nc9R`a9PEsYsk4d<kKA^opcC1pDZk0kh9^Gygk8>Lk zZck)}9uK^buJNMo4G(rSdX{57(7&n=Q6$QZ@lIO9#<3pA2ceD<ex)Co(^yo~b^iS? z-G6>pO_340B*pHlh_y{>i&c1?vdpN1j>3UN-;;Yq?P+V5oY`4Z(|P8SwWq<)<fz%B zj)+x<OZ_gB*%c@YSI6p9w+Ydpc!Zcf$QEBFDuqEL6=PD@Pe~N@st{xMy+-n;*Mt~v zmrteH;(NO63jTi5?DV@CF_fsL-w|T3X%De;sQHBB^9@P)Y{)Bp<max_sHiv=Y2ujB z*Y0pN2vXRDgae#VLF1APpWP+=i6luTbXun4wCl7o-h=Gg-_V%L+$3>n`W@AwcQ?E9 zd5j8>FT^m=MHEWfN9jS}UHHsU`&SScib$qd0i=ky0>4dz5ADy70AeIuSzw#gHhQ_c zOp1!v6qU<Kxjvk}u}KI}1IL4P)HQX%3Qy1||7)ACyj<$_yY^HUY1Qh86mASo5oGq6 zE#i-HjkgKyfR`wC1AzxilV;sCL6u<;DfJ$k2lHogcuG&96Y=9Dx08l3i%#>)@8MY+ zMNIID?(CysRc2uZQ$l*QZVY)$X?@4$VT^>djbugLQJdm^P>?51#lXBkdXglYm|4{L zL%Sr?2f`J+xrcN@=0tiJt(<-=+v>tHy{XaGj7^cA6felUn_KPa?V4ebfq7~4i~GKE zpm)e@1=E;PP%?`vK6KVPKXjUXyLS1^NbnQ&?z>epHCd+J$ktT1G&L~T)nQeExe;0Z zlei}<<dHMjP`dMgT;)rz@KwnNqz2u#jL%!`ao{S@tM3IGYSeTv3Fk3tBkVZxLRlho z@Yxs}5wdFIYX}Vx7;lNy5jfXGDv1)02|!y=K!RAWW@=@lh*MCQ(we#;x;&XaD>_ni ztFo}j7nBl$)s_<W4is^tCJZEK$$)&HpdlqLPzQFWv`<{7GL_AD92F#&(|%OzJIbuy z+Ol{_jn76nNgzuA>3odmdafVieFxc)m!wM+U`2u%yhJ90giFcU1`dR6BBTKc2cQ*d zm-{?M&%(={<F~lIWhEX{d2;PTbK5UDb8+WLo7GcN=5=ow@4S4W$LOt!x3rG3C8mvr z0>xYHy?VCx!ogr|4g5;V{2q(L?QzJGsirn~kWHU`l`rHiIrc-Nan!hR7zaLsPr4uR zG{En&gaRK&B@lyWV@yfFpD_^&z>84~_0Rd!v(Nr%PJhFF_ci3D#ixf|(r@$igZiWw za*qbXIJ_Hm4)TaQ=zW^g)FC6uvyO~Hg-#Z5Vsr<Zy{+LyD`h4YS(ghy#BfWzW^5Uo zQ8PC9sjEJ4RGC&$F|HxuyK{woR4L3OZu<36tuvn9l2snS_;Y@J&z1A*lMO*_Ur`v= zX;m?{v#RtbKP{_C_Pwp$oMe|?dH6}PAjk=@Y1ry|VVd(HV4<-(-0+OjB`EyB0T=kn z(gB<B0#L(B#0`VW)>ybz6uOTF>Rq1($JS`imyNB7myWWpxYL(t7`H8*voI3Qz6mvm z$JxtArLJ(1wlCO_te?L{>8YPzQ})xJlvc5wv8p7Z=HviPYB#^#_vGO#*`<0r%MR#u zN_mV4vaBb2RwtoOYCw)X^>r{2a0kK|WyEYoBjGxcObFl&P*??)WEWKU*V~zG5o=s@ z;rc~uuQQf9wf)MYWsWgPR!wKGt6q;^8!cD_vxrG8GMoFGOVV=(J3w6Xk;}i)9(7*U zwR4VkP_5Zx7wqn8%M8uDj4f1aP+vh1Wue&ry@h|wuN(D2W<Jk_Ub)RM4SgV&OId4; zn2zn6!@5a6q<V@&t`j1NlR++Q;e@+-SbcuS)(a+|%YH!7_B%_B*R5T=?m|>;v6b1^ z`)7XBZ385zg;}&Pt@?dunQ=RduGRJn^9HLU&HaeUE_cA1{+oSIjmj3z+1YiOGiu-H zf8u-oVnG%KfhB8H?cg%@#V5n+L$MO2F4>XoBjBeX>css^h}Omu#)ExTfUE^07KOQS znMfQY2wz?!7!{*C^)aZ^UhMZf=TJNDv8VrrW;JJ9`=|L0`w9DE8MS>+o{f#{7}B4P z{I34>342vLsP}o=ny1eZkEabr@niT5J2AhByUz&i3Ck0H*H`LRHz;>3C_ru!X+EhJ z6(+(lI#4c`2{`q0o9aZhI|jRjBZOV~IA_km7ItNtUa(Wsr*Hmb;b4=;<J1?+^3A&j zK3cnIJ@xJ)8})7lyFf5`owi5yu4lj04lY55Grhwxe6`Vjk5_%2h6Srm0%!Z7OTJgS z7xk*fSj^YWvFa#^cCzaibaRR7wifomC%U_?eh_XL=5Hz83qQMDCary#^CqnoCok6y z#aKY5h8k>R(gF@GmsRI`pF+0tmq0<eALkrdNz?_uQPl5L<ziG;l8G^BKV7-hN+!<* z<qETgy|$oSZ328w$u~CVg?j38Ne8Nec!$^z3O9)SK=%x<?=HO#`R=(x+xbP_2n9~L zA~@Y5=^p7G^ly*h(SjbX22XE{f_H~{EwlIe71&(CF%AC-KZ!PkfDiovb({chpQJjK zFbjvUr>zy~wnoJD(<MLjh**JGO%zg$#8^?N-Q#VEMllAeBN{8Gkcp5385M+IP?10` zKNJCQBzyb5Gta#5ZT-NK&Jkr}EY5LG-*{2<GI5k_E;Cjl{9Li(svK!m$F~O+U$JQS zMZAi<dUJWWO0+lGoKxMN#+rIpvr}TmT8W9)5>LSEwHjT<no^?z{l8Hbtg<ND1Cr6K z6#0!VQ^*}KTk66St&+e*u_9r$$-(;3c2C&lF^#Wti6x@NV{uFO48lerx@~U7EQm%~ zi8-wSrE-(Ma!Z+cdXdE^nH(<3+*mF-qjhezv`kVwaQ)pBtm+Jzn4-9>Ot4xb0XB-+ z&4RO{Snw4G%gS9w#uSUK$Zbb#=jxEl;}6&!b-rSY$0M4pftat-$Q)*y!bpx)R%P>8 zrB&`YEX2%+s#lFCIV;cUFUTIR$Gn2%F(3yLeiG8eG8&)+cpBlzx4)sK?>uIlH+$?2 z9q9wk5zY-xr_fzFSGxYp^KSY0s%1BhsI>ai2VAc8&JiwQ>3RRk?ITx!t~r45qsMnj zkX4bl06ojFCMq<9l*4NHMAtIxDJOX)H=K*$NkkNG<^nl46<z}8DjmoX!f<;!=?S0X zNm_qEi&;s|L9ptUk0h&55Ob{uhVekW1KY3{I#Svm7#;P3BE~;lg8EY6Q79rf(MCE= zN8VGwjyg@p(Rvv6Qeo&vGBF~WTM7Tu+BS~CYXlw<;F93zrP+w<0f)nm=oOTD0XeL> zHWH1GXb?Og1f0S+8-((5yaeegCT62&4N*pNQY;%asz9r9Lfr;@Bl${1@a4QA<GQZo zHC=)78Wbo&u{ERGcuiNo;G#(z2^9z>vMLbV6JDp>8SO^q1)#(o%k!QiRSd0eTmzC< zNIFWY5?)+JTl1Roi=nS4%@5iF+%XztpR^BSuM~DX9q`;Mv=+$M+GgE$_>o+~$#?*y zAcD4nd~L~EsAjXV-+li6Lua4;(EFdi|M2qV53`^4|7gR8AJI;0Xb6QGLaYl1zr&eu zH_vFUt+<?-wHx^jA;=HXzQKp_j)#`&591BSP(wIOS;Ce(17%gs%~hdM@>Ouf4SXA~ z&Hh8K@ms^`(hJfdicecj>J^Aqd00^ccqN!-f-!=N7C1?`4J+`_f^nV!B3Q^|fuU)7 z1NDNT04hd4QqE+qBP+>ZE7{v;n3OGN`->|lHjNL5w40pe<qclDY+ja_*(_95xs;%% zq{v>PJ?^Y6bFk@^k%^5CXZ<+4qbOplxpe)l7c6m%o-l1oWmCx%c6@rx85hi(F=v(2 zJ$jN>?yPgU#DnbDXPkHLeQwED5)W5sH#<v%tu={Y=OlW2%;gK%O0*}OtgP0-W>-eS z%#^4dxiVs{+q(Yd^ShMN3GH)!h!@W&N`$L!SbElXCuvnqh{U7lcCvHI#{ZjwnKvu~ zAeo7Pqot+Ohm{8|RJsTr3J4GjCy5UTo_u_~p)MS&Z5UrUc|+;Mc(YS+ju|m3Y_Dvt zonVtpBWlM718YwaN3a3wUNqX;7TqvAFnVUoD5v5WTh~}r)KoLUDw%8Rrqso~bJqd> z_T!&Rmr6ebpV^4|knJZ%qmzL;OvG3~A*loGY7?YS%hS{2R0%NQ@fRoEK52Aiu%gj( z_7~a}eQUh8PnyI^J!>pxB(x7FeINHHC4zLDT`&C*XUpp@s0_B^!k5Uu)^j_uuu^T> z8WW!QK0SgwFHTA%M!L`bl3h<zOXT*J6fe~c%_xb0$mxr#<2VD=$rO0L8nX7*#{Ksu z$LONOvFCTfJN5XIapRVZlX}Y=<Lbb4!eHVHYIDPW9?-^*TjQ2+nH<TKdTCuE{W6Ky z7>HjPp)|wL5Var_*A1-H8LV?uY5&ou{hRjj>#X@rxV>5<xG4RL_K~wL=!|H8*ZSVn ze*QWuVl90vQ035NRw9cT+>%-9hbP+v?$4}3EfoRH;l_wSiz{&1<+`Y5%o%q~4<MOn zEoNk8R4!uRxI3kmMnO0fow{Ibz3`A^4>rdpRF0jOsCoLnWY5x?V)0ga>CDo`NpqS) z@x`mh1QGkx;f)p-n^*g5M^zRTHz%b2IkLBY{F+HsjrFC9_H(=9Z5W&Eymh~A_FUJ} znhTc9KG((OnjFO=+q>JQZJbeOoUM77M{)$)qQMcxK9f;=L;IOv_J>*~w^YOW744QZ zoG;!b9VD3ww}OX<8sZ0F##8hvfDP{hpa3HjaLsKbLJ8<m2C(MCx~x+Mo`}Jf7gdL> z0WpY2E!w?&cWi7&N%bOMZD~o7QT*$xCRJ@{t31~qx~+0yYrLXubXh2{_L699Nl_pn z6)9eu+uUTUdjHXYs#pX^L)AIb!FjjNsTp7C399w&B{Q4q%yKfmy}T2uQdU|1EpNcY zDk~(h#AdxybjfzB+mg6rdU9mDZ^V>|U13Dl$Gj+pAL}lR2a1u!SJXU_YqP9N{ose4 zk+$v}BIHX60WSGVWv;S%zvHOWdDP(-ceo(<8`y@Goy%4wDu>57QZNJc)f>Ls+}9h7 z^N=#3q3|l?aG8K#HwiW2^PJu{v|x5;awYfahC?>_af3$LmMc4%N~JwVlRZa4c+eW2 zE!zosAjOv&UeCeu;Bn5OQUC=jtZjF;NDk9$fGbxf3d29SUBekX1<Pr@Tu%2mF`vob zdsw;fW5J;CqD*)A#3k~8m#E~>!a$Vmq_VK*MHQ4)eB!dQrHH)LVYNF%-t8!d`@!cb z2CsKs3|!}T^7fSZm?0dJ^JE`ZGxA&a!jC<>6_y67On0M)hd$m*RAzo_qM?aeqkm`* zXpDYcc_>TFZYaC3JV>{>mp(5H^efu!Waa7hGTAts29jjuVd1vI*fEeB?A&uG<8dLZ z(j6<v3j>;-%vJ7R0U9}XkH)1g>&uptXPHBEA*7PSO2TZ+dbhVxspNW~ZQT3fApz}2 z_@0-lZODcd>dLrYp!mHn4k>>7kibI!Em+Vh*;z}l?0qro=aJt68joCr5Jo(Vk<@i) z5BCKb4p6Gdr9=JSf(2Mgr=_6}%4?SwhV+JZj3Ox^_^OrQk$B^v?e<VR4r!cUQcNa* zLw&@@0{2I&$oQBHjs;Rdk`@6y1!<-(7NgjbFuEcwrG9}&Hy03(S??>Nz}d^xRaz&~ zKVnlLnK<O~>#8^y=If2f1zmb~^5lPLe?%l}>?~wN4IN((2~U{e9fKhLMtYFj)I$(y zgnKv?R+ZpxA$f)Q2l=aqE6EPTK=i0sY&MDFJp!vQayyvzh4wee<}kybNthRlX>SHh z7S}9he^EBOqzBCww^duHu!u+dnf9veG{HjW!}aT7aJqzze9K6-Z~8pZAgdm1n~aDs z8_s7?WXMPJ3EPJHi}NL&d;lZP8hDhAXf5Hd!x|^kEHu`6QukXrVdLnq5zbI~oPo?7 z2Cbu8U?$K!Z4_yNM1a(bL!GRe!@{Qom+DxjrJ!B99qu5b*Ma%^&-=6UEbC+S2zX&= zQ!%bgJTvmv^2}hhvNQg!l=kbapAgM^hruE3k@jTxsG(B6d=4thBC*4tzVpCYXFc$a zeqgVB^zua)y-YjpiibCCdU%txXYeNFnXcbNj*D?~)5AGjL+!!ij_4{5EWKG<MLirH z+DX^Dk(~hl-o)R17Ke7NBWBmGx0}_Yh*L{$3or|S`y{XU9=}stg7(?(^wZZS2Da%+ zWvCP|MzT2WK(<`aoEV!R1WAp-r%3{)SA=78<qFf;<rwNmD*Y*6(NUk(!LD}1(qHA3 z`=B=489M4KM^RxXd(tHgT%9X5Tjnh2mdXv4MCT5VYa7rd+N5ISRlSW}1lw5{(5L@K zwzTh&rM#;2<;oP^LJod0{WsXpN5C{w?l*Jg>av0^={~M^q}baAFOPzxfUM>`KPf|G z&hsaR*7(M6KzTj8Z?;45zX@L#xU{4n$9Q_<-ac(y4g~S|Hyp^-<*d8+P4NHe?~vfm z@y309=`lGdvN8*jw-CL<;o#DKc-%lb0i9a3%{v&2X($|Qxv(_*()&=xD=5oBg=$B0 zU?41h9)JKvP0yR{KsHoC>&`(Uz>?_`tlLjw1&5tPH3FoB%}j;yffm$$s$C=<NH+_Q zuVOy!BKDYAHt^L);tLou9Iw!KVrZ;__9lB4Qu}AkDaaH65g@R}lia;0J%u}*93`p? zaeF={6)8oIBzH4kIggVAVvNSbROx-Z(+`hO*myDp7yv#WCwMIxk<hHjD5AkCV*KFy z7uwrr!(roY4b(1>RHi`I3*m@%CPqWnP@B~%DEe;7ZT{9!IMTo1hT3Q347HJ&!)BM2 z3~aClf>aFh0_9||4G}(Npu`9xYY1*SD|M~9!CCFn{-J$u2&Dg*=5$_nozpoD2nxqq zB!--eA8UWZlcEDp4r#vhZ6|vq^9sFvRnA9HpHch5Mq4*T)oGbruj!U8Lx_G%Lby}o zTQ-_4A7b)5A42vA0U}hUJq6&wQ0J%$`w#ph!EGmW96)@{AUx>q6E>-r^Emk!iCR+X zdIaNH`$}7%57D1FyTccs3}Aq0<0Ei{`=S7*>pyg=Kv3nrqblqZcpsCWSQl^uMSsdj zYzh73?6th$c~CI0>%5@!Ej`o)Xm38u0fp9=HE@Sa6l2<mw_Yh7ly>oX9^^4|Aq%GA z3(AbFR9gA_2T2i%Ck5V<FfGDt5jFr`inQh;1&EJ*>2Q2WW-(a&(j#@l6wE4Z`xg#S za#-UWUpU2U!TmIo`CN0JwG^>{+V#9;z<j+vge|-bMmFe5eQtw=$jBe&1J+DLGhNXR zVF0LJkT6h0B8nsw@>vx;ztc$}@NlcyJr?q(Y`UdW6qhq!aWyB5xV1#Jb{I-ghFNO0 z<gP-h@3s4i1u==>FU~+QgPs{FY1AbiU&S$QSix>*rqYVma<-~s%ALhFyVhAYepId1 zs!gOB&weC18yhE-v6ltKZMV|>JwTX+X)Y_EI(Ff^3$WTD|Ea-1HlP;6L~&40Q&5{0 z$e$2KhUgH8ucMJxJV#M%cs!d~#hR^nRwk|uuCSf6irJCkSyI<%CR==tftx6d%;?ef zYIcjZrP@APzbtOeUe>m-TW}c-ugh+U*RbL1eIY{?>@8aW9bb1NGRy@MTse@>=<ra> za%;5=U}X%K2tKTYe9gjMcBvX%qrC&uZ`d(t)g)X8snf?vBe3H%d<Ke$F$Z0AGpq$L zh*N9G{;KEPa}gmeOBNBk0zORp;`+VU|1_04|4V$bCz(R~xePApA?YFdZU$CR63IbQ z2Pq2(THUz7SlMWdHOdM19(SYTR)^7j>G=b<Uy4X-FL@RBUeVq-s%!3f=Wp$pdFiyc z*UH5I+~YQSU-pf1Z~4Z+d0X6)<0i*Q_Z}vh)KKf>l^rv8Z@YN$gd9yveHY0@Wt0$s zh^7jCp(q+6XDoekb;=%y=Wr8%<!i<hjG`j2f#)CHoE%?oHV1t_^966$UcQ|tMEj_Y z^Dp_?#syJ7V{9Es?J3v}f}pPx{87yPa7|66#gbBs#7ePJ{bo_oH&rCWA~hx1V^t$U z+8@1TWfn_Z`;{~9gC9mv?eoQ*Y-C)rhp|}dc#r5_J0yspKw$C`a}OGKQh(E&3WUik z4AxbHbeGhXO7DYJ7=8m!=+Sj-HxJCb*@hx`<Q?E73ZqASI|ZO4gQX;PgpcX_I2dEP z4PzF^;fhXQ)40w{k(P#>6;z0ANH5dDR_VudDG|&_lYykJaiR+(y{zpR=qL3|2e${8 z2V<U){GkH!99$-?(vZQ6`9xYUH;m>;?jgHj7}Kl(d8C9xWRjhpf_)KOXl+@c4wrHy zL3#9U(`=N59og2KqVh>nK~g9>fX*PI0`>i;;b6K<iTA=O-~d|1@8nQW|764_gHT9A z+Jdw)Cus?cfv_Gsi;gF31B#4DZ2^Yn1Wk~wI*LZ!hnDLnI_*R~z#5pH4R3KO1Ir1F zNQX5wC;<FU(7pj+t&{Y#h#K(_6=WtrHj4aPX$5uUHjT;c(e}35?V4?SZCg90+pyx( z`_R8jCQe*LR*{P)PNV>F|8zg+k2hViCt}4dfMdvb1NJ-Rfa7vL2;lPK{Lq*u`JT>S zoM_bZ_?UY6oV6Ja14X^;LqJPl+w?vf*C!nGK;uU^0GRN|UeFF@;H(Hgp8x^|;ygh? zIZx3DuO(lD01ksanR@Mn#lti=p28RTNYY6yK={RMFiVd~k8!@a&^jicZ&rxD3CCI! zVb=fI?;c#f{K4Pp2lnb8iF2mig)|6JEmU86Y%l}m>(VnI*Bj`a6qk8QL&~PFDxI8b z2mcsQBe9$q`Q$LfG2wdvK`M1}7?SwLAV&)nO;kAk`SAz%x9CDVHVbUd$O(*aI@D|s zLxJW7W(QeGpQY<$dSD6U$ja(;Hb3{Zx@)*fIQaW{8<$KJ&fS0caI2Py^clOq9@Irt z7th7F?7W`j{&UmM==Lo~T&^R7A?G=K_e-zfTX|)i`pLitlNE(~tq*}sS1x2}Jlul6 z5+r#4SpQu8h{ntIv#qCVH`uG~+I8l+7ZG&d`Dm!+(rZQDV*1LS^WfH%-!5aTAxry~ z4xl&rot5ct{xQ$w$MtVTUi6tBFSJWq2Rj@?HAX1H$eL*fk{Hq;E`x|hghRkipYNyt zKCO=*KSziiVk|+)qQCGrTYH9X!Z0$k{Nde~0Wl`P{}ca%nv<6fnYw^<s*I^w2}g4) zDT(2xL%uqsByOSZ61tavt7O>~9dYxTnTZB&&962jX0DM&wy&8fdxX8xeHSe=UU&Mq zRTaUKnQO|A>E#|PUo+F=Q@dMdt`P*6e92za(TH{5C*2I2S~p?~O@hYiT>1(n^Lqqn zqewq3ctA<T{c@#lWCZ$(!d{cN7=2we77Yx!0ew~Gx<3;vHo@;Z=)<i6dXzL;AY|z| zQh^P>A%0E)r53*P-a8Ak32mGtUG`L^WVcm`QovX`ecB4E9X60wrA(6NZ7z~*_DV_e z8$I*eZ8m=WtChE{#QzeyHpZ%7GwFHlwo2*tAuloI-j2exx3#x7EL^&D;Re|Kj-XT- zt9<G*I5j~YwPM=zQc<-<5T)`?p=k3wJ6%=B%=d_@HDXhwqg3ij6<6Gneq}IMRsO?+ zZ$ux+&=>08^soV2`7s+Hha!d^#J+B)0-`{qIF_x=B811SZlbUe%kvPce^xu7?LY|C z@f1gRPha1j<g?ml{#gpkD^O$XNTr0o(I;d;h4uA8LjteITT`#--;T+ZYX+t7g{&jY z%jLmo;U5!e_41&}2`Y3PtJNiOtyHYGC;e`w)XqI9cfa-k)QH;zlhbma7)pQ1mZ#s9 zrt1Z7OQrg>q|=f}Se)}v-7MWH9)YAs*FJ&v3ZT9TSi?e#jarin0tjPNmxZNU_JFJG z+tZi!q)JP|4pQ)?l8$hRaPeoKf!3>MM-bp06RodLa*wD=g3)@pYJ^*YrwSIO!SaZo zDTb!G9d!hb%Y0QdYxqNSCT5o0I!GDD$Z@N!8J3eI@@0AiJmD7brkvF!pJGg_AiJ1I zO^^cKe`w$DsO|1#^_|`6XTfw6E3SJ(agG*G9qj?JiqFSL|6tSD6vUwK?Cwr~gg)Do zp@$D~7~66-=p4`!!UzJDKAymb!!R(}%O?Uel|rMH>OpRGINALtg%gpg`=}M^Q#V5( zMgJY&gF)+;`e38QHI*c%B}m94o&tOfae;<xSoo%JWgt|4OsWqBge(0MrWCl{^{1qR z$9kiQL{yp=)4GQGI_Jm5&g#GDTYcGhkauMJQ(qfM)1pg_a_8YpGwNbwNKp#T3-1@6 z|CjTBM~_fXe$Rs`cJE+v;7^0eysLT1ugyST5y-lLQ?!t5I+r@})qno};JoRD-E=Xi zX_8OynCqNAP{M@6q0{1lA$fd7YVYB^B3HOC?;KS&skUZdpr&?G*{Dvo9Hf%gnd2O9 zvFCA)Qg13bH?d=3bMwL-iMgPupd}c_KuUy2B!UeZUr<=BIK|YBv?yV$q58*?!w_CK zhp}K1=StAQ6{?zIqvi9mLesqVm&dX(9+AzcRVtrMpZ;{ErIyVQpVYzYVcvn6%u9m3 zENe?2g{r;1I%;x<{deB!54%lK?QVcb%q|Y(3&@xG42;qPh~(~r6ouOokrhp}g_Byo zKp4yiKG~E3?*xr!?^(OHXYKbID@Vk%L$MJN?dLjF_FD?rZRr8zTic`kxqVF61s8OU zY1cLlYqVUOIkCpn>og&!J2;6ENW}QeL7<PXg{yny8O<B+-%z=8!`{k@uZK?dU2tpL zoDCc1bk4tH!`>3jatbI1*9X~y=$Dm%6FwDcnCyMRL<PZ=`4kP-O>}zo`0=y7=}*Uw zo3!qZncAL{HCgY!+}eKr{P8o27ye+;qJP;kOB%RpSesGoHLT6tcYp*6v~Z9NCyb6m zP#qds0jyqXX46qMNhXDn3pyIxw2f_z;L_X9EIB}<BZV)NY+Sf`GmW4*C1<w9<G3@Y zR-2Ao^uw)%Z0Eww)CNf&GoE61(l=R$@lLulhRTBom-G)|sA)*B&(~_KWRT_L+saB5 zo*q>AhyC`FYI}G3$WnW>#NMy{0aw}nB%1=Z4&*(FaCn5QG(zvdG^pQRU25;{wwG4h z@kuLO0F->{@g2!;NNd!<zny}%07Jn8Nf<E`qd>PfqM-;@F0;&wK}0fT9UrH}(8A5I zt33(<pT6JhCadCO^EwcP0}B}m196bLHZSD1wzS~lgDzyBOMDp_>+&U;CLN|8+71@g z(s!f-kZZZILUG$QXm9iYiE*>2w;gpM>lgM{R9vT3q>qI{ELO2hJHVi`)*jzOk$r)9 zq}$VrE0$GUCm6A3H5J-=Z9i*biw8<GlN{|J&^K2l_*g<#Pt^RN|DX}11Ly}*7(>ng zi<1nM0lo^KqRY@Asucc#DMmWsnCS;5uPR)GL3pL=-IqSd>4&D&NKSGHH?pG;=Xo`w zw~VV9ddkwbp~m>9G0*b?j7-0fOwR?*U#BE#n7A=_fDS>`fwatxQ+`F<!Rj$KZl*<p zT?$eX^b9WOf%^Fc5Ow$#oiLZxFXB|4X4Ah-N23bVC3rdbHNy5`I((oY2SI(gVJE_3 zv~k-4(EcFxN5Hx@>zhBGQUAyIRZ??eJt46vHBlR>9m!vfb6I)8!v6TmtZ%G6&E|1e zOtx5xy%yOSu+<9Ul5w5N=&~4Oph?I=ZKLX5DXO(*&Po>5KjbY7s@tp$8(fO|`Xy}Y z;NmMypLoG7r#Xz4aHz7n)MYZ7Z1v;DFHLNV{)to;(;TJ=bbMgud96xRMME#0d$z-S z-r1ROBbW^&YdQWA>U|Y>{whex#~K!ZgEEk=LYG8Wqo28NFv)!t!~}quaAt}I^y-m| z8~E{9H2VnyVxb_wCZ7v%y(B@VrM6lzk~|ywCi3HeiSV`TF>j+I<PcrA4vbhkc}Ds9 zVnPj;dD9hvN^{*9tq;`Y3-i35x*J^9kk!Mknb6QMp+R%r;|Y~}U1bd=<D2Z^=6NHx z)o!mbv)c13!qxVmdz@Dme2Ud2?)buFbw!<Z_N}SPHX2@PRM{c<oRhmdQ=Q!h%GA-# zE|+zRyX;@_)`kh%@3wm_ZjUz-66I&coi<`>jd|p*kyn;=mqtf8&DK^|*f+y$<HJ*z z{kCJi%r~syv1<5SAj?Qn<RD-N0#-mimPHVGsjQ(4>38+9!sis9N=S)nINm9=CJ<;Y z!t&C>MIeyou4XLM*ywT_JuOXR>VkpFwuT9j5>66<JwXm0Iz|uD_GISrZ<tb63#|b6 zmesyu7v#<;wAs4wx|xl$8!C)O(dny+&uQp5Yiylr74+Z{`kuduLfD{$!RweaKvq@@ zSKvT=l{+EaFCqSAuk-})NiD5^S-DyEOCPWcr6mSZED8GEaH3HbBi=sIw&e0Ek0*HT zg7i-oY%env)m$!wZo6{H^btX$@qVG{e!&!~J#BILfmfs_E?=UpX#O6)G;!&c?y}Qg zZDtQIxqNpZ+R#vKv;FOFva`NsR7883$-r&2{_WuFALO<~3Fk}Bb(WC&g8i;%)qzDY zRjOTdfX!%Ad(<}BcYy4>7A=CU*{TBrMTgb4HuW&!%Yt`;#md7-`R`ouOi$rEd!ErI zo#>qggAcx?C7`rQ2;)~PYCw%CkS(@EJHZ|!!lhi@Dp$*n^mgrrImsS~(ioGak>3)w zvop0lq@II<?zr~h{;~Z%uibTbs^_R=H(HEh%|uq3KKIc_zxBu?d|hToq+T%unvO@H z_7G`_g*WS&kUbvS*4>SuA0Ou*#1JkG{U>xSQV1e}c)!d$L1plFX5XDXX5N<n2C0jm zX{r1Jy%RD8vWp=4fyb$$F_f=*`nvNgb$TK5DH~vUeDX&BtW7RGgbP7rCk$}DqbN_= zG+@cCNjfaVNpOlFw+a>7Ns{kT{y5|6MfhBD+esT)e7&CgSW8FxsXTAY=}?0A!j_V9 zJ;IJ~d%av<@=fNPJ9)T3qE78kaz64E>dJaYab5u<efW`3H($g#7XgvMkYf+oz36no z(7hfLHbbB2R0{1uae-^d+wzih8L%N9he3ud^j?e&dq$dH2awC*y4Q%$6QP+9{{{^S zS|%?I`*;k>aU`n~Zdp2h{8DV%SKE5G^$LfuOTRRjB;TnT(Jk$r{Pfe4CO!SM_7d)I zquW~FVCpSycJ~c*B*V8?Qqo=GwU8CkmmLFugfHQ7;A{yCy1OL-+X=twLYg9|H=~8H znnN@|tCs^ZLlCBl5wHvYF}2vo>a6%mUWpTds_mt*@wMN4-r`%NTA%+$(`m6{MNpi@ zMx)8f>U<?#KGhQOH9sd_@m#$xV)2XXy+)7rj<v$+@Y;iI(?-Y3Sg0r<Nksvzzi#Zp z$q~EP;jFN*8js?YBQ<`b?Z-d1$^IIsy$A>4hd!row@gM&PVo&Hx+lV@$j9yWTjTue zG9n0DP<*HUmJ7ZZWwI2x+{t3QEfr6?T}2iXl=6e0b~)J>X3`!fXd9+2wc1%cj&F@Z zgYR|r5Xd5jy9;YW&=4{-0rJ*L5CgDPj9^3%bp-`HkyBs`j1iTUGD4?WilZ6RO8mIE z+~Joc?GID6K96dyuv(dWREK9Os~%?$$FxswxQsoOi8M?RnL%B~Lyk&(-09D0M?^Jy zWjP)n(b)TF<-|C<kuA~or~e()IVaJB8ThDOo%m84{2#Jw7lA;F7HB%yOOfao*a-Bo z9vF{4tjJ*|r>G%!Vz?8Fu&6iU<>oG#kGcrcrrBlfZMVl0wOJvsq%RL9To%iCW@)#& zZAJWhgzYAq)#NTNb~3GBcD%ZZOc43!YWSyA7TD6xkk<oWhdAZNF5oEMySt*u%}=mX zY^=DnO8CU4$;_0G$Mo-Kkj5NlGljS+>)n^FaRAz73b}%9d&YisBic(?mv=Iq^r%Ug zzHq-rRrhfOOF+yR=AN!a9*Rd#sM9ONt5h~w)yMP7Dl9lfpi$H0%GPW^lS4~~?vI8Z z%^ToK#NOe0ExmUsb`lLO$W*}yXNOxPe@zD*90uTDULnH6C?InP3J=jYEO2d)&e|mP z1DSd0QOZeuLW<s88&Dqv$ZDY(qEHICGi1F$d4+8O&b2468PMe9JW2)dic7s&U~)}9 zv>o*NqZzopA+LXy9)fJC00NSX=_4Mi1Z)YyZVC>C!g}cY(Amaj%QN+bev|Xxd2OPD zk!dfkY6k!(sDBvsFC2r^?}hb81(WG5Lt9|riT`2?P;B%jaf5UX<~OJ;uAL$=Ien+V zC!V8u0v?CU<?sa9rw*YNr=`U}IHdv2<G`|o3Bx8D;^GeQOIB`c%X^K&>a)4*Q+Q_u zkx{q;NjLcvyMuU*{+uDsCQ4U{JLowYby-tn@<?{mQ!v2u1l{5e{t5@ZjF*S!>hatL zy}X>9y08#}oytdn^qfFesF)Tt(2!XGw#r%?7&zzFFh2U;#U9XBO8W--#gOpfbJ`Ey z|M8FCKlWQrOJwE;@Sm02l9OBr7N}go4V8ur)}M@m2uWjggb)DC4s`I4d7_8O&E(j; z?3$9~R$QDxNM^rNh9Y;6P7w+bo2q}NEd6f&_raor-v`UCaTM3TT8HK2-$|n{N@U>_ zL-`P7EXoEU5JRMa)?tNUEe8XFis+w8g9k(QQ)%?&Oac}S`2V$b?%`DwXBgja&&fR@ zH_XidF$p1wA)J|Wk1;?lCl?fgc)=TB3>Y8;BoMqHwJqhL)Tgydv9(?(TBX)fq%=~C zmLj!iX-kn7QA(9snzk0LRf<%SzO&~IhLor6A3f*U^UcoAygRe!H#@UCv$JUP&vPxs zeDj$1%#<2T1!e|!7xI+~_VXLl5|jHqvOhU7ZDUGee;HnkcPP=_k_FFxPjXg*9KyI+ zIh0@+s)1JDSuKMeaDZ3|<_*J8{TUFDLl|mXmY8B>Wj_?4mC#=XjsCKPEO=p0c&t&Z zd1%kHxR#o9S*C?du*}tEHfAC7WetnvS}`<%j=o7YVna)6pw(xzkUi7f#$|^y4WQ{7 zu@@lu=j6xr*11VEIY+`B{tgd(<i-P<xW8QmX{Uu}CW{$k=4G`<yQ5DK7nY#9L<7KO zZl2V*aS4sKmaEUS-mY%P1^cv^q{7lxZ)5qzsWF(QH6y#+dwE4lRddpa#$Z}_cCaKa zE;TlFY<W#EqQ=~xoZ>c3zO8%nGk0U^%ec6h)G_`ki|XQXr!?NsQkxzV6Bn1ea9L+@ z(Zr7CU_oXaW>VOdfzENm+FlFQ7Se0ROrNdw(QLvb6{f}HRQ{$Je>(c&rws#{dFI^r zZ4^(`J*G0~Pu_+p5AAh>RRpkcbaS2a?Fe&JqxDTp`dIW9;<O_d1fh3g+@%<JHS<h; z`xr?<<utwG<Lj5Zdhfz~Sd#5Kb7T9+cKkOui1y`+Uv$r&om%~&H3ligXMa!k1A}&8 z`oKdmM{uQUq3k>DL%0wxX5;`KxyA4F{(~_`93>NF@bj4LF!NC&D6Zm+Di$Q-tb2*Q z&csGmXyqA%Z9s(AxNO3@Ij=WGt=UG6J7F;r*uqdQ<A<k`&*~1mNB0QW1T5I+z^l>a z?7j!nV{8eQE-cwY7L(3AEXF3&V*9{DpSYdyCjRhv#&2johwf{r+k`QB81%!aRVN<& z@b*N^xiw_lU>H~@4MWzgHxSOGVfnD|iC7=hf0%CPm_@@4^t-nj#GHMug&S|FJtr?i z^JVrobltd(-?Ll>)6>jwgX=dUy+^n_ifzM>3)an3iOzpG9Tu;+96TP<0Jm_PIqof3 zMn=~M!#Ky{CTN_2f7Y-i#|gW~32RCWKA4-J9sS&>kYpTOx#xVNLCo)A$LUme^fVNH z@^S7VU^UJ0YR8?<bG~Mj6Gj-lk3HOub{MXq84f%T`QY6$SQB%P+{DM48!0oDB|1i& zZKxv58$HkYAPzeA(N@4W-r2I(ob~ZN%-H1^uVTL2tUjwxrv8WT<9HEQp}oppV?S-b z?TWa%T=%&4xZ~a0-G(Qtj>Oy$^IYuG*bm|g;@aX~i60%`7XLy*AYpYvZ^F^U(!|RW z*C!rJ@+7TGdL=nNd1gv^%B+;Fcr$y)i0!GRsZXRHPs>QVGVR{9r_#&Qd(wL|5;H;> zD>HUw=4CF++&{7$<8G@j*nGjhEO%BQYfjeItp4mPvY*JYb1HKd<ZQ^<n)7B(e{N}R zNACLEJ-M&vp2!R2b>!{HJ9*)(3%BR%{Pp?AM&*yHAJsW({ivOzj*qS!-7|XEn6@zo z3L*tBT%<4RxoAh>q{0n_JBmgW6&8hx?kL(_^k%VL>?xjAyrKBmSl`$=V|SK}ELl}@ zd|d0eo#RfG`bw9SK3%r4Y+rdvc}w}~ixV%tqawbdqvE-WcgE+BUpxMT%F@btm76MG zn=oQRWWuTm+a{dy)Oc2V4yX(@M{QAkx>(QB59*`dLT`<?!`ti2@y+pV_8st7_#g52 z1!@8-14n{+!KuOff(Jusq1w=z(B5!jxFx(cyss+1s<Z0Bs-u@|yyQrAPIYVbrs`9d z>Pz3Lsj9iB=HSHAiCq()ns|Cr)1<p6y)@aLys9>*c605Cx}3V&x}Lg?b+6Q?)z7Kl zQh&1Hx`y6JY-Cwvd*ozeps}a1xAA0CR+Da;+O(i)P1C;SjOI}Dtmf6tPqo-Bl`U78 zv$kYgPntPp@G)n1an9tEoL*Vumu9`>_@I(;+5+fBa-*?fEx=mTEjZ7wq}#@Gd5_cW z!mP{N=yqEntDo)|>oy6{9cu+-3*GTnmb^`O0^FzRPO^&aG`f@F_R*aQ_e{F+_9%NW z4KG_B`@X3EVV9L>?_RNDMddA>w=e0KfAiw5?#i1NFT%Zz#nuv(&!yIU>lVxmzYKQ` zzJ*0w9<&L4aJ6A;0j|_<vbtcWAbbzpCj3Gin*xk%@5HxYh(fosHrML5=EAoJzwHRw zh@)_=)rwlI8GD^(O|@nqTobf9QEEG(*M$^xqkm*B>~i>+y(q-=;2Xxhx2v%CYY^{} z^J@LO()eLo|7!{ghQ+(u$wxO*xY#)cL(|mi<iezIsIQq}e;H<1HsO1a%jmXB^n!Yj z`bEguLTH*W^N>H2_ck2yN{mu4O9=hBW*pM_()-_YdH#Ru{JtwJ^R2}3?!>>m1pohh zrn(!xCjE<?5dV)b*C5Aj$gepjhO+1}F~03sn})p^Uz6_w9HjtSwO;4fgQNBdkCC(S zXIQs_lKEg{DKt7!64@q0U7<~Z9sWW2MiWn5C=n^v2(+j+NQ}hd(YScLR6bFX1e5GJ z{f}vqE*X+(y(=SeU6&=<n3p71@^G&#A3gi#b>0Q&EH1<ywPMV@T7r4FN~KK7(R*2e zG3w@Kn+NlNX^aE);gT>QK?zA%sxVh&H99cObJUY$veZhQ)MLu-h%`!*G)s$2k;~+A z)Kk->Ri?`oGDEJEtI*wijm(s5<vO`uZjc+%3o%>f$W78FH{+qBxiU{~kq((J3uK{m z$|C8K#j-?hm8H@x%VfFqpnvu@xn1s%J7uNZC9C99a<_b1J|mx%)$%!6gPU|~<@2&m zz99GDp`|a%m*iggvfL;4%X;~WY>)@!tMWB@P`)k?$;0x9JSrRI8?s3rlgH(o@`OAo zn{f*gZ#t2u<vX%PzAIbh8QCV^lkM_->6K??hx|aElOM`Xd0t+SAIUEHvFw%?Wsm$s zUXq{6UU?a>Nc@@Xlb_2k<d?Yk`js4zSLLAmT7Dyk<TW`guge>9M1Ctr<#+O?yd}rv z_wu&<L5|BGrBD7Of0n<<JMvdKA@9n2@;7;3{*GxNK9rO44>=_t$!Yngd@N_AUj}T; z#*Ce|%XZr_sQcsWcsl{pCnnj+c8ZNIMmx<;w=-g$Q>BU;9k;w|zQ;4!W32Xg2Cd?{ zvmO3kuKQ^Hv;o>6ZHP8ZJ2`4~Bx?N;cf<0fi=!*G^^WzbTF3e$b&d^qqB{>nqLG81 zs94bBh%|Vj+hLu=!8(b9brJ>ZBns9^6s(gdSVyP9qnu2_I{Sg8j-rloG6{d`De5We zDe5WeY3ga}Y3ga}Y3ga}Y3ga}Y3ga}d8y~6o|k%F>UpW>rJk31Ug~+N=cS&HdOqs; zsOO`ek9t1p`Kafko{xGy>iMbXr=FjBxZMYc8a#gL`Kjlpo}YSt>iMY`pk9DF0qO*( z6QE9jIsxhgs1u-0kUBx8D@eT{^@7w3QZGooAoYUO3sNscy%6<6)C*BBM7<F8LevXU zFGRf%^}^H(Q!h-tF!jRJ3sWyly>L`dk$Xk%6}eZQXgo#!75P`>Uy*-B{uTLG<X@40 zMgA4}SL9!je?|Tk`B&s$k$*-075P`>Uy*-B{uTLG<X@40MgA4}SL9!je?|Tk`B&s$ zk$*-075P`>Uy*-B{uTLG<X@40MgA4}SL9xidqwUQxmV;~k$Xk%6}eaBUXgo6?iIOL z<X#1$JSg(7$iE{0iu^0`ugJe5|BC!8@~_ChBL9l~EAp?%zasyN{44UW$iE{0iu^0` zugJe5|BC!8@~_ChBL9l~EAp?%zasyN{44UW$iEuoJ{&DaDjY3GsEwTSjAnVzEDxIH zL9;w)mIux9pvk``|C;=3@~_FiCjXlJYx1wjy(agXylZl<$+;%y7~~jDCpp*TT9a!{ zt~I&V<XV$!O|CV$*5q1~YfY{-xz^-blWR?`G3|Ub9pqZ`yspW&Cf}NTYx1qhw<h13 qd~5Qp$+srontW^Wt)qNLLXk-9aux9_WlUi5WYd6^D_dVgyY*ioe@L+a diff --git a/flask_admin/static/bootstrap/bootstrap3/swatch/fonts/glyphicons-halflings-regular.woff b/flask_admin/static/bootstrap/bootstrap3/swatch/fonts/glyphicons-halflings-regular.woff deleted file mode 100644 index 9e612858f802245ddcbf59788a0db942224bab35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23424 zcmY&eV{m0%u#Iioo_J#0nb?@vwry)-+qNe*Z>))v8{5gt_uj9!t5)^yb-JtjRGrhi zYInOUNJxNyf_yKX01)K=WP|Si>HqEj|B{eUl?MR<)%<1&{(~)D+NPwKxWqT-@~snp zg9KCz1VTZDiS?UH`PRk1VPM{29cgT9=<v;Lf`EYagMdIet=H@a8oRlWfPg?`f7?L( zFKED?%?+Ku?I7~Mb(sI~^#uZMZsTe8&6R_I$YX<mq!jz=4cJ?l8k&HBDD{8auziCA zQl4qm;+y>D?!Wc_@}qzggFv;gb@2cJQAYWWtpEZ7?y@jSVqjx${B5UV@SO|wH<<0; z{><1KdVI%Ki}>~<`46C0AggwUwx-|QcU;iiZ{NZu`ur>hd*|<W)sXtmhXDixZoaeV zklo$X=sQ21?>Hb(|6veERq<PbegkBRzi{?HIp-GW`hU_n&12ozz{J4dAGi@L6pDe- z_ud2pJc-_b2pj}b3Pc9vzvpJBX4(Dy6a52IgD!!AfuwLEKN$^~jn+XAz)Mg9U?T~E zgqNfL`tz^91n&aBz=T}M5SD}tB`7H25Mn@BQsEK4gL$l9qzGE52osF@rxjbO42^t7 z#@g=mu(37N%+Vt`PAJL-lQ=FQENF`3={3?oV6ei1hBKA`DuVTzgGk7b#0j#++TdzR zI(97e!~g}_G7m33x=^Ssom?;fl4q}a+^;UP-1|ZzG9$*2kpk7p8YI9lAxj<90CjKp zE8u&KGi5Zv=157hgKP@$c2&H4zuKcOmHoZD%?+qY(Kf~v8|7crq{Nr<WvZ$ts)Fb$ z8!IcdkQ`H>xu=b@5Bab=rqptGxd{QJg!4*-i_$sES~)AB46}Fjg|ea#e@?J}z%CUJ zOsLWRQR1#<tB|QIEY)&I*ZbudHp)E;$><nb=BbXZ4tHi(jj=+TGtb?X^faOKFyozE zS@PKF)~8;5xRSNpTm4ugp<(oc@Q3%7K-)@eyP?m1z&l;rf%%J4?;rfzsBU`M+aNyb z*@?y5Vm{LN@ggUHmiuxx_Dtj5rsol#BM~=pjyHqe<HcvPas11*o_#i9ZJ%`X+7&6Y z4F}#7CrnT%)O76bs<&03Bs~CBL9-lPzgZEx+oS+S$-gV~5q;R39w5(FZ(Km5B%*l& z(rrr`BO68!fN#?(kC!s6W?du1@vWLl$02}9k4Iw`sS*azt|mzMLd*ov1C_X-Z_DEc zA>ng^sD)A4FDuY!iUhzlgfJh(J@BRqd&P#v2B`+saBx>m+M&q7vk-75$NH%T5pi%m z5FX?`2-5l53=a&GkC9^NZCLpN5(DMKMwwab$FDIs?q>4!!xBS}75gX_5;(luk;3Vl zLCLd5a_8`Iyz}K}+#RMwu6DVk3O_-}n>aE!4NaD*sQn`GxY?cHe!Bl9n?u&g6?aKm z-P8z&;Q3gr;h`YIxX%z^o&GZZg1=>_+hP2$$-DnL_?7?3^!WAsY4I7|@K;aL<>OTK zByfjl2PA$T83*LM9(;espx-qB%wv7H2i6CFsfAg<9V>Pj*OpwX)l?^mQfr$*OPPS$ z=`mzTYs{*(UW^ij1U8UfXjNoY7GK*+YHht(2oKE&tfZuvAyoN(;_OF>-J6AMmS5fB z<XKU7YH10@@&WJhj71Cj$=TP(r@q<cW{2}t$FbdUw)ad2!elcuLPw0X5toDsPadV* zO3EPF>^sY6wea&&${+!}@R1f$5oC-2J>J-A${@r(dRzc`wnK>a7~8{Y-scc|ETOI8 zjtNY%Y2!PI;8-@a=O}+{ap1Ewk0@T`C`q!|=KceX9gK8wtOtIC96}-^7)v23Mu;MH zhKyLGOQMujfRG$p(s`(2*nP4EH7*J57^=|%t(#PwCcW7U%e=8Jb>p6~<TTQ9e?y3C zdb|J>>RAlY4a*t<yx)M!`#-^(n~+nSXHt)XXPCd>s=pl}_J{->@kKzxH|8XQ5{t=E zV&o`$D#ZHdv&iZWFa)(~o<E{GN9+27JE4iktONzQ1b)q{Sex30G?of$HMKN~8KD%g zA+E{L7XRV>Bh-Osl{~CS0hfM7?PyWUWsr5oYlsyC1cwULoQ4|Y5RHA2*rN+EnFPnu z`Y_&Yz*#550YJwDy@brZU>0pWV^RxRjL221@2ABq)AtA%Cz?+FG(}Yh?^v)1Lnh%D zeM{{3&-4#F9rZhS@DT0E(WRkrG!jC<!Dwf@j`RqVrLtHFoIyn_L9bxbWrgS*Z9wMu z#p1&N;H{ZGv&zD_N*zbkas>#5?OFjZv*xQjUP~XsaxL2rqRKvPW$zHqHr8Urp2Z)L z+)EvQeoeJ8c6A#Iy9>3lxiH3=@86uiTbnnJJJoypZ7gco_*Hv<E!$|Yb^#x+eGvv( zIp;Wt3|Xgi12|CZQBu5wnkbr4Z_o<}@wU&ThE&G4r6LGOs?2M%<}Vu1j2>KOH97B? zWiwp>+r}*Zf9b3ImxwvjL~h~j<<3shN8$k-$V1p|96I!=N6VBqmb==Bec|*;HUg?) z4!5#R*(#Fe)w%+RH#y{8&%%!|<UeDoR>fQ5JcFzUE;-yVYR^&Ek55AXb{^w|@j|&G z|6C-+*On%j;W|f8mj?;679?!qY86c{(s1-PI2Wahoclf%1*8%JAvRh1(0)5Vu37Iz z`JY?RW@qKr+FMmBC{TC7k@}fv-k8t6iO}4K-i3WkF!Lc=D`<I4n3h#nG>nuD)v#Na zA|R*no51fkUN3^rmI;tty#IK284*2Zu!kG13<C=xWI7mp_-$=}wb|<b)!OZRv-HEP z{%b~I$E(4`VZ#-glOe-5)a2pflY1Bz-1#4je?)~T9!X4-E;pkTTM{XAe2I!K$wY&{ zHEYHdnV_WuXSOaFHmg_J8USFkT|e)_-*FkL@p7z7`X=kCplNBVHgHbdYiIA4b&ia% zF^b30NW{}~a)`)^H3EMpr)@2a^C3(yt-t3eigT2)odQdx2zf*pafN9pF#;@+u4LZa z7x<*Yxq9&rRf5M3B$p^s`skXsITAn=Zo(y=33sGRSGWuaK?&Ne`Pj#q{feF+D~&z+ zEyT)MiaBL7L|^V76c6eAiTxZof6@zS20aGf%dzLc3HH8OA(-=u{w4pJ6%*OO;uayC zzR4O{sz+f(78K2km*}=(W9{c=$lUj4eqLf#^t$Qwnbo?bEXMO?j$N^G)CbdGe8!P9 zJnZQX@k)7bzDG0I8w{~ZPTf4?D$;UGe$M~$TSzciU_@dS=0n{mhB=qm5O0^X+E9+o z1x?ef8>!$OlxJAt@zLU`kvsazO25TpJLbK&;M8kw*0)*14kpf*)3<d6yUQxMZe%8t zXy(eYN2(&WrmwSg<nK0tWy!~|3-Ib)_FW|=FVb)tUsL?PQ@qp22p>;GiDh;C(F}$- z1;!=OBkW#ctacN=je*Pr)lnGzX=OwgNZjTpVbFxqb;8kTc@X&L2XR0A7oc!Mf2?u9 zcctQLCCr+tYip<jrMK$>a_k=;1ETIpHt!Jeo;iy^xqBES^Ct6-+wHi%2g&)?7N^Yy zUrMIu){Jk)luDa@7We5U!$$3XFNbyRT!YPIbMKj5$IEpTX1IOtVP~(UPO2-+9ZFi6 z-$3<|{Xb#@tABt0M0s1TVCWKwveDy^S!!@4$s|DAqhsEv--Z}Dl)t%0G>U#ycJ7cy z^8%;|pg32=7~MJmqlC-x07Sd!2YX^|2D`?y;-$a!rZ3R5ia{v1QI_^>gi(HSS_e%2 zUbdg^zjMBBiLr8eSI^BqXM6HKKg#@-w`a**w(}RMe%XWl3MipvBODo*hi?+ykYq)z ziqy4goZw0@VIUY65+L7DaM5q=KWFd$;W3S!Zi>sOzpEF#(*3V-27N;^pDRoMh~(ZD zJLZXIam0lM7U#)119Hm947W)p3$%V`0Tv+*n=&ybF&}h~FA}7hEpA&1Y!BiYIb~~D z$TSo9#3ee02e^%*@4|*+=Nq6&JG5>zX4k5f?)z*#pI-G(+j|jye%13CUdcSP;rNlY z#Q!X%zHf|V)GWIcEz-=fW6AahfxI~y7w7i|PK6H@@twdgH>D_R@>&OtKl}%MuAQ7I zcpFmV^~w~8$4@zzh~P~+?B~%L@EM3x(^KXJSg<wVEvJN(*DSLK{@lLZ^>c6I=;)B6 zpRco2LKIlURPE*XUmZ^|1vb?w*ZfF}EXvY13I4af+()bAI5V?BRbFp`Sb{8GRJHd* z4S2s%4A)<beb5!5W2AL1ws>6Uc=PK%4@PbJ<{1R6+2THMk0c+kif**#ZGE)w6WsqH z`r^DL&r8|OEAumm^qyrryd(HQ9olv$ltnVGB{aY?_76Uk%6p;e)2DTvF(;t=Q+|8b zqfT(u5@BP);6;jmRAEV057E*2d^wx@*aL1GqWU|$6h5%O@cQtVtC^isd%gD7PZ_Io z_BDP5w(2*)Mu&JxS@X%%ByH_@+l>y07jIc~!@;Raw)q_;9oy@*U#mCnc7%t85qa4? z%_Vr5tkN^}(^>`EFhag;!MpRh!&bKnveQZAJ4)gEJo1@wHtT$Gs6IpznN$Lk-$NcM z3ReVC&qcXvfGX$I0nfkS$a|Pm%x+lq{WweNc;K>a1M@EAVWs2IBcQPi<R5t!qadV8 z`@w2vB^p<`Z$u8twt230^FDUXk@KFGRjk|Wy)IU*vs&-S4^@ur^QOw}{f&PX2ZUtx z2^VHiFLv0j^tM_qTCdnm{?$%kSnzz+Rz#c}<%d@@&Y%vBngG@bQjNu*$QIzHiMtlr z%<!I8J_+!}g1P;40riIDVp#J58>EJNt}+Ea8~WiapASoMvo(&PdUO}AfC~>ZGzq<X zA{wc(2{B`w8<FdY#fUA=!$2hWfZJFFh^biG^FRul&;5HGQt3HYB*8-U;tAm`ZDrW? zLGzSCAtG}^Y%BI&AQbV|jc8`aQkJs}$KZGr4&D`BKH5)pk?++zISItrK-zIx+|7D6 zd{(|~knMc?H%TN~Ttm8w#&X{*x_x0Tx_urTbWQT(rM-zoT(XUHVI3m?V@uQP4J|db z_OkbMEz8a;6}80;ZBwYhBLn3A0_Q%9Xo7*<Qa^td-Q$KXkb<^$rXNS+J!!v~e_27- z?B(DtKu5zrraAfXQ`1kqTCnO1=JFF~4jJA+&eXD+hsTX=d50Jrj6yJ)U-=XHF8z-o z1o@Y7@sl2x7U<!Ygv?%s5eyX!wKt`l=(%|REJ0yS<TOH?s9B)is6Iv13lr}2%hiI} zPUW^d?_dD#I&an8I8t^fY)SnDOhO39OTDNje$JA5dr5!UH92rZ)87wX;yQSp&mZg< zmgmz=w6D&%v&B;c-vM3DEvl$Gev##x*ndtU#f^N2I}99-3HZpRE^$`D%!0A_ujaQb zI5z(Mh2X@IN1#BF?<;^jK#~(MAEc`h<3P$Nghud=)(&&|-qnC?^x{5VK>Wjd)4no( ziLi#e3lOU~sI*XPH&n&J0cWfoh*}eWEEZW%vX?YK!$?w}htY|GALx3;YZoo=JCF4@ zdiaA-uq!*L5;Yg)z-_`MciiIwDAAR3-snC4V+<n|J*V*n#h?&wg+C8sg$z312~u%3 zz$RVnQhlm*2c)>KA>&V%Ak;p{1u>{Lw$NFj)Yn0Ms2*kxUZ)OTddbiJM}PK!DM}Ot zczn?EZXhx3wyu6i{QMz_Ht%b?K&-@5r;8b076YDir`KXF0&2i9NQ~#JYaq*}Ylb}^ z<{{6xy&;dQ;|@k_(31PDr!}}W$zF7Jv@f%um0M$#=8ygpu%j(VU-d5JtQwT714#<! z&vm@KPB=l<TMpuv%DS+RW~~WnEOz5WiaSxW4<ph#&0;zqiCMt1ekX<hrb8#^mBYaW zJA2vi7UWJVhfbeu%Rejgz>f0z+Cm$F9J<FFP&8OfSp_OMl7>jGr_G!~NS@L9P;C1? z;Ij2YVYuv}tzU+HugU=f9b1Wbx3418+xj$RKD;$gf$0j_A&c;-OhoF*z@DhEW@d9o zbQBjqEQnn2aG?N9{bmD^A#Um6SDKsm0g{g_<4^dJjg_l_HXdDMk!p`oFv8+@_v_9> zq;#WkQ!GNGfLT7f8m60H@$tu?p;o_It#TApmE`xnZr|_|cb3XXE)N^buLE`9R=Qbg zXJu}6r07me2HU<)S7m?@GzrQDTE3UH?FXM7V+-lT#l}P(U>Fvnyw8T7RTeP`R579m zj=Y>qDw1h-;|mX-)cSXCc$?hr;43LQt)7z$1QG^pyclQ1Bd!jbzsVEgIg~u9b38;> zfsRa%U`l%did6HzPRd;TK{_EW;n^Ivp-%pu0%9G-z@Au{Ry+EqEcqW=z-#6;-!{WA z;l+xC6Zke>dl+(R1q7B^Hu~HmrG~Kt575mzve>x*cL-shl+zqp6yuGX)DDGm`cid! znlnZY=+a5*xQ=$qM}5$N+o!^(TqTFHDdyCcL8NM4VY@2gnNXF|D?5a558Lb*Yfm4) z_;0%2EF7k{)i(tTvS`l5he^KvW%l&-suPwpIlWB_Za1Hfa$@J!emrcyPpTKKM@NqL z?X_SqHt#DucWm<3Lp}W|&YyQE27zbGP55=HtZmB(k*WZA79f##?TweCt{%5yuc+Kx zgfSrIZI*Y57FOD9l@H0nzq<E4Q@_YK<1;`>Ou|Bhrm&^m_RK6^Z<^N($=DDxyyPLA z+J)E(gs9AfaO`5qk$IGGY+_*tEk0n_wrM}n4G#So>8Dw6#K7tx@g;U`8hN_R<bPv^ zP6}0b!dly7dCc=KnICM>;^Uw9JLRUgOQ?PTMr<oQ9o~>4YD5H7=ryv)bPtl=<&4&% z*w6k|D-%Tg*F~sh0Ns(h&mOQ_Qf{`#_XU44(VDY8b})RFpLykg10uxUztD>gswTH} z&&xgt>zc(+=GdM2gIQ%3V4AGxPFW0*l0YsbA|nFZpN~ih4u-P!{39d@_MN)DC%d1w z7>SaUs-g@Hp7xqZ3Tn)e<dV~D-0@M0u`KSW@qBLlIFNKze0?;|tm!<F9_5{TDKnUY zJB8#(%G(di5;`|v12#{)=^Bhy!6zu5lq~#Rj8QgnK?%W-bqS8Lq9_xGRU?MD1Z_M> z7x^sC`xJ{V<3YrmbB{h9i5rdancCEyL=9ZOJXoVHo@$$-%Za<Y<=Dws@<HVOn84kp zy7czzAj#&D?|uHYH^U!oq7C#CS4C-HKPWUJ-r}5;#IkR`+-?7IMg|O#r^#PS@coAT z<xl(XMO(JUH%Fc8@Q;tlw>Nm-75Z-Ry9Z%!^+STWyv~To>{^T&MW0-;$3yc9L2mhq z;ZbQ5LGNM+aN628)Cs16>p55^T^*8$Dw&ss_~4G5Go63gW^CY+0+Z07f2WB4Dh0^q z-|6QgV8__5>~&z1gq0FxDWr`OzmR}3aJmCA^d_eufde7;d|OCrKdnaM>4(M%4<dMy z`?Qi<9Ebh#nVT{&VVFv66RU??kcC8}u+l^~F(m>V`PxpCJc~UhEuddx9)@)9qe_|i z)0EA%&P@_&9&o#9eqZCUCbh?`j!zgih5sJ%c4(7_#|Xt#r7MVL&Q+^PQEg3MBW;4T zG^4-*<N;_j_KF=#ltp<I^9_IU8#T_ulQ_w;P&0IS=TATWkvf^^ks|nDnb@T^ShFUW ztuyr~q)6&!?68RQ-V8G+#+EoOhWE-6A7rk5HfHxAG?Sknf`kY=i0}11&e`cz`MCO{ zQd*rofIJ{OtoMr$=gf?H!$EPT16>8L%s|A}R%*eGdx&i}B1He(mLygTmIAc^G(9Si zK7e{Ngoq>r-r-zhyyg<ieAPsqNv@SQwQ@xsNn5Vw2I}E18CcU&C?((>K)*9cj8_%g z)`>ANlipCdzw(raeqP-+ldhy<kGNs8`S#*G-e>Uv_VOht+!w*>Sh+Z7(7(l=9~_Vk ztsM|g1xW`?)?|@m2jyAgC_IB`Mtz(O`mwgP15`lPb2V+VihV#29>y=H6ujE#rdnK` zH`EaHzABs~teIrh`ScxMz}FC**_Ii?^EbL(n90b(F0r0PMQ70UkL}tv;*4~bKCiYm zqngRuGy`^c_*M6{*_~%7FmOMquOEZXAg1^kM`)0ZrFqgC>C%R<qRBgHG)$UB@XBA@ zshx3_1QSr};A7TJ_s8FNBrzB>JvQSo_OAA(WF3{euE}GaeA?tu5kF@#62mM$a051I zNhE>u>!gFE8g#Jj95BqHQS%|>DOj71MZ?EYfM+MiJcX?>*}vKfGaBfQFZ3f^Q-R1# znhyK1*RvO@nHb|^i4Ep_0s{lZwCNa;Ix<{E5cUReguJf+72QRZIc%`9-Vy)D<o;c> zWKhb?FbluyDTgT^naN%l2|rm}oO6D0=3kfXO2L{tqj(kDqjbl(pYz9DykeZlk4iW5 zER`)vqJxx(NOa;so@buE!389-YLbEi@6rZG0#GBsC+Z0fzT6+d7deYVU;dy!rPXiE zmu73@Jr&~K{-9MVQD}&`)e>yLNWr>Yh8CXae9XqfvVQ&eC_;#zpoaMxZ0GpZz7xjx z`t_Q-F?u=vr<JfY4KbWG<xAz}usjoo`>RPaj3r<9&t6K=+egimiJ8D4gh-rUYvaVy zG($v+3zk5sMuOhjxkH7bQ}(5{PD3Mg?!@8PkK&w>n7tO8FmAmoF30_#^B~c(Q_`4L zYWOoDVSnK|1=p{+@`Fk^Qb81Xf89_S`RSTzv(a4ID%71nll%{Wad$!CKfeTKkyC?n zCkMKHU#*nz_(tO$M)UP&Zf<GNy8?Xs8hUzIu0nqFC9@Ka{&R$vXnbN*?hR?iwv-x* zPrH;>J#*q(0Gr!E(l5(ce<3xut+_i8XrK8?Xr7_oeHz(bZ?~8q5q~$Rah{5@@7SMN zx9PnJ-5?^xeW2m?yC_7A#<rjP_en{9P5bFL68vgKu`Lv^loBE5&?9+BtYGMUT06bd zXEt*_Sdl_o?{!kSnxeJB_xVtFwR-bF`2MlsSO1bZtN)M(j%)mHVUj4b&G~L_`|PNv zb05EL`!%-lV_>WK*B@oIy*Y@iC1n7lYKj&m7vV;KP4TVll=II)$39dOJ^czLRU>L> z68P*PFMN+WXxdAu=Hyt3g$l(GTeTVOZYw3KY|W0Fk-$S_`@9`K=60)bEy?Z%tT+Iq z7f>%M9P)FGg3EY$ood+v<G?d-tNS5y+I=S1dlJZvs-NC{^w-&Jr{gfwR>$pdsXvG? zd2q3abeu-}LfAQWY@=*+#`CX8RChoA`=1!hS1x5dOF)rGjX4KFg!iPHZE2E=rv|A} zro(8h38LLFljl^>?nJkc+wdY&MOOlVa@6>vBki#gKhNVv+%Add{g6#-@Z$k*ps}0Y zQ=8$)+Nm||)mVz^aa4b-Vpg=1daRaOU)8@BY4j<Xy)*mrZf+Eqj^RX06GbC^vLKT| zpteFBLq#626+?=M@k2|V@k{2aN?cRlCum?`TP_u}%3Y{AVZHbKwm{q2d`D~XsJSyD zl=xk@5@i0e1=0fu$jfj1+lTA1h#%78*$MuUCU^B9>S>=5n#6abG@(F2`=k-eQ9@u# zxfNFHv=z2w@{p1dzSOgHokX1AUGT0DY4jQI@YMw)EWQ~q5wmR$KQ}Y;(HPMSQCwzu zdli|G?bj(>++CP)yQ4s6YfpDc3KqPmquQSxg%*EnTWumWugbDW5ef%8j-rT#3rJu? z)5n;4b2c*;2LIW%LmvUu6t1~di~}0&Svy}QX#ER|hDFZwl!~zUP&}B1o<!gKVHBj1 z!0%hK_{Iy`*BgY<Qck8#<-rH4Lg1;Qj-hq2OvPXM$(Gkmg`0T7B6Gm*>KAxIzt~so zb!GaJYOb#&qRUjEI1xe_`@<o~iP+Rf(GIMHq*yg6%vf7Mu<-aQ)$}%3o$R+x;;~W% zCQ~RFyB5g)F1k-t!#^TN>7qv_-LggQ$JE8+{ryT4%ldwC5ete+{G3C#g@^oxfY3#F zcLlj(l2G8>tC<5XWV|6_DZQZ7ow?MD8EZ9mM2oV~WoV-uoExmbwpzc6eMV}%J_{3l zW(4t2a-o}XRlU|NSiYn!*nR(Sc>*@TuU*(S77gfCi7+WR%2b;4#RiyxWR3(u5BIdf zo@#g4wQjtG3T$PqdX$2z8Zi|QP~I^*9iC+(!;?qkyk&Q7v>DLJGjS44q|%yBz}}>i z&Ve%^6>xY<=Pi9WlwpWB%K10Iz`*#gS^YqMeV9$4qFchMFO}(%y}xs2Hn_E}s4=*3 z+lAeCKtS}9E{l(P=PBI;rsYVG-gw}-_x;KwUefIB@V%RLA&}WU2XCL_?hZHoR<7ED zY}4#P_MmX(_G_lqfp=+iX|!*)RdLCr-1w`4rB_@bI&<E#m-6fJX?!@HMojcz?@FV( zEwb`K9p)6DH8Vt-HX;X2^%28zP(BOT@+<+Oy5Uv8eD=4p<t0n4?tw(5<&#sr?h6zV z!&Zb?gM&8<%??jXTdmMb1(#@6)m(rk*#aUo^iqOs4-#{`NA;|yExPzdS?_q~O>Uz# z!>9C3&LdoB$r+O#n);WTPi;V52OhNeKfW6_NLn<EDp2Lr=qOaId}Ifx9lEG?H#PEN zbI74Vx*PNK+cvB53_AWmzs=zCb5!9-mCcW#<QbIdOJM|=ASw5QpF+P}oobETGwNf< z0{kapJo<fgf(@=YJA0C%pNqB2CMVFcToi3AV3#1!n@Z&vX@98&`Sz6*SUYY~uWq>w zpFTuLC^@aPy~ZGUPZr;)=-p|b$-R8htO)JXy{ecE5a|b{{&0O%H2rN&9(VHxmvNly zbY?sVk}@^{aw)%#J}|UW=ucLWs%%j)^n7S%8D1Woi$UT}VuU6@Sd6zc2+t_2IMBxd zb4R#ykMr8s5gKy=v+opw6;4R&&46$V+OOpDZwp3iR0Osqpjx))joB*iX+diVl?E~Q zc|$qmb#T#7Kcal042LUNAoPTPUxF-iGFw>ZFnUqU@y$&s8%h-HGD`EoNBbe#S>Y-4 zlkeAP>6<Z7QQ9XL^<-l?vhbA^VVM{w_AGyBxGo2D4xc6Tl~BnC{PHYDLP{4>2k~-N zHQqXXyN6<L3Gg$i2mMBKaSbx<i~TEhvQ{`W#&P&}*M*bY-+RuxoiU+jyjZtu*2#d` z4;V{mY|5$$TfD^8s7AA{v{=Q~S8RRnPkT2vB+qp-b$~mY>7hGD6CxQIq_zoepU&j0 zYO&}<4cS^2sp!;5))(aAD!KmUED#QGr48DVlwbyft31WlS2yU<1>#VMp?>D1BCFfB z_JJ-kxTB{OLI}5XcPHXUo}x~->VP%of!G_N-(3Snvq`*gX3u0GR&}*fFwHo3-vIw0 zeiWskq3ZT9hTg^je{sC^@+z<IC+@jyb5}hL&*c9&Uv=C+8r5MFr<BeiUxikY7v-2j z#^Wp1Woo#;-OnJd6+u?>3FAd}KNhbpE5RO+lsLgv$;1igG7pRwI|;BO7o($2>mS(E z$CO@qYf5i=Zh6-xB=U8@mR7Yjk%OUp;_MMBfe_v1A(Hqk6!D})x%JNl838^ZA13Xu zz}LyD@X2;5o1P61Rc$%jcUnJ>`;6r{h5yrEbnbM$$ntA@P2IS1PyW^RyG0$S2tUlh z8?E(McS?7}X3n<sX7)_F=$tGzECOdx`5F$56$H6$2HeHDocU>AAJs2u_n{^05)*D7 zW{Y>o99!I9&KQdzgtG(k@BT|J*;{Pt*b|?A_})e98pXCbMWbhBZ$t&YbNQOwN^=F) z_yIb_az2Pyya2530n@Y@<KMNVgC+@Hh^eD5>s>s>n?L79;U-O9oPY$==~f1gXro5Y z*3~JaenSl_I}1*&dpYD?i8s<7w%~sEojqq~iFnaYyLgM#so%_ZZ^WTV0`R*H@{m2+ zja4MX^|#>xS9YQo{@F1I)!%<Q9x6E+JCnjAm>RhM{4ZUapHTKgLZLcn$ehRq(emb8 z9<w{<)uy~=x}G;ZX+CDl#T7`~iRBx5XO`@><&Nx*RLcS#)SdTxcURrJhxPM2IBP%I zf1bWu&uRf{60-?Gclb5(IFI*!%tU*7d`i!l@>TaHzYQqH4_Y*6!Wy0d-B#Lz7Rg3l zqKsvXUk9@6iKV6#!bDy5n&j9MYpcKm!vG7z*2&4G*Yl}iccl*@WqKZWQSJCgQSj+d ze&}E1mAs^hP}>`{BJ6lv<q%AGiq()8hz}1^1ex;^<jj#cc=g{s#0iIU-+2jVmxWDS zd7qq)5u4+Paaui>*>0-ft<;P@`u&VFI~P3qRtufE11+|#Y6|RJccqo27Wzr}Tp|DH z`G4^v)_8}R24X3}=6X&@Uqu;hKEQV^-)VKnBzI*|Iskecw~l?+R|WKO*~(1LrpdJ? z0!JKnCe<|m*WR>m+Qm+NKNH<_ye<gDWD0Fl@Ho4<!fm=u&SGgDO!cbo+8PUwfWk+V z)@b~#GtD0d4#K=39kiev5hj=8h(Nljd<HunOw<O@9z?#m(rb)ZnCBDPu~!uM>fIml z+x32qzkNRrhR^IhT#yCiYU{3oq196nC3ePkB)f%7X1G^Ibog$ZnYu4(HyHUiFB`6x zo$ty-8pknmO|B9|(5TzoHG|%><C<pr4&IxzPg{!KcQqRSE~Tvrur~GxUa*ce)ipeE zWgS=NE-mtVKb)JH#~V9~Hf<heFWK%N<`blD%sTD$A|XGR=J%4vWJQ9B3q;($v$3~e zpgG#}?8+2jU@b$OcWYMF>s#7)CM(i=M7Nl=@GyDi-*ng6ahK(&-_4h(lyUN-oOa$` zo+P;<GhFDlQ-b}GJ)A97b8DT!@21D?+G`33xflj&^Ajw)WxefL*Yy?uny35myNvN; zJu2^EIk(I5BXd2N-yKn?<jAHF(>C4d@m^p9J4c~rbi$rq9nhGxayFjhg+Rqa{l#`Y z!(P6K7fK3T;y!VZhGiC#)|pl$QX?a)a9$(4l(usVSH>2&5pIu5ALn*CqBt)9$yAl; z-{fOmgu><7Y<XFolPQk)mb~-4Wz2OqAihGXbfUWv<O@$JoEd1wcAoD{S1ZgFTS^!t z+_d^VD?_*`AXb~e&yM8k-n#rSNZe`F1hkVx1o46tWKB^*u4Iztzf9jS`;huL0efN_ zw(C5^O4iFb>J5k>*0Q~>lq72!XFX6P5Z{vW&zLsraKq5H%Z26}$OKDMv=sim;K<Yz zr-(K#w$yhGyI)R05r<FcNBPUs!f8{%L|!+M;WNfIk0#<kNVlmop1dan3IH7GPG0zR zbu5#oKma)07cl(sMbhFbgIx|mM?)DnP$;1oA~OW0kph!a5>?vsoVs(JNbgTU8-M%+ zN(+7Xl}`BDl=KDkUHM9fLlV)gN&PqbyX)$86!Wv!y+r*~kAyjFUKPDWL3A)m$@ir9 zjJ;uQV9#3$*`Dqo1Cy5*;^8DQcid^Td=CivAP+D;gl4b7*xa9IQ-R|lY5tIpiM~9- z%Hm9*vDV@_1FfiR|Kqh_5Ml0sm?abD>@peo(cnhiSWs$uy&$RYcd+m`6%X9<SS+iH zB{MTIilfs+m}FIm`WFe<b<`1NL(_5%pWxy`61V?hXOmI!N62_Zv-n^jPyCieqxTv3 zu0_=zb8f!dMp?R&UxGJe1qNBBRLXVmj-(R6+9rkXoo6CT-@FKe>FN%?<F{pFRdeJu z{9WJNuwr(Se^zX7t-vqF<$J*yv&MnYO_uaKBS^eIab7YX1r1^(=OyZJp!PzX%0e7b zeEpxGl+qFvtIR-KD}KZT9sfArU;dGM3-23I#q69NU-%A?w~!T{F+*-_Lil`8wsSSR zeW-s?xK)R5p&SHb*TI!J314$wOF*NT7qT*&*Og`^+jXq)LaOJ8#&*`Gy)1X0+KiH$ zU-5JNg0Goq-9^C#_ZqHXSIP}b7@(P=L?LSJk~7{IhyH9xAy{$zEDuPUgJ_RJae#PE zOqO-BK*KnjogIL_)Jz3RACJUY?ZEW~+1H$~{2k_o%Y(uIH3R6z`K|NdGL!=5lV$Vc z*(&fGI7OherXM4x!s0w3{b4Ax#6<l}lTU2>w}s~Q=3!pJzbN~iJ}bbM*PPi@!E0eN zhKcuT=kAsz8TQo76CMO+FW#hr6da({mqpGK2K4T|xv9SNIXZ}a=4_K5pbz1HE6T}9 zbApW~m0C`q)S^F}B9Kw5!eT)Bj_h9vlCX8%VRvMOg8PJ*>PU>%yt-hyGOhjg<ke2; z7Th2%k_wZpW!A{?Dn2nLFJ4=lqYa4jV<d3;8-+Dg@?%0IvOWsDfrv_`J~>!2pZR4{ z=VR_*?Hw|aai##~+^H>3p$W@6Zi`o4^iO2Iy=FPdEAI58Ebc~*%1#sh8KzUKOVHs( z<3$LMSCFP|!>fmF^oESZR|c|2JI3|gucuLq4R(||_!8L@gHU8hUQZKn2S#z@EVf3? zTroZd&}JK(mJLe>#x8xL)jfx$6`okcHP?8i%dW?F%nZh=VJ)32CmY;^y5C1^?V0;M z<3!e8GZcPej-h&-Osc>6PU2f4x=XhA*<_K*D6U6R)4xbEx~{3*ldB#N+7QEXD^v=I z+i^L+V7_2ld}O2b-(#bmv*PyZI4|U#<t4E{c3+Oa>Q5|22a(-VLOTZc3!9ns1RI-? zA<~h|tPH0y*bO1#EMrsWN>4yJM7vq<?d%8sAQUGrndP7J-=xw$nCMSpe7!xoUBNp3 zGTsNoHNSmE+wi-t?Vjri@)nrwy)cL`f%zSrKknks+ReH>FZr?uw$H8*P<CaW^*(*P zrk<ZDEOj-RoW=I>hiHRQg1U9YoscX-G|gck+SSRX<zu*#%uOZJ$&`iwbI4f^EJ9pa z@T8p1=V0x-K77AYupaOqRJ8Y8`CFqe-OG4O?Pk+3)K=lIg7Aj+5B{LP8{|uD9bb*L z=JkjZ*a>!(e7@~eeUEw+POsT;=W9J&=EV`cUc{PIg_#TQVGnZsQbCs7#Q-)<h~+VJ z%O_$A%X$-T2gv^1iV6X%A*e(F(fO?hnMA3<=C!;L;mUog>v#BicxLw#Fb?#)8TYbu zN)5R=MI1i7FHhF|X}xEl=sW~`-kf;fOR^h1yjthSw?%#F{HqrY2$q>7!nbw~nZ8q9 z<TlAz0DCai`eopoTgUXKr$&x3a%Yszt2{+eo;=r&?LuF;Zj%RNLHAg=LM|in10Rm2 zxd6;k(nHtRPkOmYqHW7fNcCybHEd(KrX46#z77Z9Q1dkPl|2ZTAjBY-ol(B)e&98T zgr-$?X`Ytyy13^aY2fa`@Y1*X*i2)xR`@;KF^;++G5hoP)3auvu~w3;5+L|E0eJ^s zgZRj(m;s_<P67c5tRN5r2qBB}z`g`y!oX~V8oXD2oDd8#khWZ&toq|9@%NQ>h{vY! z<QL?e6`jG`+hK%nypIRco?pA%s6+zYx(b~=Fi(E95-40VeV5w!L2#*>%i=H!!P&wh z7_E%pB7l5)*VU>_O-S~d5Z!+;f{pQ4e86*&);?G<9*Q$J<tS(vm9lEGpTY@s(2ek+ z8c`{)@2$sFJY{r$73(<V2UKiNm)(n(&DNp1&6b1{q_xZVGIdKSwV*O`Z3q;#cCe`U zk~C47tS5LEB&@mN%p)_=XY@OEf&MPgH{St5oHz7A*3o-mSC#2S@XC^m@?vD0WoA3+ z%jkw-8_?@Gk~M`p*@7Cp@q?r=ifcr#f5J(+ee*SCy-59!ceTk_CH8c7hwjNA;pzKD zr8zf+A(f>EJ!ZxY;Oj5&@^eg0Zs!iLCAR`2K?MSFzjX;kHD6)^`&=EZOIdW>L#O`J z<!j^{WZ{m%sbn?E@W3)ou>f~$M4}JiV}v6B-e{NUBGF<D@nTna4Fj(s(L&KkX*F3! zglkC}q4NM*a2HP+ijp5<SToUO6J4Q%w}VEJFwp|MQ|{cP2x=Zt1r&nh4>gj-*H%NG zfY0X(@|S8?V)drF;2OQcpDl2LV=~=%gGx?_$fbSsi@%J~taHcMTLLpjNF8FkjnjyM zW;4sSf6RHaa~LijL#EJ0W2m!BmQP(f=%Km_N@hsBFw%q#7{Er?y1V~UEPEih87B`~ zv$jE%>Ug9&=o+sZVZL7^+sp)PSrS;ZIJac4S-M>#V;T--4FXZ*>CI7w%583<{>tb6 zOZ8gZ#B0jplyTbzto2VOs)s9U%trre`m=RlKf{I_Nwdxn(xNG%zaVNurEYiMV3*g| z``3;{j7`UyfFrjlEbIJN{0db|r>|LA@=vX9CHFZYiexnkn$b%8Rvw0TZOQIXa;oTI zv@j;ZP+#~|!J(aBz9S{wL7W%Dr1H)G-XUNt9-lP?ijJ-XEj1e*CI~-Xz@4(Xg;UoG z{uzBf-U+(SHe}6oG%;A*93Zb=oE>uTb^%qsL>|bQf?7_6=KIiPU`I|r;YcZ!YG7y~ zQu@UldAwz$^|uoz3mz1;An-WVBtefSh-pv<`n&TU3oM!hrEI?l@v8A4#^$4t&~T32 zl*J=1q~h+60sNc43>0aVvhzyfjshgPYZoQ(<inR$cERK&%N~SSiy;WaiBTgdl;Bz@ zMx7h{4w6)@f3=XUfD<5b*Di$-gK~XeKu8qdfa(KL$OL~#uI0n&gFVreVt1RX*+{5+ z#8$4WWjNT2me=PpYKo4u#73>OOh>LbUIoblb@1z~zp?))n?^)q6WGuDh}gMUaA9|X z3qq-XlcNl<s-dSKro}45AbD<^IA@6tvSaLv-;sRc5uLj-i(AB^*}0)lznJ6A48b01 zt^mDP9!TqxILrO*cRjO@t^fSYOWb`|vQ*V4*6V-Ii_hT$&15AhsiGo@jvJCCnY0); z)Gbzh<7K3LRm`L**mLt1MLc+MqqaWkz{2JV0hUf-(7U6vlP$%@`2fR-Dt+r$66q)X zh2sR=$#8zbejz`}<A~Y#k!TUpiD??3amyj(E}M)o)o#H-j|LmgBHBXsF9$ok?Wh84 zoxjF*=Hw;;!?a%bcJVG|FBP7@_uu_xpir_`+UDHcZX;}|^THjvjdPRUJ+HO3O$%_* zsal`RIk@07Cuvh)iE1gNnn7n}$9q`Da-o@9CupmsX{@4y;aIQ1WV^7X(Rcx&McA%o zqa*mh{MZ+m6i(RP#X)4DdX;+iKAzev_!HbYetk>dy5==T4rq*~g@XVY!9sYZjo#R7 zr{n)r5^S{9+$+8l7IVB*3_k5%-TBY@C%`P@&tZf>82sm#nfw7L%92>nN$663yW!yt zhS>EfLcE_Z)gv-Y^<SaxB6gHmR|E)iyYeg|g|R}ujv8tMcq*gC>h1;xj(<<JyurkO zku;yk5>4nD4GY{C-nWUgQc9cMmH{qpa!uEznrGF^?bbJHApScQ$j>$JZHAX80DdXu z--AMgrA0$Otdd#N9#!cg2Z~N8&lj1d+wDh+^ZObWJ$J)_h(&2#msu>q0B$DEERy{1 zCJN{7M@%#E@8pda`@u!v@{gcT3bA*>g*xYLXlbb&o@1vX*x+l}Voys6o~^_7>#GB| z*r!R%kA9k%J`?m>1tMHB9x$ZRe0$r~ui<kO`4q0h1q9yWTy1Vw;6%l{l&HBbZk8-0 z4ijBu+y@{d)|{@F;ZFKw{xPkg5F+CDU-3fF>}X}jOC)9LH=Po*2SLdtf3^4?VKn<h zHzQbKiZ9a#y^bZOa6n&Wk$r`rPcR^1TWQZWl`R8PvM?r?^F}g*>u2ox&mV~0oDgi` z;9d}P$g~9%ThTK8s}5o<m&w0gVXSc39p)SfaC_U5P2<JPm~s|o1ZFngBTt(DrBI%x z4kDX}YqUJKdxxsso$;8{1MQ;f+HD&9TGSGCQS)Y9GN_l)t8XY5-si=Gs(k<5;!fvW zxE8*OW}N`jlcqPjb~+szeAOl~e_-nyQAfun)m7Qku$%99s}G7SNoRK-D2Tt?3bf7l z_f&iauzO~DnLmd4z7qW{*#v(VPN`62cvfV3MGioX->w2V4?(-lU*ed8ro|}mU}pk% z;bqB0bx3AOk<0Joeh}Vl@_7Po&C`Cg>>gff>e<EyzTH_%h@VP9GTpHG^0d?A+RMpT z+TYf8aiHmG?aSY>7fu41U3Ic{JQu1W%+!Gvz3GDO2ixKd;KF6UEw8F_cDAh08gB>@ zaRH2Q96sBJ>`4aXvrF0xPtI<C%^cGg^K!B-fX;2xnF2UCh5PH@z5cKKOHR==RLnzf zSmET?(5QuFJxq~ag0rPdFM7)-DQc6Kkb_;fb-^S9@$f%6aPJ=U;g7Zr?Ox#q(-JyY zKvu&Cw@3?z3?xc$8o*T2<9qK!(D=t1JD`+Ta(zAy-y-Frq_L?(ciWSU*N3cXEeC5N zwIavKBghMD()mO&Qc6^H#jRYCBJ}jZ#?v?4($m6CK2G!{)QNVBe9)sd3#Jc(VH2H^ z=FWxE%(d%&VjzHKBh>WoA1pPsRQtU~xDtnEfTJnl{A9u5pR^K8=UdNq%T8F$)FbN> zgK+_(BF#D>R>kK!M#OT~=@@}3yAYqm33?{Bv?2iBr|-aRK0@uapzuXI)wE0=R@m^7 zQ`wLBn(M*wg!mgmQT1d!@3<2z>~rmDW)KG0*B4>_R6LjiI0^9QT8gtDDT|Lclxppm z+OeL6H3QpearJAB%1ellZ6d*)wBQ(hPbE=%?y6i^uf%`RXm*JW*WQ%>&J+=V(=qf{ zri~yItvTZbII+7S0>4Q0U9@>HnMP$X>8TqAfD(vAh};2P{QK)ik`a6$W$n<S7xQ?o z_{n4xoeaH~jS^3HDy+veci7_+aLh^-n?E!YG6S#O$LPEC_>G<{bR2U<qLrkRpb!v0 z%U*eD$^H(<WG-@VF0k%r-g68(2_6$K`r1T6sUwW?8=<u8q_-5ITGbK36tV>fd!^iE z#1K58$gW!xpeYHeehuhQCXZ9p%N8m<Fx1W4{1&odf~Dg9N*_P3FP{`cbE*_n{Eco> zB+l~T_u-Ycr!U><XH<{<R0eR`Jn1$qaE<CV>!?xu!!*6rNxq37{`DhMMfY6NpD3Jw zkYQDstvt30Hc_SaZuuMP2YrdW@HsPMbf^Y9lI<9$bnMil2X7`Ba-DGLbzgqP>mxwe zf1&JkDH54D3nLar2KjJ3z`*R+rUABq4;>>4Kjc2i<Dy@)!kC&Aw;NA8e)mD}M7}y* zi5fe;hrp`ef1|wy(>QEj7pVLcZYZ~pteAG4rm1{><Ecc%k1Tki@ADmF<}mEh$<1ax zS8dQ&w8<!Cd38+}XJ1#f6|D`7AJ6+Fsr$rBs%wDxJx&tw*&5k&wN_-uj!ur;28wi0 zO+Qvl)mUZbXZm|~oa;LAHy_>PQy<rI@3u-En9*i_l~-?$0z#b@Vco$oFcZc}d3oKO zD*z%H@Hm`{0l9tDx7KHebXBjGPA%mTPf<pnOy#m~KL9BjL-WcR=L#f{u~T2e78Ilg z(JT)-B~I|YWyGa#aWq+mx~dt<5RI9)@9nr`in)T{m4a6g9DZqFJ{0ZDQ&w4XPvcfW z)Zgnax(EnBgW0T@l}fNuwENi8sV_h5iwfdBoer10OP+L`!QRkj>=!QiV5G|tVk)53 zP?Azw+N)Yq3zZ`dW7Q9Bq@Y*jSK0<1f`HM;_>GH57pf_S%Ounz_yhTY8lplQSM`xx zU{r-Deqs+*I~sLI$Oq`>i`J1kJ(+yNOYy$<j89}LeB{DsRRYsqux%gkK#X#@e^U8% z#M!7}cTMHu<FLh@jarvDc8P_@QfzNdoQi_n+%?2AM>_>R3Jfi680<|^u#J@aY%Q>O zqfI~sCbk#3--^zMkV&Yj0D(R^rK}+_npgPr_4^kYuG=pO%$C_7v{s@<a9Q#wuB)t? z#;9BrH!k(Q*;IUj?T<*@HX2{0em!6debb4D8+OTu+|0s%`KdJcokszE{b|_{ztw|2 zP8WR(1+AaeXov%C!=7CsT*LuDx^}pAS;||)2N$TDO}r&-q#K7;nWjNxk~onpjleeK zUPThfcj0^+;uf%68trL0i1;=y3B3G^4+!l>-{M-P@RL3^<`kO@b=YdKMuccfO1ZW# zeRYE%D~CMAgPlo?T!O6?b|pOZv{iMWb;sN=jF%=?$Iz_5zH?K;aFGU^8l7u%zHgiy z%)~y|k;Es-7YX69AMj^epGX#&^c@pp+lc}kKc`5CjPN4Z$$e58$Yn*J?81%`0~A)D zPg-db*pj-t4-G9>ImW4IMi*v#9z^9V<wSEy0;H<_ip{R`3n$&`z?qY&+x1%E`|f!X zF^6qcbMj~^Y|&mU__An*YVWv%D)nfhgB<CJl`_02TU%zkuVLq-ifv^5t4@48WjUK6 z<1pI%d1Hq!eHx}*)cFId$Vc5Z{|e7mEOmtuWJf&C8D27?iS2&%o3DCSW(Dy{q!vBU z<@J%bdvlGuCbxSa3MmV6=PD4kiAVQdnmr=bOicK#q7Xa-!xi^j8Y6rBUZPWqHJ^kK zO^AmTc89bc5I+T$XZ64^_c1Pnu-4Kq8TW>D9h@9t;3jMAUVxt=oor+16yHf{lT|G4 zya6{4#BxFw!!~UTRwXXawKU4iz$$GMY6=Z8VM{2@0{=5A0+A#p6$aT3ubRyWMWPq9 zCEH5(Il0v4e4=Yxg(tDglfYAy!UpC>&^4=x7#6_S&Ktds)a8^`^tp6RnRd{KImB^o z2n=t#>iKx<*evmvoE{+fH#@WXGWs$)Uxr<sPjul^54Bff9y%ZVHz+5}qAbDf+|fnm zNd{_kS$6bt11Qz5?-m)?lU>tf?r>AaxV0?kf0o@oDboJ6z0cgP@A$;k>SK1UqC?Q_ zk_I?j74;}uNXhOf_5ZxQSgB4otDEb9JJrX1kq`-o%T>g%M5~xXf!2_4P~K64tKgXq z&KHZ0@!cPvUJG<f9>4kw-0;tPo$zJrU-Nop>Uo65Pm|yaNvKjhi7V1g98;^N1~V3% zTR>yWa+X2FJ_wpPwz3i^6AGwOa_VMS-&`*KoKgF2&oR10Jn6{!pvVG@n=Jk@vjNuY zL~P7aDGhg~O9G^!bHi$8?G9v9Gp0cmekYkK;(q=47;~gI>h-kx-c<vM%*#w&fX{!h zF%L>eM{ml$#8KI$4ltyja<rI2qq{$AR1|U_tFD)9Y-d_jShjldAw-)(k${x89fc)V z^uj$O=9MXT2cL+;^v%uZ%TIiT&+A8q@<LEWivxLuc7cEhkMJup7#M4iRHWn;gs)|% z*`|SUEl(kbPZ=F^TZ)n%ySX6erWcgVc`2wiVw2VTP%;PP;UMWPi0k}AaIl!DD+>qP zki^cyDERloAb)dcDBU4na9C(pfD{P@eBGA}0|Rb)p{ISqi60=^FUEdF!ok{Gs;vb) zfj9(#1QA64w*ud^Y<WE?99td@r;1MVEDo>sN5&PeiI>c`VioE8h)e}W%S9NMA55Gs zrWL6l+@3CKd@8(UQLTwe12SGWMqRn+j)QZRj*g)Xua)%ayzpqs{pD(WWESJYL3{M$ z%qkpM`jFoqLYVv6{IbCkL?fEiJj$VG=$taup&RL9e{s(Sgse2xVJlw0h74EXJKt<N zv_^nt|CWo1^pEn7x}Dzrxu#9#iylF>2<mjN(C1_G037wJ*c!9$6Ya%e(y$WXL!EqA z8HVt{2cY#I$^(s5lIv2_V)0(hY4lKgWN5U}$n%K8Jg_QsDR2~!MLCfAxETJK@puD+ zRpJ+#PBP2wu|C*%vKJ>eX|dx<CQ&quy2)IJEnV9z;^O>z{->0)3W`JN7Bv!rLvRZc z0tAOZ2yVe4g9iq826qXAg`f!*+}(o1;1FDb>kKexumFS40KvK0yH1_@Z=LgWZ+}(Y zwYsa;OLz6tTA%gS=>8$=Z7pLh>|K2QElL)E=Q*(n*H`8R`8={-@4mTD-SWBOYRxV? zmF(-rJB8^Wlp?319rTrh^?QEP?|Msxrv?WbJ-+id+V#F2Y4(JPJ6U9bv+U1cIIH^W z)lg$_=g^Ma>2~Pyd_YOAv29Cb-U6DJO?NxnW7~QP*SmYi*vdUVuW#LWQ_u0`hymZi zaQS3Nb^4`ro$>0G%zbXmr5|D|iq0R<;S@?kr0j5Ruq87-Z1>crx%EzVZ9#U;{?}ti zW2W%*9MQg3Nbh%Ti6LhDd|-aFSgXoPG`mHlUU1iCHr>ru>DX?W_#13(`u*!Plu2OP z6jk=2>BC0l)aw<WV`x+C!_sw{a5i*Q67F^#P-aA<I@z6VbJW-5&rwZfvvRk3_cA8b z-o}<6m7#V@uDa<CVdlJ4d|5@tUf!yN<DjY-Ylj}w8VTHcITO{giPiM2=!{`C)-kgy z4M#`;s$Hx(F&Ry_6@hE&#+WZxZsYohII;=<B$l#U>;HCmxoYD1i4b%m$1`DYC_^L~ zIEAnFcHvad=-aO3(_MI=9#`z6-9*_!&$?<%meb5;jG<wc(D1r`!k7AFaq^l6-TVCr zn@T;NWtk;qx(I~IDg2;{VNza#Y9hnvC&&D^iJtYTc_&lLexMB!uC87mR>d5Qp=MGf z6BD{%`L#TAOq%z%@*ib95Ey7NbUF=BlszVk3Iu3imD&*91N-ij%hW?W@~2TtdHTfP z#n0@Xd7X8Dyu36n{k#PwQ~T~X7mAO^cNV+z<<Rr{6qP*fL{*O`It}aSc#<7ICz`zH zfdvuUP1@TR@FL!bPH1@um7aB~aO<rmJ%*b)*b*mqm<2+)la8vi-b#-P?L4aM?FRQw z!SL2{$6_lC;MwX~JFGU~u@(2B?<Z2dhI@qhN$Or_U*}$DGND-zz*x~AawYee{HE;I zGAb(xm0Nq$##BQLFEgd@aqT*NJhB}}du8b8cj%ob49sgx?Oi-i5sJpioR>HO@3X-# z_@rAn$k~(l@kciCC;&Qd*fWRI>=;fL{UPlciNDWyj$bX<#r^(r;EE8wwUVQm&7~QY zCXRj!**r^xybAEPq>h3W$uvI1j=yNIyzkE_D7fpGw)OV{U*Uwm{xB;mEg2(|y|ICd zMdQVqzMb-=XM6|E-a9kNh)^9lY`-DjhhHD1w5lufRcy+QLgJ47!fFn<KQi>e86#F; zX{ufroVBEZJOY?rDo!;Te6aOZ^1SO!dYRxQ*2njyA~dCWawn)>!*k7~>8Ikt<J9hI zLTxVl%^kbxFjaJKz4UwX+jy29ohPH6;RO0%T`A|oSHWhqWuNJ8tYd1Xp}S%w!~<wT zHSeF;1&d?WDhsdZgTM&TfZ@=Pp`{?gU%*=Eo2o<UfasbP*Vgmv1Y;j}@b2Fxb@=4D zWq$ckb3BOYn%N0MW}!64?YGvuPD`}=WgRB1BPo(kSV>&e*0>>V5ZbO|*1+2LFOqVe zXHb!aMk03^h%&9L8GMy7UDI2Kev>V@(R}*Iu6x+!Hn4~D@wj`P%#Hdbf(lK{+DD7f zJ&(v*mhn_e(R$^5L#bM^^Q@-!*b!l|+Xrb(q*MRFJYnrE7*xko!SJOy9LngR2|q5k zY`Ioiu+YBfzF{Labszk-E#*BYQk>$()=xWEGZRKwY)*UxP}0dGuPLZOk<u~1pRF`m zxYnI*6_BmyuVfiETJ#r=!}C__TJ(hS&_}hqJq6T(xXbQJ?{M?GH1d;1)n-8$1pDWw zJw5OAAMQDHK*ksFYeeo`fz$TbpGy<)Wsk%<#FfYFVTT9*sy=H-wkS^x;7&PL{erf! zzf{M*8sv9&hkoBZuv}-Nb}O!f7}9<9ZL1vRNUZ5T^4kV6WRoRqMQo_+AH>NJDI9Hy zFjfwiK6RjhH#rHW#B0(MW}i%V`943<6@Z*Nd^JEP5uZonXm=u%AM>{H^U@&Jy*i0s za_Da^xI6pMtXzHc{e~_ZcnKP*;=YL2Z^RmzDl{dJTk7*}E_h*NvgnhnxVKB59Duh~ zqouS_WoOR*{UvUw_K#OWz;gMracr%8>QQ&V*jv!8)ho;U8}9~8EU{N<=Z_gR%IpMT zbkePUG_a<Uo93~%MM1nso9|UdE|j>fm=#|iIfFmdqkpLMGxY5D$`?I}&T7>TexU@v zkBx09kG)O;09ckj#(_Uov6vv{{HOcr-%H#DUQ@*GzF8Zh{iSM13%fuB%>wjdU@3Nf zlnYE!GTyNrqes|;nLFXfWU*Wg-9wmr=NBd$nCk+H?iwNvcd0Wab^3CT9a`>3V~oWI z9=<ivyrYLX+hLVmYbCVC7nx>_H+N-Q=M<NIna#%7G#cG5P!5#|H6`sbgz{jBdvfcF z%F@i>Q(io4u4mpdQ;k&5FXnKV5M7R`@WJ9h(GrAirO#XXOU{qQpk^B^Vd=Dt{wiqT zg-#j9J~@o%H2;W9mg)o6@*Vo;BSs2*4HAHpDk02mndAsov08R_48zJZ@J)s7+hyCo zy*0L#y)?AqZt-wX%+_Vx`8*A95OLHvs1$k~{h-_N<KA7r(+uvizi3XCB3#4TpjNrJ zvai45nQG0Co%wk~tYgN!u~~y2n6k!jjXBHc$+Gq4hqTzEj>_vov_gHJE=`X>L?5K+ zD?u59=mjtImMvd1GsDytuYp{Iy<NXRrLZ4s+5CA`p}CBZMPL-T31R=B$JFH(h7Qq$ zc5;cO7Li&TJM=S4-dTKdpeXu!TD{GoUj}7yzx4mPG(VBO;Kq@rcXv?}P$X>UkW&?h zF>$#`n$~bZ)KN0B$<p$VcVWI@lvp&2*7))!ZYjjYh^fBV(ceia`pW>XGeMYh&`;g8 zo_2-koaO6+8O!+L>SpIQbG(i;QW9UJi{Ecewlo?s&D!^>i$|#jaW}#HJuxt|W48=? zb^Y&O$a1s5ddr8DIt!sD!t=y1g(d4GR(s;s-HfV$GXl&m;+sAAxB^rk(3_NjE$p#L z*t4em?tA0d+XwRxN^OQwzbDZMuSE0J1)Ky{mq)^t4bnSl*)s>zNM@mMdtd78&ebHN z`!(|lE5q-p+TsRaNnMXwALaN5QIZ2IUi^Z22tsN5>nvIO+YU}Q*xh6}ee6@rR~<&1 z(PB4z>9ZBUMXZwSMmd9-aKKsmJeJq^G|#JclOh*xf0?^e0(`40nsg1z)(48;4}B_( zGwPI)yo|{oX{dVDL-5-aMGr;~vU1cPtJP5JM(sswz&Q`e<@0?y{YhsO9YK8EYJA;L z>7oG_Mts+(wCBC*Md82#XdKw&J*IizR?9k^rf1r{Ot-&>V^ke{9nI9zavlcNkIJtN z7T>?o|4rENk-?|lewZ(EfdR;%BUrzKJ^UkCpsM)EA9QHBVV8trT&*O(9?FO{MLTFL z=5P0H+T6C^jAuX0k4U;~GM!x`!X2N~3_n?qXY$HI>x@(DHEy&Q3ucT1R6fj28wX!I zC=&d$@bJ_v^%?W2Ngl}e8ww`b%BrN-PzGH;$@B2Ky1?%GMkm#~Okj(-Admyy;qya| zOi7<TIqKLJIjsT6%xMurCppK$`tFA>3kr_pwt?5Nj<kh;AkqM0FqJNvpLG2%nBiEz zf%ifK$Kw|EzR5(&`uXcro~^V8i}*)jhx5-t$rA$`c)ZqIf9DQr!qkCRbJWjUI$JZJ zm$fJ9L9f6?UO=_r2e^Rac$+nqbYU6z^YgMBa7iN^LoJ4qw_S?6p!J<$X}7t17(?2t zcE?oZJ$Jvt+q&PyLJYNC4pJ6B2Qde+jOF0Lu$QB|%Hl8GeqMD>3p=&H>81!w#>Agj z(QXx{j0r=pTl>micAI_5vUw<3`Sht?Z}-j2Wx~<RLz32QGv22&J{94fr~V)YDG95g zjef+~vo?CO%A&z(jqgjVppWOfXF_a0rF&LK$Mau_gV9Ob!+u&!{<c^Y1J5Po?`a)A zQzS-wDNMkxF(uva11Qd*)ipedF7L8cQx?g7Pl*j{fhk~H=G{iXJB{lDwggu}3W3aA zqf(*0b}y=rmt<QkiQ35c+=PEj9}{Iru7J~e%e$QIlUdUy@-hWEOf@ncen^;YeTZ*X zH+U;(?Wy8Xl+h@nkoL^sjJj(5zUISeV;JWYIiaB7RDchD*VdjmbXj9)pN{CA%vsJg zciJ6y-i)!8uXW&CN8ViTMaOYPM$w1*SL53`0@H8hO>F8DKCUQrsXl2?W8hur42(F_ zsSJ)_36&x6A|YkY6c<2a94SXbv~d>4CC4nkDPvf9Z5Fys^6^5r0j5=E>Cgy_Dk@tS z%?c}9!qB?t6t8(XMH%le8UeNWp@Nsma~Ql+^3Bo%_npMryeQJz4V=BAqE~T?dejng z3ge<X@Z7g2fW4F?C!aagtvam=!RFFVpJA`q1dy-E%du?YwT%+fTkMY4<03TZ)j<Oe zuSu|TMbn$JCNKw9K<+@tJ({pU#md3G(`)NO28!Z^`B|&xuS!YWO}}^8(&l&<H`8f( zO-EXMeXU|crFs+^NzF_IZ*xCTMAZi{Y<c;sK84v<>{fjCHoNAfYBvsfq;G%VL|j7t z`X0sy1EEgpyD;)tS1x+fnv-?C@glP0{RCW}Ma?3qpoq_&IJAYOy3G#s`rsh5=3>`K zkj``<PxYPrnJ%66XZ%$jT_UO;S&LzWfo&581S_54ry#ectge+aWQh>=;|*x5HSjZC zXNvPLh372q;=+6ja|SC!R-`JcL}}wwskajjTUGTpL(1zkN-p?BA2lmf<wk(A{@fWd zR@`1h3RtSO<YT(S4xL@1hiEAxTBBzva~C*l--DU9m2vX&A2fTNg49@_4&`2Bzy8!U z)6qtF$FpZMEKdNYC;O-#lGOq92InNM@``qD2YvzcS>+J3WsB7!k`0Brx8^cLTF9<g z@nKD{&MQpkhV&mNuFe;7?=GL>h)r+LZ$vsZo}`OpOs)?c6$hclR!R#MAeh|_DY|9r zy+_3c%IO9h9X?ksp?an&>Lw;QeQ`T-Ku6HaK~H?E9-Z5$cZu{YU;1+-6B$|JD;%!^ zt(4l>F8}a-UkC4YtOxFHckhl4VK<o_&-lD0mk1#hZYAraLBA)XZd9SwQ&Pgn$a!)D z;&eLCGu8&`Ky;&{YdGM4YZMiZi$_@v^1aVdy+K+*Qo!QYDDtW4@Os*LbJ00k{m)5` zoRKnSu)novfL2Ts{!-4+5Y{b=o+LpM;89G7S{vXl;M_l=ND-Rc5qgt=ci7TpEo=mH zL6*Xt9up_3hU63OR>r6P$P_O*U!)IDory%}Wz`YeFx6TO{y2Y${SBm?H9cTWV=WWJ z`_*CGso!ZN>l@~_jkeXtV}<eU5O#LliK7g)klc(Z=e{4*h!dp)V6v<*N!NnT1w~8K za~UIar=<m6R+`}h>fczfA{TUkyeD>)i3|NFGcCsBmK3HXp&ol_@GVs7PIpfULy!hi zs+%KYgS%(n7_z_}6<X(k(VFudPeVYWZh9|epL*7btD&ckkCMALmGw(owKL=w(~r63 zOyHtRRzRvkW>)hblk~W#LZ@&2)fwm6xkFP%&Ju|MFWbNiTwy{{g-pV1RK`L&=RE2D z4|g;~vd<LODHcrO&uLo^tGtrbwh8*iCTXkJcd4-eXXU0I?k1m)6`j}QSOp%!d{k#o zIrMoZ12w1s%;qprCkWS}WH>8x<?cZds#+JB{z{||9jq*<HT!M-cBcH=;7~J2uQ_26 zvZro;_+w%PUpNkSI<TD8&2%vNAnp4avGA`e@UKhI+!{F{Jx<Cv<%&v?&9%YQ4BL2T zaOOpQFMay>d|teYS%w!IlT4W$&FTrk-hcTADX!P?*f1YWEIRwq$Ys%^(Z9w&HT$>} zsMD#6Df=uJrX!JHP7<>Or;e_Cf=}`!`qR=i8fBj)$6Lxx{HRzd8Tnzd0p>kSps{OG zKJkml>bUj8$u|F=``l(-aMxWBC@CGZ#FXClQZ<4|&%jN}Tkg#q8z)=>Ly{$i0`rjU zv<vjl^OND_&nt8%K_DY<c$hBE?ht3o;zMF?PraCx<3H?R+3c+lcVP-`!*=iR^+4=@ zjAXY+K30oPt-hFFYy6`C$csm;r=3u|c~FmFo6B7|^>t|QddO&i=91e?h3>s~i;+6{ z8X4i6a1wDLrSuE#W(zhan+U*Zq+8p3a))JFVF4ffaV51K^YgTs<ELvmzH15OGhhY8 zrA_+PnYK;aeddV!Pi3^WYTGZ2*J)4~@C%)8#kRVzSG2!MszRFau_EOo^?}G1$p^yr zk#PoR%ZY0-+cfohw#0i(2hnkZfA7b9`g0$EfREag|7IgZEqyUPIUSL{ls?ZdY2jlv zX?1Mzw~@8iav*U46179*NN~X0%-qa(h<B)RSSGS9k|=WNp6TA~=CbwUXG!l)zfkxA zNej9!)gKN9qFfwPo;8s*!hnDPngF9Kp{ukrX|iXeI3(#zb*h?bb?@D>o~3;Y*NmM; zx8T?y-N0uyWY(8=me-HUC9xtABvX5~%yg+Cp&XF$Bq=OcK6T*D7eZ2EmIoCFWm{$S z1PNw8HDpe5hHeCusN8kdeb&f2#=3M^A~7YwJ7FRrhq*)PG9x?JIAaC<n&nyz&js(6 zJeGWn+?QRH9iX#RFkV(w>{MV}5}<q?f|v9)L^XT#O^Q+lTLo@~KU5xyfaaECe?QTB zEU+ll%CA@S4EasNBgDg3P3g>g#7R$-Ly%)4=IUkRCGOR|XTMjn&okRmFjaO^YF5^* z@)#MCBOBezD)*xQNxydlUyN?dW{fS(s-T`gv*0BEnk}<MqB*2*JFz@&Ut*5R*2h-J z)_1&Q{C@mZhFSfyIyZ=2gNVh5&AtuX!f!}*i1VjIDopYKYu?w1#R<cS5`I@F1PQbP z*(_N34x08$O$DXg^I;Q5K8>`BdmrbmPO8q8y(X$AA}*RH%I7Av!~84pudHb&%Q5-j zt?=6x(iR?<^_7X0v6Ys#VAL}dKk^hcjI=|EY;kPcZ_w<*H`_*|N7SacaM1ERD@6ab zg`!iTm7$URV+lpW_{V$ruR&A>jrX68k4x2wo$45}&wf7o<|o(@B!u-L@bKyQBAGwy z4#}UrRAu>^>Vb6k2-th^>WjvP;Nl|i3WrjWv3ISkj{m{eAcQIW^_ndxSX@|8T(ASJ z?_<Q%GX;J*nopDj?vlGTW3<2Bi-14h9Ft?$MJo-;vYeHFBv>$fcP2u*6uOBk-{d>^ z0vWlfGQMvysI%R=iE|A+!!Nw?C917EU*_$`;;)px?s83CRd3i_jBN)k#nR5t$dJ(+ z_sP;wG@Ad)^(3LRj7q}0b2O(b`|i0~5SYb%Sjk^*5ISZ-Ab+}DGu$-X1n^TF1Ndw_ zF|e*1)cI2%`TR&AW~XpqpFb!=3cHbS>np9hYD_Mr5}y5Y<hjKC>`SY^r7isA2Q4(z zazRQEqWDKT2zIEbjSYdCPi1ZOGz80Nsl}gxO^<!<`)h}k*WrLKhVC9A^uqPrAX2rJ zk_X_<UKVZj#SZ`e5i&Jvd|AuDABtCTp9RP@piFO@ZU#$^j4fEyi5WR4tQO|sRzdLJ z86FxwO1hlidA6EQ5OI;XPTXTa$K&JwxgTfPhh!ZPwc^HMC{@|JRTI?xh^Ptzlf~Qj z4+amGs<?A`M~9~Ge+{a1r{l~f$XZHt1Ik1~ki({=W}#a+O?yAslpyDBa!(JThcKg+ z`7_G`o=!47FD0IvP768*p<&Vtm`CtC?;Dj`fo;v%1qH|i1@RjM=o$pEJq4&d1&L7t zjHm`Qe8@BW2ApUJb#%iMo6qv$oT6Alh&RB*5@4ncFm(r*OBC@so8*msJq8zql&b-+ z5<*+q@YE4P>DWMY0AV<2K&OL{&^6#@L1?lXu#6xSMh%3^5c*}oM6DQGY#(a^@z<&D zF(43I9e&5`h|A$5!+UFuOH0>F3$shBV4`0#M4RSB8=6F0ZgIbq<2LQ$Hh^(kAJu=! zt8ZGXTacD{(3W{V1$j_{Jc)Ka7<N6;sXR!iJaN-JXwp2f^gSr_JqZ^)=odUOg+0iG zJ@H#S=vq9neLbjrJ&FH#F#bWI5hI@wqj2Jp)bXe%8c1>t6u}ho`4kF+4@t_0!mCBn z)}o%eA}L)_L?=jw6BIfll7tb3n}?*yLt&XADa=rW>qz=_6s9ziOd5sXjil>FVFx3r zf>Feewk0v#W9>Gp4GacTRr>Sd2T6dWi-{YX`v!D)kCWzG5xQB=?es5ON(%nkwUhNl zV>@xkWWWv*N+{e$(SrExvN6BXzU(Hxlx27{VYHf+LpIbTO+Yu(ltMk<<mdQtfilQ% z#zERxP>;)3A(LU@ytVYFkYvTa79idMtUFhfxx?P!)2F`prNWW#Fub#l>N2s@nh&n_ zA4{#}|AIs9|A4P0ZF%fy=hDN!t#ifH<)4u2kirK~JUpjQ-J+~cXOZI&dI<edX<Pe$ z<5K%Sv8eq|W{$&;<^B}h+C6HiudVR>ts;P}UeXslP6zKvpEKSN-$y>kJ^nw2tC9bv zo(|lT@?vZ!{_l|d^8Yh)eEBh*5ABh<!=o}_%`M5uz0&2FvS#W)djCI>+Lzjw+?V)o z#P<J#52aEke-8d*<DbLpV99;)|DC457DTn))TG@GiB9R>-W7361>E(Y4;@`sv;VKn G`u_lkUM?>H diff --git a/flask_admin/static/bootstrap/bootstrap3/swatch/fonts/glyphicons-halflings-regular.woff2 b/flask_admin/static/bootstrap/bootstrap3/swatch/fonts/glyphicons-halflings-regular.woff2 deleted file mode 100644 index 64539b54c3751a6d9adb44c8e3a45ba5a73b77f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18028 zcmV(~K+nH-Pew8T0RR9107h&84*&oF0I^&E07eM_0Rl|`00000000000000000000 z0000#Mn+Uk92y`7U;vDA2m}!b3WBL5f#qcZHUcCAhI9*rFaQJ~1&1OBl~F%;WnyLq z8)b|&?3j;$^FW}&KmNW53flIFARDZ7_Wz%hpoWaWlgHTHEHf()GI0&dMi#DFPaEt6 zCO)z0v0~C~q&0zBj^;=tv8q{$8JxX)>_`b}WQGgXi46R*CHJ}6r+;}OrvwA{_SY+o zK)H-vy{l!P`+NG*`*x6^PGgHH4!dsolgU4RKj@I8Xz~F6o?quCX&=VQ$Q{w01;M0? zKe|5r<z7o5`*yS~8)MszG41q#5{WWPpy7G9^(-fD<g4HS2Pp6}MR#f7LIoFspeCvR z3+c{Ov}|bDFijfL*xJ&DWaU}da`Er7tg~)(Y2IDkd3AD?w7jnSneG!-SaWI)p`xDU zXH9Mys?(WBfmfBO!_){Max(NjX;ffVH@MAGD6y!?&l=$WE1+*S^Cx4)$U?A><_7CD z=eO3*x!r$<gNx(8nyyp{U13{MWIQu>aX2iFh3;}xNfx0v;SwB<Fg``NKlv&}sOOia zl_SskHz$qk-Tj7B2@DHwWBbat?O%&GCL=1*D=EFRpwKHcVF9o~HnwAo=XtT&qlRWE zVi`v1=H&nBv?M!wAX!1fF?LWbbVvCAjN!ns70n|1u$9{ZL&9b)AXkF-t^%6Wna*`f z*04(m<0Gx@4&<!XDochu+x!F|DAC{R)c4o_TK-_!s|@9}TbCv3Sp`&zta~M|$%-V1 ztq`DddvEXU8JrjLh=Ul_yYF^%B5>fGG+@Z;->Hhvq<wD;VB@ph6#6G_6lL5#3gkx~ zHFE%Z^IuN$3X)Ju)24Q9Ro)B9zI%GT-16@8|DPH7fB1}tA~RrY4U!xKmRBRxkiA|Q zKr4+b2V=R(Yj3HIK~EcS6>fF4r__4$mU>Dl_1w;-9`~5rF~@!3;r~xP-hZvOfOx)A z#>8O3N{L{naf215f>m=bzbp7_(ssu&cx)Qo-{)!)Yz3A@Z0uZaM2yJ8#<s6khOy@V z&}wI!ds<}Wi3oZ(j|&tv|KA}5cx}QpZ^By#9KFAF@B1dVuQA$!NDxA6LE`KPadPU; zQjo+AqqndYk0@McX!H;i$Tx}X(u#SHJ%&iNTJu#<Xz9=-I1o~2(*?vBfO^7b&8^8! zI*Z@{F?FmY+=Z{Cp`Jcc{axky6qgRBtRkQEW;eW-3-wE{UVkT;s_VTolPg6pyu@CK zSyeS%s7^u`F5b$ErP4Ux#VgLuk2sI{EPRQ3O?-?&iV@{?VSLbGh?0Noj@91Fh1H!U z01AI>OGlzm?JO5gbrj~@)NB4@?>KE(K-$w}{};@dKY#K3+Vi64S<@!Z{(I{7l=!p9 z&kjG^P~0f46i13(w!hED<gesU<d5XH<k#ev<OXsrxsqH=M#%^{mn<fylX>Jga;*Eb z`!n|++@H8VaKG<9>VDh(y89J#=;Z$ei=GnD5TesW#|Wf)^D+9NKN4J3H5PF_t=V+Z zdeo8*h9+8&Zfc?>>1|E4B7MAx)^uy$L>szyXre7W|81fjy+RZ1>Gd}@@${~PCOXo) z$#HZd3)V3@lNGG%(3PyIbvyJTOJAWcN@Uh!FqUkx^&BuAvc)G}0~SKI`8ZZXw$*xP zum-ZdtPciTAUn$XWb6vrS=JX~f5?M%9S(=QsdYP?K%Odn0S0-Ad<-tBtS3W06I^FK z8}d2eR_n!(uK~APZ-#tl@SycxkRJ@5wmypdWV{MFt<T5%<QMMP#rTv8Dn)!jr4End z8!An$TjN_QZBN_|-%;s$96wO$ZrvL{QYl%F!EaP1Th9SiDvOmh5WrK}3{64{{_F&y zrSMy`6AG<_-)~t&XssC4d+gCHeK9;{jV1y%Xrvg1Cy#-D2g;>YBUY#g-Vv?5AEBj1 z`$T^tRKca*sn7<ZK}0!&|7AkCI;jT+6~rYE0#BU5AkxqT6Y+wF*hUg{if$klH$Np( z14lF>gt%s@XUD-t>bij-4q-ilku9^;QJ3Mpc`HJ_EX4TGGQ-Og)`c~qm51<|gp7D@ zp#>Grssv^#A)&M8>ulnDM_5t#Al`#jaFpZ<#YJ@>!a$w@kEZ1<@PGs#L~kxOSz7jj zEhb?;W)eS}0IQQuk4~JT30>4rFJ3!b+77}>$_>v#2FFEnN^%(ls*o80pv0Q>#t#%H z@`Yy-FXQ9ULKh{Up&oA_A4B!(x^9&>i`+T|eD!&QOLVd(_avv-bFX~4^><K+`NUjl zUA`n*5<n{f%?!4-)qpuLcwM`4xUD6=$ki+M2U1n6MQw*G7TmC^qdRw?b*#WSFG;)w z)HldC)uy>o{%mzzrg_i~SBnr%DeE|i+^}|8?kaV(Z32{`vA^l!sp15>Z72z52FgXf z^8ZITvJ9eXBT1~iQjW|Q`Fac^ak$^N-vI^*geh5|*CdMz;n16gV_zk|Z7q8tFfCvU zJK^Pptnn0Rc~<r0!CgppAqmePbR1#5Tubl85FQ4lTg)+g8UrHdY9Ka1?3OcBFeRlE zzYpoom?Fp2nZ{a4hDYQEn^Tkbje;(-5yZ};a0h|L)2vg*F=grd*^|WBo1OU#S-~Fv zcDpzl2xPHbu|lC2Y@t*8{!%Fh(i78$=lQReu7C@B0!fO~hV;@Uos_RW`!LXs+NQHy z@F$dGXT35dG@wzAM4<{W&5|=hvLeY%j@6DPfZK{_NfpP!+NaV|XArkdMWmsrp|+Y0 zNxjY}2dUoGHC2{GT?~El9hnDW?KmWthwM10KJ(#NAOW%mXq6&t9<|PZ;%Xe7E+vTD zfEY+f$1Mv<nx@^jBQcU4Ljg4P-dWxOH-zo(t`hB8-Ik$N3~vY;K2XYCp*Fv_2blJm zPc;8GW*QB>egGIAK}uv<M%BWA$}X1PZ}r3ec_|6TIBdoXwlXq~Ws001rqVG;8=+eP zbcwJ)A;^UcGF*T_xCk`{#MzU|C0f_+{M&2Zk_ZN2^_{NVK>99VZm2WLPezQQ5K<`f zg{8Ll|GioPYfNheMj-7-S87=w4N0WxHP`1V6Y)0M&SkYzVrwp>yfsEF7wj&T0!}dB z)R~gGfP9pOR;GY_e0~K^^oJ-3AT+m~?Al!{>>5gNe17?OWz)$)sMH*xuQiB>FT2{i zQ>6U_<n)x#cJkNUc|V)^vL|15d~)i9%UIk7`0hyQQOX6dwG{=#lR`i}3*A_(-}<aV z6Bs$mG_#ni!&Ir*LWx4DW1y|U7^_H;P@~Q(g7S%hUz3y7SxDI<tR$+-%3z@EM);%g zLObKN!YkVml!Zc2Qm{14ydZQ0tvYlF^&(mmMY>8}Ay~r4li;jzG+$&?S12{)+<*k9 z<^SX#xY|jvlvTxt(m~C7{y<eW|86c<M_B#9!3F3@>{3g>7TX#o2q$xQO|fc<%8r<e zu{@uYv6wTaDS(!pU?WCA5)2p&Mj+Ip;0XTMc8zb%VkCGB2k$Gg;JkJFCbWHte9BlD zCR^F6kT^z*ExAP|FFuMd7tu$>E@A3=UW(o?gVg?gDV!0q6O!{MlX$6-Bu_m&0ms66 znWS&zr{O_4O&{2uCLQvA?xC5vGZ}KV1v6)#oTewgIMSnBur0PtM0&{R5t#UEy3I9) z`LVP?3f;o}sz*7g<a{wL*dZXtI5+zcTbzINq%3Vx?sa^oH8-vb96eb6k)$k`VM?dj z8y1_mUUalhn>5qdTxJl^gk3>;8%SOPH@B)rmFOJ)m6?PlYa$y=RX%;}KId{m<ya`& zf~xC+0#uqMzpD#MstCV?tz>9R#2=LNwosF@OTivgMqxpRGe}5=LtAn?VVl6VWCFLD z7l#^^H8jY~42hR)OoVF#YDW(md!g(&pJ;yMj|UBAQa}UH?ED@%ci=*(q~Opn>kE2Q z_4Kgf|0kEA6ary41A;)^Ku(*nirvP!Y>{FZYBLXLP6QL~vRL+uMlZ?jWukMV*(dsn zL~~KA@jU)(UeoOz^4Gkw{fJsYQ%|UA7i79qO5=DOPBcWlv%pK!A+)*F`3WJ}t9FU3 zXhC4xMV7Z%5RjDs0=&vC4WdvD?Zi5tg4@xg8-GLUI>N$N&3aS4bHrp%3_1u9wqL)i z)XQLsI&{Hd&bQE!3m&D0vd!4D`l1$rt_{3NS?~lj#|$GN5RmvP(j3hzJOk=+0B*2v z)Bw133RMUM%wu<VkMnpWWVN&K8^*s5oqf-N`_{oZG|c^)?fe5daI7j+I{GC?6;bAe zUSXe$6^9Vy1KrCfsOM#a9`s`Ns00)gifk>_+$vbzOy?yk#kvR?xGsg-ipX4wKyXqd zROKp5))>tNy$HByaEHK%$mqd>-{Yoj`oSBK;w>+eZ&TVcj^DyXjo{DDbZ>vS2cCWB z(6&~GZ}kUdN(*2-nI!hvbnVy@z2E#F394OZD&Jb04}`Tgaj?MoY?1`{ejE2iud51% zQ~J0sijw(hqr_Ckbj@pm$FAVASKY(D4BS0GYPkSMqSDONRaFH+O2+jL{hI<DV209S z)XR~VgGa)M^-;}1&#S3{@xzwR6~@}^V}twZy;sZcsTJr0S5s{W-N3D9v%1<w%kip_ zCaGQ)_4?SD)S-wrJ3}!#J==&-iR8Kz)nLlnoRC&l|C1fmMV-bqBD82vt61QE6dSAF z*iJKFHPeAzx_T}Ct>ltJSJT~e)TNDr(}=Xt7|UhcU9eoXl&QZRR<9WomW%&m)FT~j zTgGd3-j}Uk%CRD;$@X)NNV9+RJbifYu>yr{Fk<C+0Z7wvVjq!VGjwL>O;p>_&njI> zyBHh_72bW<C>;8}oGeY0gpHOxiV597j7mY<#?WMmkf5x~Kf<RrP*$<_TMcAZ<977s zG-{sG-<y$aNL=Fg)E11z=zEyh@&Zlt<-N$5T)Lf&<pEj#+<|}`9f4puO~YVB6Jm!v z!37dKVIz9-hLJpqcp?V#EU09HXG3YfV3A{zn-)630R_n7NwnfVYInEHeM$w$$$F=a zUOHAT9sN4j{@RNZd%w-R1}Mm~Ligs&9Lc5wlF9RUjyxD1L}DW%Q=_4K^pa5dNOiqV zfiDy5dvZ1fJ9kyK6XwwJ5_8s27to%QJf!DXz~EWpbJWE5-c5LQu!j^}nqmNv+H<%h z5ssJ<c#g^_qKPkFd;?x87%*ynZQ!gsBex|=gx*awoyTyPQBBvZ@H#pgVq8NqXJ!Gg zuwA`+(oi^5nIKiFlTl*U=ybY+9YY+wRG&TyaG*FVHfLWlmTb<UHm6AP5eOjK&H%@T z4@jLl_YGv5Jmy2q={B>k*re(&tG_mX<3&2cON*2u%V29tsXUv{#-ijs2>EuNH-x3) zPBpi+V6gI=wn}u164_j8xi-y(B?Au2o;UO=r6&)i5S3Mx*)*{_;u}~i4dh$`VgUS- zMG6t*?DXDYX0D2Oj31MI!HF>|aG8rjrOPnxHu4wZl;!=NGjjDoBpXf?ntrwt^dqxm zs(lE@*QB3NH)!`rH)5kks-D89g@UX&@DU9jvrs<xLUb7(M^4Zb6^^3tZR7!hc=SMz zY6*prxO{uSb2$<j;JZB!{&!N@FRiO@L`rit7J5FDJBlZG-SI^R&~X)B26E|MJx3Zp zy@feJ>Y)aI=9b4n<X@Mg2JK5FwM5CTI(2DlYHRLE7-h-ky&9}X`qiByDxrocwQ6k! zk>Py3bfdX_U;#?zsan{G>DKob2LnhCJv8o}duQK)qP{7iaaf2=K`a-VNcfC582d4a z>sBJA*%S|NEazDxXcGPW_uZ&d7xG`~JB!U>U(}acUSn=FqOA~(pn^!aMXRnqiL0;? zebEZYouRv}-0r;Dq&<B?o>z9>s#Rt1<!G80gW3Q`9g34ikcEkn<~yB0GE=440i1w9 z%Vr=2{=&=rZq4E{&?AkG<{r866K366I$gg?dF2R5T^g;GEw`9Q*Nk^(b|;|+1mb*% z#4u&?3d3JFi15;ot8Oc19^cux;^0|4tLG@q3aUT$?2-_vk$Lj@p(S^1tSf2`gC-^+ z=%QnjUZHg-onrhZ@o1lIHV_2Dq?*qAxhgUYKOD3{$4MNkw#KqGMg~{D*qK}6#+(MI zLiJU8?@7)@l#?NnZ90q6`<!@a)Mc05$F6R?dVF0a42_U&5!rIVRk%it+OLoWl=%^V zt}(_79f^HAArEdKM!qJXXY$(d|4@mB-2tz!8yh<&*Y>HL`0p4bB)A&sMyn|rE_9nh z?NO*RrjET8D4s(-`nS{MrdYtv*kyCnJKbsftG2D#ia@;42!8xd?a3P(&Y?vCf9na< zQ&Ni*1Qel&Xq{Z?=%f0<LS^x97`leNoS?M1&H-Xn(H4XTZqAYsYIOp+zQ7v^2WLR! z_a_8#QR|eBZg?(rHeyy)Ce#d@UAa5k@2V9cLthMp76uClo{creD&Bgz9m%@;ZGciy zb&;xZf|B4Crm;}`+FCG!wta2!yrIkn%Jpu&re1E<PjbmrrsBbowaz-9RpTeuXu#&D zFm4Z8p>SRqQt5m|Myg+8T=GDc)@^};=tM>9IDr7hdvE9-M@@<0pqv45xZTeNecbL- zWFQt4t`9>j8~X%lz}%We>Kzh_=`XO}!;4!OWH?=p*DOs#Nt({k^IvtBEL~Qafn)I^ zm*k{y7_bIs9YE}0B6%r`EIUH8US+MGY!KQA1fi-jCx9*}oz2k1nBsXp;4K<_&S<R| z+!NEpcbfYC>N}}w<)!EylI_)v7}3&c)V;Cfuj*eJ2yc8LK=vugqTL><#65r6%#2e| zdYzZ)9Uq7)A$ol&ynM!|RDHc_7?FlWqjW>8TIHc`jExt)f5W|;D%GC#$u!%B*S%Z0 zsj&;bIU2jrt_7%$=!h4Q29n*A^^AI8R|stsW%O@?i+pN0YOU`z;TVuPy!N#~F8Z29 zzZh1`FU(q31wa>kmw{$q=MY>XBprL<1)Py~5TW4mgY%rg$S=4C^0qr+*A^T)Q)Q-U zGgRb9%MdE-&i#X3xW=I`%xDzAG95!RG9<s#0S@%P{4ssMj6|f(PFTtK{&eg=M$et? zer_yKYB>)s?v_5+qx`7NdkQ)If5}BoEp~h}XoeK>kweAMxJ8tehagx~;Nr_WP?jXa zJ&j7%Ef3w*XWf<k`Dtf*esPy5LFqg?XcIB9IkPk2PVCIR^-+n7<HvnNOxS;rSNY$k z!q<-6euEMl;SCbnVwt5PhJlC8e8)6(eeUqB*8$mMnR$Q&;ETvMu%R;lTOg&_)?8$` zEVa^()w5!O5o`IR%tYnnz9leJ+<2|7dp$e$)VGU<0VsrN2!{)e*i2Km_!HkTy_op@ zsnIk4PS0pBq&7e1Cq-WNe*ebQP_BP_b6V^hnOf6Jl*FDBLVJ=#%yjrBiM`Z%lGFDo zwHH-yVfi&trZbO`$d`z6e!q^9z6z!R^x64FT@j!px;*Fv`gCn5ntcrW!_Q4ZK!=`N zoJV-<2+l^+1!xdB0GlIyi1aL@Bfyw-3;j%CdMMseXt6XU(|7@G1YlJY;FZ<6E=3Wj z<90D&lAbgUUnehHsAREwMtG=6$~8Hjj0}TB^$|Sk>?V*nR)|IOMrX;$*$e23m?QN` zk>sC^GE=h6?*Cr~596s_QE@>Nnr?{EU+_^G=LZr#V&0fEXQ3IWtrM{=t^qJ62Sp=e zrrc>bzX^6yFV!^v7;>J9>j;`qH<hDH19MMT1+`8y)sG%_MO<QWhJX7}-!&K#jas?d zy;gZO2VIR5z1H^NXfFwADaHGprj9Kyw6No$Yqd_S(T={z#2gbNW$Y;;P#5j-{0Iqq z{Yz6(ka&r*xSggxVdEyX?Y53QVJz#Wj2B2nNYC=~i46iAU6ds(WkjB{Reo2yZ2cFH z1KOLbJ7d1#n3MMhVE&yyAfdi+kxdP<3vBD^E`m_9S2y(rq1mIzE*dZNSDYg|SM_8n zmO6SnMKXq{pYHbK`f8yE_&F1K$=pH5Q;<_Q=ykx1w&1KgW?4A9Z6Hh0ujuU5gw(c) z&7nRlgcqO=4PWSIrL^%aZQ)})*BEYH(5EdFt~HS|W2m{IuJL*etT$vJP@H=66XgN5 z8Q}8pvQ~ulll!Gl9Z+^=yi)!QQl!(y;INZ9hFT3RpTQp9WD<t=u9}FyLz|lM^T%K; z_F;6vJrfj%Yd?0P?KC4$4d|po%oYftn%JedFIyM&26HYvVHGfC#(R&nCXS+Z{t)t^ zVSWJ}WdR7#^Eiv>DQ4uc92eVe6nO@c>H=ouLQot``E~KLNqMqJ7(G+?GWO9Ol+q$w z!^kMv!n{vF?RqLnxVk{a_Ar;^sw0@=+~6!4&;SCh^u<XeQK8Ry4Gm-T(Vj*P>tT=I zo&$CwvhNOjQpenw2`5*a6Gos6cs~*TD`8H9P4=#jOU_`%L<QahFX*>!W;$57NjN%4 z39(61ZC#s7^tv`_4j}wMRT9rgDo*XtZwN-L;Qc$6v8kKkhmRrxSDkUAzGPgJ?}~_t zk<g7QLp>woGS4=6lsD`=RL|8L3O9L()N)lmEn-M15fRC{dhZ}7eYV%O-R^gsAp{q4 z!C1}_T8gy^v@SZ5R&Li5JMJy+K8iZw3LOGA0pN1~y@w7RRl#F()ii6Y5mr~Mdy@Kz z@FT4cm^I&#Fu_9I<Lt*^+@1e0b(+y4E>X(HAFP{XLbRALqm&)>m_we>a`hfv?eE|t z?YdDp2yAhj-~vuw^wzVDuj%w?exOcOT(ls(F*ceCe(C5HlN{lcQ;}|mRPqFDqLEzw zR7ldY+M6xe$$qLwekmk{Z&5cME$gpC?-8)f0m$rqaS|mj9ATNJvvyCgs(f2<G?s#j zlCyq7V=W|3+#5GMRv3jyMSve^Et#Ab=u*f=lMF{rP2hXbA~Thc4Er=Whg%hdYCNEj z;kX^FSJSNv%HwF&_?QB}Y>{r;2E!oy$k<WRsM?7~2V-%l??892FJ&Nc|D((m<^gBU z9InVbh@;KM5Dz*apz7ga>5{jik#(;S>do<#m0wVcU<}>)VtYmF9O0%(C>GDzPgh6X z9OkQLMR~y7=|MtaU!LDPPY7O)L{X#SC+M|v^X2CZ?$GS>U_|aC(VA(mIvCNk+biD| zSpj>gd(v>_Cbq>~-x^Y3o|?eHmuC?E&z>;<!5?S(?^O9r&S^X+pEvdora!<1(g^2R zF}c9cL+{oKVWq$6?rtz|xpFbl44EDmFIBCjiJb-Y3(jwkFAqQImExJNVfoWvtZ)_T zk4V<B4M+9tw4kQKIG^34KQl&&Fz^SMfZ1Rr!}rgT#M3;D3P+k<)V-V;IAUzgk0mWE z!YO?vo&!phIu^NE0<F?&&>Ij`%{$Pm$hI}bl0Kd`9KD~AchY+goL1?igDxf$qxL9< z4sW@sD)nwWr`T>e2B8MQN|p*DVTT8)3(%AZ&D|@Zh6`cJFT4G^y6`(UdPLY-&bJYJ z*L06f2~BX9qX}u)nrpmHP<M#fk<GgBNMKYA_9QYh8<vJ<9@F-~(AqGXdLPEfJFTIn zp64R)U5xUof+~(#vZUz{EaXw4SAp0Y;12Y-Y*XpA#>G#La#tiZ23<>`R@u8k;ueM6 znuSTY7>XEc+I-(VvL?Y>)adHo(cZ;1I7QP^q%hu#M{BEd8&mG_!EWR7ZV_&E<NEPM zcuS4Ye{%Gqtc-n!er+G|*<cWkM>GO;d(hGGJzX|tqyYEg2-m0zLT}a{COi$9!?9yK zGN7&yP$a|0gL`dPUt=4d^}?zrLN?HfKP0_gdRvb}1D73Hx!tXq>7{DWPV;^X{-)cm zFa^H5oBDL3uLk<C+v0>aFDWgFF@HL6Bt+_^g~*o*t`Hgy3M?nHhWvTp^|AQDc9_H< zg>IaSMzd7c(Sey;1SespO=8YUUArZaCc~}}tZZX80w%)fNpMExki-qB+;8xVX@dr; z#L52S6*aM-_$P9x<jdu9ktlJz@92>FuIui;dN#qZ_MYy^C^hrY;YAMg;K`!ZpKKFc z9feHsool)`tFSS}Su|cL0%F;h!lpR+ym|P>kE-O`3QnHbJ%gJ$dQ_HPTT~>6WNX41 zoDEUpX-g&Hh&GP3ko<AA>F4##?q*MX1K`@=W6(Gxm1=2Tb{hn8{sJyhQBoq}S>bZT zisRz-xDBYoYxt6--g2M1yh{#<qP09xNr@s6w?MS->QWFCISux}4==r|7+fYdS$%DZ zXVQu{yPO<)Hn=TK`E@;l!09aY{!TMbT)H-l!(l{0j=SEj@JwW0a_h-2F0MZNpyucb zPPb+4&j?a!6Z<r#zSSW!Qu(5~6_6s0G^U8i@%ox>nPTB>$t`(XSf-}`&+#rI#`GB> zl=$3HORwccTnA2%>$Nmz)u7j%_ywoGri1UXVNRxSf(<@vDLKKxFo;5pTI$R~a|-sQ zd5Rfwj+$k1t0{J`qOL^q>vZUHc7a^`cKKVa{66z?wMuQAfdZBaVVv@-wamPmes$d! z>gv^xx<0jXO<J6=m}BiiJow`eU@2UA*K~Z_jqm?*Cp?B28V2;3;6C}+*8byL=EIJc z@2%))H|zSX{#wNl1dKR;V_`{wA-N5-aN?q$&CIR<EVd6v!|e;ZYX_h;K*-tj_Xr#R zVD!mpcMXWrZqS|`IB=hKzaZzy6X`0CowC9wPYMg&9n}1avJ{}*L0iZ!p`>z;7HIQS z4RBIFD?7{o^IQ=sNQ-k!ao*<ZRhqeGmf|{bY%Roxqzv&YHX(&*=PS#s1OR(zw~6*G zAZll^YspPb$=6UL<F@2FynT_exO*?%>+V*|-^I2=UF?{d>bE9avsWbAs{sRE-y`7r zxVAKA9amvo4T}ZAHSF-{y1GqUHlDp4DO9I3mz5h8n|}P-9nKD|$r9AS3gbF1AX=2B zyaK3TbKYqv%~JHKQH8v+%zQ8UVEGDZY|mb>Oe3JD_Z{+Pq%HB+J1s*y6JOlk`6~H) zKt)YMZ*RkbU!<JI!}T{8zEt+(a&daxMztju*ROn;npHenq}*@86I)b4J&uF~&?iJt zN?o)&ELAxfueHiio3Ybyik@o*@icyb9qQo*!QuvA1&u?hUYT)4qQ$O|oMH`uQ%7^! z_}}e+S%sZ4PL@FquF`ewt{)}v@KZ#Df*{vuY6%Mec{@2I-?T|VsMToX1VvAe%n^j) zvdeu6s1|35v#f;_moF<I`PGAy?=_uDS;`<l<OfIk_>GPHzJltmW-=6zqO=5;S)jz{ zFSx?ryqSMxgx|Nhv3z#kFBTuTBHsViaOHs5e&vXZ@l@mVI37<+^KvTE51!pB4Tggq zz!NlRY2ZLno0&6bA|KHPYO<dkI`ky_l{+0el>MY;;LZG&_lzuLy{@i$&B(}_*~Zk2 z>bkQ7u&Ww%CFh{aqkT{HCbPbRX&EvPRp=}WKmyHc>S_-qbwAr0<20vEoJ(!?-ucjE zKQ+nSlRL^VnOX0h+WcjGb6WI(8;7bsMaHXDb6ynPoOXMlf9nLKre;w*#E_whR#5!! z!^%_+X3eJVKc$fMZP;+xP$~e(CIP1R&{2m+iTQhDoC8Yl@kLM=Wily_cu>7C1wjVU z-^~I0P06ZSNVaN~A`#cSBH2L&tk6R%dU1(u1XdAx;g+5S^Hn9-L$v@p7C<o$=Hu{J zxrz+#TM>CF&PqV{Z?R$}4EJi36+u2JP7l(@fYfP!=e#76LGy^f>~vs0%s*x@X8`|5 zGd6JOHsQ=feES4Vo8%1P_7F5qjiIm#oRT0kO1(<jgC4I6wQ2{Xo|wjm0krd64efBC zGt(LP9FC(njlia=(c_lTukVx-yR9~Gt`YfGKRT==f^$Uqz)t!SwGPI)kuvX+Zjvmv zgh<^_T!LG;_|>?Z_Dk6<DV?iVez|GsZJ9q9|E_~n&^oZp@ZP#r)@50Y)8mRQBV<Zt zDX+2G&swV0HIzU2B)jGgp<HCCR~bCFxw$OKhJS{dJFnQcxWhHg&GJ*Y)wr*`8kbb7 zRF?6Y&IrteW+;JBSq`vvJy8vQL|A_+2fW`8-8lH@zNvF93Bm{k%c!o-fCV)*0t~GU zSfWy;Y#>oX&j=Xd8Klk(;gk3S(ZFnc^8Gc=d;8O-R9tlGyp=2I@1teAZpGWUi;}`n zbJOS_Z2L16nVtDnPpMn{+wR9&yU9~C<-ncppPee`>@1k7hTl5Fn_3_KzQ)u{iJPp3 z)df?Xo%9ta%(dp@DhKuQj4D8=_!*ra#Ib&OXKrsYvAG%H7Kq|43WbayvsbeeimSa= z8~{7ya9ZUAIgLLPeuNmSB&#-`Je0Lja)M$}I41KHb7dQq$wgwX+EElNxBgyyLbA2* z=c1VJR%EPJEw(7!UE?4w@94{pI3E%(acEYd8*Wmr^R7|IM2RZ-RVXSkXy-8$!(iB* zQA`qh2Ze!EY6}Zs7vRz&nr|L60NlIgnO3L*Yz2k2Ivfen?drnVzzu3)1V&-t5S~S? zw#=Sdh>K@2vA25su*@>npw&7A%|Uh9T1jR$mV*H@)pU0&2#Se`7iJlOr$mp79`DKM z5vr*XLrg7w6lc4&S{So1KGKBqcuJ!E|HVFB?vTOjQHi)g+FwJqX@Y3q(qa#6T@3{q zhc@2T-W}XD9x4u+LCdce$*}x!Sc#+rH-sCz6j}0EE`Tk*irUq<m0`(;!&c&G7p#_P zOJ|kT&v8z(QpAQ%C~^@e!Ck!ICE1vSkA<!Djfg-q)Xjj-!hve17Fw+LN`@{UJN)Br zZQc5>)y^za`}^1gFnF)C!yf_l_}I<6qfbT$Gc&Eyr?!QwJR~RE4!gKVmqjbI+I^*^ z&hz^7r-dgm@Mbfc#{JTH&^6sJCZt-NTpChB^fzQ}?etydyf~+)!d%V$0faN(f`rJb zm_YaJZ@>Fg>Ay2&bzTx3w^u-lsulc{mX4-nH*A(32O&b^EWmSu<mNHl&EF)N<Qwv@ z+ghjNCfO8{=RX6l;$%bV;UJwTS<t3aZ9alZA|`Nj-rR_)P~(S$140`CMywS0w4K@n zvEbSGG>k{#HJk}_ULC}SB(L7`YAs>opp9o5UcnB^kVB*rmW6{s0&~_>J!_#<Q!IQA zfO6pF51Khiw-3ES&zJ|$tcLa{0mAHdM*u;#&JjS6&2$71z|3e-)lO=LCK!MP<y1Y+ z19)^hGF`6{P@#NOEe8oq!=8hZ$>+cEWib@v-Ms`?!&=3fDot`oH9v&$f<52>{n2l* z1FRzJ#yQbTHO}}wt0!y8Eh-0<gy=!05)T$dd<p&_-XL+(loOF(KU||XB_8&Ud`&j6 zW~wWblPi)_Dt+fy0AJi)GpeZiwq|YIuGrGcv(nscAa@~_m+trFF56NgiRrAWJI3uF z`lhjQpmFmzF^U1!<RrqC-I>*|Um3vjX-nWH>`JN5tWB<ptoGg-$7O92<yOQsP=C)b zJ`}#bAW@wa=e0GehF6uTNUcd|*Ba&dCiyhdjY(|NMK^uobI9q$ZChi=zU%>_gnW%; zUJ0V?_a#+!=>ahhrbGvmvObe8=v1uI8#gNHJ#>RwxL>E^pT05Br8+$@a9aDC1~$@* zicSQCbQcr=DCHM*?G7Hsovk|{$3oIwvymi#YoXeVfWj{Gd#XmnDgzQPRUKNAAI44y z{1WG&rhIR4ipmvBmq$BZ*5tmPIZmhhWgq|TcuR{6lA)+vhj(cH`0;+B^72{&a7ff* zkrIo|<cYW*47-TiTWhvB;>pd-Yxm+VVptC@QNCDk0=Re%Sz%ta7y{5Dn9(EapBS0r zLbDKeZepar5%cAcb<^;m>1{QhMzRmRem=+0I3ERot-)gb`i|sII^A#^Gz+x>TW5A& z3PQcpM$lDy`zb%1yf!e8&_>D02RN950KzW>GN6n@2so&Wu09x@PB=&IkIf|zZ1W}P zAKf*&Mo5@@G=w&290aG1@3=IMCB^|G4L7*xn;r3v&HBrD4D)Zg+)f~Ls$7*P-^i#B z4X7ac=0&58j^@2EBZCs}YPe3rqgL<Jxn$r!S8QWfkb&3miwnf<3dO#?*0r^D`z@0O zyL}HbgfghMrA1DVzkMTz<h8XjNM2zx@b$YHrE<H$adW4nu!w{$k5e-y$OIJc^n_-# z?T4cd%<Il(cWf@2Jy-ZR<%BHt;L>AA1L3Y}o?}$%u~)7Rk=LLFbAdSy@-Uw6lv?0K z&P@@M`o2Rll3GoYjotf@WNNjHbe|R?IKVn*?Rzf9v9QoFMq)ODF~>L}26@z`KA82t z43e!^z&WGqAk$Ww8j6bc3$I|;5^BHwt`?e)zf|&+l#!8uJV_Cwy-n1yS0^Q{W*a8B zTzTYL>tt&I&9vzGQUrO?YIm6C1r>eyh|qw~-&;7s7u1achP$K3VnXd8sV8J7ZTxTh z5+^*J5%_#X)XL2@>h(Gmv$@)fZ@ikR$v(2Rax89xscFEi!3_;ORI0dBxw)S{r50qf zg&_a*>2Xe{s@)7OX9O!C?^6fD8tc3bQTq9}fxhbx2@QeaO9Ej+2m!u~+u%Q6?Tgz{ zjYS}bleKcVhW~1$?t*AO^p!=Xkkgwx6OTik*R3~yg^L`wUU9Dq#$Z*iW%?s6pO_f8 zJ8w#u#Eaw7=8n{zJ}C>w{enA6XYHfUf7h)!Qaev)?V=yW{b@-z`hAz;I7^|DoFChP z1aYQnkGauh*ps6x*_S77@z1wwGmF8ky9fMbM$dr*`vsot4uvqWn)0vTRwJqH#&D%g zL3(0dP>%Oj&vm5Re%>*4x|h<Em3JO)$O&GXE=ft3p^9G|#?0DwWLK`p_K)+<TTv{{ z-sme#4+Oqqf)?$*$pWS2gvP{&alHNwIjdG2eeVgB&W~2ncQkQT<TEB}+r+U*Sz^2( z{JDq=6~A;9bd6M;^@ummf%1~8*<luPLU&L(KPlUFmFbIAFWF(Em5xC%IhGNzYpP8O zT+`%G-QRPYJlIrWo{iAsK!Q9!P2vkE5P#|jye^?ECnY~D$0dPb9DZfa1?v)yz@3g& z;g&G9%`bXU)%GaSxc!s&q+yw?s&G0kHmhpF|71o$Tvo0$rpbSM(^6^d{uv91%{b|= z$*Kl!b^WeJ@0d+rhNnHIz4cl+;iLmd<L-)VhjV!~YbEu}d>1J2X*mK5BH1?Nx_#7( zepgF`+n)rHXj!RiipusEq!X81;QQBXlTvLDj=Qub(ha&D=BDx3@-V*d!D9PeXUY?l zwZ0<4=iY!sUj4G>zTS+eYX7knN-8Oynl=NdwHS*nSz_5}*5LQ@=?Yr?uj$`C1m2OR zK`f5SD2|;=BhU#Ama<P~$VvhmI_^8ZNrt}1AvOV7X(sz*+2GbCZLT;rBdYe9QGvD6 z)XZ03krf;EL7R4cKP%`*;hM_&31edpDiHr|`}C4$VA4K?4)t-d*ee|SqdnPMHN?%7 zx3<>TKe9QaSHQ_DUj1*cUPa*JICFt1<&S3P3zsrs^yUE;tx=x^cmW!Jq!+hohv_B> zPDMT<UQS`;VV^r@irLILT~0+N33M1<u)sr18hR(<Wra9eQt=0KCN|yzvNvA<AN<3k zV|hxRkue$##Qs23TChJ;07NqT3L1xe)KK-*%TLpc>0D&08dC4x@cTD<NY(g*?y)&( z$O8b2Q6sg#wt{+cv-4vv@-+5_NBvTr6Ex1qad@WizC1F1SdwV9_ihN`8RHq?sk5jC z#WILtbwaI9L(u>$o1$x%So1Ir(G3_AVQMvQ13un~sP(cEWi$2%5q93E7t{3VJf%K? zuwSyDke~<K40T94pahUuQl0-LemUU;AvE^<Z_y9Yyr$?J0su3Gy5f{LKemD(&L1%W zWEvyy)Y1GLmYP8(i-d%GK_O{23yX~H+%H&Rou8u`;RWM|q&*T>7KuB2?*#DV8YzJw z&}SCDexnUPD!%4|y~7}VzvJ4ch)WT4%sw@ItwoNt(C*RP)h?&~^g##vnhR0!HvIYx z0td2yz9=>t3JNySl*TszmfH6`Ir;ft@RdWs3}!J88UE|gj_GMQ6$ZYphUL2~4OY7} zB*33_bjkRf_@l;Y!7MIdb~bVe;-m78Pz|pdy=O*3kjak63UnLt!{^!!Ljg0rJD3a~ z1Q;y5Z^MF<=Hr}rd<hCKOY==|sWDSuzL8iiX7^T&s)i%HRX)g)$n}ULLiX`pwGBZP z9gmSoR&T(}(1y>oz>yRczx+p3RxxgJE2GX&Si)14B@2t21j4hnnP#U?T3g#+{W+Zb z5s^@>->~-}4|_*!5pIzMCEp|3+i1XKcfUxW`8|ezAh>y{WiRcjSG*asw6;Ef(k#>V ztguN?EGkV_mGFdq!n#W)<7E}1#EZN8O$O|}qdoE|7K?F4zo1jL-v}E8v?9qz(d$&2 zMwyK&xlC9rXo_2xw7Qe0caC?o?Pc*-QAOE!+UvRuKjG+;dk|jQhDDBe?`XT7Y5lte zqSu0t5`;>Wv%|nhj|ZiE^IqA_lZu7OWh!2Y(627zb=r7Ends}wVk7Q5o09a@ojhH7 zU0m&h*8+j4e|OqWyJ&B`V`y=>MVO;K9=hk^6EsmVAGkLT{oUtR{JqSRY{Qi{kKw1k z6s;0SMPJOLp!som|A`*q3t0wIj-=bG8a#MC)MHcMSQU98Juv$?$CvYX)(n`P^!`5| zv3q@@|G@6wMqh;d;m4qvdibx2Yjml}vG9mDv&!0ne02M#D`Bo}xIB0VWh8>>WtNZQ z$&ISlJX;*ORQIO;k62qA{^6P%3!Z=Y1EbmY02{w^yB$`;%!{kur&XTGDiO2cjA)lr zsY^XZWy^DSAaz;kZ_VG?uWnJR7qdN18$~)>(kOoybY0~QYu9||K#|$Mby{3GduV~N zk9H7$7=RSo+?CUYF502`b76ytBy}sFak&|HIwRvB=0D|S`c#QCJ<t@a2hh9FA+>Pq zP)uOWI)#(n&{6|C4A^G~%B~BY21aOMoz9RuuM`Ip%oBz+NoAlb7?#`E^}7xXo!4S? zFg8I~G%!@nXi8&aJSGFcZAxQf;0m}942=i#p-&teLvE{AKm7Sl2f}Io?!IqbC|J;h z`=5LFOnU5?^w~SV@YwNZx$k_(kLNxZ<T-w9G;`)wdHJoGV2amO-<vG?pZ@XJ#Uo$J zb+q{_L}lvg?U~@|P1*dSegkN;ajNUGhmyA=S^CQ6@p}9uJKGF3&96BmwaXxSvK>DE z3cf08^-rIT_>A$}B%IJBPcN^)4;90BQtiEi!gT#+EqyAUZ|}*b_}R>SGloq&6?opL zuT_+lwQMgg6!Cso$BwUA;k-1NcrzyE>(_X$B0HocjY~=Pk~Q08+N}(|%HjO_i+*=o z%G6C6A30Ch<0UlG;Zdj@ed!rfUY_i9mYwK8(aYuzcUzlTJ1yPz|Bb-9b33A9zRh<? zEh+^J@0OOsX>Gl>Ny-Q<wjX~nWiOR}_^4D)POdKUaI)X<DM%#y>#JAq-+qtI@B@&w z$;PJbyiW=!py@g2hAi0)U1v=;avka`gd@8LC4=BEbNqL&K^UAQ5%r95#x%<j2Twi< zWI28Jof9kY(Ikv>^qRB%KLaqMnG|6xKAm}sx!Q<xJn;TKhAi-lV_zy<;)6u(yxe`r zG8s+nu+7X=I2SJx?KI|R<|o>wo}J=2C;NROi$mfADui4)y(3wVA3k~{j^_5%H)C6K zlYAm1eY**HZOj($)xfKIQFtIVw<YDEZ~5huBx;6h(9UoYDe-u{#QQBex`xo0d_SF- zZ{zr8r-x@oa=@P7G8Gz%Q<2A7_lyD&aeZ-!inR%aZ-5;iEO&XuPoZbZ6OcnjG1hFD z=btAA?MyXPGxhQ_`_b@us-{heIodKJbCj6!H57FlM3sv+z|<{D?1@zfhGGSCy3ZI2 zt4}F|%ocaJQVlIK<}Wp7+&rp6QOq<JYmAuckgc6Zxd{^=DJ9>$4&yvz9>(Crs>Gh{ zya6-FG7Dgi92#K)64=9Csj5?Zqe~_9TwSI!2quAwa1w-*uC5!}xY`?tltb0Hq740< zsq2QelPveZ4chr$=~U3!+c&>xyfvA1`)owOqj=i4wjY=A1577Gwg&Ko7;?il9r|_* z8P&IDV_g2D{in5OLFxsO!kx3AhO$5aKeoM|!q|VokqMlYM@HtsRuMtBY%I35#5$+G zpp|JOeoj^U=95HLemB04Yqv{a8X<^K9G2`&ShM_6&Bi1n?o?@MXsDj9Z*A3>#XK%J zRc*&SlFl>l)9DyRQ{*%Z+^e1XpH?0@vhpXrnPPU*d%vOhKkimm-u<I9o!2{*RVUW0 zkpjTAF;dx9>3c%Q^v3RKp9kx@A2dS?QfS=iigGr7m><)YkV=%LA5h@Uj@9=~ABPMJ z1UE;F&;Ttg5Kc^Qy!1SuvbNEqdgu3*l`=>s5_}dUv$B%BJbMiWrrMm7OXOdi=GOmh zZBvXXK7VqO&zojI2Om9};zCB5i|<210I{iwiGznGCx=FT89=Ef)5!lB1cZ6lbz<Vs z!O6)(KPRgm>gDn07*he}G&w7m!;|E(L-?+<?McI~@TA!vj4RjYnCoT*FH)-pRq74Q z67E9_umMJOIut_@Dx-Z2hEzHqy0(3L!ra}x0phZ^)OD)P*BAJetYupvu9iOfKMRY* z59R&ZxVR$6O$s<?dV};ZTu5t!)CO9!I>cz@0<9Z<nFBx*sw*AzBdboG>I~LqYQE<f zdA084i)nAbA%sHr3I6f)x0A6_C#f|)+7km{+VWc=8p6a>7>HnPA436}oeN2Y(VfG6 zxNZuMK3Crm^Z_AFeHc~CVRrSl0W^?+Gbteu1g8NGYa3(8f*P{(ZT>%!jtSl6WbYVv zmE(37t0C8vJ6O-5+o*lL9XRcFbd~GSBGbGh3~R!67g&l)7n!kJlWd)~TUy<jO~Zhv z@xvBaLkBZ#>Xus#!&G6sR%(l(h1$xyrR5j_jM1zj#giA&@(Xl26@n<9>folx!92bQ z24h<Dc4e3SQJcr^RE3|QaY*5jX?vj3>570+<)4!$!IQ(5yOU|4_E6aN@4v0+{Kx~Z z;q7fp%0cHziuI%!kB~w}g9@V+1wDz0wFlzX2UOvOy|&;e;t!lAR8tV2KQHgtfk8Uf zw;rs!(4JPODERk4ckd5I2Vq|0rd@@Mwd8MID%0^fITjYIQom^q;qhP8@|eJx{?5xX zc1@Fj*kDknlk{c-rnCloQ3hGh7OU+@e<M~mcEvZ$(y*X$K0x5}s~CQD$(YxML3psk zFM|TBc-aWBLjK@0qr{-u^ogBxgUZ2q9fo2sjGh*5M_>fO3>fkRMcM>J?AeVP<Ux|u zIt<28*boJGNgvZU&+HIxSJU@0MMOMk7(|dJT9}B#3C^H5%`@R9`pq2cDNIDmG&|fk z=;qP1KP0X0%WFW{10wdnB1|TJr}_3V9m=|9t1&c+%CUUz+SxZxbB`X)efq{sF+1tq zKf-%4B#;+_1Fv@}nSe1EebC@A=zceZ+9L=HMG!TLs$d<`aVBpK$8UGu%?r!ZUz3ID zw2G?KI8ia%8jnZwySwx2`P0dY`Re&F893$F0%*A8SHESTm@B%nT<YZ$)QN^ti`2>& zlfzX%cdp=N+4S#E*%^=BQ+N`A7C}|k%$|QUn0yI6S3$MS-NjO!4hm55uyju)Q6e!} z*OVO@A#-mfC9Pha6ng((Xl^V7{d+&u+yx)_B1{~t7d5e8L^i4J>;x<7@5;+l7-Gge zf#9diXJ$&v^rbN5V(ee%q0xBMEgS6%qZm7hNUP%G;^J44I!BmI@M*+FWz0!+s;+iQ zU4CuI+27bvNK8v>?7PZnVxB=heJ&_ymE0nN^W#-rqB%+JXkYGDuRw>JM_LdtLkiq* z6%%3&^BX$jnM@2bjiGc-DymKly)wVkA-pq;jSWL#7_*moZZ4I|-N}o8SK?sIv)p|c zu~9-B%tMc=!)YMFp*SiC0>kfnH8+X5>;+FFVN{~a9YVdIg1uGkZ~kegFy{^PU(4{( z`CbY`XmVA3esai686Yw8djCEyF7`bfB^F1)nwv+AqYLZ&Zy=eFhYT2uMd@{sP_qS4 zbJ&>PxajjZt?&c<1^!T|pLHfX=E^FJ>-l_XCZzvRV%x}@u(FtF(mS+Umw<d2c`9Rr zR+?yr(!A0r|CD~t7GFV?aaA(6z5nz_Nm0i$V6I-ucK$u?K&%hkODCkY(1+;DS|bQF zb4mg|54xl}b6Ewc=m`{a+NEN`d1?%=>$e+IA74e>gCdTqi;6&=euAIpxd=Y3I5xWR zBhGoT+T`V1@91OlQ}2YO*~P4ukd*TBBdt?Plt)_ou6Y@Db`ss+Q~A-48s>?eaJYA2 zRGOa8^~Em}EFTmKIVVbMb|ob)hJJ7ITg>yHAn2i|{2ZJU!cwt9YNDT0=*WO7Bq#Xj zg@FjEaKoolrF8%c;49|`IT&25?O$dq<?{UbIQ0;9Tr9TA6pzz%=H>8kp3#la9&6aH z6G|{>^C(>yP7#Dr$aeFyS0Ai_$ILhL43#*mgEl(c*4?Ae;tRL&S7Vc}Szl>B`mBuI zB9Y%xp%CZwlH!3V(`6W4-ZuETssvI&B~_O;CbULfl)X1V%(H7VSPf`_Ka9ak@8A=z z1l|B1QKT}NLI`WVTRd;2En5u{0CRqy9PTi$ja^inu){LJ&E&6W%JJPw#&PaTxpt?k zpC~gjN*22Q8tpGHR|tg~ye#9a8N<%odhZJnk7Oh=(PKfhYfzLAxdE36r<6<oD}e5; zMPsE4+rk0d2jE*#p84SO^!fW~`j-|(WExf+!}WMlI2oGcLeMqZ%ofC97d<+nflE=C zww(j#(;Qr&ut3IEyIwm>a?A;rO&ELp_Y?8Pdw(PT^Fxn!eG_|LEbSYoBrsBA|6Fgr zt5LntyusI{Q2fdy=>ditS;}^B;I2MD4=(>7fWt0Jp~y=?VvfvzHvQhj6dyIef46J$ zl4Xu7U9v_NJV?uBBC0!kcTS0UcrV7+<p(Ba=Bk7*SXvlcpQJatnzmyl-^GA6y=0YH zU!Qp*(5v5`qcU7GH`fZ53mR)&#Os~1d`1FKAc~R?v^F@3sPXWHk(`{v@BF<NgpL1h zOYj$ZQX-EI8H4?Ypq8IMFE`LLGMYNju;D(Aux0jFNCc@>@~is?Fi+jrr@l3XwD|uG zr26jUWiv>Ju48Y<K5Q0UFt#$Wh-3Y^huuiZIhuP~4SRD>^#qn7r9mwIH-<mOw=)2D z<iCzV917q@YTEy}IJiO<?It)?BnA;jg`vU#wb|e4BpbC^HJE}Jh7S%#;t@=RHEzf3 zve@!5mXtmM3~}?iGNYp|t2UDZWtZs+?hWj`+Vz*5E0~r*FRY^QnYC-}Vte5CD38TA z2heFf8>Pv6Y|V|V-GZ&+&gQ?S?-`&ts{@5GXPqbmyZjUACC&oVXfNwUX0}ba(v978 zp8z!v9~8Zx8qB<QXT5I&+92wF0pO{dS4(N<h_+P+tKZn8-IlF)tWr~gMeIiH-&7y0 zvL&hwU_I>@7>oFPDm^iR@+yw`79YF)w^OHB_N;&&x7c3l^3!)IY#)}x)@D(iNaOm9 zC=^*!{`7<aJO;!0Q_GA?kGJMA-q_;pS6#JcnV+|?H`ki8UM3IyaP&Y_Cob&3B{Pk) zm4w3$nw_t--`?`O5&1RGdSO&%Hqq;;K{ebNOqKIk%%SGD!F=%uOt^n7pXHX$w+HIP z8dL)o*Jpb{DXQ+Ru13)nl`bL_X#5zH`D&t|K|2sG@Zx^L{-A|#-X*Z;4E;wV8qs|w zT>={3*S=%iU=KsPXh=DDZcc``Ss>057i{pdW8M@4q+Ba@Tt%OytH!4>rbIbQw^-pR zGGYNPzw@n=PV@)b7yVbFr;glF*Qq3>F9oBN5PUXt!?2mdGcpv^o1?Thp`jP10G2Yi z(c93td3F3SW!Le5DUwdub!aDKoVLU6g!O?Ret21l$qOC;kdd@L#M&baVu&JZGt&<6 z!VCkvgRaav6QDW2x}tUy4~Y5(B+#Ej-8vM?DM-1?J_*&PntI3E96M!`WL#<&Z5n2u z<QPxSVI}f8nvsYEV@sQO)6fswrNtp@sU=8(-b8Mb5P$r8S==I%7kh4B)_n@!DLI2Z z4PP(&9*0`aDCzk=7Hs;qt@l};2A|ee_lp|_XHg@k->o`P!~vBT$YOT~gU9#PB)%JZ zcd_u<u8SkTyW@XV6qrAJ#qjS(2-MC6glNGYe|r3T`ER-;ck$QHoSn3~1RN=RR%nUZ zKf8<#6k1k~H@+pG{73t5FQeCnhxF-1&my@?)3Sx2>=m^LYzC!pH#W`yA1!(fA;D~b zG#73@l)NNd;n#XrKXZEfab;@kQRnOFU2Th-1m<4mJzlj9<frYer6HiQx@?8?NJ2Do zObcl_ecl~1qF&eiOVBk0#ZN-|Dd_D_4Xx*PUVf?)>b3pv-GF$elX7ib9!uILM_$ke zHIGB*&=5=;ynQA{y7H93%i^d)T}y@(p>8vVhJ4L)M{0Q*@D^+SPp`EW+G6E%+`Z;u zS3goV@Dic7vc5`?!pCN4<JvL_48+Q8LQ@>4Ts@*{)zwy)9?B||AM{zKlN4T}qQRL2 zgv+{K8bv7w)#xge16;kI1fU87!W4pX)N&|cq8&i^1r`W|Hg4366r(?-ecEJ9u&Eaw zrhyikXQB>C9d>cpPGiu=VU3Z-u4|0V_iap!_J3o+K_R5EXk@sfu~zHwwYkpncVh!R zqNe7Cmf_|Wmeq4#(mIO&(wCK@b4(x0?W1Qtk(`$?+$uCJCGZm_%k?l32vuShgDFMa ztc`{$8DhB9)&?~(m&EUc=LzI1=qo#zjy#2{hLT_*aj<618qQ7mD#k2ZFGou&69;=2 z1j7=Su8k}{L*h&mfs7jg^PN&9C1Z@U!p6gXk&-7xM~{X<iLOVw!aav*!V=`4l#Z}C z96Cuv>`nqH#aGO`;Xy_zbz^rYacIq0AH%4!Oh93TzJ820%ur)8OyeS@K?sF1V(iFO z37Nnqj1z#1{|v7=_CX`lQA|$<1gtuNMHGNJYp1D_k;WQk-b+T6VmUK(x=bWviOZ~T z|4e%SpuaWLWD?qN2%`S*`P;BQBw(B__wTD6epvGdJ+>DBq2oV<pcqb&6wR<4FA$2v z5~)nCP^#1#txj(+n#>lf&F*lz+#avb4<LeKI6+c0!*aYJO0uGAzkT?h&<)eF9oO@N zFp85j%ZswAo3`tRahjKP+mG|QpZEJg2u4s0CrFBBSdJG&Nmf)%H%!ZRT+a`}C{EHW zFUqQJ+O8kQX<pWCKhEoZ-tYH^5fsA-lA;-w;{{QY6;;y>)3P1c^Mf#olQheVvZ|Z5 z>xXfgmv!5Z^SYn+_x}K5B%G^sRwiez&z9|f!E!#oJlT2k<v)*-8Izce`)2-oo#(W- zoudGWwGo@1CGNHF$IO1;TKoQC#d=r1zr6R{_1!X`9kp|Iknh0E@*R+w*=1K9s{o0$ zk>COV0000$L_|bHBqAarB4TD{W@grX1CUr72@caw0faEd7-K|4L_|cawbojjHdpd6 zI6~Iv5J?-Q4*&oF000000FV;^004t70Z6Qk1Xl<E0000001Beth!e-qIiLWEb%ZLV zlu{~6UVVTb6vR4Bl(ZyCk|ase4n~5DnVFfHdC{Mq``+`wUsuh>{X9oJ{sRC2(cs?- diff --git a/flask_admin/static/bootstrap/bootstrap3/swatch/journal/bootstrap.min.css b/flask_admin/static/bootstrap/bootstrap3/swatch/journal/bootstrap.min.css deleted file mode 100644 index 28ef0c632..000000000 --- a/flask_admin/static/bootstrap/bootstrap3/swatch/journal/bootstrap.min.css +++ /dev/null @@ -1,11 +0,0 @@ -@import url("https://fonts.googleapis.com/css?family=News+Cycle:400,700");/*! - * bootswatch v3.3.5 - * Homepage: http://bootswatch.com - * Copyright 2012-2015 Thomas Park - * Licensed under MIT - * Based on Bootstrap -*//*! - * Bootstrap v3.3.5 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;-webkit-box-shadow:none !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:Georgia,"Times New Roman",Times,serif;font-size:15px;line-height:1.42857143;color:#777777;background-color:#ffffff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#eb6864;text-decoration:none}a:hover,a:focus{color:#e22620;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,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#ffffff;border:1px solid #dddddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:21px;margin-bottom:21px;border:0;border-top:1px solid #eeeeee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"News Cycle","Arial Narrow Bold",sans-serif;font-weight:700;line-height:1.1;color:#000000}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#999999}h1,.h1,h2,.h2,h3,.h3{margin-top:21px;margin-bottom:10.5px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10.5px;margin-bottom:10.5px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:39px}h2,.h2{font-size:32px}h3,.h3{font-size:26px}h4,.h4{font-size:19px}h5,.h5{font-size:15px}h6,.h6{font-size:13px}p{margin:0 0 10.5px}.lead{margin-bottom:21px;font-size:17px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:22.5px}}small,.small{font-size:86%}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#999999}.text-primary{color:#eb6864}a.text-primary:hover,a.text-primary:focus{color:#e53c37}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-danger{color:#b94a48}a.text-danger:hover,a.text-danger:focus{color:#953b39}.bg-primary{color:#fff;background-color:#eb6864}a.bg-primary:hover,a.bg-primary:focus{background-color:#e53c37}.bg-success{background-color:#dff0d8}a.bg-success:hover,a.bg-success:focus{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover,a.bg-info:focus{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover,a.bg-warning:focus{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover,a.bg-danger:focus{background-color:#e4b9b9}.page-header{padding-bottom:9.5px;margin:42px 0 21px;border-bottom:1px solid #eeeeee}ul,ol{margin-top:0;margin-bottom:10.5px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:21px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10.5px 21px;margin:0 0 21px;font-size:18.75px;border-left:5px solid #eeeeee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#999999}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eeeeee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:21px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#ffffff;background-color:#333333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:10px;margin:0 0 10.5px;font-size:14px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333333;background-color:#f5f5f5;border:1px solid #cccccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0%}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0%}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0%}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0%}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#999999;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:21px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #dddddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #dddddd}.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 #dddddd}.table .table{background-color:#ffffff}.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 #dddddd}.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 #dddddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*="col-"]{position:static;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:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15.75px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #dddddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:21px;font-size:22.5px;line-height:inherit;color:#777777;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:9px;font-size:15px;line-height:1.42857143;color:#777777}.form-control{display:block;width:100%;height:39px;padding:8px 12px;font-size:15px;line-height:1.42857143;color:#777777;background-color:#ffffff;background-image:none;border:1px solid #cccccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control::-moz-placeholder{color:#999999;opacity:1}.form-control:-ms-input-placeholder{color:#999999}.form-control::-webkit-input-placeholder{color:#999999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eeeeee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:39px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:31px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:56px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:21px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:9px;padding-bottom:9px;margin-bottom:0;min-height:36px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:31px;padding:5px 10px;font-size:13px;line-height:1.5;border-radius:3px}select.input-sm{height:31px;line-height:31px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:31px;padding:5px 10px;font-size:13px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:31px;line-height:31px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:31px;min-height:34px;padding:6px 10px;font-size:13px;line-height:1.5}.input-lg{height:56px;padding:14px 16px;font-size:19px;line-height:1.3333333;border-radius:6px}select.input-lg{height:56px;line-height:56px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:56px;padding:14px 16px;font-size:19px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:56px;line-height:56px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:56px;min-height:40px;padding:15px 16px;font-size:19px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:48.75px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:39px;height:39px;line-height:39px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:56px;height:56px;line-height:56px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:31px;height:31px;line-height:31px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#468847}.has-success .form-control{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.has-success .input-group-addon{color:#468847;border-color:#468847;background-color:#dff0d8}.has-success .form-control-feedback{color:#468847}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#c09853}.has-warning .form-control{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.has-warning .input-group-addon{color:#c09853;border-color:#c09853;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#c09853}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#b94a48}.has-error .form-control{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.has-error .input-group-addon{color:#b94a48;border-color:#b94a48;background-color:#f2dede}.has-error .form-control-feedback{color:#b94a48}.has-feedback label~.form-control-feedback{top:26px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#b7b7b7}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:9px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:30px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:9px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:19.6666662px;font-size:19px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:13px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:8px 12px;font-size:15px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#ffffff;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#ffffff;background-color:#999999;border-color:#999999}.btn-default:focus,.btn-default.focus{color:#ffffff;background-color:#808080;border-color:#595959}.btn-default:hover{color:#ffffff;background-color:#808080;border-color:#7a7a7a}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#ffffff;background-color:#808080;border-color:#7a7a7a}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#ffffff;background-color:#6e6e6e;border-color:#595959}.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.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:#999999;border-color:#999999}.btn-default .badge{color:#999999;background-color:#ffffff}.btn-primary{color:#ffffff;background-color:#eb6864;border-color:#eb6864}.btn-primary:focus,.btn-primary.focus{color:#ffffff;background-color:#e53c37;border-color:#b81c18}.btn-primary:hover{color:#ffffff;background-color:#e53c37;border-color:#e4332e}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#ffffff;background-color:#e53c37;border-color:#e4332e}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#ffffff;background-color:#dc221c;border-color:#b81c18}.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.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:#eb6864;border-color:#eb6864}.btn-primary .badge{color:#eb6864;background-color:#ffffff}.btn-success{color:#ffffff;background-color:#22b24c;border-color:#22b24c}.btn-success:focus,.btn-success.focus{color:#ffffff;background-color:#1a873a;border-color:#0e471e}.btn-success:hover{color:#ffffff;background-color:#1a873a;border-color:#187f36}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#ffffff;background-color:#1a873a;border-color:#187f36}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#ffffff;background-color:#14692d;border-color:#0e471e}.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.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:#22b24c;border-color:#22b24c}.btn-success .badge{color:#22b24c;background-color:#ffffff}.btn-info{color:#ffffff;background-color:#336699;border-color:#336699}.btn-info:focus,.btn-info.focus{color:#ffffff;background-color:#264c73;border-color:#132639}.btn-info:hover{color:#ffffff;background-color:#264c73;border-color:#24476b}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#ffffff;background-color:#264c73;border-color:#24476b}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#ffffff;background-color:#1d3b58;border-color:#132639}.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.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:#336699;border-color:#336699}.btn-info .badge{color:#336699;background-color:#ffffff}.btn-warning{color:#ffffff;background-color:#f5e625;border-color:#f5e625}.btn-warning:focus,.btn-warning.focus{color:#ffffff;background-color:#ddce0a;border-color:#948a07}.btn-warning:hover{color:#ffffff;background-color:#ddce0a;border-color:#d3c50a}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#ffffff;background-color:#ddce0a;border-color:#d3c50a}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#ffffff;background-color:#bbae09;border-color:#948a07}.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.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:#f5e625;border-color:#f5e625}.btn-warning .badge{color:#f5e625;background-color:#ffffff}.btn-danger{color:#ffffff;background-color:#f57a00;border-color:#f57a00}.btn-danger:focus,.btn-danger.focus{color:#ffffff;background-color:#c26100;border-color:#763b00}.btn-danger:hover{color:#ffffff;background-color:#c26100;border-color:#b85c00}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#ffffff;background-color:#c26100;border-color:#b85c00}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#ffffff;background-color:#9e4f00;border-color:#763b00}.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.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:#f57a00;border-color:#f57a00}.btn-danger .badge{color:#f57a00;background-color:#ffffff}.btn-link{color:#eb6864;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#e22620;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999999;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:14px 16px;font-size:19px;line-height:1.3333333;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:13px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:13px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;-o-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:0.35s;-o-transition-duration:0.35s;transition-duration:0.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:15px;text-align:left;background-color:#ffffff;border:1px solid #cccccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#333333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#ffffff;background-color:#eb6864}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#ffffff;text-decoration:none;outline:0;background-color:#eb6864}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:13px;line-height:1.42857143;color:#999999;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:56px;padding:14px 16px;font-size:19px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:56px;line-height:56px}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:31px;padding:5px 10px;font-size:13px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:31px;line-height:31px}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:8px 12px;font-size:15px;font-weight:normal;line-height:1;color:#777777;text-align:center;background-color:#eeeeee;border:1px solid #cccccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:13px;border-radius:3px}.input-group-addon.input-lg{padding:14px 16px;font-size:19px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eeeeee}.nav>li.disabled>a{color:#999999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999999;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eeeeee;border-color:#eb6864}.nav .nav-divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #dddddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#777777;background-color:#ffffff;border:1px solid #dddddd;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 #dddddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #dddddd;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:#ffffff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#ffffff;background-color:#eb6864}.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 #dddddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #dddddd;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:#ffffff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:60px;margin-bottom:21px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:19.5px 15px;font-size:19px;line-height:21px;height:60px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:13px;margin-bottom:13px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:9.75px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:21px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:21px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:19.5px;padding-bottom:19.5px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:10.5px;margin-bottom:10.5px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:10.5px;margin-bottom:10.5px}.navbar-btn.btn-sm{margin-top:14.5px;margin-bottom:14.5px}.navbar-btn.btn-xs{margin-top:19px;margin-bottom:19px}.navbar-text{margin-top:19.5px;margin-bottom:19.5px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#ffffff;border-color:#eeeeee}.navbar-default .navbar-brand{color:#000000}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#000000;background-color:#eeeeee}.navbar-default .navbar-text{color:#000000}.navbar-default .navbar-nav>li>a{color:#000000}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#000000;background-color:#eeeeee}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#000000;background-color:#eeeeee}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#cccccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#dddddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#dddddd}.navbar-default .navbar-toggle .icon-bar{background-color:#cccccc}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#eeeeee}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#eeeeee;color:#000000}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#000000}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#000000;background-color:#eeeeee}.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:#000000;background-color:#eeeeee}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#cccccc;background-color:transparent}}.navbar-default .navbar-link{color:#000000}.navbar-default .navbar-link:hover{color:#000000}.navbar-default .btn-link{color:#000000}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#000000}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#cccccc}.navbar-inverse{background-color:#eb6864;border-color:#e53c37}.navbar-inverse .navbar-brand{color:#ffffff}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#ffffff;background-color:#e74b47}.navbar-inverse .navbar-text{color:#ffffff}.navbar-inverse .navbar-nav>li>a{color:#ffffff}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#ffffff;background-color:#e74b47}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#ffffff;background-color:#e74b47}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#e53c37}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#e53c37}.navbar-inverse .navbar-toggle .icon-bar{background-color:#ffffff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#e74944}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#e74b47;color:#ffffff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#e53c37}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#e53c37}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#ffffff}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#ffffff;background-color:#e74b47}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#e74b47}.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:#444444;background-color:transparent}}.navbar-inverse .navbar-link{color:#ffffff}.navbar-inverse .navbar-link:hover{color:#ffffff}.navbar-inverse .btn-link{color:#ffffff}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#ffffff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444444}.breadcrumb{padding:8px 15px;margin-bottom:21px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#cccccc}.breadcrumb>.active{color:#999999}.pagination{display:inline-block;padding-left:0;margin:21px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:8px 12px;line-height:1.42857143;text-decoration:none;color:#eb6864;background-color:#ffffff;border:1px solid #dddddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{z-index:3;color:#e22620;background-color:#eeeeee;border-color:#dddddd}.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:#999999;background-color:#f5f5f5;border-color:#dddddd;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:#999999;background-color:#ffffff;border-color:#dddddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:14px 16px;font-size:19px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:13px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:21px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#ffffff;border:1px solid #dddddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eeeeee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999999;background-color:#ffffff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#ffffff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#ffffff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999999}.label-default[href]:hover,.label-default[href]:focus{background-color:#808080}.label-primary{background-color:#eb6864}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#e53c37}.label-success{background-color:#22b24c}.label-success[href]:hover,.label-success[href]:focus{background-color:#1a873a}.label-info{background-color:#336699}.label-info[href]:hover,.label-info[href]:focus{background-color:#264c73}.label-warning{background-color:#f5e625}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ddce0a}.label-danger{background-color:#f57a00}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c26100}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:13px;font-weight:bold;color:#ffffff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#eb6864;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#ffffff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#eb6864;background-color:#ffffff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eeeeee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:23px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:68px}}.thumbnail{display:block;padding:4px;margin-bottom:21px;line-height:1.42857143;background-color:#ffffff;border:1px solid #dddddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#eb6864}.thumbnail .caption{padding:9px;color:#777777}.alert{padding:15px;margin-bottom:21px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#468847}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#356635}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#3a87ad}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#2d6987}.alert-warning{background-color:#fcf8e3;border-color:#fbeed5;color:#c09853}.alert-warning hr{border-top-color:#f8e5be}.alert-warning .alert-link{color:#a47e3c}.alert-danger{background-color:#f2dede;border-color:#eed3d7;color:#b94a48}.alert-danger hr{border-top-color:#e6c1c7}.alert-danger .alert-link{color:#953b39}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:21px;margin-bottom:21px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:13px;line-height:21px;color:#ffffff;text-align:center;background-color:#eb6864;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#22b24c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#336699}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#f5e625}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#f57a00}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#ffffff;border:1px solid #dddddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333333}a.list-group-item:hover,button.list-group-item:hover,a.list-group-item:focus,button.list-group-item:focus{text-decoration:none;color:#555555;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#eeeeee;color:#999999;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#999999}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#ffffff;background-color:#eb6864;border-color:#eb6864}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#ffffff}.list-group-item-success{color:#468847;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#468847}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,button.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:focus{color:#468847;background-color:#d0e9c6}a.list-group-item-success.active,button.list-group-item-success.active,a.list-group-item-success.active:hover,button.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active:focus{color:#fff;background-color:#468847;border-color:#468847}.list-group-item-info{color:#3a87ad;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#3a87ad}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,button.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:focus{color:#3a87ad;background-color:#c4e3f3}a.list-group-item-info.active,button.list-group-item-info.active,a.list-group-item-info.active:hover,button.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active:focus{color:#fff;background-color:#3a87ad;border-color:#3a87ad}.list-group-item-warning{color:#c09853;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#c09853}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,button.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:focus{color:#c09853;background-color:#faf2cc}a.list-group-item-warning.active,button.list-group-item-warning.active,a.list-group-item-warning.active:hover,button.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active:focus{color:#fff;background-color:#c09853;border-color:#c09853}.list-group-item-danger{color:#b94a48;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#b94a48}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,button.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:focus{color:#b94a48;background-color:#ebcccc}a.list-group-item-danger.active,button.list-group-item-danger.active,a.list-group-item-danger.active:hover,button.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active:focus{color:#fff;background-color:#b94a48;border-color:#b94a48}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:21px;background-color:#ffffff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:17px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #dddddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #dddddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:21px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #dddddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #dddddd}.panel-default{border-color:#dddddd}.panel-default>.panel-heading{color:#777777;background-color:#f5f5f5;border-color:#dddddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#dddddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#777777}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#dddddd}.panel-primary{border-color:#eb6864}.panel-primary>.panel-heading{color:#ffffff;background-color:#eb6864;border-color:#eb6864}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#eb6864}.panel-primary>.panel-heading .badge{color:#eb6864;background-color:#ffffff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#eb6864}.panel-success{border-color:#22b24c}.panel-success>.panel-heading{color:#468847;background-color:#22b24c;border-color:#22b24c}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#22b24c}.panel-success>.panel-heading .badge{color:#22b24c;background-color:#468847}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#22b24c}.panel-info{border-color:#336699}.panel-info>.panel-heading{color:#3a87ad;background-color:#336699;border-color:#336699}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#336699}.panel-info>.panel-heading .badge{color:#336699;background-color:#3a87ad}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#336699}.panel-warning{border-color:#f5e625}.panel-warning>.panel-heading{color:#c09853;background-color:#f5e625;border-color:#f5e625}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#f5e625}.panel-warning>.panel-heading .badge{color:#f5e625;background-color:#c09853}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#f5e625}.panel-danger{border-color:#f57a00}.panel-danger>.panel-heading{color:#b94a48;background-color:#f57a00;border-color:#f57a00}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#f57a00}.panel-danger>.panel-heading .badge{color:#f57a00;background-color:#b94a48}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#f57a00}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:22.5px;font-weight:bold;line-height:1;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000000;text-decoration:none;cursor:pointer;opacity:0.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#ffffff;border:1px solid #999999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:0.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{padding:20px;text-align:right;border-top:1px solid #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}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:Georgia,"Times New Roman",Times,serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:13px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:0.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;background-color:#000000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:Georgia,"Times New Roman",Times,serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:15px;background-color:#ffffff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #cccccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:15px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#ffffff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999999;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#ffffff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#ffffff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999999;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#ffffff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:0.5;filter:alpha(opacity=50);font-size:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.5)), to(rgba(0,0,0,0.0001)));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.0001)), to(rgba(0,0,0,0.5)));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #ffffff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#ffffff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}.navbar{font-size:18px;font-family:"News Cycle","Arial Narrow Bold",sans-serif;font-weight:700}.navbar-default .badge{background-color:#000;color:#fff}.navbar-inverse .badge{background-color:#fff;color:#eb6864}.navbar-brand{font-size:inherit;font-weight:700;text-transform:uppercase}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label,.has-warning .form-control-feedback{color:#f57a00}.has-warning .form-control,.has-warning .form-control:focus{border-color:#f57a00}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label,.has-error .form-control-feedback{color:#eb6864}.has-error .form-control,.has-error .form-control:focus{border-color:#eb6864}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label,.has-success .form-control-feedback{color:#22b24c}.has-success .form-control,.has-success .form-control:focus{border-color:#22b24c}.badge{padding-bottom:4px;vertical-align:3px;font-size:10px}.jumbotron h1,.jumbotron h2,.jumbotron h3,.jumbotron h4,.jumbotron h5,.jumbotron h6{font-family:"News Cycle","Arial Narrow Bold",sans-serif;font-weight:700;color:#000}.panel-primary .panel-title,.panel-success .panel-title,.panel-warning .panel-title,.panel-danger .panel-title,.panel-info .panel-title{color:#fff} \ No newline at end of file diff --git a/flask_admin/static/bootstrap/bootstrap3/swatch/lumen/bootstrap.min.css b/flask_admin/static/bootstrap/bootstrap3/swatch/lumen/bootstrap.min.css deleted file mode 100644 index fd97f4113..000000000 --- a/flask_admin/static/bootstrap/bootstrap3/swatch/lumen/bootstrap.min.css +++ /dev/null @@ -1,11 +0,0 @@ -@import url("https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,700,400italic");/*! - * bootswatch v3.3.5 - * Homepage: http://bootswatch.com - * Copyright 2012-2015 Thomas Park - * Licensed under MIT - * Based on Bootstrap -*//*! - * Bootstrap v3.3.5 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;-webkit-box-shadow:none !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Source Sans Pro","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#555555;background-color:#ffffff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#158cba;text-decoration:none}a:hover,a:focus{color:#158cba;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,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:5px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#ffffff;border:1px solid #eeeeee;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eeeeee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:400;line-height:1.1;color:#333333}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#999999}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{background-color:#ff851b;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#999999}.text-primary{color:#158cba}a.text-primary:hover,a.text-primary:focus{color:#106a8c}.text-success{color:#ffffff}a.text-success:hover,a.text-success:focus{color:#e6e6e6}.text-info{color:#ffffff}a.text-info:hover,a.text-info:focus{color:#e6e6e6}.text-warning{color:#ffffff}a.text-warning:hover,a.text-warning:focus{color:#e6e6e6}.text-danger{color:#ffffff}a.text-danger:hover,a.text-danger:focus{color:#e6e6e6}.bg-primary{color:#fff;background-color:#158cba}a.bg-primary:hover,a.bg-primary:focus{background-color:#106a8c}.bg-success{background-color:#28b62c}a.bg-success:hover,a.bg-success:focus{background-color:#1f8c22}.bg-info{background-color:#75caeb}a.bg-info:hover,a.bg-info:focus{background-color:#48b9e5}.bg-warning{background-color:#ff851b}a.bg-warning:hover,a.bg-warning:focus{background-color:#e76b00}.bg-danger{background-color:#ff4136}a.bg-danger:hover,a.bg-danger:focus{background-color:#ff1103}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eeeeee}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;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eeeeee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#999999}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eeeeee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#ffffff;background-color:#333333;border-radius:2px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333333;background-color:#f5f5f5;border:1px solid #cccccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0%}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0%}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0%}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0%}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#999999;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #dddddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #dddddd}.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 #dddddd}.table .table{background-color:#ffffff}.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 #dddddd}.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 #dddddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*="col-"]{position:static;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:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#28b62c}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#23a127}.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:#75caeb}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#5fc1e8}.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:#ff851b}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#ff7701}.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:#ff4136}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ff291c}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #dddddd}.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:#333333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:8px;font-size:14px;line-height:1.42857143;color:#555555}.form-control{display:block;width:100%;height:38px;padding:7px 12px;font-size:14px;line-height:1.42857143;color:#555555;background-color:#ffffff;background-image:none;border:1px solid #e7e7e7;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control::-moz-placeholder{color:#999999;opacity:1}.form-control:-ms-input-placeholder{color:#999999}.form-control::-webkit-input-placeholder{color:#999999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eeeeee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:38px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:28px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:52px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:8px;padding-bottom:8px;margin-bottom:0;min-height:34px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:28px;padding:4px 10px;font-size:12px;line-height:1.5;border-radius:2px}select.input-sm{height:28px;line-height:28px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:28px;padding:4px 10px;font-size:12px;line-height:1.5;border-radius:2px}.form-group-sm select.form-control{height:28px;line-height:28px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:28px;min-height:32px;padding:5px 10px;font-size:12px;line-height:1.5}.input-lg{height:52px;padding:13px 16px;font-size:18px;line-height:1.3333333;border-radius:5px}select.input-lg{height:52px;line-height:52px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:52px;padding:13px 16px;font-size:18px;line-height:1.3333333;border-radius:5px}.form-group-lg select.form-control{height:52px;line-height:52px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:52px;min-height:38px;padding:14px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:47.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:38px;height:38px;line-height:38px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:52px;height:52px;line-height:52px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:28px;height:28px;line-height:28px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#ffffff}.has-success .form-control{border-color:#ffffff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-success .input-group-addon{color:#ffffff;border-color:#ffffff;background-color:#28b62c}.has-success .form-control-feedback{color:#ffffff}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#ffffff}.has-warning .form-control{border-color:#ffffff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-warning .input-group-addon{color:#ffffff;border-color:#ffffff;background-color:#ff851b}.has-warning .form-control-feedback{color:#ffffff}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#ffffff}.has-error .form-control{border-color:#ffffff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-error .input-group-addon{color:#ffffff;border-color:#ffffff;background-color:#ff4136}.has-error .form-control-feedback{color:#ffffff}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#959595}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:8px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:28px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:8px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:18.3333329px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:5px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:7px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#555555;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#555555;background-color:#eeeeee;border-color:#e2e2e2}.btn-default:focus,.btn-default.focus{color:#555555;background-color:#d5d5d5;border-color:#a2a2a2}.btn-default:hover{color:#555555;background-color:#d5d5d5;border-color:#c3c3c3}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#555555;background-color:#d5d5d5;border-color:#c3c3c3}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#555555;background-color:#c3c3c3;border-color:#a2a2a2}.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.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:#eeeeee;border-color:#e2e2e2}.btn-default .badge{color:#eeeeee;background-color:#555555}.btn-primary{color:#ffffff;background-color:#158cba;border-color:#127ba3}.btn-primary:focus,.btn-primary.focus{color:#ffffff;background-color:#106a8c;border-color:#052531}.btn-primary:hover{color:#ffffff;background-color:#106a8c;border-color:#0c516c}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#ffffff;background-color:#106a8c;border-color:#0c516c}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#ffffff;background-color:#0c516c;border-color:#052531}.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.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:#158cba;border-color:#127ba3}.btn-primary .badge{color:#158cba;background-color:#ffffff}.btn-success{color:#ffffff;background-color:#28b62c;border-color:#23a127}.btn-success:focus,.btn-success.focus{color:#ffffff;background-color:#1f8c22;border-color:#0c390e}.btn-success:hover{color:#ffffff;background-color:#1f8c22;border-color:#186f1b}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#ffffff;background-color:#1f8c22;border-color:#186f1b}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#ffffff;background-color:#186f1b;border-color:#0c390e}.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.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:#28b62c;border-color:#23a127}.btn-success .badge{color:#28b62c;background-color:#ffffff}.btn-info{color:#ffffff;background-color:#75caeb;border-color:#5fc1e8}.btn-info:focus,.btn-info.focus{color:#ffffff;background-color:#48b9e5;border-color:#1984ae}.btn-info:hover{color:#ffffff;background-color:#48b9e5;border-color:#29ade0}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#ffffff;background-color:#48b9e5;border-color:#29ade0}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#ffffff;background-color:#29ade0;border-color:#1984ae}.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.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:#75caeb;border-color:#5fc1e8}.btn-info .badge{color:#75caeb;background-color:#ffffff}.btn-warning{color:#ffffff;background-color:#ff851b;border-color:#ff7701}.btn-warning:focus,.btn-warning.focus{color:#ffffff;background-color:#e76b00;border-color:#813c00}.btn-warning:hover{color:#ffffff;background-color:#e76b00;border-color:#c35b00}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#ffffff;background-color:#e76b00;border-color:#c35b00}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#ffffff;background-color:#c35b00;border-color:#813c00}.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.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:#ff851b;border-color:#ff7701}.btn-warning .badge{color:#ff851b;background-color:#ffffff}.btn-danger{color:#ffffff;background-color:#ff4136;border-color:#ff291c}.btn-danger:focus,.btn-danger.focus{color:#ffffff;background-color:#ff1103;border-color:#9c0900}.btn-danger:hover{color:#ffffff;background-color:#ff1103;border-color:#de0c00}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#ffffff;background-color:#ff1103;border-color:#de0c00}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#ffffff;background-color:#de0c00;border-color:#9c0900}.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.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:#ff4136;border-color:#ff291c}.btn-danger .badge{color:#ff4136;background-color:#ffffff}.btn-link{color:#158cba;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#158cba;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999999;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:13px 16px;font-size:18px;line-height:1.3333333;border-radius:5px}.btn-sm,.btn-group-sm>.btn{padding:4px 10px;font-size:12px;line-height:1.5;border-radius:2px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:2px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;-o-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:0.35s;-o-transition-duration:0.35s;transition-duration:0.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#ffffff;border:1px solid #cccccc;border:1px solid #e7e7e7;border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#eeeeee}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#999999;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#333333;background-color:transparent}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#ffffff;text-decoration:none;outline:0;background-color:#158cba}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#eeeeee}.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.42857143;color:#999999;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:52px;padding:13px 16px;font-size:18px;line-height:1.3333333;border-radius:5px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:52px;line-height:52px}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:28px;padding:4px 10px;font-size:12px;line-height:1.5;border-radius:2px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:28px;line-height:28px}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:7px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555555;text-align:center;background-color:#eeeeee;border:1px solid #e7e7e7;border-radius:4px}.input-group-addon.input-sm{padding:4px 10px;font-size:12px;border-radius:2px}.input-group-addon.input-lg{padding:13px 16px;font-size:18px;border-radius:5px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#ffffff}.nav>li.disabled>a{color:#999999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999999;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#ffffff;border-color:#158cba}.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 #e7e7e7}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #e7e7e7}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555555;background-color:#ffffff;border:1px solid #e7e7e7;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 #e7e7e7}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #e7e7e7;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:#ffffff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#ffffff;background-color:#158cba}.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 #e7e7e7}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #e7e7e7;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:#ffffff}}.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{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top: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;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:6px;margin-bottom:6px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:6px;margin-bottom:6px}.navbar-btn.btn-sm{margin-top:11px;margin-bottom:11px}.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}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#333333}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#333333;background-color:transparent}.navbar-default .navbar-text{color:#555555}.navbar-default .navbar-nav>li>a{color:#999999}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#333333;background-color:transparent}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#eeeeee;background-color:transparent}.navbar-default .navbar-toggle{border-color:#eeeeee}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ffffff}.navbar-default .navbar-toggle .icon-bar{background-color:#999999}.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:transparent;color:#333333}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#999999}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333333;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:#333333;background-color:transparent}.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:#eeeeee;background-color:transparent}}.navbar-default .navbar-link{color:#999999}.navbar-default .navbar-link:hover{color:#333333}.navbar-default .btn-link{color:#999999}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#eeeeee}.navbar-inverse{background-color:#ffffff;border-color:#e6e6e6}.navbar-inverse .navbar-brand{color:#999999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#333333;background-color:transparent}.navbar-inverse .navbar-text{color:#999999}.navbar-inverse .navbar-nav>li>a{color:#999999}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#333333;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#333333;background-color:transparent}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#eeeeee;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#eeeeee}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#eeeeee}.navbar-inverse .navbar-toggle .icon-bar{background-color:#999999}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#ededed}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:transparent;color:#333333}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#e6e6e6}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#e6e6e6}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#333333;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:#333333;background-color:transparent}.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:#eeeeee;background-color:transparent}}.navbar-inverse .navbar-link{color:#999999}.navbar-inverse .navbar-link:hover{color:#333333}.navbar-inverse .btn-link{color:#999999}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#333333}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#eeeeee}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#fafafa;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:">\00a0";padding:0 5px;color:#999999}.breadcrumb>.active{color:#999999}.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:7px 12px;line-height:1.42857143;text-decoration:none;color:#555555;background-color:#eeeeee;border:1px solid #e2e2e2;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{z-index:3;color:#555555;background-color:#eeeeee;border-color:#e2e2e2}.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:#ffffff;background-color:#158cba;border-color:#127ba3;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:#999999;background-color:#eeeeee;border-color:#e2e2e2;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:13px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:5px;border-top-left-radius:5px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:5px;border-top-right-radius:5px}.pagination-sm>li>a,.pagination-sm>li>span{padding:4px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:2px;border-top-left-radius:2px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:2px;border-top-right-radius:2px}.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:#eeeeee;border:1px solid #e2e2e2;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eeeeee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999999;background-color:#eeeeee;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#ffffff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#ffffff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999999}.label-default[href]:hover,.label-default[href]:focus{background-color:#808080}.label-primary{background-color:#158cba}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#106a8c}.label-success{background-color:#28b62c}.label-success[href]:hover,.label-success[href]:focus{background-color:#1f8c22}.label-info{background-color:#75caeb}.label-info[href]:hover,.label-info[href]:focus{background-color:#48b9e5}.label-warning{background-color:#ff851b}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#e76b00}.label-danger{background-color:#ff4136}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#ff1103}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:normal;color:#ffffff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#158cba;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#ffffff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#158cba;background-color:#ffffff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#fafafa}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#e1e1e1}.container .jumbotron,.container-fluid .jumbotron{border-radius:5px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#ffffff;border:1px solid #eeeeee;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#158cba}.thumbnail .caption{padding:9px;color:#555555}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#28b62c;border-color:#24a528;color:#ffffff}.alert-success hr{border-top-color:#209023}.alert-success .alert-link{color:#e6e6e6}.alert-info{background-color:#75caeb;border-color:#40b5e3;color:#ffffff}.alert-info hr{border-top-color:#29ade0}.alert-info .alert-link{color:#e6e6e6}.alert-warning{background-color:#ff851b;border-color:#ff7701;color:#ffffff}.alert-warning hr{border-top-color:#e76b00}.alert-warning .alert-link{color:#e6e6e6}.alert-danger{background-color:#ff4136;border-color:#ff1103;color:#ffffff}.alert-danger hr{border-top-color:#e90d00}.alert-danger .alert-link{color:#e6e6e6}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#fafafa;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:20px;color:#ffffff;text-align:center;background-color:#158cba;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#28b62c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#75caeb}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#ff851b}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#ff4136}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#ffffff;border:1px solid #dddddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333333}a.list-group-item:hover,button.list-group-item:hover,a.list-group-item:focus,button.list-group-item:focus{text-decoration:none;color:#555555;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#eeeeee;color:#999999;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#999999}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#ffffff;background-color:#158cba;border-color:#158cba}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#a6dff5}.list-group-item-success{color:#ffffff;background-color:#28b62c}a.list-group-item-success,button.list-group-item-success{color:#ffffff}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,button.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:focus{color:#ffffff;background-color:#23a127}a.list-group-item-success.active,button.list-group-item-success.active,a.list-group-item-success.active:hover,button.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-info{color:#ffffff;background-color:#75caeb}a.list-group-item-info,button.list-group-item-info{color:#ffffff}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,button.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:focus{color:#ffffff;background-color:#5fc1e8}a.list-group-item-info.active,button.list-group-item-info.active,a.list-group-item-info.active:hover,button.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-warning{color:#ffffff;background-color:#ff851b}a.list-group-item-warning,button.list-group-item-warning{color:#ffffff}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,button.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:focus{color:#ffffff;background-color:#ff7701}a.list-group-item-warning.active,button.list-group-item-warning.active,a.list-group-item-warning.active:hover,button.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-danger{color:#ffffff;background-color:#ff4136}a.list-group-item-danger,button.list-group-item-danger{color:#ffffff}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,button.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:focus{color:#ffffff;background-color:#ff291c}a.list-group-item-danger.active,button.list-group-item-danger.active,a.list-group-item-danger.active:hover,button.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#ffffff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid transparent;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #dddddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid transparent}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid transparent}.panel-default{border-color:transparent}.panel-default>.panel-heading{color:#333333;background-color:#f5f5f5;border-color:transparent}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:transparent}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:transparent}.panel-primary{border-color:transparent}.panel-primary>.panel-heading{color:#ffffff;background-color:#158cba;border-color:transparent}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:transparent}.panel-primary>.panel-heading .badge{color:#158cba;background-color:#ffffff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:transparent}.panel-success{border-color:transparent}.panel-success>.panel-heading{color:#ffffff;background-color:#28b62c;border-color:transparent}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:transparent}.panel-success>.panel-heading .badge{color:#28b62c;background-color:#ffffff}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:transparent}.panel-info{border-color:transparent}.panel-info>.panel-heading{color:#ffffff;background-color:#75caeb;border-color:transparent}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:transparent}.panel-info>.panel-heading .badge{color:#75caeb;background-color:#ffffff}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:transparent}.panel-warning{border-color:transparent}.panel-warning>.panel-heading{color:#ffffff;background-color:#ff851b;border-color:transparent}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:transparent}.panel-warning>.panel-heading .badge{color:#ff851b;background-color:#ffffff}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:transparent}.panel-danger{border-color:transparent}.panel-danger>.panel-heading{color:#ffffff;background-color:#ff4136;border-color:transparent}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:transparent}.panel-danger>.panel-heading .badge{color:#ff4136;background-color:#ffffff}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:transparent}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#fafafa;border:1px solid #e8e8e8;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:5px}.well-sm{padding:9px;border-radius:2px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#ffffff;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#ffffff;text-decoration:none;cursor:pointer;opacity:0.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#ffffff;border:1px solid #999999;border:1px solid rgba(0,0,0,0.2);border-radius:5px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:0.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{padding:20px;text-align:right;border-top:1px solid #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}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Source Sans Pro","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:12px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:0.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;background-color:#000000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Source Sans Pro","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:14px;background-color:#ffffff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #cccccc;border:1px solid rgba(0,0,0,0.2);border-radius:5px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:4px 4px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#ffffff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999999;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#ffffff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#ffffff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999999;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#ffffff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:0.5;filter:alpha(opacity=50);font-size:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.5)), to(rgba(0,0,0,0.0001)));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.0001)), to(rgba(0,0,0,0.5)));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #ffffff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#ffffff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}.navbar{border-width:0 1px 4px 1px}.btn{padding:9px 12px 7px;border-width:0 1px 4px 1px;font-size:12px;font-weight:bold;text-transform:uppercase}.btn:hover{margin-top:1px;border-bottom-width:3px}.btn:active{margin-top:2px;border-bottom-width:2px;-webkit-box-shadow:none;box-shadow:none}.btn-lg,.btn-group-lg>.btn{padding:15px 16px 13px;line-height:15px}.btn-sm,.btn-group-sm>.btn{padding:6px 10px 4px}.btn-xs,.btn-group-xs>.btn{padding:3px 5px 1px}.btn-default:hover,.btn-default:focus,.btn-group.open .dropdown-toggle.btn-default{background-color:#eeeeee;border-color:#e2e2e2}.btn-primary:hover,.btn-primary:focus,.btn-group.open .dropdown-toggle.btn-primary{background-color:#158cba;border-color:#127ba3}.btn-success:hover,.btn-success:focus,.btn-group.open .dropdown-toggle.btn-success{background-color:#28b62c;border-color:#23a127}.btn-info:hover,.btn-info:focus,.btn-group.open .dropdown-toggle.btn-info{background-color:#75caeb;border-color:#5fc1e8}.btn-warning:hover,.btn-warning:focus,.btn-group.open .dropdown-toggle.btn-warning{background-color:#ff851b;border-color:#ff7701}.btn-danger:hover,.btn-danger:focus,.btn-group.open .dropdown-toggle.btn-danger{background-color:#ff4136;border-color:#ff291c}.btn-group.open .dropdown-toggle{-webkit-box-shadow:none;box-shadow:none}.navbar-btn:hover{margin-top:8px}.navbar-btn:active{margin-top:9px}.navbar-btn.btn-sm:hover{margin-top:11px}.navbar-btn.btn-sm:active{margin-top:12px}.navbar-btn.btn-xs:hover{margin-top:15px}.navbar-btn.btn-xs:active{margin-top:16px}.btn-group-vertical .btn+.btn:hover{border-top-width:1px}.btn-group-vertical .btn+.btn:active{border-top-width:2px}.text-primary,.text-primary:hover{color:#158cba}.text-success,.text-success:hover{color:#28b62c}.text-danger,.text-danger:hover{color:#ff4136}.text-warning,.text-warning:hover{color:#ff851b}.text-info,.text-info:hover{color:#75caeb}table a:not(.btn),.table a:not(.btn){text-decoration:underline}table .dropdown-menu a,.table .dropdown-menu a{text-decoration:none}table .success,.table .success,table .warning,.table .warning,table .danger,.table .danger,table .info,.table .info{color:#fff}table .success a:not(.btn),.table .success a:not(.btn),table .warning a:not(.btn),.table .warning a:not(.btn),table .danger a:not(.btn),.table .danger a:not(.btn),table .info a:not(.btn),.table .info a:not(.btn){color:#fff}table>thead>tr>th,.table>thead>tr>th,table>tbody>tr>th,.table>tbody>tr>th,table>tfoot>tr>th,.table>tfoot>tr>th,table>thead>tr>td,.table>thead>tr>td,table>tbody>tr>td,.table>tbody>tr>td,table>tfoot>tr>td,.table>tfoot>tr>td{border-color:transparent}.form-control{-webkit-box-shadow:inset 0 2px 0 rgba(0,0,0,0.075);box-shadow:inset 0 2px 0 rgba(0,0,0,0.075)}label{font-weight:normal}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label,.has-warning .form-control-feedback{color:#ff851b}.has-warning .form-control,.has-warning .form-control:focus{border:1px solid #ff851b;-webkit-box-shadow:inset 0 2px 0 rgba(0,0,0,0.075);box-shadow:inset 0 2px 0 rgba(0,0,0,0.075)}.has-warning .input-group-addon{border:1px solid #ff851b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label,.has-error .form-control-feedback{color:#ff4136}.has-error .form-control,.has-error .form-control:focus{border:1px solid #ff4136;-webkit-box-shadow:inset 0 2px 0 rgba(0,0,0,0.075);box-shadow:inset 0 2px 0 rgba(0,0,0,0.075)}.has-error .input-group-addon{border:1px solid #ff4136}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label,.has-success .form-control-feedback{color:#28b62c}.has-success .form-control,.has-success .form-control:focus{border:1px solid #28b62c;-webkit-box-shadow:inset 0 2px 0 rgba(0,0,0,0.075);box-shadow:inset 0 2px 0 rgba(0,0,0,0.075)}.has-success .input-group-addon{border:1px solid #28b62c}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{border-color:transparent}.nav-tabs>li>a{margin-top:6px;border-color:#e7e7e7;color:#333333;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus,.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus,.nav-tabs .open>a,.nav-tabs .open>a:hover,.nav-tabs .open>a:focus{padding-bottom:16px;margin-top:0}.nav-tabs .open>a,.nav-tabs .open>a:hover,.nav-tabs .open>a:focus{border-color:#e7e7e7}.nav-tabs>li.disabled>a:hover,.nav-tabs>li.disabled>a:focus{padding-top:10px;padding-bottom:10px;margin-top:6px}.nav-tabs.nav-justified>li{vertical-align:bottom}.dropdown-menu{margin-top:0;border-width:0 1px 4px 1px;border-top-width:1px;-webkit-box-shadow:none;box-shadow:none}.breadcrumb{border-color:#ededed;border-style:solid;border-width:0 1px 4px 1px}.pagination>li>a,.pager>li>a,.pagination>li>span,.pager>li>span{position:relative;top:0;border-width:0 1px 4px 1px;color:#555555;font-size:12px;font-weight:bold;text-transform:uppercase}.pagination>li>a:hover,.pager>li>a:hover,.pagination>li>span:hover,.pager>li>span:hover{top:1px;border-bottom-width:3px}.pagination>li>a:active,.pager>li>a:active,.pagination>li>span:active,.pager>li>span:active{top:2px;border-bottom-width:2px}.pagination>.disabled>a:hover,.pager>.disabled>a:hover,.pagination>.disabled>span:hover,.pager>.disabled>span:hover{top:0;border-width:0 1px 4px 1px}.pagination>.disabled>a:active,.pager>.disabled>a:active,.pagination>.disabled>span:active,.pager>.disabled>span:active{top:0;border-width:0 1px 4px 1px}.pager>li>a,.pager>li>span,.pager>.disabled>a,.pager>.disabled>span,.pager>li>a:hover,.pager>li>span:hover,.pager>.disabled>a:hover,.pager>.disabled>span:hover,.pager>li>a:active,.pager>li>span:active,.pager>.disabled>a:active,.pager>.disabled>span:active{border-left-width:2px;border-right-width:2px}.close{color:#fff;text-decoration:none;opacity:0.4}.close:hover,.close:focus{color:#fff;opacity:1}.alert{border-width:0 1px 4px 1px}.alert .alert-link{font-weight:normal;color:#fff;text-decoration:underline}.label{font-weight:normal}.progress{border:1px solid #e7e7e7;-webkit-box-shadow:inset 0 2px 0 rgba(0,0,0,0.1);box-shadow:inset 0 2px 0 rgba(0,0,0,0.1)}.progress-bar{-webkit-box-shadow:inset 0 -4px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -4px 0 rgba(0,0,0,0.15)}.well{border:1px solid #e7e7e7;-webkit-box-shadow:inset 0 2px 0 rgba(0,0,0,0.05);box-shadow:inset 0 2px 0 rgba(0,0,0,0.05)}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{border-color:#dddddd}a.list-group-item-success.active{background-color:#28b62c}a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{background-color:#23a127}a.list-group-item-warning.active{background-color:#ff851b}a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{background-color:#ff7701}a.list-group-item-danger.active{background-color:#ff4136}a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{background-color:#ff291c}.jumbotron{border:1px solid #e7e7e7;-webkit-box-shadow:inset 0 2px 0 rgba(0,0,0,0.05);box-shadow:inset 0 2px 0 rgba(0,0,0,0.05)}.panel{border:1px solid #e7e7e7;border-width:0 1px 4px 1px}.panel-default .close{color:#555555}.modal .close{color:#555555}.popover{color:#555555} \ No newline at end of file diff --git a/flask_admin/static/bootstrap/bootstrap3/swatch/paper/bootstrap.min.css b/flask_admin/static/bootstrap/bootstrap3/swatch/paper/bootstrap.min.css deleted file mode 100644 index 6c7ef82b7..000000000 --- a/flask_admin/static/bootstrap/bootstrap3/swatch/paper/bootstrap.min.css +++ /dev/null @@ -1,11 +0,0 @@ -@import url("https://fonts.googleapis.com/css?family=Roboto:300,400,500,700");/*! - * bootswatch v3.3.5 - * Homepage: http://bootswatch.com - * Copyright 2012-2015 Thomas Park - * Licensed under MIT - * Based on Bootstrap -*//*! - * Bootstrap v3.3.5 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;-webkit-box-shadow:none !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:1.846;color:#666666;background-color:#ffffff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#2196f3;text-decoration:none}a:hover,a:focus{color:#0a6ebd;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,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:3px}.img-thumbnail{padding:4px;line-height:1.846;background-color:#ffffff;border:1px solid #dddddd;border-radius:3px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:23px;margin-bottom:23px;border:0;border-top:1px solid #eeeeee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:400;line-height:1.1;color:#444444}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#bbbbbb}h1,.h1,h2,.h2,h3,.h3{margin-top:23px;margin-bottom:11.5px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:11.5px;margin-bottom:11.5px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:56px}h2,.h2{font-size:45px}h3,.h3{font-size:34px}h4,.h4{font-size:24px}h5,.h5{font-size:20px}h6,.h6{font-size:14px}p{margin:0 0 11.5px}.lead{margin-bottom:23px;font-size:14px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:19.5px}}small,.small{font-size:92%}mark,.mark{background-color:#ffe0b2;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#bbbbbb}.text-primary{color:#2196f3}a.text-primary:hover,a.text-primary:focus{color:#0c7cd5}.text-success{color:#4caf50}a.text-success:hover,a.text-success:focus{color:#3d8b40}.text-info{color:#9c27b0}a.text-info:hover,a.text-info:focus{color:#771e86}.text-warning{color:#ff9800}a.text-warning:hover,a.text-warning:focus{color:#cc7a00}.text-danger{color:#e51c23}a.text-danger:hover,a.text-danger:focus{color:#b9151b}.bg-primary{color:#fff;background-color:#2196f3}a.bg-primary:hover,a.bg-primary:focus{background-color:#0c7cd5}.bg-success{background-color:#dff0d8}a.bg-success:hover,a.bg-success:focus{background-color:#c1e2b3}.bg-info{background-color:#e1bee7}a.bg-info:hover,a.bg-info:focus{background-color:#d099d9}.bg-warning{background-color:#ffe0b2}a.bg-warning:hover,a.bg-warning:focus{background-color:#ffcb7f}.bg-danger{background-color:#f9bdbb}a.bg-danger:hover,a.bg-danger:focus{background-color:#f5908c}.page-header{padding-bottom:10.5px;margin:46px 0 23px;border-bottom:1px solid #eeeeee}ul,ol{margin-top:0;margin-bottom:11.5px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:23px}dt,dd{line-height:1.846}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #bbbbbb}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:11.5px 23px;margin:0 0 23px;font-size:16.25px;border-left:5px solid #eeeeee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.846;color:#bbbbbb}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eeeeee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:23px;font-style:normal;line-height:1.846}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:3px}kbd{padding:2px 4px;font-size:90%;color:#ffffff;background-color:#333333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:11px;margin:0 0 11.5px;font-size:12px;line-height:1.846;word-break:break-all;word-wrap:break-word;color:#212121;background-color:#f5f5f5;border:1px solid #cccccc;border-radius:3px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0%}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0%}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0%}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0%}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#bbbbbb;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:23px}.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.846;vertical-align:top;border-top:1px solid #dddddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #dddddd}.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 #dddddd}.table .table{background-color:#ffffff}.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 #dddddd}.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 #dddddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*="col-"]{position:static;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:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#e1bee7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#d8abe0}.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:#ffe0b2}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#ffd699}.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:#f9bdbb}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#f7a6a4}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:17.25px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #dddddd}.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:23px;font-size:19.5px;line-height:inherit;color:#212121;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:13px;line-height:1.846;color:#666666}.form-control{display:block;width:100%;height:37px;padding:6px 16px;font-size:13px;line-height:1.846;color:#666666;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:3px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control::-moz-placeholder{color:#bbbbbb;opacity:1}.form-control:-ms-input-placeholder{color:#bbbbbb}.form-control::-webkit-input-placeholder{color:#bbbbbb}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:transparent;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:37px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:45px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:23px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0;min-height:36px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:35px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:45px;padding:10px 16px;font-size:17px;line-height:1.3333333;border-radius:3px}select.input-lg{height:45px;line-height:45px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:45px;padding:10px 16px;font-size:17px;line-height:1.3333333;border-radius:3px}.form-group-lg select.form-control{height:45px;line-height:45px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:45px;min-height:40px;padding:11px 16px;font-size:17px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:46.25px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:37px;height:37px;line-height:37px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:45px;height:45px;line-height:45px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#4caf50}.has-success .form-control{border-color:#4caf50;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#3d8b40;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #92cf94;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #92cf94}.has-success .input-group-addon{color:#4caf50;border-color:#4caf50;background-color:#dff0d8}.has-success .form-control-feedback{color:#4caf50}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#ff9800}.has-warning .form-control{border-color:#ff9800;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#cc7a00;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffc166;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ffc166}.has-warning .input-group-addon{color:#ff9800;border-color:#ff9800;background-color:#ffe0b2}.has-warning .form-control-feedback{color:#ff9800}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#e51c23}.has-error .form-control{border-color:#e51c23;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#b9151b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ef787c;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ef787c}.has-error .input-group-addon{color:#e51c23;border-color:#e51c23;background-color:#f9bdbb}.has-error .form-control-feedback{color:#e51c23}.has-feedback label~.form-control-feedback{top:28px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#a6a6a6}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:30px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.333333px;font-size:17px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 16px;font-size:13px;line-height:1.846;border-radius:3px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#444444;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#444444;background-color:#ffffff;border-color:transparent}.btn-default:focus,.btn-default.focus{color:#444444;background-color:#e6e6e6;border-color:rgba(0,0,0,0)}.btn-default:hover{color:#444444;background-color:#e6e6e6;border-color:rgba(0,0,0,0)}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#444444;background-color:#e6e6e6;border-color:rgba(0,0,0,0)}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#444444;background-color:#d4d4d4;border-color:rgba(0,0,0,0)}.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.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:#ffffff;border-color:transparent}.btn-default .badge{color:#ffffff;background-color:#444444}.btn-primary{color:#ffffff;background-color:#2196f3;border-color:transparent}.btn-primary:focus,.btn-primary.focus{color:#ffffff;background-color:#0c7cd5;border-color:rgba(0,0,0,0)}.btn-primary:hover{color:#ffffff;background-color:#0c7cd5;border-color:rgba(0,0,0,0)}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#ffffff;background-color:#0c7cd5;border-color:rgba(0,0,0,0)}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#ffffff;background-color:#0a68b4;border-color:rgba(0,0,0,0)}.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.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:#2196f3;border-color:transparent}.btn-primary .badge{color:#2196f3;background-color:#ffffff}.btn-success{color:#ffffff;background-color:#4caf50;border-color:transparent}.btn-success:focus,.btn-success.focus{color:#ffffff;background-color:#3d8b40;border-color:rgba(0,0,0,0)}.btn-success:hover{color:#ffffff;background-color:#3d8b40;border-color:rgba(0,0,0,0)}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#ffffff;background-color:#3d8b40;border-color:rgba(0,0,0,0)}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#ffffff;background-color:#327334;border-color:rgba(0,0,0,0)}.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.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:#4caf50;border-color:transparent}.btn-success .badge{color:#4caf50;background-color:#ffffff}.btn-info{color:#ffffff;background-color:#9c27b0;border-color:transparent}.btn-info:focus,.btn-info.focus{color:#ffffff;background-color:#771e86;border-color:rgba(0,0,0,0)}.btn-info:hover{color:#ffffff;background-color:#771e86;border-color:rgba(0,0,0,0)}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#ffffff;background-color:#771e86;border-color:rgba(0,0,0,0)}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#ffffff;background-color:#5d1769;border-color:rgba(0,0,0,0)}.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.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:#9c27b0;border-color:transparent}.btn-info .badge{color:#9c27b0;background-color:#ffffff}.btn-warning{color:#ffffff;background-color:#ff9800;border-color:transparent}.btn-warning:focus,.btn-warning.focus{color:#ffffff;background-color:#cc7a00;border-color:rgba(0,0,0,0)}.btn-warning:hover{color:#ffffff;background-color:#cc7a00;border-color:rgba(0,0,0,0)}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#ffffff;background-color:#cc7a00;border-color:rgba(0,0,0,0)}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#ffffff;background-color:#a86400;border-color:rgba(0,0,0,0)}.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.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:#ff9800;border-color:transparent}.btn-warning .badge{color:#ff9800;background-color:#ffffff}.btn-danger{color:#ffffff;background-color:#e51c23;border-color:transparent}.btn-danger:focus,.btn-danger.focus{color:#ffffff;background-color:#b9151b;border-color:rgba(0,0,0,0)}.btn-danger:hover{color:#ffffff;background-color:#b9151b;border-color:rgba(0,0,0,0)}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#ffffff;background-color:#b9151b;border-color:rgba(0,0,0,0)}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#ffffff;background-color:#991216;border-color:rgba(0,0,0,0)}.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.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:#e51c23;border-color:transparent}.btn-danger .badge{color:#e51c23;background-color:#ffffff}.btn-link{color:#2196f3;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#0a6ebd;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:#bbbbbb;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:17px;line-height:1.3333333;border-radius:3px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;-o-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:0.35s;-o-transition-duration:0.35s;transition-duration:0.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:13px;text-align:left;background-color:#ffffff;border:1px solid #cccccc;border:1px solid rgba(0,0,0,0.15);border-radius:3px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:10.5px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.846;color:#666666;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#141414;background-color:#eeeeee}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#ffffff;text-decoration:none;outline:0;background-color:#2196f3}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#bbbbbb}.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.846;color:#bbbbbb;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:3px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:3px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:45px;padding:10px 16px;font-size:17px;line-height:1.3333333;border-radius:3px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:45px;line-height:45px}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 16px;font-size:13px;font-weight:normal;line-height:1;color:#666666;text-align:center;background-color:transparent;border:1px solid transparent;border-radius:3px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:17px;border-radius:3px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eeeeee}.nav>li.disabled>a{color:#bbbbbb}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#bbbbbb;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eeeeee;border-color:#2196f3}.nav .nav-divider{height:1px;margin:10.5px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid transparent}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.846;border:1px solid transparent;border-radius:3px 3px 0 0}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee transparent}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#666666;background-color:transparent;border:1px solid transparent;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:3px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid transparent}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid transparent;border-radius:3px 3px 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:#ffffff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:3px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#ffffff;background-color:#2196f3}.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:3px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid transparent}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid transparent;border-radius:3px 3px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#ffffff}}.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:64px;margin-bottom:23px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:3px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:20.5px 15px;font-size:17px;line-height:23px;height:64px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:15px;margin-bottom:15px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:3px}.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:10.25px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:23px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:23px}.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:20.5px;padding-bottom:20.5px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:13.5px;margin-bottom:13.5px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:3px;border-top-left-radius:3px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:13.5px;margin-bottom:13.5px}.navbar-btn.btn-sm{margin-top:17px;margin-bottom:17px}.navbar-btn.btn-xs{margin-top:21px;margin-bottom:21px}.navbar-text{margin-top:20.5px;margin-bottom:20.5px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#ffffff;border-color:transparent}.navbar-default .navbar-brand{color:#666666}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#212121;background-color:transparent}.navbar-default .navbar-text{color:#bbbbbb}.navbar-default .navbar-nav>li>a{color:#666666}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#212121;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#212121;background-color:#eeeeee}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#cccccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:transparent}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:transparent}.navbar-default .navbar-toggle .icon-bar{background-color:rgba(0,0,0,0.5)}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:transparent}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#eeeeee;color:#212121}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#666666}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#212121;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:#212121;background-color:#eeeeee}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#cccccc;background-color:transparent}}.navbar-default .navbar-link{color:#666666}.navbar-default .navbar-link:hover{color:#212121}.navbar-default .btn-link{color:#666666}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#212121}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#cccccc}.navbar-inverse{background-color:#2196f3;border-color:transparent}.navbar-inverse .navbar-brand{color:#b2dbfb}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#ffffff;background-color:transparent}.navbar-inverse .navbar-text{color:#bbbbbb}.navbar-inverse .navbar-nav>li>a{color:#b2dbfb}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#ffffff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#ffffff;background-color:#0c7cd5}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:transparent}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:transparent}.navbar-inverse .navbar-toggle .icon-bar{background-color:rgba(0,0,0,0.5)}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#0c84e4}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#0c7cd5;color:#ffffff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#b2dbfb}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#ffffff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#0c7cd5}.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:#444444;background-color:transparent}}.navbar-inverse .navbar-link{color:#b2dbfb}.navbar-inverse .navbar-link:hover{color:#ffffff}.navbar-inverse .btn-link{color:#b2dbfb}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#ffffff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444444}.breadcrumb{padding:8px 15px;margin-bottom:23px;list-style:none;background-color:#f5f5f5;border-radius:3px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#cccccc}.breadcrumb>.active{color:#bbbbbb}.pagination{display:inline-block;padding-left:0;margin:23px 0;border-radius:3px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 16px;line-height:1.846;text-decoration:none;color:#2196f3;background-color:#ffffff;border:1px solid #dddddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{z-index:3;color:#0a6ebd;background-color:#eeeeee;border-color:#dddddd}.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:#ffffff;background-color:#2196f3;border-color:#2196f3;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:#bbbbbb;background-color:#ffffff;border-color:#dddddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:17px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-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:23px 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:#ffffff;border:1px solid #dddddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eeeeee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#bbbbbb;background-color:#ffffff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#ffffff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#ffffff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#bbbbbb}.label-default[href]:hover,.label-default[href]:focus{background-color:#a2a2a2}.label-primary{background-color:#2196f3}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#0c7cd5}.label-success{background-color:#4caf50}.label-success[href]:hover,.label-success[href]:focus{background-color:#3d8b40}.label-info{background-color:#9c27b0}.label-info[href]:hover,.label-info[href]:focus{background-color:#771e86}.label-warning{background-color:#ff9800}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#cc7a00}.label-danger{background-color:#e51c23}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#b9151b}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:normal;color:#ffffff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#bbbbbb;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#ffffff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#2196f3;background-color:#ffffff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#f9f9f9}.jumbotron h1,.jumbotron .h1{color:#444444}.jumbotron p{margin-bottom:15px;font-size:20px;font-weight:200}.jumbotron>hr{border-top-color:#e0e0e0}.container .jumbotron,.container-fluid .jumbotron{border-radius:3px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:59px}}.thumbnail{display:block;padding:4px;margin-bottom:23px;line-height:1.846;background-color:#ffffff;border:1px solid #dddddd;border-radius:3px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#2196f3}.thumbnail .caption{padding:9px;color:#666666}.alert{padding:15px;margin-bottom:23px;border:1px solid transparent;border-radius:3px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#4caf50}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#3d8b40}.alert-info{background-color:#e1bee7;border-color:#cba4dd;color:#9c27b0}.alert-info hr{border-top-color:#c191d6}.alert-info .alert-link{color:#771e86}.alert-warning{background-color:#ffe0b2;border-color:#ffc599;color:#ff9800}.alert-warning hr{border-top-color:#ffb67f}.alert-warning .alert-link{color:#cc7a00}.alert-danger{background-color:#f9bdbb;border-color:#f7a4af;color:#e51c23}.alert-danger hr{border-top-color:#f58c9a}.alert-danger .alert-link{color:#b9151b}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:23px;margin-bottom:23px;background-color:#f5f5f5;border-radius:3px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:23px;color:#ffffff;text-align:center;background-color:#2196f3;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#4caf50}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#9c27b0}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#ff9800}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#e51c23}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#ffffff;border:1px solid #dddddd}.list-group-item:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}a.list-group-item,button.list-group-item{color:#555555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333333}a.list-group-item:hover,button.list-group-item:hover,a.list-group-item:focus,button.list-group-item:focus{text-decoration:none;color:#555555;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#eeeeee;color:#bbbbbb;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#bbbbbb}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#ffffff;background-color:#2196f3;border-color:#2196f3}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#e3f2fd}.list-group-item-success{color:#4caf50;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#4caf50}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,button.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:focus{color:#4caf50;background-color:#d0e9c6}a.list-group-item-success.active,button.list-group-item-success.active,a.list-group-item-success.active:hover,button.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active:focus{color:#fff;background-color:#4caf50;border-color:#4caf50}.list-group-item-info{color:#9c27b0;background-color:#e1bee7}a.list-group-item-info,button.list-group-item-info{color:#9c27b0}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,button.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:focus{color:#9c27b0;background-color:#d8abe0}a.list-group-item-info.active,button.list-group-item-info.active,a.list-group-item-info.active:hover,button.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active:focus{color:#fff;background-color:#9c27b0;border-color:#9c27b0}.list-group-item-warning{color:#ff9800;background-color:#ffe0b2}a.list-group-item-warning,button.list-group-item-warning{color:#ff9800}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,button.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:focus{color:#ff9800;background-color:#ffd699}a.list-group-item-warning.active,button.list-group-item-warning.active,a.list-group-item-warning.active:hover,button.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active:focus{color:#fff;background-color:#ff9800;border-color:#ff9800}.list-group-item-danger{color:#e51c23;background-color:#f9bdbb}a.list-group-item-danger,button.list-group-item-danger{color:#e51c23}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,button.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:focus{color:#e51c23;background-color:#f7a6a4}a.list-group-item-danger.active,button.list-group-item-danger.active,a.list-group-item-danger.active:hover,button.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active:focus{color:#fff;background-color:#e51c23;border-color:#e51c23}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:23px;background-color:#ffffff;border:1px solid transparent;border-radius:3px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:2px;border-top-left-radius:2px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:15px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #dddddd;border-bottom-right-radius:2px;border-bottom-left-radius:2px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:2px;border-top-left-radius:2px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:2px;border-bottom-left-radius:2px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:2px;border-top-left-radius:2px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.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:2px}.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:2px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:2px;border-bottom-left-radius:2px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:2px;border-bottom-right-radius:2px}.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:2px}.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:2px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #dddddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:23px}.panel-group .panel{margin-bottom:0;border-radius:3px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #dddddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #dddddd}.panel-default{border-color:#dddddd}.panel-default>.panel-heading{color:#212121;background-color:#f5f5f5;border-color:#dddddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#dddddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#212121}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#dddddd}.panel-primary{border-color:#2196f3}.panel-primary>.panel-heading{color:#ffffff;background-color:#2196f3;border-color:#2196f3}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#2196f3}.panel-primary>.panel-heading .badge{color:#2196f3;background-color:#ffffff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#2196f3}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#ffffff;background-color:#4caf50;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#4caf50;background-color:#ffffff}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#cba4dd}.panel-info>.panel-heading{color:#ffffff;background-color:#9c27b0;border-color:#cba4dd}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#cba4dd}.panel-info>.panel-heading .badge{color:#9c27b0;background-color:#ffffff}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#cba4dd}.panel-warning{border-color:#ffc599}.panel-warning>.panel-heading{color:#ffffff;background-color:#ff9800;border-color:#ffc599}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ffc599}.panel-warning>.panel-heading .badge{color:#ff9800;background-color:#ffffff}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ffc599}.panel-danger{border-color:#f7a4af}.panel-danger>.panel-heading{color:#ffffff;background-color:#e51c23;border-color:#f7a4af}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#f7a4af}.panel-danger>.panel-heading .badge{color:#e51c23;background-color:#ffffff}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#f7a4af}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f9f9f9;border:1px solid transparent;border-radius:3px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:3px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:19.5px;font-weight:normal;line-height:1;color:#000000;text-shadow:none;opacity:0.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000000;text-decoration:none;cursor:pointer;opacity:0.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#ffffff;border:1px solid #999999;border:1px solid transparent;border-radius:3px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:0.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid transparent;min-height:16.846px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.846}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid transparent}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.846;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:12px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:0.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;background-color:#727272;border-radius:3px}.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:#727272}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#727272}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#727272}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#727272}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#727272}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#727272}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#727272}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#727272}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.846;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:13px;background-color:#ffffff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid transparent;border-radius:3px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:13px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:2px 2px 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:rgba(0,0,0,0);border-top-color:rgba(0,0,0,0.075);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#ffffff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:rgba(0,0,0,0);border-right-color:rgba(0,0,0,0.075)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#ffffff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:rgba(0,0,0,0);border-bottom-color:rgba(0,0,0,0.075);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#ffffff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:rgba(0,0,0,0);border-left-color:rgba(0,0,0,0.075)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#ffffff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:0.5;filter:alpha(opacity=50);font-size:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.5)), to(rgba(0,0,0,0.0001)));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.0001)), to(rgba(0,0,0,0.5)));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #ffffff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#ffffff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}.navbar{border:none;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.3);box-shadow:0 1px 2px rgba(0,0,0,0.3)}.navbar-brand{font-size:24px}.navbar-inverse .form-control{color:#fff}.navbar-inverse .form-control::-moz-placeholder{color:#b2dbfb;opacity:1}.navbar-inverse .form-control:-ms-input-placeholder{color:#b2dbfb}.navbar-inverse .form-control::-webkit-input-placeholder{color:#b2dbfb}.navbar-inverse .form-control[type=text],.navbar-inverse .form-control[type=password]{-webkit-box-shadow:inset 0 -1px 0 #b2dbfb;box-shadow:inset 0 -1px 0 #b2dbfb}.navbar-inverse .form-control[type=text]:focus,.navbar-inverse .form-control[type=password]:focus{-webkit-box-shadow:inset 0 -2px 0 #fff;box-shadow:inset 0 -2px 0 #fff}.btn-default{-webkit-background-size:200% 200%;background-size:200%;background-position:50%}.btn-default:focus{background-color:#ffffff}.btn-default:hover,.btn-default:active:hover{background-color:#f0f0f0}.btn-default:active{background-color:#e0e0e0;background-image:-webkit-radial-gradient(circle, #e0e0e0 10%, #fff 11%);background-image:-o-radial-gradient(circle, #e0e0e0 10%, #fff 11%);background-image:radial-gradient(circle, #e0e0e0 10%, #fff 11%);background-repeat:no-repeat;-webkit-background-size:1000% 1000%;background-size:1000%;-webkit-box-shadow:2px 2px 4px rgba(0,0,0,0.4);box-shadow:2px 2px 4px rgba(0,0,0,0.4)}.btn-primary{-webkit-background-size:200% 200%;background-size:200%;background-position:50%}.btn-primary:focus{background-color:#2196f3}.btn-primary:hover,.btn-primary:active:hover{background-color:#0d87e9}.btn-primary:active{background-color:#0b76cc;background-image:-webkit-radial-gradient(circle, #0b76cc 10%, #2196f3 11%);background-image:-o-radial-gradient(circle, #0b76cc 10%, #2196f3 11%);background-image:radial-gradient(circle, #0b76cc 10%, #2196f3 11%);background-repeat:no-repeat;-webkit-background-size:1000% 1000%;background-size:1000%;-webkit-box-shadow:2px 2px 4px rgba(0,0,0,0.4);box-shadow:2px 2px 4px rgba(0,0,0,0.4)}.btn-success{-webkit-background-size:200% 200%;background-size:200%;background-position:50%}.btn-success:focus{background-color:#4caf50}.btn-success:hover,.btn-success:active:hover{background-color:#439a46}.btn-success:active{background-color:#39843c;background-image:-webkit-radial-gradient(circle, #39843c 10%, #4caf50 11%);background-image:-o-radial-gradient(circle, #39843c 10%, #4caf50 11%);background-image:radial-gradient(circle, #39843c 10%, #4caf50 11%);background-repeat:no-repeat;-webkit-background-size:1000% 1000%;background-size:1000%;-webkit-box-shadow:2px 2px 4px rgba(0,0,0,0.4);box-shadow:2px 2px 4px rgba(0,0,0,0.4)}.btn-info{-webkit-background-size:200% 200%;background-size:200%;background-position:50%}.btn-info:focus{background-color:#9c27b0}.btn-info:hover,.btn-info:active:hover{background-color:#862197}.btn-info:active{background-color:#701c7e;background-image:-webkit-radial-gradient(circle, #701c7e 10%, #9c27b0 11%);background-image:-o-radial-gradient(circle, #701c7e 10%, #9c27b0 11%);background-image:radial-gradient(circle, #701c7e 10%, #9c27b0 11%);background-repeat:no-repeat;-webkit-background-size:1000% 1000%;background-size:1000%;-webkit-box-shadow:2px 2px 4px rgba(0,0,0,0.4);box-shadow:2px 2px 4px rgba(0,0,0,0.4)}.btn-warning{-webkit-background-size:200% 200%;background-size:200%;background-position:50%}.btn-warning:focus{background-color:#ff9800}.btn-warning:hover,.btn-warning:active:hover{background-color:#e08600}.btn-warning:active{background-color:#c27400;background-image:-webkit-radial-gradient(circle, #c27400 10%, #ff9800 11%);background-image:-o-radial-gradient(circle, #c27400 10%, #ff9800 11%);background-image:radial-gradient(circle, #c27400 10%, #ff9800 11%);background-repeat:no-repeat;-webkit-background-size:1000% 1000%;background-size:1000%;-webkit-box-shadow:2px 2px 4px rgba(0,0,0,0.4);box-shadow:2px 2px 4px rgba(0,0,0,0.4)}.btn-danger{-webkit-background-size:200% 200%;background-size:200%;background-position:50%}.btn-danger:focus{background-color:#e51c23}.btn-danger:hover,.btn-danger:active:hover{background-color:#cb171e}.btn-danger:active{background-color:#b0141a;background-image:-webkit-radial-gradient(circle, #b0141a 10%, #e51c23 11%);background-image:-o-radial-gradient(circle, #b0141a 10%, #e51c23 11%);background-image:radial-gradient(circle, #b0141a 10%, #e51c23 11%);background-repeat:no-repeat;-webkit-background-size:1000% 1000%;background-size:1000%;-webkit-box-shadow:2px 2px 4px rgba(0,0,0,0.4);box-shadow:2px 2px 4px rgba(0,0,0,0.4)}.btn-link{-webkit-background-size:200% 200%;background-size:200%;background-position:50%}.btn-link:focus{background-color:#ffffff}.btn-link:hover,.btn-link:active:hover{background-color:#f0f0f0}.btn-link:active{background-color:#e0e0e0;background-image:-webkit-radial-gradient(circle, #e0e0e0 10%, #fff 11%);background-image:-o-radial-gradient(circle, #e0e0e0 10%, #fff 11%);background-image:radial-gradient(circle, #e0e0e0 10%, #fff 11%);background-repeat:no-repeat;-webkit-background-size:1000% 1000%;background-size:1000%;-webkit-box-shadow:2px 2px 4px rgba(0,0,0,0.4);box-shadow:2px 2px 4px rgba(0,0,0,0.4)}.btn{text-transform:uppercase;border:none;-webkit-box-shadow:1px 1px 4px rgba(0,0,0,0.4);box-shadow:1px 1px 4px rgba(0,0,0,0.4);-webkit-transition:all 0.4s;-o-transition:all 0.4s;transition:all 0.4s}.btn-link{border-radius:3px;-webkit-box-shadow:none;box-shadow:none;color:#444444}.btn-link:hover,.btn-link:focus{-webkit-box-shadow:none;box-shadow:none;color:#444444;text-decoration:none}.btn-default.disabled{background-color:rgba(0,0,0,0.1);color:rgba(0,0,0,0.4);opacity:1}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:0}.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:0}body{-webkit-font-smoothing:antialiased;letter-spacing:.1px}p{margin:0 0 1em}input,button{-webkit-font-smoothing:antialiased;letter-spacing:.1px}a{-webkit-transition:all 0.2s;-o-transition:all 0.2s;transition:all 0.2s}.table-hover>tbody>tr,.table-hover>tbody>tr>th,.table-hover>tbody>tr>td{-webkit-transition:all 0.2s;-o-transition:all 0.2s;transition:all 0.2s}label{font-weight:normal}textarea,textarea.form-control,input.form-control,input[type=text],input[type=password],input[type=email],input[type=number],[type=text].form-control,[type=password].form-control,[type=email].form-control,[type=tel].form-control,[contenteditable].form-control{padding:0;border:none;border-radius:0;-webkit-appearance:none;-webkit-box-shadow:inset 0 -1px 0 #ddd;box-shadow:inset 0 -1px 0 #ddd;font-size:16px}textarea:focus,textarea.form-control:focus,input.form-control:focus,input[type=text]:focus,input[type=password]:focus,input[type=email]:focus,input[type=number]:focus,[type=text].form-control:focus,[type=password].form-control:focus,[type=email].form-control:focus,[type=tel].form-control:focus,[contenteditable].form-control:focus{-webkit-box-shadow:inset 0 -2px 0 #2196f3;box-shadow:inset 0 -2px 0 #2196f3}textarea[disabled],textarea.form-control[disabled],input.form-control[disabled],input[type=text][disabled],input[type=password][disabled],input[type=email][disabled],input[type=number][disabled],[type=text].form-control[disabled],[type=password].form-control[disabled],[type=email].form-control[disabled],[type=tel].form-control[disabled],[contenteditable].form-control[disabled],textarea[readonly],textarea.form-control[readonly],input.form-control[readonly],input[type=text][readonly],input[type=password][readonly],input[type=email][readonly],input[type=number][readonly],[type=text].form-control[readonly],[type=password].form-control[readonly],[type=email].form-control[readonly],[type=tel].form-control[readonly],[contenteditable].form-control[readonly]{-webkit-box-shadow:none;box-shadow:none;border-bottom:1px dotted #ddd}textarea.input-sm,textarea.form-control.input-sm,input.form-control.input-sm,input[type=text].input-sm,input[type=password].input-sm,input[type=email].input-sm,input[type=number].input-sm,[type=text].form-control.input-sm,[type=password].form-control.input-sm,[type=email].form-control.input-sm,[type=tel].form-control.input-sm,[contenteditable].form-control.input-sm{font-size:12px}textarea.input-lg,textarea.form-control.input-lg,input.form-control.input-lg,input[type=text].input-lg,input[type=password].input-lg,input[type=email].input-lg,input[type=number].input-lg,[type=text].form-control.input-lg,[type=password].form-control.input-lg,[type=email].form-control.input-lg,[type=tel].form-control.input-lg,[contenteditable].form-control.input-lg{font-size:17px}select,select.form-control{border:0;border-radius:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;padding-left:0;padding-right:0\9;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAAJ1BMVEVmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmaP/QSjAAAADHRSTlMAAgMJC0uWpKa6wMxMdjkoAAAANUlEQVR4AeXJyQEAERAAsNl7Hf3X6xt0QL6JpZWq30pdvdadme+0PMdzvHm8YThHcT1H7K0BtOMDniZhWOgAAAAASUVORK5CYII=);-webkit-background-size:13px 13px;background-size:13px;background-repeat:no-repeat;background-position:right center;-webkit-box-shadow:inset 0 -1px 0 #ddd;box-shadow:inset 0 -1px 0 #ddd;font-size:16px;line-height:1.5}select::-ms-expand,select.form-control::-ms-expand{display:none}select.input-sm,select.form-control.input-sm{font-size:12px}select.input-lg,select.form-control.input-lg{font-size:17px}select:focus,select.form-control:focus{-webkit-box-shadow:inset 0 -2px 0 #2196f3;box-shadow:inset 0 -2px 0 #2196f3;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAAJ1BMVEUhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISF8S9ewAAAADHRSTlMAAgMJC0uWpKa6wMxMdjkoAAAANUlEQVR4AeXJyQEAERAAsNl7Hf3X6xt0QL6JpZWq30pdvdadme+0PMdzvHm8YThHcT1H7K0BtOMDniZhWOgAAAAASUVORK5CYII=)}select[multiple],select.form-control[multiple]{background:none}.radio label,.radio-inline label,.checkbox label,.checkbox-inline label{padding-left:25px}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="radio"],.checkbox-inline input[type="radio"],.radio input[type="checkbox"],.radio-inline input[type="checkbox"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{margin-left:-25px}input[type="radio"],.radio input[type="radio"],.radio-inline input[type="radio"]{position:relative;margin-top:6px;margin-right:4px;vertical-align:top;border:none;background-color:transparent;-webkit-appearance:none;appearance:none;cursor:pointer}input[type="radio"]:focus,.radio input[type="radio"]:focus,.radio-inline input[type="radio"]:focus{outline:none}input[type="radio"]:before,.radio input[type="radio"]:before,.radio-inline input[type="radio"]:before,input[type="radio"]:after,.radio input[type="radio"]:after,.radio-inline input[type="radio"]:after{content:"";display:block;width:18px;height:18px;border-radius:50%;-webkit-transition:240ms;-o-transition:240ms;transition:240ms}input[type="radio"]:before,.radio input[type="radio"]:before,.radio-inline input[type="radio"]:before{position:absolute;left:0;top:-3px;background-color:#2196f3;-webkit-transform:scale(0);-ms-transform:scale(0);-o-transform:scale(0);transform:scale(0)}input[type="radio"]:after,.radio input[type="radio"]:after,.radio-inline input[type="radio"]:after{position:relative;top:-3px;border:2px solid #666666}input[type="radio"]:checked:before,.radio input[type="radio"]:checked:before,.radio-inline input[type="radio"]:checked:before{-webkit-transform:scale(.5);-ms-transform:scale(.5);-o-transform:scale(.5);transform:scale(.5)}input[type="radio"]:disabled:checked:before,.radio input[type="radio"]:disabled:checked:before,.radio-inline input[type="radio"]:disabled:checked:before{background-color:#bbbbbb}input[type="radio"]:checked:after,.radio input[type="radio"]:checked:after,.radio-inline input[type="radio"]:checked:after{border-color:#2196f3}input[type="radio"]:disabled:after,.radio input[type="radio"]:disabled:after,.radio-inline input[type="radio"]:disabled:after,input[type="radio"]:disabled:checked:after,.radio input[type="radio"]:disabled:checked:after,.radio-inline input[type="radio"]:disabled:checked:after{border-color:#bbbbbb}input[type="checkbox"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:relative;border:none;margin-bottom:-4px;-webkit-appearance:none;appearance:none;cursor:pointer}input[type="checkbox"]:focus,.checkbox input[type="checkbox"]:focus,.checkbox-inline input[type="checkbox"]:focus{outline:none}input[type="checkbox"]:after,.checkbox input[type="checkbox"]:after,.checkbox-inline input[type="checkbox"]:after{content:"";display:block;width:18px;height:18px;margin-top:-2px;margin-right:5px;border:2px solid #666666;border-radius:2px;-webkit-transition:240ms;-o-transition:240ms;transition:240ms}input[type="checkbox"]:checked:before,.checkbox input[type="checkbox"]:checked:before,.checkbox-inline input[type="checkbox"]:checked:before{content:"";position:absolute;top:0;left:6px;display:table;width:6px;height:12px;border:2px solid #fff;border-top-width:0;border-left-width:0;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}input[type="checkbox"]:checked:after,.checkbox input[type="checkbox"]:checked:after,.checkbox-inline input[type="checkbox"]:checked:after{background-color:#2196f3;border-color:#2196f3}input[type="checkbox"]:disabled:after,.checkbox input[type="checkbox"]:disabled:after,.checkbox-inline input[type="checkbox"]:disabled:after{border-color:#bbbbbb}input[type="checkbox"]:disabled:checked:after,.checkbox input[type="checkbox"]:disabled:checked:after,.checkbox-inline input[type="checkbox"]:disabled:checked:after{background-color:#bbbbbb;border-color:transparent}.has-warning input:not([type=checkbox]),.has-warning .form-control,.has-warning input.form-control[readonly],.has-warning input[type=text][readonly],.has-warning [type=text].form-control[readonly],.has-warning input:not([type=checkbox]):focus,.has-warning .form-control:focus{border-bottom:none;-webkit-box-shadow:inset 0 -2px 0 #ff9800;box-shadow:inset 0 -2px 0 #ff9800}.has-error input:not([type=checkbox]),.has-error .form-control,.has-error input.form-control[readonly],.has-error input[type=text][readonly],.has-error [type=text].form-control[readonly],.has-error input:not([type=checkbox]):focus,.has-error .form-control:focus{border-bottom:none;-webkit-box-shadow:inset 0 -2px 0 #e51c23;box-shadow:inset 0 -2px 0 #e51c23}.has-success input:not([type=checkbox]),.has-success .form-control,.has-success input.form-control[readonly],.has-success input[type=text][readonly],.has-success [type=text].form-control[readonly],.has-success input:not([type=checkbox]):focus,.has-success .form-control:focus{border-bottom:none;-webkit-box-shadow:inset 0 -2px 0 #4caf50;box-shadow:inset 0 -2px 0 #4caf50}.has-warning .input-group-addon,.has-error .input-group-addon,.has-success .input-group-addon{color:#666666;border-color:transparent;background-color:transparent}.nav-tabs>li>a,.nav-tabs>li>a:focus{margin-right:0;background-color:transparent;border:none;color:#666666;-webkit-box-shadow:inset 0 -1px 0 #ddd;box-shadow:inset 0 -1px 0 #ddd;-webkit-transition:all 0.2s;-o-transition:all 0.2s;transition:all 0.2s}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus:hover{background-color:transparent;-webkit-box-shadow:inset 0 -2px 0 #2196f3;box-shadow:inset 0 -2px 0 #2196f3;color:#2196f3}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus{border:none;-webkit-box-shadow:inset 0 -2px 0 #2196f3;box-shadow:inset 0 -2px 0 #2196f3;color:#2196f3}.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus:hover{border:none;color:#2196f3}.nav-tabs>li.disabled>a{-webkit-box-shadow:inset 0 -1px 0 #ddd;box-shadow:inset 0 -1px 0 #ddd}.nav-tabs.nav-justified>li>a,.nav-tabs.nav-justified>li>a:hover,.nav-tabs.nav-justified>li>a:focus,.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:none}.nav-tabs .dropdown-menu{margin-top:0}.dropdown-menu{margin-top:0;border:none;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.3);box-shadow:0 1px 4px rgba(0,0,0,0.3)}.alert{border:none;color:#fff}.alert-success{background-color:#4caf50}.alert-info{background-color:#9c27b0}.alert-warning{background-color:#ff9800}.alert-danger{background-color:#e51c23}.alert a:not(.close),.alert .alert-link{color:#fff;font-weight:bold}.alert .close{color:#fff}.badge{padding:3px 6px 5px}.progress{position:relative;z-index:1;height:6px;border-radius:0;-webkit-box-shadow:none;box-shadow:none}.progress-bar{-webkit-box-shadow:none;box-shadow:none}.progress-bar:last-child{border-radius:0 3px 3px 0}.progress-bar:last-child:before{display:block;content:"";position:absolute;width:100%;height:100%;left:0;right:0;z-index:-1;background-color:#cae6fc}.progress-bar-success:last-child.progress-bar:before{background-color:#c7e7c8}.progress-bar-info:last-child.progress-bar:before{background-color:#edc9f3}.progress-bar-warning:last-child.progress-bar:before{background-color:#ffe0b3}.progress-bar-danger:last-child.progress-bar:before{background-color:#f28e92}.close{font-size:34px;font-weight:300;line-height:24px;opacity:0.6;-webkit-transition:all 0.2s;-o-transition:all 0.2s;transition:all 0.2s}.close:hover{opacity:1}.list-group-item{padding:15px}.list-group-item-text{color:#bbbbbb}.well{border-radius:0;-webkit-box-shadow:none;box-shadow:none}.panel{border:none;border-radius:2px;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.3);box-shadow:0 1px 4px rgba(0,0,0,0.3)}.panel-heading{border-bottom:none}.panel-footer{border-top:none}.popover{border:none;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.3);box-shadow:0 1px 4px rgba(0,0,0,0.3)}.carousel-caption h1,.carousel-caption h2,.carousel-caption h3,.carousel-caption h4,.carousel-caption h5,.carousel-caption h6{color:inherit} \ No newline at end of file diff --git a/flask_admin/static/bootstrap/bootstrap3/swatch/readable/bootstrap.min.css b/flask_admin/static/bootstrap/bootstrap3/swatch/readable/bootstrap.min.css deleted file mode 100644 index 3fb40860a..000000000 --- a/flask_admin/static/bootstrap/bootstrap3/swatch/readable/bootstrap.min.css +++ /dev/null @@ -1,11 +0,0 @@ -@import url("https://fonts.googleapis.com/css?family=Raleway:400,700");/*! - * bootswatch v3.3.5 - * Homepage: http://bootswatch.com - * Copyright 2012-2015 Thomas Park - * Licensed under MIT - * Based on Bootstrap -*//*! - * Bootstrap v3.3.5 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;-webkit-box-shadow:none !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:Georgia,"Times New Roman",Times,serif;font-size:16px;line-height:1.42857143;color:#333333;background-color:#ffffff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#4582ec;text-decoration:none}a:hover,a:focus{color:#134fb8;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,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#ffffff;border:1px solid #dddddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:22px;margin-bottom:22px;border:0;border-top:1px solid #eeeeee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Raleway","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:bold;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#b3b3b3}h1,.h1,h2,.h2,h3,.h3{margin-top:22px;margin-bottom:11px}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:11px;margin-bottom:11px}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:41px}h2,.h2{font-size:34px}h3,.h3{font-size:28px}h4,.h4{font-size:20px}h5,.h5{font-size:16px}h6,.h6{font-size:14px}p{margin:0 0 11px}.lead{margin-bottom:22px;font-size:18px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:24px}}small,.small{font-size:87%}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#b3b3b3}.text-primary{color:#4582ec}a.text-primary:hover,a.text-primary:focus{color:#1863e6}.text-success{color:#3fad46}a.text-success:hover,a.text-success:focus{color:#318837}.text-info{color:#5bc0de}a.text-info:hover,a.text-info:focus{color:#31b0d5}.text-warning{color:#f0ad4e}a.text-warning:hover,a.text-warning:focus{color:#ec971f}.text-danger{color:#d9534f}a.text-danger:hover,a.text-danger:focus{color:#c9302c}.bg-primary{color:#fff;background-color:#4582ec}a.bg-primary:hover,a.bg-primary:focus{background-color:#1863e6}.bg-success{background-color:#dff0d8}a.bg-success:hover,a.bg-success:focus{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover,a.bg-info:focus{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover,a.bg-warning:focus{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover,a.bg-danger:focus{background-color:#e4b9b9}.page-header{padding-bottom:10px;margin:44px 0 22px;border-bottom:1px solid #dddddd}ul,ol{margin-top:0;margin-bottom:11px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:22px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #b3b3b3}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:11px 22px;margin:0 0 22px;font-size:20px;border-left:5px solid #4582ec}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#333333}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 #4582ec;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:22px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#ffffff;background-color:#333333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:10.5px;margin:0 0 11px;font-size:15px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333333;background-color:#f5f5f5;border:1px solid #cccccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0%}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0%}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0%}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0%}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#b3b3b3;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:22px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #dddddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #dddddd}.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 #dddddd}.table .table{background-color:#ffffff}.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 #dddddd}.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 #dddddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*="col-"]{position:static;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:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:16.5px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #dddddd}.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:22px;font-size:24px;line-height:inherit;color:#333333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:9px;font-size:16px;line-height:1.42857143;color:#333333}.form-control{display:block;width:100%;height:40px;padding:8px 12px;font-size:16px;line-height:1.42857143;color:#333333;background-color:#ffffff;background-image:none;border:1px solid #dddddd;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control::-moz-placeholder{color:#b3b3b3;opacity:1}.form-control:-ms-input-placeholder{color:#b3b3b3}.form-control::-webkit-input-placeholder{color:#b3b3b3}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eeeeee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:40px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:33px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:57px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:22px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:9px;padding-bottom:9px;margin-bottom:0;min-height:38px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:33px;padding:5px 10px;font-size:14px;line-height:1.5;border-radius:3px}select.input-sm{height:33px;line-height:33px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:33px;padding:5px 10px;font-size:14px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:33px;line-height:33px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:33px;min-height:36px;padding:6px 10px;font-size:14px;line-height:1.5}.input-lg{height:57px;padding:14px 16px;font-size:20px;line-height:1.3333333;border-radius:6px}select.input-lg{height:57px;line-height:57px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:57px;padding:14px 16px;font-size:20px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:57px;line-height:57px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:57px;min-height:42px;padding:15px 16px;font-size:20px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:50px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:40px;height:40px;line-height:40px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:57px;height:57px;line-height:57px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:33px;height:33px;line-height:33px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3fad46}.has-success .form-control{border-color:#3fad46;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#318837;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #81d186;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #81d186}.has-success .input-group-addon{color:#3fad46;border-color:#3fad46;background-color:#dff0d8}.has-success .form-control-feedback{color:#3fad46}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#f0ad4e}.has-warning .form-control{border-color:#f0ad4e;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#ec971f;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f8d9ac;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f8d9ac}.has-warning .input-group-addon{color:#f0ad4e;border-color:#f0ad4e;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#f0ad4e}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#d9534f}.has-error .form-control{border-color:#d9534f;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#c9302c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #eba5a3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #eba5a3}.has-error .input-group-addon{color:#d9534f;border-color:#d9534f;background-color:#f2dede}.has-error .form-control-feedback{color:#d9534f}.has-feedback label~.form-control-feedback{top:27px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:9px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:31px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:9px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:19.6666662px;font-size:20px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:14px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:8px 12px;font-size:16px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333333;background-color:#ffffff;border-color:#dddddd}.btn-default:focus,.btn-default.focus{color:#333333;background-color:#e6e6e6;border-color:#9d9d9d}.btn-default:hover{color:#333333;background-color:#e6e6e6;border-color:#bebebe}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333333;background-color:#e6e6e6;border-color:#bebebe}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#333333;background-color:#d4d4d4;border-color:#9d9d9d}.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.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:#ffffff;border-color:#dddddd}.btn-default .badge{color:#ffffff;background-color:#333333}.btn-primary{color:#ffffff;background-color:#4582ec;border-color:#4582ec}.btn-primary:focus,.btn-primary.focus{color:#ffffff;background-color:#1863e6;border-color:#1045a1}.btn-primary:hover{color:#ffffff;background-color:#1863e6;border-color:#175fdd}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#ffffff;background-color:#1863e6;border-color:#175fdd}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#ffffff;background-color:#1455c6;border-color:#1045a1}.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.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:#4582ec;border-color:#4582ec}.btn-primary .badge{color:#4582ec;background-color:#ffffff}.btn-success{color:#ffffff;background-color:#3fad46;border-color:#3fad46}.btn-success:focus,.btn-success.focus{color:#ffffff;background-color:#318837;border-color:#1d5020}.btn-success:hover{color:#ffffff;background-color:#318837;border-color:#2f8034}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#ffffff;background-color:#318837;border-color:#2f8034}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#ffffff;background-color:#286d2c;border-color:#1d5020}.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.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:#3fad46;border-color:#3fad46}.btn-success .badge{color:#3fad46;background-color:#ffffff}.btn-info{color:#ffffff;background-color:#5bc0de;border-color:#5bc0de}.btn-info:focus,.btn-info.focus{color:#ffffff;background-color:#31b0d5;border-color:#1f7e9a}.btn-info:hover{color:#ffffff;background-color:#31b0d5;border-color:#2aabd2}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#ffffff;background-color:#31b0d5;border-color:#2aabd2}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#ffffff;background-color:#269abc;border-color:#1f7e9a}.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.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:#5bc0de}.btn-info .badge{color:#5bc0de;background-color:#ffffff}.btn-warning{color:#ffffff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-warning:focus,.btn-warning.focus{color:#ffffff;background-color:#ec971f;border-color:#b06d0f}.btn-warning:hover{color:#ffffff;background-color:#ec971f;border-color:#eb9316}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#ffffff;background-color:#ec971f;border-color:#eb9316}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#ffffff;background-color:#d58512;border-color:#b06d0f}.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.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:#f0ad4e}.btn-warning .badge{color:#f0ad4e;background-color:#ffffff}.btn-danger{color:#ffffff;background-color:#d9534f;border-color:#d9534f}.btn-danger:focus,.btn-danger.focus{color:#ffffff;background-color:#c9302c;border-color:#8b211e}.btn-danger:hover{color:#ffffff;background-color:#c9302c;border-color:#c12e2a}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#ffffff;background-color:#c9302c;border-color:#c12e2a}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#ffffff;background-color:#ac2925;border-color:#8b211e}.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.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:#d9534f}.btn-danger .badge{color:#d9534f;background-color:#ffffff}.btn-link{color:#4582ec;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#134fb8;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:#b3b3b3;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:14px 16px;font-size:20px;line-height:1.3333333;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:14px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:14px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;-o-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:0.35s;-o-transition-duration:0.35s;transition-duration:0.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:16px;text-align:left;background-color:#ffffff;border:1px solid #cccccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:10px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#333333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#ffffff;background-color:#4582ec}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#ffffff;text-decoration:none;outline:0;background-color:#4582ec}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#b3b3b3}.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:14px;line-height:1.42857143;color:#b3b3b3;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:57px;padding:14px 16px;font-size:20px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:57px;line-height:57px}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:33px;padding:5px 10px;font-size:14px;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:33px;line-height:33px}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:8px 12px;font-size:16px;font-weight:normal;line-height:1;color:#333333;text-align:center;background-color:#eeeeee;border:1px solid #dddddd;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:14px;border-radius:3px}.input-group-addon.input-lg{padding:14px 16px;font-size:20px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eeeeee}.nav>li.disabled>a{color:#b3b3b3}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#b3b3b3;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eeeeee;border-color:#4582ec}.nav .nav-divider{height:1px;margin:10px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #dddddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555555;background-color:#ffffff;border:1px solid #dddddd;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 #dddddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #dddddd;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:#ffffff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#ffffff;background-color:#4582ec}.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 #dddddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #dddddd;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:#ffffff}}.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:65px;margin-bottom:22px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:21.5px 15px;font-size:20px;line-height:22px;height:65px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:15.5px;margin-bottom:15.5px;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:10.75px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:22px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:22px}.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:21.5px;padding-bottom:21.5px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:12.5px;margin-bottom:12.5px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:12.5px;margin-bottom:12.5px}.navbar-btn.btn-sm{margin-top:16px;margin-bottom:16px}.navbar-btn.btn-xs{margin-top:21.5px;margin-bottom:21.5px}.navbar-text{margin-top:21.5px;margin-bottom:21.5px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#ffffff;border-color:#dddddd}.navbar-default .navbar-brand{color:#4582ec}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#4582ec;background-color:transparent}.navbar-default .navbar-text{color:#333333}.navbar-default .navbar-nav>li>a{color:#4582ec}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#4582ec;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#4582ec;background-color:transparent}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#333333;background-color:transparent}.navbar-default .navbar-toggle{border-color:#dddddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#dddddd}.navbar-default .navbar-toggle .icon-bar{background-color:#cccccc}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#dddddd}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:transparent;color:#4582ec}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#4582ec}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#4582ec;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:#4582ec;background-color:transparent}.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:#333333;background-color:transparent}}.navbar-default .navbar-link{color:#4582ec}.navbar-default .navbar-link:hover{color:#4582ec}.navbar-default .btn-link{color:#4582ec}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#4582ec}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#333333}.navbar-inverse{background-color:#ffffff;border-color:#dddddd}.navbar-inverse .navbar-brand{color:#333333}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#333333;background-color:transparent}.navbar-inverse .navbar-text{color:#333333}.navbar-inverse .navbar-nav>li>a{color:#333333}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#333333;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#333333;background-color:transparent}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#cccccc;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#dddddd}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#dddddd}.navbar-inverse .navbar-toggle .icon-bar{background-color:#cccccc}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#ededed}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:transparent;color:#333333}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#dddddd}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#dddddd}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#333333}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#333333;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:#333333;background-color:transparent}.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:#cccccc;background-color:transparent}}.navbar-inverse .navbar-link{color:#333333}.navbar-inverse .navbar-link:hover{color:#333333}.navbar-inverse .btn-link{color:#333333}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#333333}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#cccccc}.breadcrumb{padding:8px 15px;margin-bottom:22px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#cccccc}.breadcrumb>.active{color:#b3b3b3}.pagination{display:inline-block;padding-left:0;margin:22px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:8px 12px;line-height:1.42857143;text-decoration:none;color:#333333;background-color:#ffffff;border:1px solid #dddddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{z-index:3;color:#ffffff;background-color:#4582ec;border-color:#4582ec}.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:#ffffff;background-color:#4582ec;border-color:#4582ec;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:#b3b3b3;background-color:#ffffff;border-color:#dddddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:14px 16px;font-size:20px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:14px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:22px 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:#ffffff;border:1px solid #dddddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#4582ec}.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:#b3b3b3;background-color:#ffffff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#ffffff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#ffffff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#ffffff}.label-default[href]:hover,.label-default[href]:focus{background-color:#e6e6e6}.label-primary{background-color:#4582ec}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#1863e6}.label-success{background-color:#3fad46}.label-success[href]:hover,.label-success[href]:focus{background-color:#318837}.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:14px;font-weight:bold;color:#ffffff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#4582ec;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#ffffff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#4582ec;background-color:#ffffff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#f7f7f7}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:24px;font-weight:200}.jumbotron>hr{border-top-color:#dedede}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:72px}}.thumbnail{display:block;padding:4px;margin-bottom:22px;line-height:1.42857143;background-color:#ffffff;border:1px solid #dddddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#4582ec}.thumbnail .caption{padding:9px;color:#333333}.alert{padding:15px;margin-bottom:22px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#3fad46;border-color:#3fad46;color:#ffffff}.alert-success hr{border-top-color:#389a3e}.alert-success .alert-link{color:#e6e6e6}.alert-info{background-color:#5bc0de;border-color:#5bc0de;color:#ffffff}.alert-info hr{border-top-color:#46b8da}.alert-info .alert-link{color:#e6e6e6}.alert-warning{background-color:#f0ad4e;border-color:#f0ad4e;color:#ffffff}.alert-warning hr{border-top-color:#eea236}.alert-warning .alert-link{color:#e6e6e6}.alert-danger{background-color:#d9534f;border-color:#d9534f;color:#ffffff}.alert-danger hr{border-top-color:#d43f3a}.alert-danger .alert-link{color:#e6e6e6}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:22px;margin-bottom:22px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:14px;line-height:22px;color:#ffffff;text-align:center;background-color:#4582ec;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#3fad46}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#ffffff;border:1px solid #dddddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333333}a.list-group-item:hover,button.list-group-item:hover,a.list-group-item:focus,button.list-group-item:focus{text-decoration:none;color:#555555;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#eeeeee;color:#b3b3b3;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#b3b3b3}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#ffffff;background-color:#4582ec;border-color:#4582ec}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#fefeff}.list-group-item-success{color:#3fad46;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3fad46}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,button.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:focus{color:#3fad46;background-color:#d0e9c6}a.list-group-item-success.active,button.list-group-item-success.active,a.list-group-item-success.active:hover,button.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active:focus{color:#fff;background-color:#3fad46;border-color:#3fad46}.list-group-item-info{color:#5bc0de;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#5bc0de}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,button.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:focus{color:#5bc0de;background-color:#c4e3f3}a.list-group-item-info.active,button.list-group-item-info.active,a.list-group-item-info.active:hover,button.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active:focus{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.list-group-item-warning{color:#f0ad4e;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#f0ad4e}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,button.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:focus{color:#f0ad4e;background-color:#faf2cc}a.list-group-item-warning.active,button.list-group-item-warning.active,a.list-group-item-warning.active:hover,button.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active:focus{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.list-group-item-danger{color:#d9534f;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#d9534f}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,button.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:focus{color:#d9534f;background-color:#ebcccc}a.list-group-item-danger.active,button.list-group-item-danger.active,a.list-group-item-danger.active:hover,button.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active:focus{color:#fff;background-color:#d9534f;border-color:#d9534f}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:22px;background-color:#ffffff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:18px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#ffffff;border-top:1px solid #dddddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #dddddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:22px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #dddddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #dddddd}.panel-default{border-color:#dddddd}.panel-default>.panel-heading{color:#333333;background-color:#f5f5f5;border-color:#dddddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#dddddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#dddddd}.panel-primary{border-color:#4582ec}.panel-primary>.panel-heading{color:#ffffff;background-color:#4582ec;border-color:#4582ec}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#4582ec}.panel-primary>.panel-heading .badge{color:#4582ec;background-color:#ffffff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#4582ec}.panel-success{border-color:#3fad46}.panel-success>.panel-heading{color:#ffffff;background-color:#3fad46;border-color:#3fad46}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#3fad46}.panel-success>.panel-heading .badge{color:#3fad46;background-color:#ffffff}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#3fad46}.panel-info{border-color:#5bc0de}.panel-info>.panel-heading{color:#ffffff;background-color:#5bc0de;border-color:#5bc0de}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#5bc0de}.panel-info>.panel-heading .badge{color:#5bc0de;background-color:#ffffff}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#5bc0de}.panel-warning{border-color:#f0ad4e}.panel-warning>.panel-heading{color:#ffffff;background-color:#f0ad4e;border-color:#f0ad4e}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#f0ad4e}.panel-warning>.panel-heading .badge{color:#f0ad4e;background-color:#ffffff}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#f0ad4e}.panel-danger{border-color:#d9534f}.panel-danger>.panel-heading{color:#ffffff;background-color:#d9534f;border-color:#d9534f}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d9534f}.panel-danger>.panel-heading .badge{color:#d9534f;background-color:#ffffff}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d9534f}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f7f7f7;border:1px solid #e5e5e5;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:24px;font-weight:bold;line-height:1;color:#ffffff;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#ffffff;text-decoration:none;cursor:pointer;opacity:0.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#ffffff;border:1px solid #999999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:0.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{padding:20px;text-align:right;border-top:1px solid #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}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:Georgia,"Times New Roman",Times,serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:14px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:0.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;background-color:#000000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:Georgia,"Times New Roman",Times,serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:16px;background-color:#ffffff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #cccccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:16px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#ffffff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999999;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#ffffff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#ffffff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999999;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#ffffff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:0.5;filter:alpha(opacity=50);font-size:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.5)), to(rgba(0,0,0,0.0001)));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.0001)), to(rgba(0,0,0,0.5)));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #ffffff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#ffffff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}.navbar{font-family:"Raleway","Helvetica Neue",Helvetica,Arial,sans-serif}.navbar-nav,.navbar-form{margin-left:0;margin-right:0}.navbar-nav>li>a{margin:12.5px 6px;padding:8px 12px;border:1px solid transparent;border-radius:4px}.navbar-nav>li>a:hover{border:1px solid #ddd}.navbar-nav>.active>a,.navbar-nav>.active>a:hover{border:1px solid #ddd}.navbar-default .navbar-nav>.active>a:hover{color:#4582ec}.navbar-inverse .navbar-nav>.active>a:hover{color:#333333}.navbar-brand{padding-top:12.5px;padding-bottom:12.5px;line-height:1.9}@media (min-width:768px){.navbar .navbar-nav>li>a{padding:8px 12px}}@media (max-width:768px - 1){.navbar .navbar-nav>li>a{margin:0}}.btn{font-family:"Raleway","Helvetica Neue",Helvetica,Arial,sans-serif}legend{font-family:"Raleway","Helvetica Neue",Helvetica,Arial,sans-serif}.input-group-addon{font-family:"Raleway","Helvetica Neue",Helvetica,Arial,sans-serif}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{border:1px solid #ddd}.pagination{font-family:"Raleway","Helvetica Neue",Helvetica,Arial,sans-serif}.pagination-lg>li>a,.pagination-lg>li>span{padding:14px 24px}.pager{font-family:"Raleway","Helvetica Neue",Helvetica,Arial,sans-serif}.pager a{color:#333333}.pager a:hover{border-color:transparent;color:#fff}.pager .disabled a{border-color:#dddddd}.close{color:#fff;text-decoration:none;text-shadow:none;opacity:0.4}.close:hover,.close:focus{color:#fff;opacity:1}.alert .alert-link{color:#ffffff;text-decoration:underline}.label{font-family:"Raleway","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:normal}.label-default{border:1px solid #ddd;color:#333333}.badge{padding:1px 7px 5px;vertical-align:2px;font-family:"Raleway","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:normal}.panel{-webkit-box-shadow:none;box-shadow:none}.panel-default .close{color:#333333}.modal .close{color:#333333} \ No newline at end of file diff --git a/flask_admin/static/bootstrap/bootstrap3/swatch/sandstone/bootstrap.min.css b/flask_admin/static/bootstrap/bootstrap3/swatch/sandstone/bootstrap.min.css deleted file mode 100644 index 48ff1700e..000000000 --- a/flask_admin/static/bootstrap/bootstrap3/swatch/sandstone/bootstrap.min.css +++ /dev/null @@ -1,11 +0,0 @@ -@import url("https://fonts.googleapis.com/css?family=Roboto:400,500");/*! - * bootswatch v3.3.5 - * Homepage: http://bootswatch.com - * Copyright 2012-2015 Thomas Park - * Licensed under MIT - * Based on Bootstrap -*//*! - * Bootstrap v3.3.5 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;-webkit-box-shadow:none !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#3e3f3a;background-color:#ffffff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#93c54b;text-decoration:none}a:hover,a:focus{color:#79a736;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,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#f8f5f0;border:1px solid #dfd7ca;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #f8f5f0}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:400;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#98978b}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#98978b}.text-primary{color:#325d88}a.text-primary:hover,a.text-primary:focus{color:#244363}.text-success{color:#93c54b}a.text-success:hover,a.text-success:focus{color:#79a736}.text-info{color:#29abe0}a.text-info:hover,a.text-info:focus{color:#1b8dbb}.text-warning{color:#f47c3c}a.text-warning:hover,a.text-warning:focus{color:#ef5c0e}.text-danger{color:#d9534f}a.text-danger:hover,a.text-danger:focus{color:#c9302c}.bg-primary{color:#fff;background-color:#325d88}a.bg-primary:hover,a.bg-primary:focus{background-color:#244363}.bg-success{background-color:#dff0d8}a.bg-success:hover,a.bg-success:focus{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover,a.bg-info:focus{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover,a.bg-warning:focus{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover,a.bg-danger:focus{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #f8f5f0}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;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #98978b}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #dfd7ca}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#3e3f3a}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 #dfd7ca;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#ffffff;background-color:#333333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#8e8c84;background-color:#f5f5f5;border:1px solid #cccccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0%}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0%}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0%}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0%}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#98978b;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #dfd7ca}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #dfd7ca}.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 #dfd7ca}.table .table{background-color:#ffffff}.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 #dfd7ca}.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 #dfd7ca}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f8f5f0}.table-hover>tbody>tr:hover{background-color:#f8f5f0}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:#f8f5f0}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#f0e9df}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #dfd7ca}.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:inherit;border:0;border-bottom:1px solid transparent}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:13px;font-size:14px;line-height:1.42857143;color:#3e3f3a}.form-control{display:block;width:100%;height:46px;padding:12px 16px;font-size:14px;line-height:1.42857143;color:#3e3f3a;background-color:#ffffff;background-image:none;border:1px solid #dfd7ca;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:transparent;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(0,0,0,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(0,0,0,0.6)}.form-control::-moz-placeholder{color:#dfd7ca;opacity:1}.form-control:-ms-input-placeholder{color:#dfd7ca}.form-control::-webkit-input-placeholder{color:#dfd7ca}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#f8f5f0;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:46px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:66px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:13px;padding-bottom:13px;margin-bottom:0;min-height:34px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:66px;padding:20px 30px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:66px;line-height:66px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:66px;padding:20px 30px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:66px;line-height:66px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:66px;min-height:38px;padding:21px 30px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:57.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:46px;height:46px;line-height:46px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:66px;height:66px;line-height:66px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#93c54b}.has-success .form-control{border-color:#93c54b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#79a736;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c1de98;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c1de98}.has-success .input-group-addon{color:#93c54b;border-color:#93c54b;background-color:#dff0d8}.has-success .form-control-feedback{color:#93c54b}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#f47c3c}.has-warning .form-control{border-color:#f47c3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#ef5c0e;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f9bd9d;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f9bd9d}.has-warning .input-group-addon{color:#f47c3c;border-color:#f47c3c;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#f47c3c}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#d9534f}.has-error .form-control{border-color:#d9534f;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#c9302c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #eba5a3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #eba5a3}.has-error .input-group-addon{color:#d9534f;border-color:#d9534f;background-color:#f2dede}.has-error .form-control-feedback{color:#d9534f}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#7f8177}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:13px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:33px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:13px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:27.666666px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:12px 16px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#ffffff;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#ffffff;background-color:#3e3f3a;border-color:transparent}.btn-default:focus,.btn-default.focus{color:#ffffff;background-color:#242422;border-color:rgba(0,0,0,0)}.btn-default:hover{color:#ffffff;background-color:#242422;border-color:rgba(0,0,0,0)}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#ffffff;background-color:#242422;border-color:rgba(0,0,0,0)}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#ffffff;background-color:#121210;border-color:rgba(0,0,0,0)}.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.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:#3e3f3a;border-color:transparent}.btn-default .badge{color:#3e3f3a;background-color:#ffffff}.btn-primary{color:#ffffff;background-color:#325d88;border-color:transparent}.btn-primary:focus,.btn-primary.focus{color:#ffffff;background-color:#244363;border-color:rgba(0,0,0,0)}.btn-primary:hover{color:#ffffff;background-color:#244363;border-color:rgba(0,0,0,0)}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#ffffff;background-color:#244363;border-color:rgba(0,0,0,0)}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#ffffff;background-color:#1b3249;border-color:rgba(0,0,0,0)}.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.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:#325d88;border-color:transparent}.btn-primary .badge{color:#325d88;background-color:#ffffff}.btn-success{color:#ffffff;background-color:#93c54b;border-color:transparent}.btn-success:focus,.btn-success.focus{color:#ffffff;background-color:#79a736;border-color:rgba(0,0,0,0)}.btn-success:hover{color:#ffffff;background-color:#79a736;border-color:rgba(0,0,0,0)}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#ffffff;background-color:#79a736;border-color:rgba(0,0,0,0)}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#ffffff;background-color:#658c2d;border-color:rgba(0,0,0,0)}.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.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:#93c54b;border-color:transparent}.btn-success .badge{color:#93c54b;background-color:#ffffff}.btn-info{color:#ffffff;background-color:#29abe0;border-color:transparent}.btn-info:focus,.btn-info.focus{color:#ffffff;background-color:#1b8dbb;border-color:rgba(0,0,0,0)}.btn-info:hover{color:#ffffff;background-color:#1b8dbb;border-color:rgba(0,0,0,0)}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#ffffff;background-color:#1b8dbb;border-color:rgba(0,0,0,0)}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#ffffff;background-color:#17759c;border-color:rgba(0,0,0,0)}.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.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:#29abe0;border-color:transparent}.btn-info .badge{color:#29abe0;background-color:#ffffff}.btn-warning{color:#ffffff;background-color:#f47c3c;border-color:transparent}.btn-warning:focus,.btn-warning.focus{color:#ffffff;background-color:#ef5c0e;border-color:rgba(0,0,0,0)}.btn-warning:hover{color:#ffffff;background-color:#ef5c0e;border-color:rgba(0,0,0,0)}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#ffffff;background-color:#ef5c0e;border-color:rgba(0,0,0,0)}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#ffffff;background-color:#ce4f0c;border-color:rgba(0,0,0,0)}.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.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:#f47c3c;border-color:transparent}.btn-warning .badge{color:#f47c3c;background-color:#ffffff}.btn-danger{color:#ffffff;background-color:#d9534f;border-color:transparent}.btn-danger:focus,.btn-danger.focus{color:#ffffff;background-color:#c9302c;border-color:rgba(0,0,0,0)}.btn-danger:hover{color:#ffffff;background-color:#c9302c;border-color:rgba(0,0,0,0)}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#ffffff;background-color:#c9302c;border-color:rgba(0,0,0,0)}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#ffffff;background-color:#ac2925;border-color:rgba(0,0,0,0)}.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.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:transparent}.btn-danger .badge{color:#d9534f;background-color:#ffffff}.btn-link{color:#93c54b;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#79a736;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:#dfd7ca;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:20px 30px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;-o-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:0.35s;-o-transition-duration:0.35s;transition-duration:0.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#ffffff;border:1px solid #dfd7ca;border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#f8f5f0}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#98978b;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#98978b;background-color:#f8f5f0}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#98978b;text-decoration:none;outline:0;background-color:#f8f5f0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#dfd7ca}.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.42857143;color:#dfd7ca;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:66px;padding:20px 30px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:66px;line-height:66px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height: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:12px 16px;font-size:14px;font-weight:normal;line-height:1;color:#3e3f3a;text-align:center;background-color:#f8f5f0;border:1px solid #dfd7ca;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:20px 30px;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{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#f8f5f0}.nav>li.disabled>a{color:#dfd7ca}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#dfd7ca;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#f8f5f0;border-color:#93c54b}.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 #dfd7ca}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#dfd7ca #dfd7ca #dfd7ca}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#98978b;background-color:#ffffff;border:1px solid #dfd7ca;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 #dfd7ca}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #dfd7ca;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:#ffffff}}.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:#98978b;background-color:#f8f5f0}.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 #dfd7ca}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #dfd7ca;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:#ffffff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:60px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:20px 15px;font-size:18px;line-height:20px;height:60px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:13px;margin-bottom:13px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:10px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:20px;padding-bottom:20px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:7px;margin-bottom:7px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:7px;margin-bottom:7px}.navbar-btn.btn-sm{margin-top:15px;margin-bottom:15px}.navbar-btn.btn-xs{margin-top:19px;margin-bottom:19px}.navbar-text{margin-top:20px;margin-bottom:20px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#3e3f3a;border-color:#3e3f3a}.navbar-default .navbar-brand{color:#ffffff}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#ffffff;background-color:transparent}.navbar-default .navbar-text{color:#8e8c84}.navbar-default .navbar-nav>li>a{color:#98978b}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#ffffff;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#ffffff;background-color:#393a35}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#cccccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:transparent}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#393a35}.navbar-default .navbar-toggle .icon-bar{background-color:#98978b}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#3e3f3a}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#393a35;color:#ffffff}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#98978b}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#ffffff;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#393a35}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#cccccc;background-color:transparent}}.navbar-default .navbar-link{color:#98978b}.navbar-default .navbar-link:hover{color:#ffffff}.navbar-default .btn-link{color:#98978b}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#ffffff}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#cccccc}.navbar-inverse{background-color:#93c54b;border-color:#93c54b}.navbar-inverse .navbar-brand{color:#ffffff}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#ffffff;background-color:transparent}.navbar-inverse .navbar-text{color:#dfd7ca}.navbar-inverse .navbar-nav>li>a{color:#6b9430}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#ffffff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#ffffff;background-color:#89be3d}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:transparent}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#89be3d}.navbar-inverse .navbar-toggle .icon-bar{background-color:#6b9430}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#81b33a}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#89be3d;color:#ffffff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#93c54b}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#93c54b}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#6b9430}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#ffffff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#89be3d}.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:#444444;background-color:transparent}}.navbar-inverse .navbar-link{color:#6b9430}.navbar-inverse .navbar-link:hover{color:#ffffff}.navbar-inverse .btn-link{color:#6b9430}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#ffffff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f8f5f0;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#dfd7ca}.breadcrumb>.active{color:#98978b}.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:12px 16px;line-height:1.42857143;text-decoration:none;color:#98978b;background-color:#f8f5f0;border:1px solid #dfd7ca;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{z-index:3;color:#8e8c84;background-color:#dfd7ca;border-color:#dfd7ca}.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:#8e8c84;background-color:#dfd7ca;border-color:#dfd7ca;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:#dfd7ca;background-color:#f8f5f0;border-color:#dfd7ca;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:20px 30px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin: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:#f8f5f0;border:1px solid #dfd7ca;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#dfd7ca}.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:#dfd7ca;background-color:#f8f5f0;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#ffffff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#ffffff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#3e3f3a}.label-default[href]:hover,.label-default[href]:focus{background-color:#242422}.label-primary{background-color:#325d88}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#244363}.label-success{background-color:#93c54b}.label-success[href]:hover,.label-success[href]:focus{background-color:#79a736}.label-info{background-color:#29abe0}.label-info[href]:hover,.label-info[href]:focus{background-color:#1b8dbb}.label-warning{background-color:#f47c3c}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ef5c0e}.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:normal;color:#ffffff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#93c54b;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#ffffff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#ffffff;background-color:#93c54b}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#f8f5f0}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#e8decd}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#f8f5f0;border:1px solid #dfd7ca;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#93c54b}.thumbnail .caption{padding:9px;color:#3e3f3a}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#93c54b;border-color:transparent;color:#ffffff}.alert-success hr{border-top-color:rgba(0,0,0,0)}.alert-success .alert-link{color:#e6e6e6}.alert-info{background-color:#29abe0;border-color:transparent;color:#ffffff}.alert-info hr{border-top-color:rgba(0,0,0,0)}.alert-info .alert-link{color:#e6e6e6}.alert-warning{background-color:#f47c3c;border-color:transparent;color:#ffffff}.alert-warning hr{border-top-color:rgba(0,0,0,0)}.alert-warning .alert-link{color:#e6e6e6}.alert-danger{background-color:#d9534f;border-color:transparent;color:#ffffff}.alert-danger hr{border-top-color:rgba(0,0,0,0)}.alert-danger .alert-link{color:#e6e6e6}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:20px;color:#ffffff;text-align:center;background-color:#325d88;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#93c54b}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#29abe0}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#f47c3c}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#ffffff;border:1px solid #dfd7ca}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#3e3f3a}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:inherit}a.list-group-item:hover,button.list-group-item:hover,a.list-group-item:focus,button.list-group-item:focus{text-decoration:none;color:#3e3f3a;background-color:#f8f5f0}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#f8f5f0;color:#dfd7ca;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#dfd7ca}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#3e3f3a;background-color:#f8f5f0;border-color:#dfd7ca}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#3e3f3a}.list-group-item-success{color:#93c54b;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#93c54b}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,button.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:focus{color:#93c54b;background-color:#d0e9c6}a.list-group-item-success.active,button.list-group-item-success.active,a.list-group-item-success.active:hover,button.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active:focus{color:#fff;background-color:#93c54b;border-color:#93c54b}.list-group-item-info{color:#29abe0;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#29abe0}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,button.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:focus{color:#29abe0;background-color:#c4e3f3}a.list-group-item-info.active,button.list-group-item-info.active,a.list-group-item-info.active:hover,button.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active:focus{color:#fff;background-color:#29abe0;border-color:#29abe0}.list-group-item-warning{color:#f47c3c;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#f47c3c}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,button.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:focus{color:#f47c3c;background-color:#faf2cc}a.list-group-item-warning.active,button.list-group-item-warning.active,a.list-group-item-warning.active:hover,button.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active:focus{color:#fff;background-color:#f47c3c;border-color:#f47c3c}.list-group-item-danger{color:#d9534f;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#d9534f}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,button.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:focus{color:#d9534f;background-color:#ebcccc}a.list-group-item-danger.active,button.list-group-item-danger.active,a.list-group-item-danger.active:hover,button.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active:focus{color:#fff;background-color:#d9534f;border-color:#d9534f}.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:#ffffff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f8f5f0;border-top:1px solid #dfd7ca;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #dfd7ca}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #dfd7ca}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #dfd7ca}.panel-default{border-color:#dfd7ca}.panel-default>.panel-heading{color:#3e3f3a;background-color:#f8f5f0;border-color:#dfd7ca}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#dfd7ca}.panel-default>.panel-heading .badge{color:#f8f5f0;background-color:#3e3f3a}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#dfd7ca}.panel-primary{border-color:#325d88}.panel-primary>.panel-heading{color:#ffffff;background-color:#325d88;border-color:#325d88}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#325d88}.panel-primary>.panel-heading .badge{color:#325d88;background-color:#ffffff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#325d88}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#93c54b;background-color:#93c54b;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#93c54b;background-color:#93c54b}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#29abe0;background-color:#29abe0;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#29abe0;background-color:#29abe0}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#f47c3c;background-color:#f47c3c;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#f47c3c;background-color:#f47c3c}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#d9534f;background-color:#d9534f;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#d9534f;background-color:#d9534f}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f8f5f0;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000000;text-shadow:0 0 0 transparent;opacity:0.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000000;text-decoration:none;cursor:pointer;opacity:0.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#ffffff;border:1px solid #f8f5f0;border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:0.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #f8f5f0;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #f8f5f0}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:12px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:1;filter:alpha(opacity=100)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;background-color:#3e3f3a;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:#3e3f3a}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#3e3f3a}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#3e3f3a}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#3e3f3a}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#3e3f3a}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#3e3f3a}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#3e3f3a}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#3e3f3a}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:14px;background-color:#ffffff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #dfd7ca;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;background-color:#f8f5f0;border-bottom:1px solid #f0e9df;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:#b9a78a;border-top-color:#dfd7ca;bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#ffffff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#b9a78a;border-right-color:#dfd7ca}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#ffffff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#b9a78a;border-bottom-color:#dfd7ca;top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#ffffff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#b9a78a;border-left-color:#dfd7ca}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#ffffff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:0.5;filter:alpha(opacity=50);font-size:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.5)), to(rgba(0,0,0,0.0001)));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.0001)), to(rgba(0,0,0,0.5)));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #ffffff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#ffffff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}.sandstone{font-size:11px;line-height:22px;font-weight:500;text-transform:uppercase}.navbar .nav>li>a{font-size:11px;line-height:22px;font-weight:500;text-transform:uppercase}.navbar-form input,.navbar-form .form-control{border:none}.btn{border:none;font-size:11px;line-height:22px;font-weight:500;text-transform:uppercase}.btn:hover{border-color:transparent}.btn-lg{line-height:26px}.btn-default:hover{background-color:#393a35}input,.form-control{-webkit-box-shadow:none;box-shadow:none}input:focus,.form-control:focus{border-color:#dfd7ca;-webkit-box-shadow:none;box-shadow:none}.nav{font-size:11px;line-height:22px;font-weight:500;text-transform:uppercase}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{border-color:#dfd7ca}.nav-tabs>li>a{background-color:#f8f5f0;border-color:#dfd7ca;color:#98978b}.nav-tabs>li.disabled>a:hover{background-color:#f8f5f0}.nav-pills a{color:#98978b}.nav-pills li>a{border:1px solid transparent}.nav-pills li.active>a,.nav-pills li>a:hover{border-color:#dfd7ca}.nav-pills li.disabled>a{border-color:transparent}.breadcrumb{font-size:11px;line-height:22px;font-weight:500;text-transform:uppercase;border:1px solid #dfd7ca}.breadcrumb a{color:#98978b}.pagination{font-size:11px;line-height:22px;font-weight:500;text-transform:uppercase}.pager{font-size:11px;line-height:22px;font-weight:500;text-transform:uppercase}.pager li>a{color:#98978b}.dropdown-menu>li>a{font-size:11px;line-height:22px;font-weight:500;text-transform:uppercase}.alert a,.alert .alert-link{color:#fff}.tooltip{font-size:11px;line-height:22px;font-weight:500;text-transform:uppercase}.progress{border-radius:10px;background-color:#dfd7ca;-webkit-box-shadow:none;box-shadow:none}.progress-bar{-webkit-box-shadow:none;box-shadow:none}.list-group-item{padding:16px 24px}.well{-webkit-box-shadow:none;box-shadow:none}.panel{-webkit-box-shadow:none;box-shadow:none}.panel .panel-heading,.panel .panel-title{font-size:11px;line-height:22px;font-weight:500;text-transform:uppercase;color:#fff}.panel .panel-footer{font-size:11px;line-height:22px;font-weight:500;text-transform:uppercase}.panel-default .panel-heading,.panel-default .panel-title,.panel-default .panel-footer{color:#98978b} \ No newline at end of file diff --git a/flask_admin/static/bootstrap/bootstrap3/swatch/simplex/bootstrap.min.css b/flask_admin/static/bootstrap/bootstrap3/swatch/simplex/bootstrap.min.css deleted file mode 100644 index 4439b6752..000000000 --- a/flask_admin/static/bootstrap/bootstrap3/swatch/simplex/bootstrap.min.css +++ /dev/null @@ -1,11 +0,0 @@ -@import url("https://fonts.googleapis.com/css?family=Open+Sans:400,700");/*! - * bootswatch v3.3.5 - * Homepage: http://bootswatch.com - * Copyright 2012-2015 Thomas Park - * Licensed under MIT - * Based on Bootstrap -*//*! - * Bootstrap v3.3.5 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;-webkit-box-shadow:none !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:1.42857143;color:#777777;background-color:#fcfcfc}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#d9230f;text-decoration:none}a:hover,a:focus{color:#91170a;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,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fcfcfc;border:1px solid #dddddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:18px;margin-bottom:18px;border:0;border-top:1px solid #dddddd}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:300;line-height:1.1;color:#444444}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#808080}h1,.h1,h2,.h2,h3,.h3{margin-top:18px;margin-bottom:9px}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:9px;margin-bottom:9px}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:33px}h2,.h2{font-size:27px}h3,.h3{font-size:23px}h4,.h4{font-size:17px}h5,.h5{font-size:13px}h6,.h6{font-size:12px}p{margin:0 0 9px}.lead{margin-bottom:18px;font-size:14px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:19.5px}}small,.small{font-size:92%}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#808080}.text-primary{color:#d9230f}a.text-primary:hover,a.text-primary:focus{color:#a91b0c}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-danger{color:#b94a48}a.text-danger:hover,a.text-danger:focus{color:#953b39}.bg-primary{color:#fff;background-color:#d9230f}a.bg-primary:hover,a.bg-primary:focus{background-color:#a91b0c}.bg-success{background-color:#dff0d8}a.bg-success:hover,a.bg-success:focus{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover,a.bg-info:focus{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover,a.bg-warning:focus{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover,a.bg-danger:focus{background-color:#e4b9b9}.page-header{padding-bottom:8px;margin:36px 0 18px;border-bottom:1px solid #dddddd}ul,ol{margin-top:0;margin-bottom:9px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:18px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #808080}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:9px 18px;margin:0 0 18px;font-size:16.25px;border-left:5px solid #dddddd}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#808080}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 #dddddd;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:18px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#ffffff;background-color:#333333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#444444;background-color:#f5f5f5;border:1px solid #cccccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0%}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0%}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0%}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0%}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#808080;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:18px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #dddddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #dddddd}.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 #dddddd}.table .table{background-color:#fcfcfc}.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 #dddddd}.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 #dddddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*="col-"]{position:static;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:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:13.5px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #dddddd}.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:18px;font-size:19.5px;line-height:inherit;color:#777777;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:9px;font-size:13px;line-height:1.42857143;color:#777777}.form-control{display:block;width:100%;height:36px;padding:8px 12px;font-size:13px;line-height:1.42857143;color:#777777;background-color:#ffffff;background-image:none;border:1px solid #dddddd;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control::-moz-placeholder{color:#dddddd;opacity:1}.form-control:-ms-input-placeholder{color:#dddddd}.form-control::-webkit-input-placeholder{color:#dddddd}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#dddddd;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:36px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:53px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:18px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:9px;padding-bottom:9px;margin-bottom:0;min-height:31px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:30px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:53px;padding:14px 16px;font-size:17px;line-height:1.3333333;border-radius:6px}select.input-lg{height:53px;line-height:53px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:53px;padding:14px 16px;font-size:17px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:53px;line-height:53px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:53px;min-height:35px;padding:15px 16px;font-size:17px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:45px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:36px;height:36px;line-height:36px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:53px;height:53px;line-height:53px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#468847}.has-success .form-control{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.has-success .input-group-addon{color:#468847;border-color:#468847;background-color:#dff0d8}.has-success .form-control-feedback{color:#468847}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#c09853}.has-warning .form-control{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.has-warning .input-group-addon{color:#c09853;border-color:#c09853;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#c09853}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#b94a48}.has-error .form-control{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.has-error .input-group-addon{color:#b94a48;border-color:#b94a48;background-color:#f2dede}.has-error .form-control-feedback{color:#b94a48}.has-feedback label~.form-control-feedback{top:23px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#b7b7b7}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:9px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:9px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:19.6666662px;font-size:17px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:8px 12px;font-size:13px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#ffffff;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#ffffff;background-color:#474949;border-color:#474949}.btn-default:focus,.btn-default.focus{color:#ffffff;background-color:#2e2f2f;border-color:#080808}.btn-default:hover{color:#ffffff;background-color:#2e2f2f;border-color:#292a2a}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#ffffff;background-color:#2e2f2f;border-color:#292a2a}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#ffffff;background-color:#1c1d1d;border-color:#080808}.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.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:#474949;border-color:#474949}.btn-default .badge{color:#474949;background-color:#ffffff}.btn-primary{color:#ffffff;background-color:#d9230f;border-color:#d9230f}.btn-primary:focus,.btn-primary.focus{color:#ffffff;background-color:#a91b0c;border-color:#621007}.btn-primary:hover{color:#ffffff;background-color:#a91b0c;border-color:#a01a0b}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#ffffff;background-color:#a91b0c;border-color:#a01a0b}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#ffffff;background-color:#881609;border-color:#621007}.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.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:#d9230f;border-color:#d9230f}.btn-primary .badge{color:#d9230f;background-color:#ffffff}.btn-success{color:#ffffff;background-color:#469408;border-color:#469408}.btn-success:focus,.btn-success.focus{color:#ffffff;background-color:#2f6405;border-color:#0d1b01}.btn-success:hover{color:#ffffff;background-color:#2f6405;border-color:#2b5a05}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#ffffff;background-color:#2f6405;border-color:#2b5a05}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#ffffff;background-color:#1f4204;border-color:#0d1b01}.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.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:#469408;border-color:#469408}.btn-success .badge{color:#469408;background-color:#ffffff}.btn-info{color:#ffffff;background-color:#029acf;border-color:#029acf}.btn-info:focus,.btn-info.focus{color:#ffffff;background-color:#02749c;border-color:#013c51}.btn-info:hover{color:#ffffff;background-color:#02749c;border-color:#016d92}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#ffffff;background-color:#02749c;border-color:#016d92}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#ffffff;background-color:#015a79;border-color:#013c51}.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.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:#029acf;border-color:#029acf}.btn-info .badge{color:#029acf;background-color:#ffffff}.btn-warning{color:#ffffff;background-color:#9b479f;border-color:#9b479f}.btn-warning:focus,.btn-warning.focus{color:#ffffff;background-color:#79377c;border-color:#452047}.btn-warning:hover{color:#ffffff;background-color:#79377c;border-color:#723475}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#ffffff;background-color:#79377c;border-color:#723475}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#ffffff;background-color:#612c63;border-color:#452047}.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.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:#9b479f;border-color:#9b479f}.btn-warning .badge{color:#9b479f;background-color:#ffffff}.btn-danger{color:#ffffff;background-color:#d9831f;border-color:#d9831f}.btn-danger:focus,.btn-danger.focus{color:#ffffff;background-color:#ac6819;border-color:#69400f}.btn-danger:hover{color:#ffffff;background-color:#ac6819;border-color:#a36317}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#ffffff;background-color:#ac6819;border-color:#a36317}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#ffffff;background-color:#8d5514;border-color:#69400f}.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.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:#d9831f;border-color:#d9831f}.btn-danger .badge{color:#d9831f;background-color:#ffffff}.btn-link{color:#d9230f;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#91170a;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:#808080;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:14px 16px;font-size:17px;line-height:1.3333333;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;-o-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:0.35s;-o-transition-duration:0.35s;transition-duration:0.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:13px;text-align:left;background-color:#ffffff;border:1px solid #cccccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:8px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#444444;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#ffffff;background-color:#d9230f}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#ffffff;text-decoration:none;outline:0;background-color:#d9230f}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#808080}.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.42857143;color:#808080;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:53px;padding:14px 16px;font-size:17px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:53px;line-height:53px}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:8px 12px;font-size:13px;font-weight:normal;line-height:1;color:#777777;text-align:center;background-color:#dddddd;border:1px solid #dddddd;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:14px 16px;font-size:17px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#dddddd}.nav>li.disabled>a{color:#808080}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#808080;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#dddddd;border-color:#d9230f}.nav .nav-divider{height:1px;margin:8px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #dddddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#dddddd #dddddd #dddddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#777777;background-color:#fcfcfc;border:1px solid #dddddd;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 #dddddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #dddddd;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:#fcfcfc}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#ffffff;background-color:#d9230f}.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 #dddddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #dddddd;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:#fcfcfc}}.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:40px;margin-bottom:18px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:11px 15px;font-size:17px;line-height:18px;height:40px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:3px;margin-bottom:3px;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:5.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:18px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:18px}.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:11px;padding-bottom:11px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:2px;margin-bottom:2px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:2px;margin-bottom:2px}.navbar-btn.btn-sm{margin-top:5px;margin-bottom:5px}.navbar-btn.btn-xs{margin-top:9px;margin-bottom:9px}.navbar-text{margin-top:11px;margin-bottom:11px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#ffffff;border-color:#eeeeee}.navbar-default .navbar-brand{color:#777777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#d9230f;background-color:transparent}.navbar-default .navbar-text{color:#777777}.navbar-default .navbar-nav>li>a{color:#777777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#d9230f;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#d9230f;background-color:transparent}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#444444;background-color:transparent}.navbar-default .navbar-toggle{border-color:#dddddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#dddddd}.navbar-default .navbar-toggle .icon-bar{background-color:#cccccc}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#eeeeee}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:transparent;color:#d9230f}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#d9230f;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:#d9230f;background-color:transparent}.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:#444444;background-color:transparent}}.navbar-default .navbar-link{color:#777777}.navbar-default .navbar-link:hover{color:#d9230f}.navbar-default .btn-link{color:#777777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#d9230f}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#444444}.navbar-inverse{background-color:#d9230f;border-color:#a91b0c}.navbar-inverse .navbar-brand{color:#fac0ba}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#ffffff;background-color:transparent}.navbar-inverse .navbar-text{color:#fac0ba}.navbar-inverse .navbar-nav>li>a{color:#fac0ba}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#ffffff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#ffffff;background-color:transparent}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#cccccc;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#a91b0c}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#a91b0c}.navbar-inverse .navbar-toggle .icon-bar{background-color:#ffffff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#b81e0d}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:transparent;color:#ffffff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#a91b0c}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#a91b0c}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#fac0ba}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#ffffff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:transparent}.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:#cccccc;background-color:transparent}}.navbar-inverse .navbar-link{color:#fac0ba}.navbar-inverse .navbar-link:hover{color:#ffffff}.navbar-inverse .btn-link{color:#fac0ba}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#ffffff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#cccccc}.breadcrumb{padding:8px 15px;margin-bottom:18px;list-style:none;background-color:transparent;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#cccccc}.breadcrumb>.active{color:#808080}.pagination{display:inline-block;padding-left:0;margin:18px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:8px 12px;line-height:1.42857143;text-decoration:none;color:#444444;background-color:#ffffff;border:1px solid #dddddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{z-index:3;color:#ffffff;background-color:#d9230f;border-color:#d9230f}.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:#ffffff;background-color:#d9230f;border-color:#d9230f;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:#dddddd;background-color:#ffffff;border-color:#dddddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:14px 16px;font-size:17px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:18px 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:#ffffff;border:1px solid #dddddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#d9230f}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#dddddd;background-color:#ffffff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#ffffff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#ffffff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#474949}.label-default[href]:hover,.label-default[href]:focus{background-color:#2e2f2f}.label-primary{background-color:#d9230f}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#a91b0c}.label-success{background-color:#469408}.label-success[href]:hover,.label-success[href]:focus{background-color:#2f6405}.label-info{background-color:#029acf}.label-info[href]:hover,.label-info[href]:focus{background-color:#02749c}.label-warning{background-color:#9b479f}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#79377c}.label-danger{background-color:#d9831f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#ac6819}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;color:#ffffff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#d9230f;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#ffffff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#d9230f;background-color:#ffffff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#f4f4f4}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:20px;font-weight:200}.jumbotron>hr{border-top-color:#dbdbdb}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:59px}}.thumbnail{display:block;padding:4px;margin-bottom:18px;line-height:1.42857143;background-color:#fcfcfc;border:1px solid #dddddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#d9230f}.thumbnail .caption{padding:9px;color:#777777}.alert{padding:15px;margin-bottom:18px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#468847}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#356635}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#3a87ad}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#2d6987}.alert-warning{background-color:#fcf8e3;border-color:#fbeed5;color:#c09853}.alert-warning hr{border-top-color:#f8e5be}.alert-warning .alert-link{color:#a47e3c}.alert-danger{background-color:#f2dede;border-color:#eed3d7;color:#b94a48}.alert-danger hr{border-top-color:#e6c1c7}.alert-danger .alert-link{color:#953b39}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:18px;margin-bottom:18px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:18px;color:#ffffff;text-align:center;background-color:#d9230f;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#469408}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#029acf}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#9b479f}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#d9831f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#ffffff;border:1px solid #dddddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333333}a.list-group-item:hover,button.list-group-item:hover,a.list-group-item:focus,button.list-group-item:focus{text-decoration:none;color:#555555;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#dddddd;color:#808080;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#808080}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#ffffff;background-color:#d9230f;border-color:#d9230f}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#fac0ba}.list-group-item-success{color:#468847;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#468847}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,button.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:focus{color:#468847;background-color:#d0e9c6}a.list-group-item-success.active,button.list-group-item-success.active,a.list-group-item-success.active:hover,button.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active:focus{color:#fff;background-color:#468847;border-color:#468847}.list-group-item-info{color:#3a87ad;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#3a87ad}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,button.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:focus{color:#3a87ad;background-color:#c4e3f3}a.list-group-item-info.active,button.list-group-item-info.active,a.list-group-item-info.active:hover,button.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active:focus{color:#fff;background-color:#3a87ad;border-color:#3a87ad}.list-group-item-warning{color:#c09853;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#c09853}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,button.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:focus{color:#c09853;background-color:#faf2cc}a.list-group-item-warning.active,button.list-group-item-warning.active,a.list-group-item-warning.active:hover,button.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active:focus{color:#fff;background-color:#c09853;border-color:#c09853}.list-group-item-danger{color:#b94a48;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#b94a48}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,button.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:focus{color:#b94a48;background-color:#ebcccc}a.list-group-item-danger.active,button.list-group-item-danger.active,a.list-group-item-danger.active:hover,button.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active:focus{color:#fff;background-color:#b94a48;border-color:#b94a48}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:18px;background-color:#ffffff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:15px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#fcfcfc;border-top:1px solid #dddddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #dddddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:18px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #dddddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #dddddd}.panel-default{border-color:#dddddd}.panel-default>.panel-heading{color:#444444;background-color:#fcfcfc;border-color:#dddddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#dddddd}.panel-default>.panel-heading .badge{color:#fcfcfc;background-color:#444444}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#dddddd}.panel-primary{border-color:#d9230f}.panel-primary>.panel-heading{color:#ffffff;background-color:#d9230f;border-color:#d9230f}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d9230f}.panel-primary>.panel-heading .badge{color:#d9230f;background-color:#ffffff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d9230f}.panel-success{border-color:#469408}.panel-success>.panel-heading{color:#ffffff;background-color:#469408;border-color:#469408}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#469408}.panel-success>.panel-heading .badge{color:#469408;background-color:#ffffff}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#469408}.panel-info{border-color:#029acf}.panel-info>.panel-heading{color:#ffffff;background-color:#029acf;border-color:#029acf}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#029acf}.panel-info>.panel-heading .badge{color:#029acf;background-color:#ffffff}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#029acf}.panel-warning{border-color:#9b479f}.panel-warning>.panel-heading{color:#ffffff;background-color:#9b479f;border-color:#9b479f}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#9b479f}.panel-warning>.panel-heading .badge{color:#9b479f;background-color:#ffffff}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#9b479f}.panel-danger{border-color:#d9831f}.panel-danger>.panel-heading{color:#ffffff;background-color:#d9831f;border-color:#d9831f}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d9831f}.panel-danger>.panel-heading .badge{color:#d9831f;background-color:#ffffff}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d9831f}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f4f4f4;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:19.5px;font-weight:bold;line-height:1;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000000;text-decoration:none;cursor:pointer;opacity:0.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#ffffff;border:1px solid #999999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:0.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{padding:20px;text-align:right;border-top:1px solid #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}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:12px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:0.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;background-color:#000000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:13px;background-color:#ffffff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #cccccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:13px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#ffffff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999999;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#ffffff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#ffffff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999999;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#ffffff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:0.5;filter:alpha(opacity=50);font-size:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.5)), to(rgba(0,0,0,0.0001)));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.0001)), to(rgba(0,0,0,0.5)));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #ffffff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#ffffff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}.navbar-inverse .badge{background-color:#fff;color:#d9230f}.btn{font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif}.btn-default,.btn-default:hover{background-image:-webkit-linear-gradient(#4f5151, #474949 6%, #3f4141);background-image:-o-linear-gradient(#4f5151, #474949 6%, #3f4141);background-image:-webkit-gradient(linear, left top, left bottom, from(#4f5151), color-stop(6%, #474949), to(#3f4141));background-image:linear-gradient(#4f5151, #474949 6%, #3f4141);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4f5151', endColorstr='#ff3f4141', GradientType=0);-webkit-filter:none;filter:none;border:1px solid #2e2f2f}.btn-primary,.btn-primary:hover{background-image:-webkit-linear-gradient(#e72510, #d9230f 6%, #cb210e);background-image:-o-linear-gradient(#e72510, #d9230f 6%, #cb210e);background-image:-webkit-gradient(linear, left top, left bottom, from(#e72510), color-stop(6%, #d9230f), to(#cb210e));background-image:linear-gradient(#e72510, #d9230f 6%, #cb210e);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe72510', endColorstr='#ffcb210e', GradientType=0);-webkit-filter:none;filter:none;border:1px solid #a91b0c}.btn-success,.btn-success:hover{background-image:-webkit-linear-gradient(#4da309, #469408 6%, #3f8507);background-image:-o-linear-gradient(#4da309, #469408 6%, #3f8507);background-image:-webkit-gradient(linear, left top, left bottom, from(#4da309), color-stop(6%, #469408), to(#3f8507));background-image:linear-gradient(#4da309, #469408 6%, #3f8507);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4da309', endColorstr='#ff3f8507', GradientType=0);-webkit-filter:none;filter:none;border:1px solid #2f6405}.btn-info,.btn-info:hover{background-image:-webkit-linear-gradient(#02a5de, #029acf 6%, #028fc0);background-image:-o-linear-gradient(#02a5de, #029acf 6%, #028fc0);background-image:-webkit-gradient(linear, left top, left bottom, from(#02a5de), color-stop(6%, #029acf), to(#028fc0));background-image:linear-gradient(#02a5de, #029acf 6%, #028fc0);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff02a5de', endColorstr='#ff028fc0', GradientType=0);-webkit-filter:none;filter:none;border:1px solid #02749c}.btn-warning,.btn-warning:hover{background-image:-webkit-linear-gradient(#a54caa, #9b479f 6%, #914294);background-image:-o-linear-gradient(#a54caa, #9b479f 6%, #914294);background-image:-webkit-gradient(linear, left top, left bottom, from(#a54caa), color-stop(6%, #9b479f), to(#914294));background-image:linear-gradient(#a54caa, #9b479f 6%, #914294);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffa54caa', endColorstr='#ff914294', GradientType=0);-webkit-filter:none;filter:none;border:1px solid #79377c}.btn-danger,.btn-danger:hover{background-image:-webkit-linear-gradient(#e08b27, #d9831f 6%, #cc7b1d);background-image:-o-linear-gradient(#e08b27, #d9831f 6%, #cc7b1d);background-image:-webkit-gradient(linear, left top, left bottom, from(#e08b27), color-stop(6%, #d9831f), to(#cc7b1d));background-image:linear-gradient(#e08b27, #d9831f 6%, #cc7b1d);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe08b27', endColorstr='#ffcc7b1d', GradientType=0);-webkit-filter:none;filter:none;border:1px solid #ac6819}body{font-weight:200}th{color:#444444}legend{color:#444444}label{font-weight:normal}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label,.has-warning .form-control-feedback{color:#d9831f}.has-warning .form-control,.has-warning .form-control:focus{border-color:#d9831f}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label,.has-error .form-control-feedback{color:#d9230f}.has-error .form-control,.has-error .form-control:focus{border-color:#d9230f}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label,.has-success .form-control-feedback{color:#469408}.has-success .form-control,.has-success .form-control:focus{border-color:#469408}.pager a{color:#444444}.pager a:hover,.pager .active>a{border-color:#d9230f;color:#fff}.pager .disabled>a{border-color:#dddddd} \ No newline at end of file diff --git a/flask_admin/static/bootstrap/bootstrap3/swatch/slate/bootstrap.min.css b/flask_admin/static/bootstrap/bootstrap3/swatch/slate/bootstrap.min.css deleted file mode 100644 index a333aac28..000000000 --- a/flask_admin/static/bootstrap/bootstrap3/swatch/slate/bootstrap.min.css +++ /dev/null @@ -1,11 +0,0 @@ -/*! - * bootswatch v3.3.5 - * Homepage: http://bootswatch.com - * Copyright 2012-2015 Thomas Park - * Licensed under MIT - * Based on Bootstrap -*//*! - * Bootstrap v3.3.5 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;-webkit-box-shadow:none !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#c8c8c8;background-color:#272b30}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#ffffff;text-decoration:none}a:hover,a:focus{color:#ffffff;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,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#1c1e22;border:1px solid #0c0d0e;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #1c1e22}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#7a8288}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{background-color:#f89406;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#7a8288}.text-primary{color:#7a8288}a.text-primary:hover,a.text-primary:focus{color:#62686d}.text-success{color:#ffffff}a.text-success:hover,a.text-success:focus{color:#e6e6e6}.text-info{color:#ffffff}a.text-info:hover,a.text-info:focus{color:#e6e6e6}.text-warning{color:#ffffff}a.text-warning:hover,a.text-warning:focus{color:#e6e6e6}.text-danger{color:#ffffff}a.text-danger:hover,a.text-danger:focus{color:#e6e6e6}.bg-primary{color:#fff;background-color:#7a8288}a.bg-primary:hover,a.bg-primary:focus{background-color:#62686d}.bg-success{background-color:#62c462}a.bg-success:hover,a.bg-success:focus{background-color:#42b142}.bg-info{background-color:#5bc0de}a.bg-info:hover,a.bg-info:focus{background-color:#31b0d5}.bg-warning{background-color:#f89406}a.bg-warning:hover,a.bg-warning:focus{background-color:#c67605}.bg-danger{background-color:#ee5f5b}a.bg-danger:hover,a.bg-danger:focus{background-color:#e9322d}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #1c1e22}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;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #7a8288}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #7a8288}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#7a8288}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 #7a8288;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#ffffff;background-color:#333333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#3a3f44;background-color:#f5f5f5;border:1px solid #cccccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0%}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0%}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0%}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0%}}table{background-color:#2e3338}caption{padding-top:8px;padding-bottom:8px;color:#7a8288;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #1c1e22}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #1c1e22}.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 #1c1e22}.table .table{background-color:#272b30}.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 #1c1e22}.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 #1c1e22}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#353a41}.table-hover>tbody>tr:hover{background-color:#49515a}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:#49515a}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#3e444c}.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:#62c462}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#4fbd4f}.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:#5bc0de}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#46b8da}.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:#f89406}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#df8505}.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:#ee5f5b}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ec4844}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #1c1e22}.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:#c8c8c8;border:0;border-bottom:1px solid #1c1e22}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:9px;font-size:14px;line-height:1.42857143;color:#272b30}.form-control{display:block;width:100%;height:38px;padding:8px 12px;font-size:14px;line-height:1.42857143;color:#272b30;background-color:#ffffff;background-image:none;border:1px solid #cccccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control::-moz-placeholder{color:#7a8288;opacity:1}.form-control:-ms-input-placeholder{color:#7a8288}.form-control::-webkit-input-placeholder{color:#7a8288}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#999999;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:38px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:54px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:9px;padding-bottom:9px;margin-bottom:0;min-height:34px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:54px;padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:54px;line-height:54px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:54px;padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:54px;line-height:54px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:54px;min-height:38px;padding:15px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:47.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:38px;height:38px;line-height:38px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:54px;height:54px;line-height:54px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#ffffff}.has-success .form-control{border-color:#ffffff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-success .input-group-addon{color:#ffffff;border-color:#ffffff;background-color:#62c462}.has-success .form-control-feedback{color:#ffffff}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#ffffff}.has-warning .form-control{border-color:#ffffff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-warning .input-group-addon{color:#ffffff;border-color:#ffffff;background-color:#f89406}.has-warning .form-control-feedback{color:#ffffff}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#ffffff}.has-error .form-control{border-color:#ffffff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-error .input-group-addon{color:#ffffff;border-color:#ffffff;background-color:#ee5f5b}.has-error .form-control-feedback{color:#ffffff}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#ffffff}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:9px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:29px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:9px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:19.6666662px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:8px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#ffffff;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#ffffff;background-color:#3a3f44;border-color:#3a3f44}.btn-default:focus,.btn-default.focus{color:#ffffff;background-color:#232628;border-color:#000000}.btn-default:hover{color:#ffffff;background-color:#232628;border-color:#1e2023}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#ffffff;background-color:#232628;border-color:#1e2023}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#ffffff;background-color:#121415;border-color:#000000}.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.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:#3a3f44;border-color:#3a3f44}.btn-default .badge{color:#3a3f44;background-color:#ffffff}.btn-primary{color:#ffffff;background-color:#7a8288;border-color:#7a8288}.btn-primary:focus,.btn-primary.focus{color:#ffffff;background-color:#62686d;border-color:#3e4245}.btn-primary:hover{color:#ffffff;background-color:#62686d;border-color:#5d6368}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#ffffff;background-color:#62686d;border-color:#5d6368}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#ffffff;background-color:#51565a;border-color:#3e4245}.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.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:#7a8288;border-color:#7a8288}.btn-primary .badge{color:#7a8288;background-color:#ffffff}.btn-success{color:#ffffff;background-color:#62c462;border-color:#62c462}.btn-success:focus,.btn-success.focus{color:#ffffff;background-color:#42b142;border-color:#2d792d}.btn-success:hover{color:#ffffff;background-color:#42b142;border-color:#40a940}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#ffffff;background-color:#42b142;border-color:#40a940}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#ffffff;background-color:#399739;border-color:#2d792d}.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.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:#62c462;border-color:#62c462}.btn-success .badge{color:#62c462;background-color:#ffffff}.btn-info{color:#ffffff;background-color:#5bc0de;border-color:#5bc0de}.btn-info:focus,.btn-info.focus{color:#ffffff;background-color:#31b0d5;border-color:#1f7e9a}.btn-info:hover{color:#ffffff;background-color:#31b0d5;border-color:#2aabd2}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#ffffff;background-color:#31b0d5;border-color:#2aabd2}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#ffffff;background-color:#269abc;border-color:#1f7e9a}.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.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:#5bc0de}.btn-info .badge{color:#5bc0de;background-color:#ffffff}.btn-warning{color:#ffffff;background-color:#f89406;border-color:#f89406}.btn-warning:focus,.btn-warning.focus{color:#ffffff;background-color:#c67605;border-color:#7c4a03}.btn-warning:hover{color:#ffffff;background-color:#c67605;border-color:#bc7005}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#ffffff;background-color:#c67605;border-color:#bc7005}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#ffffff;background-color:#a36104;border-color:#7c4a03}.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.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:#f89406;border-color:#f89406}.btn-warning .badge{color:#f89406;background-color:#ffffff}.btn-danger{color:#ffffff;background-color:#ee5f5b;border-color:#ee5f5b}.btn-danger:focus,.btn-danger.focus{color:#ffffff;background-color:#e9322d;border-color:#b71713}.btn-danger:hover{color:#ffffff;background-color:#e9322d;border-color:#e82924}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#ffffff;background-color:#e9322d;border-color:#e82924}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#ffffff;background-color:#dc1c17;border-color:#b71713}.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.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:#ee5f5b;border-color:#ee5f5b}.btn-danger .badge{color:#ee5f5b;background-color:#ffffff}.btn-link{color:#ffffff;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#ffffff;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:#7a8288;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;-o-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:0.35s;-o-transition-duration:0.35s;transition-duration:0.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#3a3f44;border:1px solid #272b30;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#272b30}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#c8c8c8;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#ffffff;background-color:#272b30}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#ffffff;text-decoration:none;outline:0;background-color:#272b30}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#7a8288}.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.42857143;color:#7a8288;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:54px;padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:54px;line-height:54px}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:8px 12px;font-size:14px;font-weight:normal;line-height:1;color:#272b30;text-align:center;background-color:#999999;border:1px solid #cccccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:14px 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{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#3e444c}.nav>li.disabled>a{color:#7a8288}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#7a8288;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#3e444c;border-color:#ffffff}.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 #1c1e22}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#1c1e22 #1c1e22 #1c1e22}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#ffffff;background-color:#3e444c;border:1px solid #1c1e22;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 #1c1e22}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #1c1e22;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:#272b30}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#ffffff;background-color:transparent}.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 #1c1e22}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #1c1e22;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:#272b30}}.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{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top: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;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:6px;margin-bottom:6px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:6px;margin-bottom:6px}.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}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#3a3f44;border-color:#2b2e32}.navbar-default .navbar-brand{color:#c8c8c8}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#ffffff;background-color:none}.navbar-default .navbar-text{color:#c8c8c8}.navbar-default .navbar-nav>li>a{color:#c8c8c8}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#ffffff;background-color:#272b2e}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#ffffff;background-color:#272b2e}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#cccccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#272b2e}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#272b2e}.navbar-default .navbar-toggle .icon-bar{background-color:#c8c8c8}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#2b2e32}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#272b2e;color:#ffffff}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#c8c8c8}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#ffffff;background-color:#272b2e}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#272b2e}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#cccccc;background-color:transparent}}.navbar-default .navbar-link{color:#c8c8c8}.navbar-default .navbar-link:hover{color:#ffffff}.navbar-default .btn-link{color:#c8c8c8}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#ffffff}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#cccccc}.navbar-inverse{background-color:#7a8288;border-color:#62686d}.navbar-inverse .navbar-brand{color:#cccccc}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#ffffff;background-color:none}.navbar-inverse .navbar-text{color:#cccccc}.navbar-inverse .navbar-nav>li>a{color:#cccccc}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#ffffff;background-color:#5d6368}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#ffffff;background-color:#5d6368}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#cccccc;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#5d6368}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#5d6368}.navbar-inverse .navbar-toggle .icon-bar{background-color:#ffffff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#697075}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#5d6368;color:#ffffff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#62686d}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#62686d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#cccccc}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#ffffff;background-color:#5d6368}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#5d6368}.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:#cccccc;background-color:transparent}}.navbar-inverse .navbar-link{color:#cccccc}.navbar-inverse .navbar-link:hover{color:#ffffff}.navbar-inverse .btn-link{color:#cccccc}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#ffffff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#cccccc}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:transparent;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#cccccc}.breadcrumb>.active{color:#7a8288}.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:8px 12px;line-height:1.42857143;text-decoration:none;color:#ffffff;background-color:#3a3f44;border:1px solid rgba(0,0,0,0.6);margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{z-index:3;color:#ffffff;background-color:transparent;border-color:rgba(0,0,0,0.6)}.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:#ffffff;background-color:#232628;border-color:rgba(0,0,0,0.6);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:#7a8288;background-color:#ffffff;border-color:rgba(0,0,0,0.6);cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:14px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin: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:#3a3f44;border:1px solid rgba(0,0,0,0.6);border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:transparent}.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:#7a8288;background-color:#3a3f44;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#ffffff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#ffffff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#3a3f44}.label-default[href]:hover,.label-default[href]:focus{background-color:#232628}.label-primary{background-color:#7a8288}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#62686d}.label-success{background-color:#62c462}.label-success[href]:hover,.label-success[href]:focus{background-color:#42b142}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f89406}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#c67605}.label-danger{background-color:#ee5f5b}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#e9322d}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;color:#ffffff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#7a8288;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#ffffff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#ffffff;background-color:#7a8288}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#1c1e22}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#050506}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#1c1e22;border:1px solid #0c0d0e;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#ffffff}.thumbnail .caption{padding:9px;color:#c8c8c8}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#62c462;border-color:#62bd4f;color:#ffffff}.alert-success hr{border-top-color:#55b142}.alert-success .alert-link{color:#e6e6e6}.alert-info{background-color:#5bc0de;border-color:#3dced8;color:#ffffff}.alert-info hr{border-top-color:#2ac7d2}.alert-info .alert-link{color:#e6e6e6}.alert-warning{background-color:#f89406;border-color:#e96506;color:#ffffff}.alert-warning hr{border-top-color:#d05a05}.alert-warning .alert-link{color:#e6e6e6}.alert-danger{background-color:#ee5f5b;border-color:#ed4d63;color:#ffffff}.alert-danger hr{border-top-color:#ea364f}.alert-danger .alert-link{color:#e6e6e6}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#1c1e22;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:20px;color:#ffffff;text-align:center;background-color:#7a8288;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#62c462}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#f89406}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#ee5f5b}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#32383e;border:1px solid rgba(0,0,0,0.6)}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#c8c8c8}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#ffffff}a.list-group-item:hover,button.list-group-item:hover,a.list-group-item:focus,button.list-group-item:focus{text-decoration:none;color:#c8c8c8;background-color:#3e444c}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#999999;color:#7a8288;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#7a8288}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#ffffff;background-color:#3e444c;border-color:rgba(0,0,0,0.6)}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#a2aab4}.list-group-item-success{color:#ffffff;background-color:#62c462}a.list-group-item-success,button.list-group-item-success{color:#ffffff}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,button.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:focus{color:#ffffff;background-color:#4fbd4f}a.list-group-item-success.active,button.list-group-item-success.active,a.list-group-item-success.active:hover,button.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-info{color:#ffffff;background-color:#5bc0de}a.list-group-item-info,button.list-group-item-info{color:#ffffff}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,button.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:focus{color:#ffffff;background-color:#46b8da}a.list-group-item-info.active,button.list-group-item-info.active,a.list-group-item-info.active:hover,button.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-warning{color:#ffffff;background-color:#f89406}a.list-group-item-warning,button.list-group-item-warning{color:#ffffff}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,button.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:focus{color:#ffffff;background-color:#df8505}a.list-group-item-warning.active,button.list-group-item-warning.active,a.list-group-item-warning.active:hover,button.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-danger{color:#ffffff;background-color:#ee5f5b}a.list-group-item-danger,button.list-group-item-danger{color:#ffffff}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,button.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:focus{color:#ffffff;background-color:#ec4844}a.list-group-item-danger.active,button.list-group-item-danger.active,a.list-group-item-danger.active:hover,button.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#2e3338;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#3e444c;border-top:1px solid rgba(0,0,0,0.6);border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #1c1e22}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid rgba(0,0,0,0.6)}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid rgba(0,0,0,0.6)}.panel-default{border-color:rgba(0,0,0,0.6)}.panel-default>.panel-heading{color:#c8c8c8;background-color:#3e444c;border-color:rgba(0,0,0,0.6)}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:rgba(0,0,0,0.6)}.panel-default>.panel-heading .badge{color:#3e444c;background-color:#c8c8c8}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:rgba(0,0,0,0.6)}.panel-primary{border-color:rgba(0,0,0,0.6)}.panel-primary>.panel-heading{color:#ffffff;background-color:#7a8288;border-color:rgba(0,0,0,0.6)}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:rgba(0,0,0,0.6)}.panel-primary>.panel-heading .badge{color:#7a8288;background-color:#ffffff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:rgba(0,0,0,0.6)}.panel-success{border-color:rgba(0,0,0,0.6)}.panel-success>.panel-heading{color:#ffffff;background-color:#62c462;border-color:rgba(0,0,0,0.6)}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:rgba(0,0,0,0.6)}.panel-success>.panel-heading .badge{color:#62c462;background-color:#ffffff}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:rgba(0,0,0,0.6)}.panel-info{border-color:rgba(0,0,0,0.6)}.panel-info>.panel-heading{color:#ffffff;background-color:#5bc0de;border-color:rgba(0,0,0,0.6)}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:rgba(0,0,0,0.6)}.panel-info>.panel-heading .badge{color:#5bc0de;background-color:#ffffff}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:rgba(0,0,0,0.6)}.panel-warning{border-color:rgba(0,0,0,0.6)}.panel-warning>.panel-heading{color:#ffffff;background-color:#f89406;border-color:rgba(0,0,0,0.6)}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:rgba(0,0,0,0.6)}.panel-warning>.panel-heading .badge{color:#f89406;background-color:#ffffff}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:rgba(0,0,0,0.6)}.panel-danger{border-color:rgba(0,0,0,0.6)}.panel-danger>.panel-heading{color:#ffffff;background-color:#ee5f5b;border-color:rgba(0,0,0,0.6)}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:rgba(0,0,0,0.6)}.panel-danger>.panel-heading .badge{color:#ee5f5b;background-color:#ffffff}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:rgba(0,0,0,0.6)}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#1c1e22;border:1px solid #0c0d0e;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000000;text-decoration:none;cursor:pointer;opacity:0.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#2e3338;border:1px solid #999999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:0.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #1c1e22;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{padding:20px;text-align:right;border-top:1px solid #1c1e22}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:12px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:0.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;background-color:#000000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:14px;background-color:#2e3338;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;background-color:#2e3338;border-bottom:1px solid #22262a;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#666666;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#2e3338}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#666666;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#2e3338}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#666666;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#2e3338}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#666666;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#2e3338;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:0.5;filter:alpha(opacity=50);font-size:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.5)), to(rgba(0,0,0,0.0001)));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.0001)), to(rgba(0,0,0,0.5)));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #ffffff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#ffffff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}.navbar{background-image:-webkit-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-o-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-webkit-gradient(linear, left top, left bottom, from(#484e55), color-stop(60%, #3a3f44), to(#313539));background-image:linear-gradient(#484e55, #3a3f44 60%, #313539);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff484e55', endColorstr='#ff313539', GradientType=0);-webkit-filter:none;filter:none;border:1px solid rgba(0,0,0,0.6);text-shadow:1px 1px 1px rgba(0,0,0,0.3)}.navbar-inverse{background-image:-webkit-linear-gradient(#8a9196, #7a8288 60%, #70787d);background-image:-o-linear-gradient(#8a9196, #7a8288 60%, #70787d);background-image:-webkit-gradient(linear, left top, left bottom, from(#8a9196), color-stop(60%, #7a8288), to(#70787d));background-image:linear-gradient(#8a9196, #7a8288 60%, #70787d);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff8a9196', endColorstr='#ff70787d', GradientType=0);-webkit-filter:none;filter:none}.navbar-inverse .badge{background-color:#5d6368}.navbar-nav>li>a{border-right:1px solid rgba(0,0,0,0.2);border-left:1px solid rgba(255,255,255,0.1)}.navbar-nav>li>a:hover{background-image:-webkit-linear-gradient(#020202, #101112 40%, #191b1d);background-image:-o-linear-gradient(#020202, #101112 40%, #191b1d);background-image:-webkit-gradient(linear, left top, left bottom, from(#020202), color-stop(40%, #101112), to(#191b1d));background-image:linear-gradient(#020202, #101112 40%, #191b1d);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff020202', endColorstr='#ff191b1d', GradientType=0);-webkit-filter:none;filter:none;border-left-color:transparent}.navbar .nav .open>a{border-color:transparent}.navbar-nav>li.active>a{border-left-color:transparent}.navbar-form{margin-left:5px;margin-right:5px}.btn,.btn:hover{border-color:rgba(0,0,0,0.6);text-shadow:1px 1px 1px rgba(0,0,0,0.3)}.btn-default{background-image:-webkit-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-o-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-webkit-gradient(linear, left top, left bottom, from(#484e55), color-stop(60%, #3a3f44), to(#313539));background-image:linear-gradient(#484e55, #3a3f44 60%, #313539);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff484e55', endColorstr='#ff313539', GradientType=0);-webkit-filter:none;filter:none}.btn-default:hover{background-image:-webkit-linear-gradient(#020202, #101112 40%, #191b1d);background-image:-o-linear-gradient(#020202, #101112 40%, #191b1d);background-image:-webkit-gradient(linear, left top, left bottom, from(#020202), color-stop(40%, #101112), to(#191b1d));background-image:linear-gradient(#020202, #101112 40%, #191b1d);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff020202', endColorstr='#ff191b1d', GradientType=0);-webkit-filter:none;filter:none}.btn-primary{background-image:-webkit-linear-gradient(#8a9196, #7a8288 60%, #70787d);background-image:-o-linear-gradient(#8a9196, #7a8288 60%, #70787d);background-image:-webkit-gradient(linear, left top, left bottom, from(#8a9196), color-stop(60%, #7a8288), to(#70787d));background-image:linear-gradient(#8a9196, #7a8288 60%, #70787d);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff8a9196', endColorstr='#ff70787d', GradientType=0);-webkit-filter:none;filter:none}.btn-primary:hover{background-image:-webkit-linear-gradient(#404448, #4e5458 40%, #585e62);background-image:-o-linear-gradient(#404448, #4e5458 40%, #585e62);background-image:-webkit-gradient(linear, left top, left bottom, from(#404448), color-stop(40%, #4e5458), to(#585e62));background-image:linear-gradient(#404448, #4e5458 40%, #585e62);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff404448', endColorstr='#ff585e62', GradientType=0);-webkit-filter:none;filter:none}.btn-success{background-image:-webkit-linear-gradient(#78cc78, #62c462 60%, #53be53);background-image:-o-linear-gradient(#78cc78, #62c462 60%, #53be53);background-image:-webkit-gradient(linear, left top, left bottom, from(#78cc78), color-stop(60%, #62c462), to(#53be53));background-image:linear-gradient(#78cc78, #62c462 60%, #53be53);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff78cc78', endColorstr='#ff53be53', GradientType=0);-webkit-filter:none;filter:none}.btn-success:hover{background-image:-webkit-linear-gradient(#2f7d2f, #379337 40%, #3da23d);background-image:-o-linear-gradient(#2f7d2f, #379337 40%, #3da23d);background-image:-webkit-gradient(linear, left top, left bottom, from(#2f7d2f), color-stop(40%, #379337), to(#3da23d));background-image:linear-gradient(#2f7d2f, #379337 40%, #3da23d);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2f7d2f', endColorstr='#ff3da23d', GradientType=0);-webkit-filter:none;filter:none}.btn-info{background-image:-webkit-linear-gradient(#74cae3, #5bc0de 60%, #4ab9db);background-image:-o-linear-gradient(#74cae3, #5bc0de 60%, #4ab9db);background-image:-webkit-gradient(linear, left top, left bottom, from(#74cae3), color-stop(60%, #5bc0de), to(#4ab9db));background-image:linear-gradient(#74cae3, #5bc0de 60%, #4ab9db);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff74cae3', endColorstr='#ff4ab9db', GradientType=0);-webkit-filter:none;filter:none}.btn-info:hover{background-image:-webkit-linear-gradient(#20829f, #2596b8 40%, #28a4c9);background-image:-o-linear-gradient(#20829f, #2596b8 40%, #28a4c9);background-image:-webkit-gradient(linear, left top, left bottom, from(#20829f), color-stop(40%, #2596b8), to(#28a4c9));background-image:linear-gradient(#20829f, #2596b8 40%, #28a4c9);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff20829f', endColorstr='#ff28a4c9', GradientType=0);-webkit-filter:none;filter:none}.btn-warning{background-image:-webkit-linear-gradient(#faa123, #f89406 60%, #e48806);background-image:-o-linear-gradient(#faa123, #f89406 60%, #e48806);background-image:-webkit-gradient(linear, left top, left bottom, from(#faa123), color-stop(60%, #f89406), to(#e48806));background-image:linear-gradient(#faa123, #f89406 60%, #e48806);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffaa123', endColorstr='#ffe48806', GradientType=0);-webkit-filter:none;filter:none}.btn-warning:hover{background-image:-webkit-linear-gradient(#804d03, #9e5f04 40%, #b26a04);background-image:-o-linear-gradient(#804d03, #9e5f04 40%, #b26a04);background-image:-webkit-gradient(linear, left top, left bottom, from(#804d03), color-stop(40%, #9e5f04), to(#b26a04));background-image:linear-gradient(#804d03, #9e5f04 40%, #b26a04);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff804d03', endColorstr='#ffb26a04', GradientType=0);-webkit-filter:none;filter:none}.btn-danger{background-image:-webkit-linear-gradient(#f17a77, #ee5f5b 60%, #ec4d49);background-image:-o-linear-gradient(#f17a77, #ee5f5b 60%, #ec4d49);background-image:-webkit-gradient(linear, left top, left bottom, from(#f17a77), color-stop(60%, #ee5f5b), to(#ec4d49));background-image:linear-gradient(#f17a77, #ee5f5b 60%, #ec4d49);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff17a77', endColorstr='#ffec4d49', GradientType=0);-webkit-filter:none;filter:none}.btn-danger:hover{background-image:-webkit-linear-gradient(#bb1813, #d71c16 40%, #e7201a);background-image:-o-linear-gradient(#bb1813, #d71c16 40%, #e7201a);background-image:-webkit-gradient(linear, left top, left bottom, from(#bb1813), color-stop(40%, #d71c16), to(#e7201a));background-image:linear-gradient(#bb1813, #d71c16 40%, #e7201a);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffbb1813', endColorstr='#ffe7201a', GradientType=0);-webkit-filter:none;filter:none}.btn-link,.btn-link:hover{border-color:transparent}h1,h2,h3,h4,h5,h6{text-shadow:-1px -1px 0 rgba(0,0,0,0.3)}.text-primary,.text-primary:hover{color:#7a8288}.text-success,.text-success:hover{color:#62c462}.text-danger,.text-danger:hover{color:#ee5f5b}.text-warning,.text-warning:hover{color:#f89406}.text-info,.text-info:hover{color:#5bc0de}.table .success,.table .warning,.table .danger,.table .info{color:#fff}.table-bordered tbody tr.success td,.table-bordered tbody tr.warning td,.table-bordered tbody tr.danger td,.table-bordered tbody tr.success:hover td,.table-bordered tbody tr.warning:hover td,.table-bordered tbody tr.danger:hover td{border-color:#1c1e22}.table-responsive>.table{background-color:#2e3338}input,textarea{color:#272b30}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label,.has-warning .form-control-feedback{color:#f89406}.has-warning .form-control,.has-warning .form-control:focus{border-color:#f89406}.has-warning .input-group-addon{background-color:#272b30;border:none}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label,.has-error .form-control-feedback{color:#ee5f5b}.has-error .form-control,.has-error .form-control:focus{border-color:#ee5f5b}.has-error .input-group-addon{background-color:#272b30;border:none}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label,.has-success .form-control-feedback{color:#62c462}.has-success .form-control,.has-success .form-control:focus{border-color:#62c462}.has-success .input-group-addon{background-color:#272b30;border:none}legend{color:#fff}.input-group-addon{border-color:rgba(0,0,0,0.6);text-shadow:1px 1px 1px rgba(0,0,0,0.3);background-image:-webkit-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-o-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-webkit-gradient(linear, left top, left bottom, from(#484e55), color-stop(60%, #3a3f44), to(#313539));background-image:linear-gradient(#484e55, #3a3f44 60%, #313539);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff484e55', endColorstr='#ff313539', GradientType=0);-webkit-filter:none;filter:none;color:#ffffff}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{border-color:rgba(0,0,0,0.6)}.nav-pills>li>a{background-image:-webkit-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-o-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-webkit-gradient(linear, left top, left bottom, from(#484e55), color-stop(60%, #3a3f44), to(#313539));background-image:linear-gradient(#484e55, #3a3f44 60%, #313539);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff484e55', endColorstr='#ff313539', GradientType=0);-webkit-filter:none;filter:none;border:1px solid rgba(0,0,0,0.6);text-shadow:1px 1px 1px rgba(0,0,0,0.3)}.nav-pills>li>a:hover{background-image:-webkit-linear-gradient(#020202, #101112 40%, #191b1d);background-image:-o-linear-gradient(#020202, #101112 40%, #191b1d);background-image:-webkit-gradient(linear, left top, left bottom, from(#020202), color-stop(40%, #101112), to(#191b1d));background-image:linear-gradient(#020202, #101112 40%, #191b1d);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff020202', endColorstr='#ff191b1d', GradientType=0);-webkit-filter:none;filter:none;border:1px solid rgba(0,0,0,0.6)}.nav-pills>li.active>a,.nav-pills>li.active>a:hover{background-color:none;background-image:-webkit-linear-gradient(#020202, #101112 40%, #191b1d);background-image:-o-linear-gradient(#020202, #101112 40%, #191b1d);background-image:-webkit-gradient(linear, left top, left bottom, from(#020202), color-stop(40%, #101112), to(#191b1d));background-image:linear-gradient(#020202, #101112 40%, #191b1d);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff020202', endColorstr='#ff191b1d', GradientType=0);-webkit-filter:none;filter:none;border:1px solid rgba(0,0,0,0.6)}.nav-pills>li.disabled>a,.nav-pills>li.disabled>a:hover{background-image:-webkit-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-o-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-webkit-gradient(linear, left top, left bottom, from(#484e55), color-stop(60%, #3a3f44), to(#313539));background-image:linear-gradient(#484e55, #3a3f44 60%, #313539);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff484e55', endColorstr='#ff313539', GradientType=0);-webkit-filter:none;filter:none}.pagination>li>a,.pagination>li>span{text-shadow:1px 1px 1px rgba(0,0,0,0.3);background-image:-webkit-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-o-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-webkit-gradient(linear, left top, left bottom, from(#484e55), color-stop(60%, #3a3f44), to(#313539));background-image:linear-gradient(#484e55, #3a3f44 60%, #313539);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff484e55', endColorstr='#ff313539', GradientType=0);-webkit-filter:none;filter:none}.pagination>li>a:hover,.pagination>li>span:hover{background-image:-webkit-linear-gradient(#020202, #101112 40%, #191b1d);background-image:-o-linear-gradient(#020202, #101112 40%, #191b1d);background-image:-webkit-gradient(linear, left top, left bottom, from(#020202), color-stop(40%, #101112), to(#191b1d));background-image:linear-gradient(#020202, #101112 40%, #191b1d);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff020202', endColorstr='#ff191b1d', GradientType=0);-webkit-filter:none;filter:none}.pagination>li.active>a,.pagination>li.active>span{background-image:-webkit-linear-gradient(#020202, #101112 40%, #191b1d);background-image:-o-linear-gradient(#020202, #101112 40%, #191b1d);background-image:-webkit-gradient(linear, left top, left bottom, from(#020202), color-stop(40%, #101112), to(#191b1d));background-image:linear-gradient(#020202, #101112 40%, #191b1d);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff020202', endColorstr='#ff191b1d', GradientType=0);-webkit-filter:none;filter:none}.pagination>li.disabled>a,.pagination>li.disabled>a:hover,.pagination>li.disabled>span,.pagination>li.disabled>span:hover{background-color:transparent;background-image:-webkit-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-o-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-webkit-gradient(linear, left top, left bottom, from(#484e55), color-stop(60%, #3a3f44), to(#313539));background-image:linear-gradient(#484e55, #3a3f44 60%, #313539);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff484e55', endColorstr='#ff313539', GradientType=0);-webkit-filter:none;filter:none}.pager>li>a{background-image:-webkit-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-o-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-webkit-gradient(linear, left top, left bottom, from(#484e55), color-stop(60%, #3a3f44), to(#313539));background-image:linear-gradient(#484e55, #3a3f44 60%, #313539);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff484e55', endColorstr='#ff313539', GradientType=0);-webkit-filter:none;filter:none;text-shadow:1px 1px 1px rgba(0,0,0,0.3)}.pager>li>a:hover{background-image:-webkit-linear-gradient(#020202, #101112 40%, #191b1d);background-image:-o-linear-gradient(#020202, #101112 40%, #191b1d);background-image:-webkit-gradient(linear, left top, left bottom, from(#020202), color-stop(40%, #101112), to(#191b1d));background-image:linear-gradient(#020202, #101112 40%, #191b1d);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff020202', endColorstr='#ff191b1d', GradientType=0);-webkit-filter:none;filter:none}.pager>li.disabled>a,.pager>li.disabled>a:hover{background-color:transparent;background-image:-webkit-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-o-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-webkit-gradient(linear, left top, left bottom, from(#484e55), color-stop(60%, #3a3f44), to(#313539));background-image:linear-gradient(#484e55, #3a3f44 60%, #313539);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff484e55', endColorstr='#ff313539', GradientType=0);-webkit-filter:none;filter:none}.breadcrumb{border:1px solid rgba(0,0,0,0.6);text-shadow:1px 1px 1px rgba(0,0,0,0.3);background-image:-webkit-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-o-linear-gradient(#484e55, #3a3f44 60%, #313539);background-image:-webkit-gradient(linear, left top, left bottom, from(#484e55), color-stop(60%, #3a3f44), to(#313539));background-image:linear-gradient(#484e55, #3a3f44 60%, #313539);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff484e55', endColorstr='#ff313539', GradientType=0);-webkit-filter:none;filter:none}.alert .alert-link,.alert a{color:#fff;text-decoration:underline}.alert .close{color:#000000;text-decoration:none}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#0c0d0e}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{border-color:rgba(0,0,0,0.6)}a.list-group-item-success.active{background-color:#62c462}a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{background-color:#4fbd4f}a.list-group-item-warning.active{background-color:#f89406}a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{background-color:#df8505}a.list-group-item-danger.active{background-color:#ee5f5b}a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{background-color:#ec4844}.jumbotron{border:1px solid rgba(0,0,0,0.6)}.panel-primary .panel-heading,.panel-success .panel-heading,.panel-danger .panel-heading,.panel-warning .panel-heading,.panel-info .panel-heading{border-color:#000} \ No newline at end of file diff --git a/flask_admin/static/bootstrap/bootstrap3/swatch/spacelab/bootstrap.min.css b/flask_admin/static/bootstrap/bootstrap3/swatch/spacelab/bootstrap.min.css deleted file mode 100644 index cc83b248c..000000000 --- a/flask_admin/static/bootstrap/bootstrap3/swatch/spacelab/bootstrap.min.css +++ /dev/null @@ -1,11 +0,0 @@ -@import url("https://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700");/*! - * bootswatch v3.3.5 - * Homepage: http://bootswatch.com - * Copyright 2012-2015 Thomas Park - * Licensed under MIT - * Based on Bootstrap -*//*! - * Bootstrap v3.3.5 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;-webkit-box-shadow:none !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#666666;background-color:#ffffff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#3399f3;text-decoration:none}a:hover,a:focus{color:#3399f3;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,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#ffffff;border:1px solid #dddddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eeeeee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1;color:#2d2d2d}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#999999}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#999999}.text-primary{color:#446e9b}a.text-primary:hover,a.text-primary:focus{color:#345578}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-danger{color:#b94a48}a.text-danger:hover,a.text-danger:focus{color:#953b39}.bg-primary{color:#fff;background-color:#446e9b}a.bg-primary:hover,a.bg-primary:focus{background-color:#345578}.bg-success{background-color:#dff0d8}a.bg-success:hover,a.bg-success:focus{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover,a.bg-info:focus{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover,a.bg-warning:focus{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover,a.bg-danger:focus{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eeeeee}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;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eeeeee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#999999}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eeeeee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#ffffff;background-color:#333333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333333;background-color:#f5f5f5;border:1px solid #cccccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0%}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0%}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0%}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0%}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#999999;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #dddddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #dddddd}.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 #dddddd}.table .table{background-color:#ffffff}.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 #dddddd}.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 #dddddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*="col-"]{position:static;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:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #dddddd}.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:#666666;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:9px;font-size:14px;line-height:1.42857143;color:#666666}.form-control{display:block;width:100%;height:38px;padding:8px 12px;font-size:14px;line-height:1.42857143;color:#666666;background-color:#ffffff;background-image:none;border:1px solid #cccccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control::-moz-placeholder{color:#999999;opacity:1}.form-control:-ms-input-placeholder{color:#999999}.form-control::-webkit-input-placeholder{color:#999999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eeeeee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:38px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:54px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:9px;padding-bottom:9px;margin-bottom:0;min-height:34px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:54px;padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:54px;line-height:54px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:54px;padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:54px;line-height:54px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:54px;min-height:38px;padding:15px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:47.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:38px;height:38px;line-height:38px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:54px;height:54px;line-height:54px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#468847}.has-success .form-control{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.has-success .input-group-addon{color:#468847;border-color:#468847;background-color:#dff0d8}.has-success .form-control-feedback{color:#468847}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#c09853}.has-warning .form-control{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.has-warning .input-group-addon{color:#c09853;border-color:#c09853;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#c09853}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#b94a48}.has-error .form-control{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.has-error .input-group-addon{color:#b94a48;border-color:#b94a48;background-color:#f2dede}.has-error .form-control-feedback{color:#b94a48}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#a6a6a6}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:9px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:29px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:9px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:19.6666662px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:8px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#ffffff;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#ffffff;background-color:#474949;border-color:#474949}.btn-default:focus,.btn-default.focus{color:#ffffff;background-color:#2e2f2f;border-color:#080808}.btn-default:hover{color:#ffffff;background-color:#2e2f2f;border-color:#292a2a}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#ffffff;background-color:#2e2f2f;border-color:#292a2a}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#ffffff;background-color:#1c1d1d;border-color:#080808}.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.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:#474949;border-color:#474949}.btn-default .badge{color:#474949;background-color:#ffffff}.btn-primary{color:#ffffff;background-color:#446e9b;border-color:#446e9b}.btn-primary:focus,.btn-primary.focus{color:#ffffff;background-color:#345578;border-color:#1d2f42}.btn-primary:hover{color:#ffffff;background-color:#345578;border-color:#315070}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#ffffff;background-color:#345578;border-color:#315070}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#ffffff;background-color:#2a435f;border-color:#1d2f42}.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.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:#446e9b;border-color:#446e9b}.btn-primary .badge{color:#446e9b;background-color:#ffffff}.btn-success{color:#ffffff;background-color:#3cb521;border-color:#3cb521}.btn-success:focus,.btn-success.focus{color:#ffffff;background-color:#2e8a19;border-color:#18490d}.btn-success:hover{color:#ffffff;background-color:#2e8a19;border-color:#2b8118}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#ffffff;background-color:#2e8a19;border-color:#2b8118}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#ffffff;background-color:#246c14;border-color:#18490d}.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.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:#3cb521;border-color:#3cb521}.btn-success .badge{color:#3cb521;background-color:#ffffff}.btn-info{color:#ffffff;background-color:#3399f3;border-color:#3399f3}.btn-info:focus,.btn-info.focus{color:#ffffff;background-color:#0e80e5;border-color:#09589d}.btn-info:hover{color:#ffffff;background-color:#0e80e5;border-color:#0d7bdc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#ffffff;background-color:#0e80e5;border-color:#0d7bdc}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#ffffff;background-color:#0c6dc4;border-color:#09589d}.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.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:#3399f3;border-color:#3399f3}.btn-info .badge{color:#3399f3;background-color:#ffffff}.btn-warning{color:#ffffff;background-color:#d47500;border-color:#d47500}.btn-warning:focus,.btn-warning.focus{color:#ffffff;background-color:#a15900;border-color:#552f00}.btn-warning:hover{color:#ffffff;background-color:#a15900;border-color:#975300}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#ffffff;background-color:#a15900;border-color:#975300}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#ffffff;background-color:#7d4500;border-color:#552f00}.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.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:#d47500;border-color:#d47500}.btn-warning .badge{color:#d47500;background-color:#ffffff}.btn-danger{color:#ffffff;background-color:#cd0200;border-color:#cd0200}.btn-danger:focus,.btn-danger.focus{color:#ffffff;background-color:#9a0200;border-color:#4e0100}.btn-danger:hover{color:#ffffff;background-color:#9a0200;border-color:#900100}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#ffffff;background-color:#9a0200;border-color:#900100}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#ffffff;background-color:#760100;border-color:#4e0100}.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.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:#cd0200;border-color:#cd0200}.btn-danger .badge{color:#cd0200;background-color:#ffffff}.btn-link{color:#3399f3;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#3399f3;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999999;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;-o-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:0.35s;-o-transition-duration:0.35s;transition-duration:0.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#ffffff;border:1px solid #cccccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#333333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#ffffff;background-color:#446e9b}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#ffffff;text-decoration:none;outline:0;background-color:#446e9b}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#999999;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:54px;padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:54px;line-height:54px}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:8px 12px;font-size:14px;font-weight:normal;line-height:1;color:#666666;text-align:center;background-color:#eeeeee;border:1px solid #cccccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:14px 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{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eeeeee}.nav>li.disabled>a{color:#999999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999999;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eeeeee;border-color:#3399f3}.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 #dddddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#666666;background-color:#ffffff;border:1px solid #dddddd;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 #dddddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #dddddd;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:#ffffff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#ffffff;background-color:#446e9b}.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 #dddddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #dddddd;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:#ffffff}}.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{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top: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;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:6px;margin-bottom:6px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:6px;margin-bottom:6px}.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}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#eeeeee;border-color:#dddddd}.navbar-default .navbar-brand{color:#777777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#3399f3;background-color:transparent}.navbar-default .navbar-text{color:#777777}.navbar-default .navbar-nav>li>a{color:#777777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#3399f3;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#3399f3;background-color:transparent}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#444444;background-color:transparent}.navbar-default .navbar-toggle{border-color:#dddddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#dddddd}.navbar-default .navbar-toggle .icon-bar{background-color:#cccccc}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#dddddd}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:transparent;color:#3399f3}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#3399f3;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:#3399f3;background-color:transparent}.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:#444444;background-color:transparent}}.navbar-default .navbar-link{color:#777777}.navbar-default .navbar-link:hover{color:#3399f3}.navbar-default .btn-link{color:#777777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#3399f3}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#444444}.navbar-inverse{background-color:#446e9b;border-color:#345578}.navbar-inverse .navbar-brand{color:#dddddd}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#ffffff;background-color:transparent}.navbar-inverse .navbar-text{color:#dddddd}.navbar-inverse .navbar-nav>li>a{color:#dddddd}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#ffffff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#ffffff;background-color:transparent}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#cccccc;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#345578}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#345578}.navbar-inverse .navbar-toggle .icon-bar{background-color:#ffffff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#395c82}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:transparent;color:#ffffff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#345578}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#345578}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#dddddd}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#ffffff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:transparent}.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:#cccccc;background-color:transparent}}.navbar-inverse .navbar-link{color:#dddddd}.navbar-inverse .navbar-link:hover{color:#ffffff}.navbar-inverse .btn-link{color:#dddddd}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#ffffff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#cccccc}.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:#cccccc}.breadcrumb>.active{color:#999999}.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:8px 12px;line-height:1.42857143;text-decoration:none;color:#3399f3;background-color:#ffffff;border:1px solid #dddddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{z-index:3;color:#3399f3;background-color:#eeeeee;border-color:#dddddd}.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:#999999;background-color:#f5f5f5;border-color:#dddddd;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:#999999;background-color:#ffffff;border-color:#dddddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:14px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin: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:#ffffff;border:1px solid #dddddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eeeeee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999999;background-color:#ffffff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#ffffff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#ffffff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#474949}.label-default[href]:hover,.label-default[href]:focus{background-color:#2e2f2f}.label-primary{background-color:#446e9b}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#345578}.label-success{background-color:#3cb521}.label-success[href]:hover,.label-success[href]:focus{background-color:#2e8a19}.label-info{background-color:#3399f3}.label-info[href]:hover,.label-info[href]:focus{background-color:#0e80e5}.label-warning{background-color:#d47500}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#a15900}.label-danger{background-color:#cd0200}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#9a0200}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;color:#ffffff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#3399f3;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#ffffff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#3399f3;background-color:#ffffff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eeeeee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#ffffff;border:1px solid #dddddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#3399f3}.thumbnail .caption{padding:9px;color:#666666}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#468847}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#356635}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#3a87ad}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#2d6987}.alert-warning{background-color:#fcf8e3;border-color:#fbeed5;color:#c09853}.alert-warning hr{border-top-color:#f8e5be}.alert-warning .alert-link{color:#a47e3c}.alert-danger{background-color:#f2dede;border-color:#eed3d7;color:#b94a48}.alert-danger hr{border-top-color:#e6c1c7}.alert-danger .alert-link{color:#953b39}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:20px;color:#ffffff;text-align:center;background-color:#446e9b;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#3cb521}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#3399f3}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#d47500}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#cd0200}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#ffffff;border:1px solid #dddddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333333}a.list-group-item:hover,button.list-group-item:hover,a.list-group-item:focus,button.list-group-item:focus{text-decoration:none;color:#555555;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#eeeeee;color:#999999;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#999999}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#ffffff;background-color:#446e9b;border-color:#446e9b}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#c5d5e6}.list-group-item-success{color:#468847;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#468847}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,button.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:focus{color:#468847;background-color:#d0e9c6}a.list-group-item-success.active,button.list-group-item-success.active,a.list-group-item-success.active:hover,button.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active:focus{color:#fff;background-color:#468847;border-color:#468847}.list-group-item-info{color:#3a87ad;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#3a87ad}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,button.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:focus{color:#3a87ad;background-color:#c4e3f3}a.list-group-item-info.active,button.list-group-item-info.active,a.list-group-item-info.active:hover,button.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active:focus{color:#fff;background-color:#3a87ad;border-color:#3a87ad}.list-group-item-warning{color:#c09853;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#c09853}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,button.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:focus{color:#c09853;background-color:#faf2cc}a.list-group-item-warning.active,button.list-group-item-warning.active,a.list-group-item-warning.active:hover,button.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active:focus{color:#fff;background-color:#c09853;border-color:#c09853}.list-group-item-danger{color:#b94a48;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#b94a48}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,button.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:focus{color:#b94a48;background-color:#ebcccc}a.list-group-item-danger.active,button.list-group-item-danger.active,a.list-group-item-danger.active:hover,button.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active:focus{color:#fff;background-color:#b94a48;border-color:#b94a48}.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:#ffffff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #dddddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #dddddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #dddddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #dddddd}.panel-default{border-color:#dddddd}.panel-default>.panel-heading{color:#333333;background-color:#f5f5f5;border-color:#dddddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#dddddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#dddddd}.panel-primary{border-color:#446e9b}.panel-primary>.panel-heading{color:#ffffff;background-color:#446e9b;border-color:#446e9b}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#446e9b}.panel-primary>.panel-heading .badge{color:#446e9b;background-color:#ffffff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#446e9b}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#468847}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#3a87ad}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#fbeed5}.panel-warning>.panel-heading{color:#c09853;background-color:#fcf8e3;border-color:#fbeed5}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#fbeed5}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#c09853}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#fbeed5}.panel-danger{border-color:#eed3d7}.panel-danger>.panel-heading{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#eed3d7}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#b94a48}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#eed3d7}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000000;text-decoration:none;cursor:pointer;opacity:0.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#ffffff;border:1px solid #999999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:0.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{padding:20px;text-align:right;border-top:1px solid #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}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:12px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:0.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;background-color:#000000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:14px;background-color:#ffffff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #cccccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#ffffff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999999;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#ffffff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#ffffff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999999;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#ffffff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:0.5;filter:alpha(opacity=50);font-size:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.5)), to(rgba(0,0,0,0.0001)));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.0001)), to(rgba(0,0,0,0.5)));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #ffffff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#ffffff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}.navbar{background-image:-webkit-linear-gradient(#fff, #eee 50%, #e4e4e4);background-image:-o-linear-gradient(#fff, #eee 50%, #e4e4e4);background-image:-webkit-gradient(linear, left top, left bottom, from(#fff), color-stop(50%, #eee), to(#e4e4e4));background-image:linear-gradient(#fff, #eee 50%, #e4e4e4);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe4e4e4', GradientType=0);-webkit-filter:none;filter:none;border:1px solid #d5d5d5;text-shadow:0 1px 0 rgba(255,255,255,0.3)}.navbar-inverse{background-image:-webkit-linear-gradient(#6d94bf, #446e9b 50%, #3e648d);background-image:-o-linear-gradient(#6d94bf, #446e9b 50%, #3e648d);background-image:-webkit-gradient(linear, left top, left bottom, from(#6d94bf), color-stop(50%, #446e9b), to(#3e648d));background-image:linear-gradient(#6d94bf, #446e9b 50%, #3e648d);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff6d94bf', endColorstr='#ff3e648d', GradientType=0);-webkit-filter:none;filter:none;border:1px solid #345578;text-shadow:0 -1px 0 rgba(0,0,0,0.3)}.navbar-inverse .badge{background-color:#fff;color:#446e9b}.navbar .badge{text-shadow:none}.navbar-nav>li>a,.navbar-nav>li>a:hover{padding-top:17px;padding-bottom:13px;-webkit-transition:color ease-in-out .2s;-o-transition:color ease-in-out .2s;transition:color ease-in-out .2s}.navbar-brand,.navbar-brand:hover{-webkit-transition:color ease-in-out .2s;-o-transition:color ease-in-out .2s;transition:color ease-in-out .2s}.navbar .caret,.navbar .caret:hover{-webkit-transition:border-color ease-in-out .2s;-o-transition:border-color ease-in-out .2s;transition:border-color ease-in-out .2s}.navbar .dropdown-menu{text-shadow:none}.btn{text-shadow:0 -1px 0 rgba(0,0,0,0.3)}.btn-default{background-image:-webkit-linear-gradient(#6d7070, #474949 50%, #3d3f3f);background-image:-o-linear-gradient(#6d7070, #474949 50%, #3d3f3f);background-image:-webkit-gradient(linear, left top, left bottom, from(#6d7070), color-stop(50%, #474949), to(#3d3f3f));background-image:linear-gradient(#6d7070, #474949 50%, #3d3f3f);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff6d7070', endColorstr='#ff3d3f3f', GradientType=0);-webkit-filter:none;filter:none;border:1px solid #2e2f2f}.btn-default:hover{background-image:-webkit-linear-gradient(#636565, #3d3f3f 50%, #333434);background-image:-o-linear-gradient(#636565, #3d3f3f 50%, #333434);background-image:-webkit-gradient(linear, left top, left bottom, from(#636565), color-stop(50%, #3d3f3f), to(#333434));background-image:linear-gradient(#636565, #3d3f3f 50%, #333434);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff636565', endColorstr='#ff333434', GradientType=0);-webkit-filter:none;filter:none;border:1px solid #242525}.btn-primary{background-image:-webkit-linear-gradient(#6d94bf, #446e9b 50%, #3e648d);background-image:-o-linear-gradient(#6d94bf, #446e9b 50%, #3e648d);background-image:-webkit-gradient(linear, left top, left bottom, from(#6d94bf), color-stop(50%, #446e9b), to(#3e648d));background-image:linear-gradient(#6d94bf, #446e9b 50%, #3e648d);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff6d94bf', endColorstr='#ff3e648d', GradientType=0);-webkit-filter:none;filter:none;border:1px solid #345578}.btn-primary:hover{background-image:-webkit-linear-gradient(#5f8ab9, #3e648d 50%, #385a7f);background-image:-o-linear-gradient(#5f8ab9, #3e648d 50%, #385a7f);background-image:-webkit-gradient(linear, left top, left bottom, from(#5f8ab9), color-stop(50%, #3e648d), to(#385a7f));background-image:linear-gradient(#5f8ab9, #3e648d 50%, #385a7f);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5f8ab9', endColorstr='#ff385a7f', GradientType=0);-webkit-filter:none;filter:none;border:1px solid #2e4b69}.btn-success{background-image:-webkit-linear-gradient(#61dd45, #3cb521 50%, #36a41e);background-image:-o-linear-gradient(#61dd45, #3cb521 50%, #36a41e);background-image:-webkit-gradient(linear, left top, left bottom, from(#61dd45), color-stop(50%, #3cb521), to(#36a41e));background-image:linear-gradient(#61dd45, #3cb521 50%, #36a41e);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff61dd45', endColorstr='#ff36a41e', GradientType=0);-webkit-filter:none;filter:none;border:1px solid #2e8a19}.btn-success:hover{background-image:-webkit-linear-gradient(#52da34, #36a41e 50%, #31921b);background-image:-o-linear-gradient(#52da34, #36a41e 50%, #31921b);background-image:-webkit-gradient(linear, left top, left bottom, from(#52da34), color-stop(50%, #36a41e), to(#31921b));background-image:linear-gradient(#52da34, #36a41e 50%, #31921b);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff52da34', endColorstr='#ff31921b', GradientType=0);-webkit-filter:none;filter:none;border:1px solid #287916}.btn-info{background-image:-webkit-linear-gradient(#7bbdf7, #3399f3 50%, #208ff2);background-image:-o-linear-gradient(#7bbdf7, #3399f3 50%, #208ff2);background-image:-webkit-gradient(linear, left top, left bottom, from(#7bbdf7), color-stop(50%, #3399f3), to(#208ff2));background-image:linear-gradient(#7bbdf7, #3399f3 50%, #208ff2);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff7bbdf7', endColorstr='#ff208ff2', GradientType=0);-webkit-filter:none;filter:none;border:1px solid #0e80e5}.btn-info:hover{background-image:-webkit-linear-gradient(#68b3f6, #208ff2 50%, #0e86ef);background-image:-o-linear-gradient(#68b3f6, #208ff2 50%, #0e86ef);background-image:-webkit-gradient(linear, left top, left bottom, from(#68b3f6), color-stop(50%, #208ff2), to(#0e86ef));background-image:linear-gradient(#68b3f6, #208ff2 50%, #0e86ef);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff68b3f6', endColorstr='#ff0e86ef', GradientType=0);-webkit-filter:none;filter:none;border:1px solid #0c75d2}.btn-warning{background-image:-webkit-linear-gradient(#ff9c21, #d47500 50%, #c06a00);background-image:-o-linear-gradient(#ff9c21, #d47500 50%, #c06a00);background-image:-webkit-gradient(linear, left top, left bottom, from(#ff9c21), color-stop(50%, #d47500), to(#c06a00));background-image:linear-gradient(#ff9c21, #d47500 50%, #c06a00);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff9c21', endColorstr='#ffc06a00', GradientType=0);-webkit-filter:none;filter:none;border:1px solid #a15900}.btn-warning:hover{background-image:-webkit-linear-gradient(#ff930d, #c06a00 50%, #ab5e00);background-image:-o-linear-gradient(#ff930d, #c06a00 50%, #ab5e00);background-image:-webkit-gradient(linear, left top, left bottom, from(#ff930d), color-stop(50%, #c06a00), to(#ab5e00));background-image:linear-gradient(#ff930d, #c06a00 50%, #ab5e00);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff930d', endColorstr='#ffab5e00', GradientType=0);-webkit-filter:none;filter:none;border:1px solid #8d4e00}.btn-danger{background-image:-webkit-linear-gradient(#ff1d1b, #cd0200 50%, #b90200);background-image:-o-linear-gradient(#ff1d1b, #cd0200 50%, #b90200);background-image:-webkit-gradient(linear, left top, left bottom, from(#ff1d1b), color-stop(50%, #cd0200), to(#b90200));background-image:linear-gradient(#ff1d1b, #cd0200 50%, #b90200);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff1d1b', endColorstr='#ffb90200', GradientType=0);-webkit-filter:none;filter:none;border:1px solid #9a0200}.btn-danger:hover{background-image:-webkit-linear-gradient(#ff0906, #b90200 50%, #a40200);background-image:-o-linear-gradient(#ff0906, #b90200 50%, #a40200);background-image:-webkit-gradient(linear, left top, left bottom, from(#ff0906), color-stop(50%, #b90200), to(#a40200));background-image:linear-gradient(#ff0906, #b90200 50%, #a40200);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff0906', endColorstr='#ffa40200', GradientType=0);-webkit-filter:none;filter:none;border:1px solid #860100}.btn-link{text-shadow:none}.btn:active,.btn.active{background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.panel-primary .panel-title{color:#fff} \ No newline at end of file diff --git a/flask_admin/static/bootstrap/bootstrap3/swatch/superhero/bootstrap.min.css b/flask_admin/static/bootstrap/bootstrap3/swatch/superhero/bootstrap.min.css deleted file mode 100644 index 7bbc5e2e6..000000000 --- a/flask_admin/static/bootstrap/bootstrap3/swatch/superhero/bootstrap.min.css +++ /dev/null @@ -1,11 +0,0 @@ -@import url("https://fonts.googleapis.com/css?family=Lato:300,400,700");/*! - * bootswatch v3.3.5 - * Homepage: http://bootswatch.com - * Copyright 2012-2015 Thomas Park - * Licensed under MIT - * Based on Bootstrap -*//*! - * Bootstrap v3.3.5 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;-webkit-box-shadow:none !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:15px;line-height:1.42857143;color:#ebebeb;background-color:#2b3e50}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#df691a;text-decoration:none}a:hover,a:focus{color:#df691a;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,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:0}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#2b3e50;border:1px solid #dddddd;border-radius:0;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:21px;margin-bottom:21px;border:0;border-top:1px solid #596a7b}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:300;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#ebebeb}h1,.h1,h2,.h2,h3,.h3{margin-top:21px;margin-bottom:10.5px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10.5px;margin-bottom:10.5px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:39px}h2,.h2{font-size:32px}h3,.h3{font-size:26px}h4,.h4{font-size:19px}h5,.h5{font-size:15px}h6,.h6{font-size:13px}p{margin:0 0 10.5px}.lead{margin-bottom:21px;font-size:17px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:22.5px}}small,.small{font-size:86%}mark,.mark{background-color:#f0ad4e;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#4e5d6c}.text-primary{color:#df691a}a.text-primary:hover,a.text-primary:focus{color:#b15315}.text-success{color:#ebebeb}a.text-success:hover,a.text-success:focus{color:#d2d2d2}.text-info{color:#ebebeb}a.text-info:hover,a.text-info:focus{color:#d2d2d2}.text-warning{color:#ebebeb}a.text-warning:hover,a.text-warning:focus{color:#d2d2d2}.text-danger{color:#ebebeb}a.text-danger:hover,a.text-danger:focus{color:#d2d2d2}.bg-primary{color:#fff;background-color:#df691a}a.bg-primary:hover,a.bg-primary:focus{background-color:#b15315}.bg-success{background-color:#5cb85c}a.bg-success:hover,a.bg-success:focus{background-color:#449d44}.bg-info{background-color:#5bc0de}a.bg-info:hover,a.bg-info:focus{background-color:#31b0d5}.bg-warning{background-color:#f0ad4e}a.bg-warning:hover,a.bg-warning:focus{background-color:#ec971f}.bg-danger{background-color:#d9534f}a.bg-danger:hover,a.bg-danger:focus{background-color:#c9302c}.page-header{padding-bottom:9.5px;margin:42px 0 21px;border-bottom:1px solid #ebebeb}ul,ol{margin-top:0;margin-bottom:10.5px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:21px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #4e5d6c}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10.5px 21px;margin:0 0 21px;font-size:18.75px;border-left:5px solid #4e5d6c}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#ebebeb}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 #4e5d6c;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:21px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:0}kbd{padding:2px 4px;font-size:90%;color:#ffffff;background-color:#333333;border-radius:0;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:10px;margin:0 0 10.5px;font-size:14px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333333;background-color:#f5f5f5;border:1px solid #cccccc;border-radius:0}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0%}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0%}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0%}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0%}}table{background-color:transparent}caption{padding-top:6px;padding-bottom:6px;color:#4e5d6c;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:21px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:6px;line-height:1.42857143;vertical-align:top;border-top:1px solid #4e5d6c}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #4e5d6c}.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 #4e5d6c}.table .table{background-color:#2b3e50}.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:3px}.table-bordered{border:1px solid #4e5d6c}.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 #4e5d6c}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#4e5d6c}.table-hover>tbody>tr:hover{background-color:#485563}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:#485563}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#3d4954}.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:#5cb85c}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#4cae4c}.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:#5bc0de}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#46b8da}.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:#f0ad4e}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#eea236}.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:#d9534f}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#d43f3a}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15.75px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #4e5d6c}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:21px;font-size:22.5px;line-height:inherit;color:#ebebeb;border:0;border-bottom:1px solid #4e5d6c}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:9px;font-size:15px;line-height:1.42857143;color:#2b3e50}.form-control{display:block;width:100%;height:39px;padding:8px 16px;font-size:15px;line-height:1.42857143;color:#2b3e50;background-color:#ffffff;background-image:none;border:1px solid transparent;border-radius:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:transparent;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(0,0,0,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(0,0,0,0.6)}.form-control::-moz-placeholder{color:#cccccc;opacity:1}.form-control:-ms-input-placeholder{color:#cccccc}.form-control::-webkit-input-placeholder{color:#cccccc}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#ebebeb;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:39px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:31px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:52px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:21px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:9px;padding-bottom:9px;margin-bottom:0;min-height:36px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:31px;padding:5px 10px;font-size:13px;line-height:1.5;border-radius:0}select.input-sm{height:31px;line-height:31px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:31px;padding:5px 10px;font-size:13px;line-height:1.5;border-radius:0}.form-group-sm select.form-control{height:31px;line-height:31px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:31px;min-height:34px;padding:6px 10px;font-size:13px;line-height:1.5}.input-lg{height:52px;padding:12px 24px;font-size:19px;line-height:1.3333333;border-radius:0}select.input-lg{height:52px;line-height:52px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:52px;padding:12px 24px;font-size:19px;line-height:1.3333333;border-radius:0}.form-group-lg select.form-control{height:52px;line-height:52px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:52px;min-height:40px;padding:13px 24px;font-size:19px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:48.75px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:39px;height:39px;line-height:39px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:52px;height:52px;line-height:52px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:31px;height:31px;line-height:31px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#ebebeb}.has-success .form-control{border-color:#ebebeb;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#d2d2d2;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-success .input-group-addon{color:#ebebeb;border-color:#ebebeb;background-color:#5cb85c}.has-success .form-control-feedback{color:#ebebeb}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#ebebeb}.has-warning .form-control{border-color:#ebebeb;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#d2d2d2;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-warning .input-group-addon{color:#ebebeb;border-color:#ebebeb;background-color:#f0ad4e}.has-warning .form-control-feedback{color:#ebebeb}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#ebebeb}.has-error .form-control{border-color:#ebebeb;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#d2d2d2;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-error .input-group-addon{color:#ebebeb;border-color:#ebebeb;background-color:#d9534f}.has-error .form-control-feedback{color:#ebebeb}.has-feedback label~.form-control-feedback{top:26px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#ffffff}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:9px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:30px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:9px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:16.9999996px;font-size:19px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:13px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:8px 16px;font-size:15px;line-height:1.42857143;border-radius:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#ffffff;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#ffffff;background-color:#4e5d6c;border-color:transparent}.btn-default:focus,.btn-default.focus{color:#ffffff;background-color:#39444e;border-color:rgba(0,0,0,0)}.btn-default:hover{color:#ffffff;background-color:#39444e;border-color:rgba(0,0,0,0)}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#ffffff;background-color:#39444e;border-color:rgba(0,0,0,0)}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#ffffff;background-color:#2a323a;border-color:rgba(0,0,0,0)}.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.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:#4e5d6c;border-color:transparent}.btn-default .badge{color:#4e5d6c;background-color:#ffffff}.btn-primary{color:#ffffff;background-color:#df691a;border-color:transparent}.btn-primary:focus,.btn-primary.focus{color:#ffffff;background-color:#b15315;border-color:rgba(0,0,0,0)}.btn-primary:hover{color:#ffffff;background-color:#b15315;border-color:rgba(0,0,0,0)}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#ffffff;background-color:#b15315;border-color:rgba(0,0,0,0)}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#ffffff;background-color:#914411;border-color:rgba(0,0,0,0)}.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.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:#df691a;border-color:transparent}.btn-primary .badge{color:#df691a;background-color:#ffffff}.btn-success{color:#ffffff;background-color:#5cb85c;border-color:transparent}.btn-success:focus,.btn-success.focus{color:#ffffff;background-color:#449d44;border-color:rgba(0,0,0,0)}.btn-success:hover{color:#ffffff;background-color:#449d44;border-color:rgba(0,0,0,0)}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#ffffff;background-color:#449d44;border-color:rgba(0,0,0,0)}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#ffffff;background-color:#398439;border-color:rgba(0,0,0,0)}.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.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:transparent}.btn-success .badge{color:#5cb85c;background-color:#ffffff}.btn-info{color:#ffffff;background-color:#5bc0de;border-color:transparent}.btn-info:focus,.btn-info.focus{color:#ffffff;background-color:#31b0d5;border-color:rgba(0,0,0,0)}.btn-info:hover{color:#ffffff;background-color:#31b0d5;border-color:rgba(0,0,0,0)}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#ffffff;background-color:#31b0d5;border-color:rgba(0,0,0,0)}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#ffffff;background-color:#269abc;border-color:rgba(0,0,0,0)}.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.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:transparent}.btn-info .badge{color:#5bc0de;background-color:#ffffff}.btn-warning{color:#ffffff;background-color:#f0ad4e;border-color:transparent}.btn-warning:focus,.btn-warning.focus{color:#ffffff;background-color:#ec971f;border-color:rgba(0,0,0,0)}.btn-warning:hover{color:#ffffff;background-color:#ec971f;border-color:rgba(0,0,0,0)}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#ffffff;background-color:#ec971f;border-color:rgba(0,0,0,0)}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#ffffff;background-color:#d58512;border-color:rgba(0,0,0,0)}.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.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:transparent}.btn-warning .badge{color:#f0ad4e;background-color:#ffffff}.btn-danger{color:#ffffff;background-color:#d9534f;border-color:transparent}.btn-danger:focus,.btn-danger.focus{color:#ffffff;background-color:#c9302c;border-color:rgba(0,0,0,0)}.btn-danger:hover{color:#ffffff;background-color:#c9302c;border-color:rgba(0,0,0,0)}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#ffffff;background-color:#c9302c;border-color:rgba(0,0,0,0)}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#ffffff;background-color:#ac2925;border-color:rgba(0,0,0,0)}.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.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:transparent}.btn-danger .badge{color:#d9534f;background-color:#ffffff}.btn-link{color:#df691a;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#df691a;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:#4e5d6c;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:12px 24px;font-size:19px;line-height:1.3333333;border-radius:0}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:13px;line-height:1.5;border-radius:0}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:13px;line-height:1.5;border-radius:0}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;-o-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:0.35s;-o-transition-duration:0.35s;transition-duration:0.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:15px;text-align:left;background-color:#4e5d6c;border:1px solid transparent;border-radius:0;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:#2b3e50}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#ebebeb;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#ebebeb;background-color:#485563}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#ffffff;text-decoration:none;outline:0;background-color:#df691a}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#2b3e50}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:13px;line-height:1.42857143;color:#2b3e50;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:0;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:52px;padding:12px 24px;font-size:19px;line-height:1.3333333;border-radius:0}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:52px;line-height:52px}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:31px;padding:5px 10px;font-size:13px;line-height:1.5;border-radius:0}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:31px;line-height:31px}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:8px 16px;font-size:15px;font-weight:normal;line-height:1;color:#2b3e50;text-align:center;background-color:#4e5d6c;border:1px solid transparent;border-radius:0}.input-group-addon.input-sm{padding:5px 10px;font-size:13px;border-radius:0}.input-group-addon.input-lg{padding:12px 24px;font-size:19px;border-radius:0}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#4e5d6c}.nav>li.disabled>a{color:#4e5d6c}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#4e5d6c;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#4e5d6c;border-color:#df691a}.nav .nav-divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid transparent}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:0 0 0 0}.nav-tabs>li>a:hover{border-color:#4e5d6c #4e5d6c transparent}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#ebebeb;background-color:#2b3e50;border:1px solid #4e5d6c;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:0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #4e5d6c}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #4e5d6c;border-radius:0 0 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:#4e5d6c}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:0}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#ffffff;background-color:#df691a}.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:0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #4e5d6c}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #4e5d6c;border-radius:0 0 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#4e5d6c}}.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:40px;margin-bottom:21px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:0}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:9.5px 15px;font-size:19px;line-height:21px;height:40px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:3px;margin-bottom:3px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:0}.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:4.75px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:21px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:21px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:9.5px;padding-bottom:9.5px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:0.5px;margin-bottom:0.5px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:0.5px;margin-bottom:0.5px}.navbar-btn.btn-sm{margin-top:4.5px;margin-bottom:4.5px}.navbar-btn.btn-xs{margin-top:9px;margin-bottom:9px}.navbar-text{margin-top:9.5px;margin-bottom:9.5px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#4e5d6c;border-color:transparent}.navbar-default .navbar-brand{color:#ebebeb}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#ebebeb;background-color:transparent}.navbar-default .navbar-text{color:#ebebeb}.navbar-default .navbar-nav>li>a{color:#ebebeb}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#ebebeb;background-color:#485563}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#ebebeb;background-color:#485563}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#cccccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:transparent}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#485563}.navbar-default .navbar-toggle .icon-bar{background-color:#ebebeb}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:transparent}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#485563;color:#ebebeb}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#ebebeb}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#ebebeb;background-color:#485563}.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:#ebebeb;background-color:#485563}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#cccccc;background-color:transparent}}.navbar-default .navbar-link{color:#ebebeb}.navbar-default .navbar-link:hover{color:#ebebeb}.navbar-default .btn-link{color:#ebebeb}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#ebebeb}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#cccccc}.navbar-inverse{background-color:#df691a;border-color:transparent}.navbar-inverse .navbar-brand{color:#ebebeb}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#ebebeb;background-color:transparent}.navbar-inverse .navbar-text{color:#ebebeb}.navbar-inverse .navbar-nav>li>a{color:#ebebeb}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#ebebeb;background-color:#c85e17}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#ebebeb;background-color:#c85e17}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:transparent}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#c85e17}.navbar-inverse .navbar-toggle .icon-bar{background-color:#ebebeb}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#bf5a16}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#c85e17;color:#ebebeb}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#ebebeb}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#ebebeb;background-color:#c85e17}.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:#ebebeb;background-color:#c85e17}.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:#444444;background-color:transparent}}.navbar-inverse .navbar-link{color:#ebebeb}.navbar-inverse .navbar-link:hover{color:#ebebeb}.navbar-inverse .btn-link{color:#ebebeb}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#ebebeb}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444444}.breadcrumb{padding:8px 15px;margin-bottom:21px;list-style:none;background-color:#4e5d6c;border-radius:0}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ebebeb}.breadcrumb>.active{color:#ebebeb}.pagination{display:inline-block;padding-left:0;margin:21px 0;border-radius:0}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:8px 16px;line-height:1.42857143;text-decoration:none;color:#ebebeb;background-color:#4e5d6c;border:1px solid transparent;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:0;border-top-left-radius:0}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:0;border-top-right-radius:0}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{z-index:3;color:#ebebeb;background-color:#485563;border-color:transparent}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#ebebeb;background-color:#df691a;border-color:transparent;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#323c46;background-color:#4e5d6c;border-color:transparent;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:12px 24px;font-size:19px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:0;border-top-left-radius:0}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:0;border-top-right-radius:0}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:13px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:0;border-top-left-radius:0}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:0;border-top-right-radius:0}.pager{padding-left:0;margin:21px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#4e5d6c;border:1px solid transparent;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#485563}.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:#323c46;background-color:#4e5d6c;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#ffffff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#ffffff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#4e5d6c}.label-default[href]:hover,.label-default[href]:focus{background-color:#39444e}.label-primary{background-color:#df691a}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#b15315}.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:13px;font-weight:300;color:#ebebeb;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#4e5d6c;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#ffffff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#df691a;background-color:#ffffff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#4e5d6c}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:23px;font-weight:200}.jumbotron>hr{border-top-color:#39444e}.container .jumbotron,.container-fluid .jumbotron{border-radius:0}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:68px}}.thumbnail{display:block;padding:4px;margin-bottom:21px;line-height:1.42857143;background-color:#2b3e50;border:1px solid #dddddd;border-radius:0;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#df691a}.thumbnail .caption{padding:9px;color:#ebebeb}.alert{padding:15px;margin-bottom:21px;border:1px solid transparent;border-radius:0}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#5cb85c;border-color:transparent;color:#ebebeb}.alert-success hr{border-top-color:rgba(0,0,0,0)}.alert-success .alert-link{color:#d2d2d2}.alert-info{background-color:#5bc0de;border-color:transparent;color:#ebebeb}.alert-info hr{border-top-color:rgba(0,0,0,0)}.alert-info .alert-link{color:#d2d2d2}.alert-warning{background-color:#f0ad4e;border-color:transparent;color:#ebebeb}.alert-warning hr{border-top-color:rgba(0,0,0,0)}.alert-warning .alert-link{color:#d2d2d2}.alert-danger{background-color:#d9534f;border-color:transparent;color:#ebebeb}.alert-danger hr{border-top-color:rgba(0,0,0,0)}.alert-danger .alert-link{color:#d2d2d2}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:21px;margin-bottom:21px;background-color:#4e5d6c;border-radius:0;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:13px;line-height:21px;color:#ffffff;text-align:center;background-color:#df691a;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#4e5d6c;border:1px solid transparent}.list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}a.list-group-item,button.list-group-item{color:#ebebeb}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#ebebeb}a.list-group-item:hover,button.list-group-item:hover,a.list-group-item:focus,button.list-group-item:focus{text-decoration:none;color:#ebebeb;background-color:#485563}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#ebebeb;color:#4e5d6c;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#4e5d6c}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#ffffff;background-color:#df691a;border-color:#df691a}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#f9decc}.list-group-item-success{color:#ebebeb;background-color:#5cb85c}a.list-group-item-success,button.list-group-item-success{color:#ebebeb}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,button.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:focus{color:#ebebeb;background-color:#4cae4c}a.list-group-item-success.active,button.list-group-item-success.active,a.list-group-item-success.active:hover,button.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active:focus{color:#fff;background-color:#ebebeb;border-color:#ebebeb}.list-group-item-info{color:#ebebeb;background-color:#5bc0de}a.list-group-item-info,button.list-group-item-info{color:#ebebeb}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,button.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:focus{color:#ebebeb;background-color:#46b8da}a.list-group-item-info.active,button.list-group-item-info.active,a.list-group-item-info.active:hover,button.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active:focus{color:#fff;background-color:#ebebeb;border-color:#ebebeb}.list-group-item-warning{color:#ebebeb;background-color:#f0ad4e}a.list-group-item-warning,button.list-group-item-warning{color:#ebebeb}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,button.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:focus{color:#ebebeb;background-color:#eea236}a.list-group-item-warning.active,button.list-group-item-warning.active,a.list-group-item-warning.active:hover,button.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active:focus{color:#fff;background-color:#ebebeb;border-color:#ebebeb}.list-group-item-danger{color:#ebebeb;background-color:#d9534f}a.list-group-item-danger,button.list-group-item-danger{color:#ebebeb}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,button.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:focus{color:#ebebeb;background-color:#d43f3a}a.list-group-item-danger.active,button.list-group-item-danger.active,a.list-group-item-danger.active:hover,button.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active:focus{color:#fff;background-color:#ebebeb;border-color:#ebebeb}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:21px;background-color:#4e5d6c;border:1px solid transparent;border-radius:0;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:-1;border-top-left-radius:-1}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:17px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#485563;border-top:1px solid transparent;border-bottom-right-radius:-1;border-bottom-left-radius:-1}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:-1;border-top-left-radius:-1}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:-1;border-bottom-left-radius:-1}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:-1;border-top-left-radius:-1}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:-1;border-top-right-radius:-1}.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:-1}.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:-1}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:-1;border-bottom-left-radius:-1}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:-1;border-bottom-right-radius:-1}.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:-1}.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:-1}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #4e5d6c}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:21px}.panel-group .panel{margin-bottom:0;border-radius:0}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid transparent}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid transparent}.panel-default{border-color:transparent}.panel-default>.panel-heading{color:#333333;background-color:#f5f5f5;border-color:transparent}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:transparent}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:transparent}.panel-primary{border-color:transparent}.panel-primary>.panel-heading{color:#ffffff;background-color:#df691a;border-color:transparent}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:transparent}.panel-primary>.panel-heading .badge{color:#df691a;background-color:#ffffff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:transparent}.panel-success{border-color:transparent}.panel-success>.panel-heading{color:#ebebeb;background-color:#5cb85c;border-color:transparent}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:transparent}.panel-success>.panel-heading .badge{color:#5cb85c;background-color:#ebebeb}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:transparent}.panel-info{border-color:transparent}.panel-info>.panel-heading{color:#ebebeb;background-color:#5bc0de;border-color:transparent}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:transparent}.panel-info>.panel-heading .badge{color:#5bc0de;background-color:#ebebeb}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:transparent}.panel-warning{border-color:transparent}.panel-warning>.panel-heading{color:#ebebeb;background-color:#f0ad4e;border-color:transparent}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:transparent}.panel-warning>.panel-heading .badge{color:#f0ad4e;background-color:#ebebeb}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:transparent}.panel-danger{border-color:transparent}.panel-danger>.panel-heading{color:#ebebeb;background-color:#d9534f;border-color:transparent}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:transparent}.panel-danger>.panel-heading .badge{color:#d9534f;background-color:#ebebeb}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:transparent}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#4e5d6c;border:1px solid transparent;border-radius:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:0}.well-sm{padding:9px;border-radius:0}.close{float:right;font-size:22.5px;font-weight:bold;line-height:1;color:#ebebeb;text-shadow:none;opacity:0.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#ebebeb;text-decoration:none;cursor:pointer;opacity:0.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#4e5d6c;border:1px solid transparent;border-radius:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:0.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #2b3e50;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{padding:20px;text-align:right;border-top:1px solid #2b3e50}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:13px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:0.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;background-color:#000000;border-radius:0}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:15px;background-color:#4e5d6c;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid transparent;border-radius:0;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:15px;background-color:#485563;border-bottom:1px solid #3d4954;border-radius:-1 -1 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:transparent;bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#4e5d6c}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:transparent}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#4e5d6c}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:transparent;top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#4e5d6c}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:transparent}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#4e5d6c;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:0.5;filter:alpha(opacity=50);font-size:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.5)), to(rgba(0,0,0,0.0001)));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.0001)), to(rgba(0,0,0,0.5)));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #ffffff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#ffffff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}.navbar{-webkit-box-shadow:none;box-shadow:none;border:none;font-size:12px}.navbar-default .badge{background-color:#fff;color:#4e5d6c}.navbar-inverse .badge{background-color:#fff;color:#df691a}.btn{font-weight:300}.btn-default:hover{background-color:#485563}.btn-sm,.btn-xs{font-size:12px}body{font-weight:300}.text-primary,.text-primary:hover{color:#df691a}.text-success,.text-success:hover{color:#5cb85c}.text-danger,.text-danger:hover{color:#d9534f}.text-warning,.text-warning:hover{color:#f0ad4e}.text-info,.text-info:hover{color:#5bc0de}.page-header{border-bottom-color:#4e5d6c}.dropdown-menu{border:none;margin:0;-webkit-box-shadow:none;box-shadow:none}.dropdown-menu>li>a{font-size:12px;font-weight:300}.btn-group.open .dropdown-toggle{-webkit-box-shadow:none;box-shadow:none}.dropdown-header{font-size:12px}table,.table{font-size:12px}table a:not(.btn),.table a:not(.btn){color:#fff;text-decoration:underline}table .dropdown-menu a,.table .dropdown-menu a{text-decoration:none}table .text-muted,.table .text-muted{color:#4e5d6c}table>thead>tr>th,.table>thead>tr>th,table>tbody>tr>th,.table>tbody>tr>th,table>tfoot>tr>th,.table>tfoot>tr>th,table>thead>tr>td,.table>thead>tr>td,table>tbody>tr>td,.table>tbody>tr>td,table>tfoot>tr>td,.table>tfoot>tr>td{border-color:transparent}input,textarea{color:#2b3e50}label,.radio label,.checkbox label,.help-block{font-size:12px;font-weight:300}.input-addon,.input-group-addon{color:#ebebeb}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label,.has-warning .form-control-feedback{color:#f0ad4e}.has-warning .input-group-addon{border:none}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label,.has-error .form-control-feedback{color:#d9534f}.has-error .input-group-addon{border:none}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label,.has-success .form-control-feedback{color:#5cb85c}.has-success .input-group-addon{border:none}.form-control:focus{-webkit-box-shadow:none;box-shadow:none}.has-warning .form-control:focus,.has-error .form-control:focus,.has-success .form-control:focus{-webkit-box-shadow:none;box-shadow:none}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{border-color:transparent}.nav-tabs>li>a{color:#ebebeb}.nav-pills>li>a{color:#ebebeb}.pager a{color:#ebebeb}.label{font-weight:300}.alert{color:#fff}.alert a,.alert .alert-link{color:#fff}.close{opacity:0.4}.close:hover,.close:focus{opacity:1}.well{-webkit-box-shadow:none;box-shadow:none}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{border:none}a.list-group-item-success.active{background-color:#5cb85c}a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{background-color:#4cae4c}a.list-group-item-warning.active{background-color:#f0ad4e}a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{background-color:#eea236}a.list-group-item-danger.active{background-color:#d9534f}a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{background-color:#d43f3a}.panel{border:none}.panel-default>.panel-heading{background-color:#485563;color:#ebebeb}.thumbnail{background-color:#4e5d6c;border:none}.modal{padding:0}.modal-header,.modal-footer{background-color:#485563;border:none;border-radius:0}.popover-title{border:none} \ No newline at end of file diff --git a/flask_admin/static/bootstrap/bootstrap3/swatch/united/bootstrap.min.css b/flask_admin/static/bootstrap/bootstrap3/swatch/united/bootstrap.min.css deleted file mode 100644 index 7791912a3..000000000 --- a/flask_admin/static/bootstrap/bootstrap3/swatch/united/bootstrap.min.css +++ /dev/null @@ -1,11 +0,0 @@ -@import url("https://fonts.googleapis.com/css?family=Ubuntu:400,700");/*! - * bootswatch v3.3.5 - * Homepage: http://bootswatch.com - * Copyright 2012-2015 Thomas Park - * Licensed under MIT - * Based on Bootstrap -*//*! - * Bootstrap v3.3.5 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;-webkit-box-shadow:none !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Ubuntu",Tahoma,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333333;background-color:#ffffff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#dd4814;text-decoration:none}a:hover,a:focus{color:#97310e;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,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#ffffff;border:1px solid #dddddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eeeeee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Ubuntu",Tahoma,"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#aea79f}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#aea79f}.text-primary{color:#dd4814}a.text-primary:hover,a.text-primary:focus{color:#ae3910}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-danger{color:#b94a48}a.text-danger:hover,a.text-danger:focus{color:#953b39}.bg-primary{color:#fff;background-color:#dd4814}a.bg-primary:hover,a.bg-primary:focus{background-color:#ae3910}.bg-success{background-color:#dff0d8}a.bg-success:hover,a.bg-success:focus{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover,a.bg-info:focus{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover,a.bg-warning:focus{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover,a.bg-danger:focus{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eeeeee}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;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #aea79f}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eeeeee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#aea79f}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eeeeee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#ffffff;background-color:#333333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333333;background-color:#f5f5f5;border:1px solid #cccccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0%}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0%}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0%}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0%}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#aea79f;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #dddddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #dddddd}.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 #dddddd}.table .table{background-color:#ffffff}.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 #dddddd}.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 #dddddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*="col-"]{position:static;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:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #dddddd}.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:#333333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:9px;font-size:14px;line-height:1.42857143;color:#333333}.form-control{display:block;width:100%;height:38px;padding:8px 12px;font-size:14px;line-height:1.42857143;color:#333333;background-color:#ffffff;background-image:none;border:1px solid #cccccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control::-moz-placeholder{color:#aea79f;opacity:1}.form-control:-ms-input-placeholder{color:#aea79f}.form-control::-webkit-input-placeholder{color:#aea79f}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eeeeee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:38px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:54px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:9px;padding-bottom:9px;margin-bottom:0;min-height:34px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:54px;padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:54px;line-height:54px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:54px;padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:54px;line-height:54px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:54px;min-height:38px;padding:15px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:47.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:38px;height:38px;line-height:38px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:54px;height:54px;line-height:54px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#468847}.has-success .form-control{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.has-success .input-group-addon{color:#468847;border-color:#468847;background-color:#dff0d8}.has-success .form-control-feedback{color:#468847}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#c09853}.has-warning .form-control{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.has-warning .input-group-addon{color:#c09853;border-color:#c09853;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#c09853}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#b94a48}.has-error .form-control{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.has-error .input-group-addon{color:#b94a48;border-color:#b94a48;background-color:#f2dede}.has-error .form-control-feedback{color:#b94a48}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:9px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:29px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:9px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:19.6666662px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:8px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#ffffff;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#ffffff;background-color:#aea79f;border-color:#aea79f}.btn-default:focus,.btn-default.focus{color:#ffffff;background-color:#978e83;border-color:#6f675e}.btn-default:hover{color:#ffffff;background-color:#978e83;border-color:#92897e}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#ffffff;background-color:#978e83;border-color:#92897e}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#ffffff;background-color:#867c71;border-color:#6f675e}.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.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:#aea79f;border-color:#aea79f}.btn-default .badge{color:#aea79f;background-color:#ffffff}.btn-primary{color:#ffffff;background-color:#dd4814;border-color:#dd4814}.btn-primary:focus,.btn-primary.focus{color:#ffffff;background-color:#ae3910;border-color:#682209}.btn-primary:hover{color:#ffffff;background-color:#ae3910;border-color:#a5360f}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#ffffff;background-color:#ae3910;border-color:#a5360f}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#ffffff;background-color:#8d2e0d;border-color:#682209}.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.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:#dd4814;border-color:#dd4814}.btn-primary .badge{color:#dd4814;background-color:#ffffff}.btn-success{color:#ffffff;background-color:#38b44a;border-color:#38b44a}.btn-success:focus,.btn-success.focus{color:#ffffff;background-color:#2c8d3a;border-color:#1a5322}.btn-success:hover{color:#ffffff;background-color:#2c8d3a;border-color:#298537}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#ffffff;background-color:#2c8d3a;border-color:#298537}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#ffffff;background-color:#23722f;border-color:#1a5322}.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.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:#38b44a;border-color:#38b44a}.btn-success .badge{color:#38b44a;background-color:#ffffff}.btn-info{color:#ffffff;background-color:#772953;border-color:#772953}.btn-info:focus,.btn-info.focus{color:#ffffff;background-color:#511c39;border-color:#180811}.btn-info:hover{color:#ffffff;background-color:#511c39;border-color:#491933}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#ffffff;background-color:#511c39;border-color:#491933}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#ffffff;background-color:#371326;border-color:#180811}.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.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:#772953;border-color:#772953}.btn-info .badge{color:#772953;background-color:#ffffff}.btn-warning{color:#ffffff;background-color:#efb73e;border-color:#efb73e}.btn-warning:focus,.btn-warning.focus{color:#ffffff;background-color:#e7a413;border-color:#a0720d}.btn-warning:hover{color:#ffffff;background-color:#e7a413;border-color:#dd9d12}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#ffffff;background-color:#e7a413;border-color:#dd9d12}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#ffffff;background-color:#c68c10;border-color:#a0720d}.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.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:#efb73e;border-color:#efb73e}.btn-warning .badge{color:#efb73e;background-color:#ffffff}.btn-danger{color:#ffffff;background-color:#df382c;border-color:#df382c}.btn-danger:focus,.btn-danger.focus{color:#ffffff;background-color:#bc271c;border-color:#791912}.btn-danger:hover{color:#ffffff;background-color:#bc271c;border-color:#b3251b}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#ffffff;background-color:#bc271c;border-color:#b3251b}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#ffffff;background-color:#9d2118;border-color:#791912}.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.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:#df382c;border-color:#df382c}.btn-danger .badge{color:#df382c;background-color:#ffffff}.btn-link{color:#dd4814;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#97310e;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:#aea79f;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;-o-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:0.35s;-o-transition-duration:0.35s;transition-duration:0.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#ffffff;border:1px solid #cccccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#333333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#ffffff;background-color:#dd4814}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#ffffff;text-decoration:none;outline:0;background-color:#dd4814}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#aea79f}.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.42857143;color:#aea79f;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:54px;padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:54px;line-height:54px}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:8px 12px;font-size:14px;font-weight:normal;line-height:1;color:#333333;text-align:center;background-color:#eeeeee;border:1px solid #cccccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:14px 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{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eeeeee}.nav>li.disabled>a{color:#aea79f}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#aea79f;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eeeeee;border-color:#dd4814}.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 #dddddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#777777;background-color:#ffffff;border:1px solid #dddddd;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 #dddddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #dddddd;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:#ffffff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#ffffff;background-color:#dd4814}.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 #dddddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #dddddd;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:#ffffff}}.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{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top: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;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:6px;margin-bottom:6px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:6px;margin-bottom:6px}.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}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#dd4814;border-color:#bf3e11}.navbar-default .navbar-brand{color:#ffffff}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#ffffff;background-color:none}.navbar-default .navbar-text{color:#ffffff}.navbar-default .navbar-nav>li>a{color:#ffffff}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#ffffff;background-color:#97310e}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#ffffff;background-color:#ae3910}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#cccccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#97310e}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#97310e}.navbar-default .navbar-toggle .icon-bar{background-color:#ffffff}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#bf3e11}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#ae3910;color:#ffffff}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#ffffff}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#ffffff;background-color:#97310e}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#ae3910}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#cccccc;background-color:transparent}}.navbar-default .navbar-link{color:#ffffff}.navbar-default .navbar-link:hover{color:#ffffff}.navbar-default .btn-link{color:#ffffff}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#ffffff}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#cccccc}.navbar-inverse{background-color:#772953;border-color:#511c39}.navbar-inverse .navbar-brand{color:#ffffff}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#ffffff;background-color:none}.navbar-inverse .navbar-text{color:#ffffff}.navbar-inverse .navbar-nav>li>a{color:#ffffff}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#ffffff;background-color:#3e152b}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#ffffff;background-color:#511c39}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#cccccc;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#3e152b}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#3e152b}.navbar-inverse .navbar-toggle .icon-bar{background-color:#ffffff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#5c2040}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#511c39;color:#ffffff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#511c39}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#511c39}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#ffffff}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#ffffff;background-color:#3e152b}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#511c39}.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:#cccccc;background-color:transparent}}.navbar-inverse .navbar-link{color:#ffffff}.navbar-inverse .navbar-link:hover{color:#ffffff}.navbar-inverse .btn-link{color:#ffffff}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#ffffff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#cccccc}.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:#cccccc}.breadcrumb>.active{color:#aea79f}.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:8px 12px;line-height:1.42857143;text-decoration:none;color:#dd4814;background-color:#ffffff;border:1px solid #dddddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{z-index:3;color:#97310e;background-color:#eeeeee;border-color:#dddddd}.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:#aea79f;background-color:#f5f5f5;border-color:#dddddd;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:#aea79f;background-color:#ffffff;border-color:#dddddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:14px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin: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:#ffffff;border:1px solid #dddddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eeeeee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#aea79f;background-color:#ffffff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#ffffff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#ffffff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#aea79f}.label-default[href]:hover,.label-default[href]:focus{background-color:#978e83}.label-primary{background-color:#dd4814}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#ae3910}.label-success{background-color:#38b44a}.label-success[href]:hover,.label-success[href]:focus{background-color:#2c8d3a}.label-info{background-color:#772953}.label-info[href]:hover,.label-info[href]:focus{background-color:#511c39}.label-warning{background-color:#efb73e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#e7a413}.label-danger{background-color:#df382c}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#bc271c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;color:#ffffff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#aea79f;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#ffffff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#dd4814;background-color:#ffffff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eeeeee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#ffffff;border:1px solid #dddddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#dd4814}.thumbnail .caption{padding:9px;color:#333333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#468847}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#356635}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#3a87ad}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#2d6987}.alert-warning{background-color:#fcf8e3;border-color:#fbeed5;color:#c09853}.alert-warning hr{border-top-color:#f8e5be}.alert-warning .alert-link{color:#a47e3c}.alert-danger{background-color:#f2dede;border-color:#eed3d7;color:#b94a48}.alert-danger hr{border-top-color:#e6c1c7}.alert-danger .alert-link{color:#953b39}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:20px;color:#ffffff;text-align:center;background-color:#dd4814;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#38b44a}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#772953}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#efb73e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#df382c}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#ffffff;border:1px solid #dddddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333333}a.list-group-item:hover,button.list-group-item:hover,a.list-group-item:focus,button.list-group-item:focus{text-decoration:none;color:#555555;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#eeeeee;color:#aea79f;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#aea79f}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#ffffff;background-color:#dd4814;border-color:#dd4814}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#fad1c3}.list-group-item-success{color:#468847;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#468847}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,button.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:focus{color:#468847;background-color:#d0e9c6}a.list-group-item-success.active,button.list-group-item-success.active,a.list-group-item-success.active:hover,button.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active:focus{color:#fff;background-color:#468847;border-color:#468847}.list-group-item-info{color:#3a87ad;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#3a87ad}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,button.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:focus{color:#3a87ad;background-color:#c4e3f3}a.list-group-item-info.active,button.list-group-item-info.active,a.list-group-item-info.active:hover,button.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active:focus{color:#fff;background-color:#3a87ad;border-color:#3a87ad}.list-group-item-warning{color:#c09853;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#c09853}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,button.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:focus{color:#c09853;background-color:#faf2cc}a.list-group-item-warning.active,button.list-group-item-warning.active,a.list-group-item-warning.active:hover,button.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active:focus{color:#fff;background-color:#c09853;border-color:#c09853}.list-group-item-danger{color:#b94a48;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#b94a48}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,button.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:focus{color:#b94a48;background-color:#ebcccc}a.list-group-item-danger.active,button.list-group-item-danger.active,a.list-group-item-danger.active:hover,button.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active:focus{color:#fff;background-color:#b94a48;border-color:#b94a48}.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:#ffffff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #dddddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #dddddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #dddddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #dddddd}.panel-default{border-color:#dddddd}.panel-default>.panel-heading{color:#333333;background-color:#f5f5f5;border-color:#dddddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#dddddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#dddddd}.panel-primary{border-color:#dd4814}.panel-primary>.panel-heading{color:#ffffff;background-color:#dd4814;border-color:#dd4814}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#dd4814}.panel-primary>.panel-heading .badge{color:#dd4814;background-color:#ffffff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#dd4814}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#468847}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#3a87ad}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#fbeed5}.panel-warning>.panel-heading{color:#c09853;background-color:#fcf8e3;border-color:#fbeed5}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#fbeed5}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#c09853}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#fbeed5}.panel-danger{border-color:#eed3d7}.panel-danger>.panel-heading{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#eed3d7}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#b94a48}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#eed3d7}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000000;text-decoration:none;cursor:pointer;opacity:0.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#ffffff;border:1px solid #999999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:0.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{padding:20px;text-align:right;border-top:1px solid #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}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Ubuntu",Tahoma,"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:12px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:0.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;background-color:#000000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Ubuntu",Tahoma,"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:14px;background-color:#ffffff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #cccccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#ffffff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999999;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#ffffff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#ffffff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999999;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#ffffff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:0.5;filter:alpha(opacity=50);font-size:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.5)), to(rgba(0,0,0,0.0001)));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.0001)), to(rgba(0,0,0,0.5)));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #ffffff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#ffffff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}.navbar-default .badge{background-color:#fff;color:#dd4814}.navbar-inverse .badge{background-color:#fff;color:#772953}@media (max-width:767px){.navbar .dropdown-menu a{color:#fff}} \ No newline at end of file diff --git a/flask_admin/static/bootstrap/bootstrap3/swatch/yeti/bootstrap.min.css b/flask_admin/static/bootstrap/bootstrap3/swatch/yeti/bootstrap.min.css deleted file mode 100644 index 1bb3af7e9..000000000 --- a/flask_admin/static/bootstrap/bootstrap3/swatch/yeti/bootstrap.min.css +++ /dev/null @@ -1,11 +0,0 @@ -@import url("https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,700italic,400,300,700");/*! - * bootswatch v3.3.5 - * Homepage: http://bootswatch.com - * Copyright 2012-2015 Thomas Park - * Licensed under MIT - * Based on Bootstrap -*//*! - * Bootstrap v3.3.5 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;-webkit-box-shadow:none !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#222222;background-color:#ffffff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#008cba;text-decoration:none}a:hover,a:focus{color:#008cba;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,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:0}.img-thumbnail{padding:4px;line-height:1.4;background-color:#ffffff;border:1px solid #dddddd;border-radius:0;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:21px;margin-bottom:21px;border:0;border-top:1px solid #dddddd}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:300;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#999999}h1,.h1,h2,.h2,h3,.h3{margin-top:21px;margin-bottom:10.5px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10.5px;margin-bottom:10.5px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:39px}h2,.h2{font-size:32px}h3,.h3{font-size:26px}h4,.h4{font-size:19px}h5,.h5{font-size:15px}h6,.h6{font-size:13px}p{margin:0 0 10.5px}.lead{margin-bottom:21px;font-size:17px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:22.5px}}small,.small{font-size:80%}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#999999}.text-primary{color:#008cba}a.text-primary:hover,a.text-primary:focus{color:#006687}.text-success{color:#43ac6a}a.text-success:hover,a.text-success:focus{color:#358753}.text-info{color:#5bc0de}a.text-info:hover,a.text-info:focus{color:#31b0d5}.text-warning{color:#e99002}a.text-warning:hover,a.text-warning:focus{color:#b67102}.text-danger{color:#f04124}a.text-danger:hover,a.text-danger:focus{color:#d32a0e}.bg-primary{color:#fff;background-color:#008cba}a.bg-primary:hover,a.bg-primary:focus{background-color:#006687}.bg-success{background-color:#dff0d8}a.bg-success:hover,a.bg-success:focus{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover,a.bg-info:focus{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover,a.bg-warning:focus{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover,a.bg-danger:focus{background-color:#e4b9b9}.page-header{padding-bottom:9.5px;margin:42px 0 21px;border-bottom:1px solid #dddddd}ul,ol{margin-top:0;margin-bottom:10.5px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:21px}dt,dd{line-height:1.4}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10.5px 21px;margin:0 0 21px;font-size:18.75px;border-left:5px solid #dddddd}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.4;color:#6f6f6f}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 #dddddd;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:21px;font-style:normal;line-height:1.4}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:0}kbd{padding:2px 4px;font-size:90%;color:#ffffff;background-color:#333333;border-radius:0;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:10px;margin:0 0 10.5px;font-size:14px;line-height:1.4;word-break:break-all;word-wrap:break-word;color:#333333;background-color:#f5f5f5;border:1px solid #cccccc;border-radius:0}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0%}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0%}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0%}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0%}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#999999;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:21px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.4;vertical-align:top;border-top:1px solid #dddddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #dddddd}.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 #dddddd}.table .table{background-color:#ffffff}.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 #dddddd}.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 #dddddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*="col-"]{position:static;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:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15.75px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #dddddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:21px;font-size:22.5px;line-height:inherit;color:#333333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:9px;font-size:15px;line-height:1.4;color:#6f6f6f}.form-control{display:block;width:100%;height:39px;padding:8px 12px;font-size:15px;line-height:1.4;color:#6f6f6f;background-color:#ffffff;background-image:none;border:1px solid #cccccc;border-radius:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control::-moz-placeholder{color:#999999;opacity:1}.form-control:-ms-input-placeholder{color:#999999}.form-control::-webkit-input-placeholder{color:#999999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eeeeee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:39px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:36px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:60px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:21px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:9px;padding-bottom:9px;margin-bottom:0;min-height:36px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:36px;padding:8px 12px;font-size:12px;line-height:1.5;border-radius:0}select.input-sm{height:36px;line-height:36px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:36px;padding:8px 12px;font-size:12px;line-height:1.5;border-radius:0}.form-group-sm select.form-control{height:36px;line-height:36px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:36px;min-height:33px;padding:9px 12px;font-size:12px;line-height:1.5}.input-lg{height:60px;padding:16px 20px;font-size:19px;line-height:1.3333333;border-radius:0}select.input-lg{height:60px;line-height:60px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:60px;padding:16px 20px;font-size:19px;line-height:1.3333333;border-radius:0}.form-group-lg select.form-control{height:60px;line-height:60px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:60px;min-height:40px;padding:17px 20px;font-size:19px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:48.75px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:39px;height:39px;line-height:39px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:60px;height:60px;line-height:60px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:36px;height:36px;line-height:36px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#43ac6a}.has-success .form-control{border-color:#43ac6a;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#358753;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #85d0a1;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #85d0a1}.has-success .input-group-addon{color:#43ac6a;border-color:#43ac6a;background-color:#dff0d8}.has-success .form-control-feedback{color:#43ac6a}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#e99002}.has-warning .form-control{border-color:#e99002;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#b67102;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #febc53;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #febc53}.has-warning .input-group-addon{color:#e99002;border-color:#e99002;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#e99002}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#f04124}.has-error .form-control{border-color:#f04124;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#d32a0e;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f79483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f79483}.has-error .input-group-addon{color:#f04124;border-color:#f04124;background-color:#f2dede}.has-error .form-control-feedback{color:#f04124}.has-feedback label~.form-control-feedback{top:26px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#626262}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:9px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:30px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:9px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:22.3333328px;font-size:19px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:9px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:8px 12px;font-size:15px;line-height:1.4;border-radius:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333333;background-color:#e7e7e7;border-color:#cccccc}.btn-default:focus,.btn-default.focus{color:#333333;background-color:#cecece;border-color:#8c8c8c}.btn-default:hover{color:#333333;background-color:#cecece;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333333;background-color:#cecece;border-color:#adadad}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#333333;background-color:#bcbcbc;border-color:#8c8c8c}.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.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:#e7e7e7;border-color:#cccccc}.btn-default .badge{color:#e7e7e7;background-color:#333333}.btn-primary{color:#ffffff;background-color:#008cba;border-color:#0079a1}.btn-primary:focus,.btn-primary.focus{color:#ffffff;background-color:#006687;border-color:#001921}.btn-primary:hover{color:#ffffff;background-color:#006687;border-color:#004b63}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#ffffff;background-color:#006687;border-color:#004b63}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#ffffff;background-color:#004b63;border-color:#001921}.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.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:#008cba;border-color:#0079a1}.btn-primary .badge{color:#008cba;background-color:#ffffff}.btn-success{color:#ffffff;background-color:#43ac6a;border-color:#3c9a5f}.btn-success:focus,.btn-success.focus{color:#ffffff;background-color:#358753;border-color:#183e26}.btn-success:hover{color:#ffffff;background-color:#358753;border-color:#2b6e44}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#ffffff;background-color:#358753;border-color:#2b6e44}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#ffffff;background-color:#2b6e44;border-color:#183e26}.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.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:#43ac6a;border-color:#3c9a5f}.btn-success .badge{color:#43ac6a;background-color:#ffffff}.btn-info{color:#ffffff;background-color:#5bc0de;border-color:#46b8da}.btn-info:focus,.btn-info.focus{color:#ffffff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#ffffff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#ffffff;background-color:#31b0d5;border-color:#269abc}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#ffffff;background-color:#269abc;border-color:#1b6d85}.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.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:#ffffff}.btn-warning{color:#ffffff;background-color:#e99002;border-color:#d08002}.btn-warning:focus,.btn-warning.focus{color:#ffffff;background-color:#b67102;border-color:#513201}.btn-warning:hover{color:#ffffff;background-color:#b67102;border-color:#935b01}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#ffffff;background-color:#b67102;border-color:#935b01}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#ffffff;background-color:#935b01;border-color:#513201}.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.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:#e99002;border-color:#d08002}.btn-warning .badge{color:#e99002;background-color:#ffffff}.btn-danger{color:#ffffff;background-color:#f04124;border-color:#ea2f10}.btn-danger:focus,.btn-danger.focus{color:#ffffff;background-color:#d32a0e;border-color:#731708}.btn-danger:hover{color:#ffffff;background-color:#d32a0e;border-color:#b1240c}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#ffffff;background-color:#d32a0e;border-color:#b1240c}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#ffffff;background-color:#b1240c;border-color:#731708}.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.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:#f04124;border-color:#ea2f10}.btn-danger .badge{color:#f04124;background-color:#ffffff}.btn-link{color:#008cba;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#008cba;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999999;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:16px 20px;font-size:19px;line-height:1.3333333;border-radius:0}.btn-sm,.btn-group-sm>.btn{padding:8px 12px;font-size:12px;line-height:1.5;border-radius:0}.btn-xs,.btn-group-xs>.btn{padding:4px 6px;font-size:12px;line-height:1.5;border-radius:0}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;-o-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:0.35s;-o-transition-duration:0.35s;transition-duration:0.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:15px;text-align:left;background-color:#ffffff;border:1px solid #cccccc;border:1px solid rgba(0,0,0,0.15);border-radius:0;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:rgba(0,0,0,0.2)}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.4;color:#555555;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#eeeeee}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#ffffff;text-decoration:none;outline:0;background-color:#008cba}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.4;color:#999999;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:0;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:60px;padding:16px 20px;font-size:19px;line-height:1.3333333;border-radius:0}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:60px;line-height:60px}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:36px;padding:8px 12px;font-size:12px;line-height:1.5;border-radius:0}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:36px;line-height:36px}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:8px 12px;font-size:15px;font-weight:normal;line-height:1;color:#6f6f6f;text-align:center;background-color:#eeeeee;border:1px solid #cccccc;border-radius:0}.input-group-addon.input-sm{padding:8px 12px;font-size:12px;border-radius:0}.input-group-addon.input-lg{padding:16px 20px;font-size:19px;border-radius:0}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eeeeee}.nav>li.disabled>a{color:#999999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999999;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eeeeee;border-color:#008cba}.nav .nav-divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #dddddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.4;border:1px solid transparent;border-radius:0 0 0 0}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#6f6f6f;background-color:#ffffff;border:1px solid #dddddd;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:0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #dddddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #dddddd;border-radius:0 0 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:#ffffff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:0}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#ffffff;background-color:#008cba}.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:0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #dddddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #dddddd;border-radius:0 0 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#ffffff}}.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:45px;margin-bottom:21px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:0}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:12px 15px;font-size:19px;line-height:21px;height:45px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:5.5px;margin-bottom:5.5px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:0}.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:6px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:21px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:21px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:12px;padding-bottom:12px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:3px;margin-bottom:3px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:3px;margin-bottom:3px}.navbar-btn.btn-sm{margin-top:4.5px;margin-bottom:4.5px}.navbar-btn.btn-xs{margin-top:11.5px;margin-bottom:11.5px}.navbar-text{margin-top:12px;margin-bottom:12px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#333333;border-color:#222222}.navbar-default .navbar-brand{color:#ffffff}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#ffffff;background-color:transparent}.navbar-default .navbar-text{color:#ffffff}.navbar-default .navbar-nav>li>a{color:#ffffff}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#ffffff;background-color:#272727}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#ffffff;background-color:#272727}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#cccccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:transparent}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:transparent}.navbar-default .navbar-toggle .icon-bar{background-color:#ffffff}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#222222}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#272727;color:#ffffff}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#ffffff}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#ffffff;background-color:#272727}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#272727}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#cccccc;background-color:transparent}}.navbar-default .navbar-link{color:#ffffff}.navbar-default .navbar-link:hover{color:#ffffff}.navbar-default .btn-link{color:#ffffff}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#ffffff}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#cccccc}.navbar-inverse{background-color:#008cba;border-color:#006687}.navbar-inverse .navbar-brand{color:#ffffff}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#ffffff;background-color:transparent}.navbar-inverse .navbar-text{color:#ffffff}.navbar-inverse .navbar-nav>li>a{color:#ffffff}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#ffffff;background-color:#006687}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#ffffff;background-color:#006687}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:transparent}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:transparent}.navbar-inverse .navbar-toggle .icon-bar{background-color:#ffffff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#007196}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#006687;color:#ffffff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#006687}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#006687}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#ffffff}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#ffffff;background-color:#006687}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#006687}.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:#444444;background-color:transparent}}.navbar-inverse .navbar-link{color:#ffffff}.navbar-inverse .navbar-link:hover{color:#ffffff}.navbar-inverse .btn-link{color:#ffffff}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#ffffff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444444}.breadcrumb{padding:8px 15px;margin-bottom:21px;list-style:none;background-color:#f5f5f5;border-radius:0}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#999999}.breadcrumb>.active{color:#333333}.pagination{display:inline-block;padding-left:0;margin:21px 0;border-radius:0}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:8px 12px;line-height:1.4;text-decoration:none;color:#008cba;background-color:transparent;border:1px solid transparent;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:0;border-top-left-radius:0}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:0;border-top-right-radius:0}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{z-index:3;color:#008cba;background-color:#eeeeee;border-color:transparent}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#ffffff;background-color:#008cba;border-color:transparent;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999999;background-color:#ffffff;border-color:transparent;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:16px 20px;font-size:19px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:0;border-top-left-radius:0}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:0;border-top-right-radius:0}.pagination-sm>li>a,.pagination-sm>li>span{padding:8px 12px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:0;border-top-left-radius:0}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:0;border-top-right-radius:0}.pager{padding-left:0;margin:21px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:transparent;border:1px solid transparent;border-radius:3px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eeeeee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999999;background-color:transparent;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#ffffff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#ffffff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999999}.label-default[href]:hover,.label-default[href]:focus{background-color:#808080}.label-primary{background-color:#008cba}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#006687}.label-success{background-color:#43ac6a}.label-success[href]:hover,.label-success[href]:focus{background-color:#358753}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#e99002}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#b67102}.label-danger{background-color:#f04124}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#d32a0e}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;color:#ffffff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#008cba;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#ffffff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#008cba;background-color:#ffffff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#fafafa}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:23px;font-weight:200}.jumbotron>hr{border-top-color:#e1e1e1}.container .jumbotron,.container-fluid .jumbotron{border-radius:0}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:68px}}.thumbnail{display:block;padding:4px;margin-bottom:21px;line-height:1.4;background-color:#ffffff;border:1px solid #dddddd;border-radius:0;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#008cba}.thumbnail .caption{padding:9px;color:#222222}.alert{padding:15px;margin-bottom:21px;border:1px solid transparent;border-radius:0}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#43ac6a;border-color:#3c9a5f;color:#ffffff}.alert-success hr{border-top-color:#358753}.alert-success .alert-link{color:#e6e6e6}.alert-info{background-color:#5bc0de;border-color:#3db5d8;color:#ffffff}.alert-info hr{border-top-color:#2aabd2}.alert-info .alert-link{color:#e6e6e6}.alert-warning{background-color:#e99002;border-color:#d08002;color:#ffffff}.alert-warning hr{border-top-color:#b67102}.alert-warning .alert-link{color:#e6e6e6}.alert-danger{background-color:#f04124;border-color:#ea2f10;color:#ffffff}.alert-danger hr{border-top-color:#d32a0e}.alert-danger .alert-link{color:#e6e6e6}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:21px;margin-bottom:21px;background-color:#f5f5f5;border-radius:0;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:21px;color:#ffffff;text-align:center;background-color:#008cba;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#43ac6a}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#e99002}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#f04124}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#ffffff;border:1px solid #dddddd}.list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}a.list-group-item,button.list-group-item{color:#555555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333333}a.list-group-item:hover,button.list-group-item:hover,a.list-group-item:focus,button.list-group-item:focus{text-decoration:none;color:#555555;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#eeeeee;color:#999999;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#999999}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#ffffff;background-color:#008cba;border-color:#008cba}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#87e1ff}.list-group-item-success{color:#43ac6a;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#43ac6a}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,button.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:focus{color:#43ac6a;background-color:#d0e9c6}a.list-group-item-success.active,button.list-group-item-success.active,a.list-group-item-success.active:hover,button.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active:focus{color:#fff;background-color:#43ac6a;border-color:#43ac6a}.list-group-item-info{color:#5bc0de;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#5bc0de}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,button.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:focus{color:#5bc0de;background-color:#c4e3f3}a.list-group-item-info.active,button.list-group-item-info.active,a.list-group-item-info.active:hover,button.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active:focus{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.list-group-item-warning{color:#e99002;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#e99002}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,button.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:focus{color:#e99002;background-color:#faf2cc}a.list-group-item-warning.active,button.list-group-item-warning.active,a.list-group-item-warning.active:hover,button.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active:focus{color:#fff;background-color:#e99002;border-color:#e99002}.list-group-item-danger{color:#f04124;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#f04124}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,button.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:focus{color:#f04124;background-color:#ebcccc}a.list-group-item-danger.active,button.list-group-item-danger.active,a.list-group-item-danger.active:hover,button.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active:focus{color:#fff;background-color:#f04124;border-color:#f04124}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:21px;background-color:#ffffff;border:1px solid transparent;border-radius:0;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:-1;border-top-left-radius:-1}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:17px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #dddddd;border-bottom-right-radius:-1;border-bottom-left-radius:-1}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:-1;border-top-left-radius:-1}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:-1;border-bottom-left-radius:-1}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:-1;border-top-left-radius:-1}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:-1;border-top-right-radius:-1}.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:-1}.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:-1}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:-1;border-bottom-left-radius:-1}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:-1;border-bottom-right-radius:-1}.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:-1}.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:-1}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #dddddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:21px}.panel-group .panel{margin-bottom:0;border-radius:0}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #dddddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #dddddd}.panel-default{border-color:#dddddd}.panel-default>.panel-heading{color:#333333;background-color:#f5f5f5;border-color:#dddddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#dddddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#dddddd}.panel-primary{border-color:#008cba}.panel-primary>.panel-heading{color:#ffffff;background-color:#008cba;border-color:#008cba}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#008cba}.panel-primary>.panel-heading .badge{color:#008cba;background-color:#ffffff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#008cba}.panel-success{border-color:#3c9a5f}.panel-success>.panel-heading{color:#ffffff;background-color:#43ac6a;border-color:#3c9a5f}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#3c9a5f}.panel-success>.panel-heading .badge{color:#43ac6a;background-color:#ffffff}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#3c9a5f}.panel-info{border-color:#3db5d8}.panel-info>.panel-heading{color:#ffffff;background-color:#5bc0de;border-color:#3db5d8}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#3db5d8}.panel-info>.panel-heading .badge{color:#5bc0de;background-color:#ffffff}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#3db5d8}.panel-warning{border-color:#d08002}.panel-warning>.panel-heading{color:#ffffff;background-color:#e99002;border-color:#d08002}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d08002}.panel-warning>.panel-heading .badge{color:#e99002;background-color:#ffffff}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d08002}.panel-danger{border-color:#ea2f10}.panel-danger>.panel-heading{color:#ffffff;background-color:#f04124;border-color:#ea2f10}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ea2f10}.panel-danger>.panel-heading .badge{color:#f04124;background-color:#ffffff}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ea2f10}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#fafafa;border:1px solid #e8e8e8;border-radius:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:0}.well-sm{padding:9px;border-radius:0}.close{float:right;font-size:22.5px;font-weight:bold;line-height:1;color:#ffffff;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#ffffff;text-decoration:none;cursor:pointer;opacity:0.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#ffffff;border:1px solid #999999;border:1px solid rgba(0,0,0,0.2);border-radius:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:0.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.4px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.4}.modal-body{position:relative;padding:20px}.modal-footer{padding: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}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.4;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:12px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:0.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;background-color:#333333;border-radius:0}.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:#333333}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#333333}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#333333}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#333333}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#333333}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#333333}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#333333}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#333333}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.4;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:15px;background-color:#333333;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #333333;border:1px solid transparent;border-radius:0;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:15px;background-color:#333333;border-bottom:1px solid #262626;border-radius:-1 -1 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:#000000;border-top-color:rgba(0,0,0,0.05);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#333333}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#000000;border-right-color:rgba(0,0,0,0.05)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#333333}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#000000;border-bottom-color:rgba(0,0,0,0.05);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#333333}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#000000;border-left-color:rgba(0,0,0,0.05)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#333333;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:0.5;filter:alpha(opacity=50);font-size:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.5)), to(rgba(0,0,0,0.0001)));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.0001)), to(rgba(0,0,0,0.5)));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #ffffff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#ffffff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}.navbar{border:none;font-size:13px;font-weight:300}.navbar .navbar-toggle:hover .icon-bar{background-color:#b3b3b3}.navbar-collapse{border-top-color:rgba(0,0,0,0.2);-webkit-box-shadow:none;box-shadow:none}.navbar .btn{padding-top:6px;padding-bottom:6px}.navbar-form{margin-top:7px;margin-bottom:5px}.navbar-form .form-control{height:auto;padding:4px 6px}.navbar .dropdown-menu{border:none}.navbar .dropdown-menu>li>a,.navbar .dropdown-menu>li>a:focus{background-color:transparent;font-size:13px;font-weight:300}.navbar .dropdown-header{color:rgba(255,255,255,0.5)}.navbar-default .dropdown-menu{background-color:#333333}.navbar-default .dropdown-menu>li>a,.navbar-default .dropdown-menu>li>a:focus{color:#ffffff}.navbar-default .dropdown-menu>li>a:hover,.navbar-default .dropdown-menu>.active>a,.navbar-default .dropdown-menu>.active>a:hover{background-color:#272727}.navbar-inverse .dropdown-menu{background-color:#008cba}.navbar-inverse .dropdown-menu>li>a,.navbar-inverse .dropdown-menu>li>a:focus{color:#ffffff}.navbar-inverse .dropdown-menu>li>a:hover,.navbar-inverse .dropdown-menu>.active>a,.navbar-inverse .dropdown-menu>.active>a:hover{background-color:#006687}.btn{padding:8px 12px}.btn-lg{padding:16px 20px}.btn-sm{padding:8px 12px}.btn-xs{padding:4px 6px}.btn-group .btn~.dropdown-toggle{padding-left:16px;padding-right:16px}.btn-group .dropdown-menu{border-top-width:0}.btn-group.dropup .dropdown-menu{border-top-width:1px;border-bottom-width:0;margin-bottom:0}.btn-group .dropdown-toggle.btn-default~.dropdown-menu{background-color:#e7e7e7;border-color:#cccccc}.btn-group .dropdown-toggle.btn-default~.dropdown-menu>li>a{color:#333333}.btn-group .dropdown-toggle.btn-default~.dropdown-menu>li>a:hover{background-color:#d3d3d3}.btn-group .dropdown-toggle.btn-primary~.dropdown-menu{background-color:#008cba;border-color:#0079a1}.btn-group .dropdown-toggle.btn-primary~.dropdown-menu>li>a{color:#ffffff}.btn-group .dropdown-toggle.btn-primary~.dropdown-menu>li>a:hover{background-color:#006d91}.btn-group .dropdown-toggle.btn-success~.dropdown-menu{background-color:#43ac6a;border-color:#3c9a5f}.btn-group .dropdown-toggle.btn-success~.dropdown-menu>li>a{color:#ffffff}.btn-group .dropdown-toggle.btn-success~.dropdown-menu>li>a:hover{background-color:#388f58}.btn-group .dropdown-toggle.btn-info~.dropdown-menu{background-color:#5bc0de;border-color:#46b8da}.btn-group .dropdown-toggle.btn-info~.dropdown-menu>li>a{color:#ffffff}.btn-group .dropdown-toggle.btn-info~.dropdown-menu>li>a:hover{background-color:#39b3d7}.btn-group .dropdown-toggle.btn-warning~.dropdown-menu{background-color:#e99002;border-color:#d08002}.btn-group .dropdown-toggle.btn-warning~.dropdown-menu>li>a{color:#ffffff}.btn-group .dropdown-toggle.btn-warning~.dropdown-menu>li>a:hover{background-color:#c17702}.btn-group .dropdown-toggle.btn-danger~.dropdown-menu{background-color:#f04124;border-color:#ea2f10}.btn-group .dropdown-toggle.btn-danger~.dropdown-menu>li>a{color:#ffffff}.btn-group .dropdown-toggle.btn-danger~.dropdown-menu>li>a:hover{background-color:#dc2c0f}.lead{color:#6f6f6f}cite{font-style:italic}blockquote{border-left-width:1px;color:#6f6f6f}blockquote.pull-right{border-right-width:1px}blockquote small{font-size:12px;font-weight:300}table{font-size:12px}label,.control-label,.help-block,.checkbox,.radio{font-size:12px;font-weight:normal}input[type="radio"],input[type="checkbox"]{margin-top:1px}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{border-color:transparent}.nav-tabs>li>a{background-color:#e7e7e7;color:#222222}.nav-tabs .caret{border-top-color:#222222;border-bottom-color:#222222}.nav-pills{font-weight:300}.breadcrumb{border:1px solid #dddddd;border-radius:3px;font-size:10px;font-weight:300;text-transform:uppercase}.pagination{font-size:12px;font-weight:300;color:#999999}.pagination>li>a,.pagination>li>span{margin-left:4px;color:#999999}.pagination>.active>a,.pagination>.active>span{color:#fff}.pagination>li>a,.pagination>li:first-child>a,.pagination>li:last-child>a,.pagination>li>span,.pagination>li:first-child>span,.pagination>li:last-child>span{border-radius:3px}.pagination-lg>li>a,.pagination-lg>li>span{padding-left:22px;padding-right:22px}.pagination-sm>li>a,.pagination-sm>li>span{padding:0 5px}.pager{font-size:12px;font-weight:300;color:#999999}.list-group{font-size:12px;font-weight:300}.close{opacity:0.4;text-decoration:none;text-shadow:none}.close:hover,.close:focus{opacity:1}.alert{font-size:12px;font-weight:300}.alert .alert-link{font-weight:normal;color:#fff;text-decoration:underline}.label{padding-left:1em;padding-right:1em;border-radius:0;font-weight:300}.label-default{background-color:#e7e7e7;color:#333333}.badge{font-weight:300}.progress{height:22px;padding:2px;background-color:#f6f6f6;border:1px solid #ccc;-webkit-box-shadow:none;box-shadow:none}.dropdown-menu{padding:0;margin-top:0;font-size:12px}.dropdown-menu>li>a{padding:12px 15px}.dropdown-header{padding-left:15px;padding-right:15px;font-size:9px;text-transform:uppercase}.popover{color:#fff;font-size:12px;font-weight:300}.panel-heading,.panel-footer{border-top-right-radius:0;border-top-left-radius:0}.panel-default .close{color:#222222}.modal .close{color:#222222} \ No newline at end of file diff --git a/flask_admin/static/vendor/bootstrap-daterangepicker/daterangepicker-bs3.css b/flask_admin/static/vendor/bootstrap-daterangepicker/daterangepicker-bs3.css deleted file mode 100644 index 9388916d5..000000000 --- a/flask_admin/static/vendor/bootstrap-daterangepicker/daterangepicker-bs3.css +++ /dev/null @@ -1,335 +0,0 @@ -/*! - * Stylesheet for the Date Range Picker, for use with Bootstrap 3.x - * - * Copyright 2013-2015 Dan Grossman ( http://www.dangrossman.info ) - * Licensed under the MIT license. See http://www.opensource.org/licenses/mit-license.php - * - * Built for http://www.improvely.com - */ - - .daterangepicker.dropdown-menu { - max-width: none; - z-index: 3000; -} - -.daterangepicker.opensleft .ranges, .daterangepicker.opensleft .calendar { - float: left; - margin: 4px; -} - -.daterangepicker.opensright .ranges, .daterangepicker.opensright .calendar, -.daterangepicker.openscenter .ranges, .daterangepicker.openscenter .calendar { - float: right; - margin: 4px; -} - -.daterangepicker.single .ranges, .daterangepicker.single .calendar { - float: none; -} - -.daterangepicker .ranges { - width: 160px; - text-align: left; -} - -.daterangepicker .ranges .range_inputs>div { - float: left; -} - -.daterangepicker .ranges .range_inputs>div:nth-child(2) { - padding-left: 11px; -} - -.daterangepicker .calendar { - display: none; - max-width: 270px; -} - -.daterangepicker.show-calendar .calendar { - display: block; -} - -.daterangepicker .calendar.single .calendar-date { - border: none; -} - -.daterangepicker .calendar th, .daterangepicker .calendar td { - font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; - white-space: nowrap; - text-align: center; - min-width: 32px; -} - -.daterangepicker .daterangepicker_start_input label, -.daterangepicker .daterangepicker_end_input label { - color: #333; - display: block; - font-size: 11px; - font-weight: normal; - height: 20px; - line-height: 20px; - margin-bottom: 2px; - text-shadow: #fff 1px 1px 0px; - text-transform: uppercase; - width: 74px; -} - -.daterangepicker .ranges input { - font-size: 11px; -} - -.daterangepicker .ranges .input-mini { - border: 1px solid #ccc; - border-radius: 4px; - color: #555; - display: block; - font-size: 11px; - height: 30px; - line-height: 30px; - vertical-align: middle; - margin: 0 0 10px 0; - padding: 0 6px; - width: 74px; -} - -.daterangepicker .ranges ul { - list-style: none; - margin: 0; - padding: 0; -} - -.daterangepicker .ranges li { - font-size: 13px; - background: #f5f5f5; - border: 1px solid #f5f5f5; - color: #08c; - padding: 3px 12px; - margin-bottom: 8px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; - cursor: pointer; -} - -.daterangepicker .ranges li.active, .daterangepicker .ranges li:hover { - background: #08c; - border: 1px solid #08c; - color: #fff; -} - -.daterangepicker .calendar-date { - border: 1px solid #ddd; - padding: 4px; - border-radius: 4px; - background: #fff; -} - -.daterangepicker .calendar-time { - text-align: center; - margin: 8px auto 0 auto; - line-height: 30px; -} - -.daterangepicker { - position: absolute; - background: #fff; - top: 100px; - left: 20px; - padding: 4px; - margin-top: 1px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.daterangepicker.opensleft:before { - position: absolute; - top: -7px; - right: 9px; - display: inline-block; - border-right: 7px solid transparent; - border-bottom: 7px solid #ccc; - border-left: 7px solid transparent; - border-bottom-color: rgba(0, 0, 0, 0.2); - content: ''; -} - -.daterangepicker.opensleft:after { - position: absolute; - top: -6px; - right: 10px; - display: inline-block; - border-right: 6px solid transparent; - border-bottom: 6px solid #fff; - border-left: 6px solid transparent; - content: ''; -} - -.daterangepicker.openscenter:before { - position: absolute; - top: -7px; - left: 0; - right: 0; - width: 0; - margin-left: auto; - margin-right: auto; - display: inline-block; - border-right: 7px solid transparent; - border-bottom: 7px solid #ccc; - border-left: 7px solid transparent; - border-bottom-color: rgba(0, 0, 0, 0.2); - content: ''; -} - -.daterangepicker.openscenter:after { - position: absolute; - top: -6px; - left: 0; - right: 0; - width: 0; - margin-left: auto; - margin-right: auto; - display: inline-block; - border-right: 6px solid transparent; - border-bottom: 6px solid #fff; - border-left: 6px solid transparent; - content: ''; -} - -.daterangepicker.opensright:before { - position: absolute; - top: -7px; - left: 9px; - display: inline-block; - border-right: 7px solid transparent; - border-bottom: 7px solid #ccc; - border-left: 7px solid transparent; - border-bottom-color: rgba(0, 0, 0, 0.2); - content: ''; -} - -.daterangepicker.opensright:after { - position: absolute; - top: -6px; - left: 10px; - display: inline-block; - border-right: 6px solid transparent; - border-bottom: 6px solid #fff; - border-left: 6px solid transparent; - content: ''; -} - -.daterangepicker.dropup{ - margin-top: -5px; -} -.daterangepicker.dropup:before{ - top: initial; - bottom:-7px; - border-bottom: initial; - border-top: 7px solid #ccc; -} -.daterangepicker.dropup:after{ - top: initial; - bottom:-6px; - border-bottom: initial; - border-top: 6px solid #fff; -} - -.daterangepicker table { - width: 100%; - margin: 0; -} - -.daterangepicker td, .daterangepicker th { - text-align: center; - width: 20px; - height: 20px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - cursor: pointer; - white-space: nowrap; -} - -.daterangepicker td.off { - color: #999; -} - -.daterangepicker td.disabled, .daterangepicker option.disabled { - color: #999; -} - -.daterangepicker td.available:hover, .daterangepicker td.available.today, .daterangepicker th.available:hover { - background: #eee; -} - -.daterangepicker td.in-range { - background: #ebf4f8; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.daterangepicker td.start-date { - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} - -.daterangepicker td.end-date { - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.daterangepicker td.start-date.end-date { - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.daterangepicker td.today.active, .daterangepicker td.active, .daterangepicker td.active:hover { - background-color: #357ebd; - border-color: #3071a9; - color: #fff; -} - -.daterangepicker td.week, .daterangepicker th.week { - font-size: 80%; - color: #ccc; -} - -.daterangepicker select.monthselect, .daterangepicker select.yearselect { - font-size: 12px; - padding: 1px; - height: auto; - margin: 0; - cursor: default; -} - -.daterangepicker select.monthselect { - margin-right: 2%; - width: 56%; -} - -.daterangepicker select.yearselect { - width: 40%; -} - -.daterangepicker select.hourselect, .daterangepicker select.minuteselect, .daterangepicker select.secondselect, .daterangepicker select.ampmselect { - width: 50px; - margin-bottom: 0; -} - -.daterangepicker_start_input { - float: left; -} - -.daterangepicker_end_input { - float: left; - padding-left: 11px -} - -.daterangepicker th.month { - width: auto; -} diff --git a/flask_admin/static/vendor/select2/select2-bootstrap3.css b/flask_admin/static/vendor/select2/select2-bootstrap3.css deleted file mode 100644 index 20e1902d1..000000000 --- a/flask_admin/static/vendor/select2/select2-bootstrap3.css +++ /dev/null @@ -1 +0,0 @@ -/*! Select2 Bootstrap 3 CSS v1.4.6 | MIT License | github.com/t0m/select2-bootstrap-css */.select2-container.form-control{background:0 0;box-shadow:none;border:none;display:block;margin:0;padding:0}.select2-container .select2-choice,.select2-container .select2-choices,.select2-container .select2-choices .select2-search-field input{background:#fff;padding:0;border-color:#ccc;border-radius:4px;color:#555;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.select2-search input{border-color:#ccc;border-radius:4px;color:#555;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;background-color:#fff;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.select2-container .select2-choices .select2-search-field input{-webkit-box-shadow:none;box-shadow:none}.select2-container .select2-choice{height:34px;line-height:1.42857}.select2-container.select2-container-multi.form-control{height:auto}.input-group-sm .select2-container .select2-choice,.select2-container.input-sm .select2-choice{height:30px;line-height:1.5;border-radius:3px}.input-group-lg .select2-container .select2-choice,.select2-container.input-lg .select2-choice{height:46px;line-height:1.33333;border-radius:6px}.select2-container-multi .select2-choices .select2-search-field input{height:32px}.input-group-sm .select2-container-multi .select2-choices .select2-search-field input,.select2-container-multi.input-sm .select2-choices .select2-search-field input{height:28px}.input-group-lg .select2-container-multi .select2-choices .select2-search-field input,.select2-container-multi.input-lg .select2-choices .select2-search-field input{height:44px}.select2-container-multi .select2-choices .select2-search-field input{margin:0}.select2-choice>span:first-child,.select2-chosen,.select2-container .select2-choices .select2-search-field input{padding:6px 12px}.input-group-sm .select2-choice>span:first-child,.input-group-sm .select2-choices .select2-search-field input,.input-group-sm .select2-chosen,.input-sm .select2-choice>span:first-child,.input-sm .select2-choices .select2-search-field input,.input-sm .select2-chosen{padding:5px 10px}.input-group-lg .select2-choice>span:first-child,.input-group-lg .select2-choices .select2-search-field input,.input-group-lg .select2-chosen,.input-lg .select2-choice>span:first-child,.input-lg .select2-choices .select2-search-field input,.input-lg .select2-chosen{padding:10px 16px}.select2-container-multi .select2-choices .select2-search-choice{margin-top:5px;margin-bottom:3px}.input-group-sm .select2-container-multi .select2-choices .select2-search-choice,.select2-container-multi.input-sm .select2-choices .select2-search-choice{margin-top:3px;margin-bottom:2px}.input-group-lg .select2-container-multi .select2-choices .select2-search-choice,.select2-container-multi.input-lg .select2-choices .select2-search-choice{line-height:24px}.select2-container .select2-choice .select2-arrow,.select2-container .select2-choice div{border-left:none;background:0 0;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.select2-dropdown-open .select2-choice .select2-arrow,.select2-dropdown-open .select2-choice div{border-left-color:transparent;background:0 0;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.select2-container .select2-choice .select2-arrow b,.select2-container .select2-choice div b{background-position:0 3px}.select2-dropdown-open .select2-choice .select2-arrow b,.select2-dropdown-open .select2-choice div b{background-position:-18px 3px}.input-group-sm .select2-container .select2-choice .select2-arrow b,.input-group-sm .select2-container .select2-choice div b,.select2-container.input-sm .select2-choice .select2-arrow b,.select2-container.input-sm .select2-choice div b{background-position:0 1px}.input-group-sm .select2-dropdown-open .select2-choice .select2-arrow b,.input-group-sm .select2-dropdown-open .select2-choice div b,.select2-dropdown-open.input-sm .select2-choice .select2-arrow b,.select2-dropdown-open.input-sm .select2-choice div b{background-position:-18px 1px}.input-group-lg .select2-container .select2-choice .select2-arrow b,.input-group-lg .select2-container .select2-choice div b,.select2-container.input-lg .select2-choice .select2-arrow b,.select2-container.input-lg .select2-choice div b{background-position:0 9px}.input-group-lg .select2-dropdown-open .select2-choice .select2-arrow b,.input-group-lg .select2-dropdown-open .select2-choice div b,.select2-dropdown-open.input-lg .select2-choice .select2-arrow b,.select2-dropdown-open.input-lg .select2-choice div b{background-position:-18px 9px}.has-warning .select2-choice,.has-warning .select2-choices{border-color:#8a6d3b}.has-warning .select2-container-active .select2-choice,.has-warning .select2-container-multi.select2-container-active .select2-choices{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.select2-drop-active{border-color:#66512c}.has-warning.select2-drop-active.select2-drop.select2-drop-above{border-top-color:#66512c}.has-error .select2-choice,.has-error .select2-choices{border-color:#a94442}.has-error .select2-container-active .select2-choice,.has-error .select2-container-multi.select2-container-active .select2-choices{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.select2-drop-active{border-color:#843534}.has-error.select2-drop-active.select2-drop.select2-drop-above{border-top-color:#843534}.has-success .select2-choice,.has-success .select2-choices{border-color:#3c763d}.has-success .select2-container-active .select2-choice,.has-success .select2-container-multi.select2-container-active .select2-choices{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.select2-drop-active{border-color:#2b542c}.has-success.select2-drop-active.select2-drop.select2-drop-above{border-top-color:#2b542c}.select2-container-active .select2-choice,.select2-container-multi.select2-container-active .select2-choices{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);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.select2-drop-active{border-color:#66afe9}.select2-drop-auto-width,.select2-drop.select2-drop-above.select2-drop-active{border-top-color:#66afe9}.input-group.select2-bootstrap-prepend [class^=select2-choice]{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.input-group.select2-bootstrap-append [class^=select2-choice]{border-bottom-right-radius:0!important;border-top-right-radius:0!important}.select2-dropdown-open [class^=select2-choice]{border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.select2-dropdown-open.select2-drop-above [class^=select2-choice]{border-radius:0 0 4px 4px!important;background:#fff;filter:none}.input-group.select2-bootstrap-prepend .select2-dropdown-open.select2-drop-above [class^=select2-choice]{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.input-group.select2-bootstrap-append .select2-dropdown-open.select2-drop-above [class^=select2-choice]{border-bottom-right-radius:0!important;border-top-right-radius:0!important}.input-group.input-group-sm.select2-bootstrap-prepend .select2-dropdown-open.select2-drop-above [class^=select2-choice]{border-bottom-right-radius:3px!important}.input-group.input-group-lg.select2-bootstrap-prepend .select2-dropdown-open.select2-drop-above [class^=select2-choice]{border-bottom-right-radius:6px!important}.input-group.input-group-sm.select2-bootstrap-append .select2-dropdown-open.select2-drop-above [class^=select2-choice]{border-bottom-left-radius:3px!important}.input-group.input-group-lg.select2-bootstrap-append .select2-dropdown-open.select2-drop-above [class^=select2-choice]{border-bottom-left-radius:6px!important}.select2-results .select2-highlighted{color:#fff;background-color:#337ab7}.select2-bootstrap-append .input-group-btn,.select2-bootstrap-append .input-group-btn .btn,.select2-bootstrap-append .select2-container-multiple,.select2-bootstrap-prepend .input-group-btn,.select2-bootstrap-prepend .input-group-btn .btn,.select2-bootstrap-prepend .select2-container-multiple{vertical-align:top}.select2-container-multi .select2-choices .select2-search-choice{color:#555;background:#fff;border-color:#ccc;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:none;box-shadow:none}.select2-container-multi .select2-choices .select2-search-choice-focus{background:#ebebeb;border-color:#adadad;color:#333;-webkit-box-shadow:none;box-shadow:none}.select2-search-choice-close{margin-top:-7px;top:50%}.select2-container .select2-choice abbr{top:50%}.select2-results .select2-no-results,.select2-results .select2-searching,.select2-results .select2-selection-limit{background-color:#fcf8e3;color:#8a6d3b}.select2-container.select2-container-disabled .select2-choice,.select2-container.select2-container-disabled .select2-choices{cursor:not-allowed;background-color:#eee;border-color:#ccc}.select2-container.select2-container-disabled .select2-choice .select2-arrow,.select2-container.select2-container-disabled .select2-choice div,.select2-container.select2-container-disabled .select2-choices .select2-arrow,.select2-container.select2-container-disabled .select2-choices div{background-color:transparent;border-left:1px solid transparent}.select2-container-multi .select2-choices .select2-search-field input.select2-active,.select2-more-results.select2-active,.select2-search input.select2-active{background-position:right 4px center}.select2-offscreen,.select2-offscreen:focus{width:1px!important;height:1px!important;position:absolute!important} \ No newline at end of file diff --git a/flask_admin/static/vendor/x-editable/css/bootstrap3-editable.css b/flask_admin/static/vendor/x-editable/css/bootstrap3-editable.css deleted file mode 100755 index eaef0de96..000000000 --- a/flask_admin/static/vendor/x-editable/css/bootstrap3-editable.css +++ /dev/null @@ -1,663 +0,0 @@ -/*! X-editable - v1.5.1 -* In-place editing with Twitter Bootstrap, jQuery UI or pure jQuery -* http://github.com/vitalets/x-editable -* Copyright (c) 2013 Vitaliy Potapov; Licensed MIT */ -.editableform { - margin-bottom: 0; /* overwrites bootstrap margin */ -} - -.editableform .control-group { - margin-bottom: 0; /* overwrites bootstrap margin */ - white-space: nowrap; /* prevent wrapping buttons on new line */ - line-height: 20px; /* overwriting bootstrap line-height. See #133 */ -} - -/* - BS3 width:1005 for inputs breaks editable form in popup - See: https://github.com/vitalets/x-editable/issues/393 -*/ -.editableform .form-control { - width: auto; -} - -.editable-buttons { - display: inline-block; /* should be inline to take effect of parent's white-space: nowrap */ - vertical-align: top; - margin-left: 7px; - /* inline-block emulation for IE7*/ - zoom: 1; - *display: inline; -} - -.editable-buttons.editable-buttons-bottom { - display: block; - margin-top: 7px; - margin-left: 0; -} - -.editable-input { - vertical-align: top; - display: inline-block; /* should be inline to take effect of parent's white-space: nowrap */ - width: auto; /* bootstrap-responsive has width: 100% that breakes layout */ - white-space: normal; /* reset white-space decalred in parent*/ - /* display-inline emulation for IE7*/ - zoom: 1; - *display: inline; -} - -.editable-buttons .editable-cancel { - margin-left: 7px; -} - -/*for jquery-ui buttons need set height to look more pretty*/ -.editable-buttons button.ui-button-icon-only { - height: 24px; - width: 30px; -} - -.editableform-loading { - background: url('../img/loading.gif') center center no-repeat; - height: 25px; - width: auto; - min-width: 25px; -} - -.editable-inline .editableform-loading { - background-position: left 5px; -} - - .editable-error-block { - max-width: 300px; - margin: 5px 0 0 0; - width: auto; - white-space: normal; -} - -/*add padding for jquery ui*/ -.editable-error-block.ui-state-error { - padding: 3px; -} - -.editable-error { - color: red; -} - -/* ---- For specific types ---- */ - -.editableform .editable-date { - padding: 0; - margin: 0; - float: left; -} - -/* move datepicker icon to center of add-on button. See https://github.com/vitalets/x-editable/issues/183 */ -.editable-inline .add-on .icon-th { - margin-top: 3px; - margin-left: 1px; -} - - -/* checklist vertical alignment */ -.editable-checklist label input[type="checkbox"], -.editable-checklist label span { - vertical-align: middle; - margin: 0; -} - -.editable-checklist label { - white-space: nowrap; -} - -/* set exact width of textarea to fit buttons toolbar */ -.editable-wysihtml5 { - width: 566px; - height: 250px; -} - -/* clear button shown as link in date inputs */ -.editable-clear { - clear: both; - font-size: 0.9em; - text-decoration: none; - text-align: right; -} - -/* IOS-style clear button for text inputs */ -.editable-clear-x { - background: url('../img/clear.png') center center no-repeat; - display: block; - width: 13px; - height: 13px; - position: absolute; - opacity: 0.6; - z-index: 100; - - top: 50%; - right: 6px; - margin-top: -6px; - -} - -.editable-clear-x:hover { - opacity: 1; -} - -.editable-pre-wrapped { - white-space: pre-wrap; -} -.editable-container.editable-popup { - max-width: none !important; /* without this rule poshytip/tooltip does not stretch */ -} - -.editable-container.popover { - width: auto; /* without this rule popover does not stretch */ -} - -.editable-container.editable-inline { - display: inline-block; - vertical-align: middle; - width: auto; - /* inline-block emulation for IE7*/ - zoom: 1; - *display: inline; -} - -.editable-container.ui-widget { - font-size: inherit; /* jqueryui widget font 1.1em too big, overwrite it */ - z-index: 9990; /* should be less than select2 dropdown z-index to close dropdown first when click */ -} -.editable-click, -a.editable-click, -a.editable-click:hover { - text-decoration: none; - border-bottom: dashed 1px #0088cc; -} - -.editable-click.editable-disabled, -a.editable-click.editable-disabled, -a.editable-click.editable-disabled:hover { - color: #585858; - cursor: default; - border-bottom: none; -} - -.editable-empty, .editable-empty:hover, .editable-empty:focus{ - font-style: italic; - color: #DD1144; - /* border-bottom: none; */ - text-decoration: none; -} - -.editable-unsaved { - font-weight: bold; -} - -.editable-unsaved:after { -/* content: '*'*/ -} - -.editable-bg-transition { - -webkit-transition: background-color 1400ms ease-out; - -moz-transition: background-color 1400ms ease-out; - -o-transition: background-color 1400ms ease-out; - -ms-transition: background-color 1400ms ease-out; - transition: background-color 1400ms ease-out; -} - -/*see https://github.com/vitalets/x-editable/issues/139 */ -.form-horizontal .editable -{ - padding-top: 5px; - display:inline-block; -} - - -/*! - * Datepicker for Bootstrap - * - * Copyright 2012 Stefan Petre - * Improvements by Andrew Rowls - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - */ -.datepicker { - padding: 4px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - direction: ltr; - /*.dow { - border-top: 1px solid #ddd !important; - }*/ - -} -.datepicker-inline { - width: 220px; -} -.datepicker.datepicker-rtl { - direction: rtl; -} -.datepicker.datepicker-rtl table tr td span { - float: right; -} -.datepicker-dropdown { - top: 0; - left: 0; -} -.datepicker-dropdown:before { - content: ''; - display: inline-block; - border-left: 7px solid transparent; - border-right: 7px solid transparent; - border-bottom: 7px solid #ccc; - border-bottom-color: rgba(0, 0, 0, 0.2); - position: absolute; - top: -7px; - left: 6px; -} -.datepicker-dropdown:after { - content: ''; - display: inline-block; - border-left: 6px solid transparent; - border-right: 6px solid transparent; - border-bottom: 6px solid #ffffff; - position: absolute; - top: -6px; - left: 7px; -} -.datepicker > div { - display: none; -} -.datepicker.days div.datepicker-days { - display: block; -} -.datepicker.months div.datepicker-months { - display: block; -} -.datepicker.years div.datepicker-years { - display: block; -} -.datepicker table { - margin: 0; -} -.datepicker td, -.datepicker th { - text-align: center; - width: 20px; - height: 20px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - border: none; -} -.table-striped .datepicker table tr td, -.table-striped .datepicker table tr th { - background-color: transparent; -} -.datepicker table tr td.day:hover { - background: #eeeeee; - cursor: pointer; -} -.datepicker table tr td.old, -.datepicker table tr td.new { - color: #999999; -} -.datepicker table tr td.disabled, -.datepicker table tr td.disabled:hover { - background: none; - color: #999999; - cursor: default; -} -.datepicker table tr td.today, -.datepicker table tr td.today:hover, -.datepicker table tr td.today.disabled, -.datepicker table tr td.today.disabled:hover { - background-color: #fde19a; - background-image: -moz-linear-gradient(top, #fdd49a, #fdf59a); - background-image: -ms-linear-gradient(top, #fdd49a, #fdf59a); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fdd49a), to(#fdf59a)); - background-image: -webkit-linear-gradient(top, #fdd49a, #fdf59a); - background-image: -o-linear-gradient(top, #fdd49a, #fdf59a); - background-image: linear-gradient(top, #fdd49a, #fdf59a); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0); - border-color: #fdf59a #fdf59a #fbed50; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); - color: #000; -} -.datepicker table tr td.today:hover, -.datepicker table tr td.today:hover:hover, -.datepicker table tr td.today.disabled:hover, -.datepicker table tr td.today.disabled:hover:hover, -.datepicker table tr td.today:active, -.datepicker table tr td.today:hover:active, -.datepicker table tr td.today.disabled:active, -.datepicker table tr td.today.disabled:hover:active, -.datepicker table tr td.today.active, -.datepicker table tr td.today:hover.active, -.datepicker table tr td.today.disabled.active, -.datepicker table tr td.today.disabled:hover.active, -.datepicker table tr td.today.disabled, -.datepicker table tr td.today:hover.disabled, -.datepicker table tr td.today.disabled.disabled, -.datepicker table tr td.today.disabled:hover.disabled, -.datepicker table tr td.today[disabled], -.datepicker table tr td.today:hover[disabled], -.datepicker table tr td.today.disabled[disabled], -.datepicker table tr td.today.disabled:hover[disabled] { - background-color: #fdf59a; -} -.datepicker table tr td.today:active, -.datepicker table tr td.today:hover:active, -.datepicker table tr td.today.disabled:active, -.datepicker table tr td.today.disabled:hover:active, -.datepicker table tr td.today.active, -.datepicker table tr td.today:hover.active, -.datepicker table tr td.today.disabled.active, -.datepicker table tr td.today.disabled:hover.active { - background-color: #fbf069 \9; -} -.datepicker table tr td.today:hover:hover { - color: #000; -} -.datepicker table tr td.today.active:hover { - color: #fff; -} -.datepicker table tr td.range, -.datepicker table tr td.range:hover, -.datepicker table tr td.range.disabled, -.datepicker table tr td.range.disabled:hover { - background: #eeeeee; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.datepicker table tr td.range.today, -.datepicker table tr td.range.today:hover, -.datepicker table tr td.range.today.disabled, -.datepicker table tr td.range.today.disabled:hover { - background-color: #f3d17a; - background-image: -moz-linear-gradient(top, #f3c17a, #f3e97a); - background-image: -ms-linear-gradient(top, #f3c17a, #f3e97a); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f3c17a), to(#f3e97a)); - background-image: -webkit-linear-gradient(top, #f3c17a, #f3e97a); - background-image: -o-linear-gradient(top, #f3c17a, #f3e97a); - background-image: linear-gradient(top, #f3c17a, #f3e97a); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3c17a', endColorstr='#f3e97a', GradientType=0); - border-color: #f3e97a #f3e97a #edde34; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.datepicker table tr td.range.today:hover, -.datepicker table tr td.range.today:hover:hover, -.datepicker table tr td.range.today.disabled:hover, -.datepicker table tr td.range.today.disabled:hover:hover, -.datepicker table tr td.range.today:active, -.datepicker table tr td.range.today:hover:active, -.datepicker table tr td.range.today.disabled:active, -.datepicker table tr td.range.today.disabled:hover:active, -.datepicker table tr td.range.today.active, -.datepicker table tr td.range.today:hover.active, -.datepicker table tr td.range.today.disabled.active, -.datepicker table tr td.range.today.disabled:hover.active, -.datepicker table tr td.range.today.disabled, -.datepicker table tr td.range.today:hover.disabled, -.datepicker table tr td.range.today.disabled.disabled, -.datepicker table tr td.range.today.disabled:hover.disabled, -.datepicker table tr td.range.today[disabled], -.datepicker table tr td.range.today:hover[disabled], -.datepicker table tr td.range.today.disabled[disabled], -.datepicker table tr td.range.today.disabled:hover[disabled] { - background-color: #f3e97a; -} -.datepicker table tr td.range.today:active, -.datepicker table tr td.range.today:hover:active, -.datepicker table tr td.range.today.disabled:active, -.datepicker table tr td.range.today.disabled:hover:active, -.datepicker table tr td.range.today.active, -.datepicker table tr td.range.today:hover.active, -.datepicker table tr td.range.today.disabled.active, -.datepicker table tr td.range.today.disabled:hover.active { - background-color: #efe24b \9; -} -.datepicker table tr td.selected, -.datepicker table tr td.selected:hover, -.datepicker table tr td.selected.disabled, -.datepicker table tr td.selected.disabled:hover { - background-color: #9e9e9e; - background-image: -moz-linear-gradient(top, #b3b3b3, #808080); - background-image: -ms-linear-gradient(top, #b3b3b3, #808080); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#b3b3b3), to(#808080)); - background-image: -webkit-linear-gradient(top, #b3b3b3, #808080); - background-image: -o-linear-gradient(top, #b3b3b3, #808080); - background-image: linear-gradient(top, #b3b3b3, #808080); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#b3b3b3', endColorstr='#808080', GradientType=0); - border-color: #808080 #808080 #595959; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} -.datepicker table tr td.selected:hover, -.datepicker table tr td.selected:hover:hover, -.datepicker table tr td.selected.disabled:hover, -.datepicker table tr td.selected.disabled:hover:hover, -.datepicker table tr td.selected:active, -.datepicker table tr td.selected:hover:active, -.datepicker table tr td.selected.disabled:active, -.datepicker table tr td.selected.disabled:hover:active, -.datepicker table tr td.selected.active, -.datepicker table tr td.selected:hover.active, -.datepicker table tr td.selected.disabled.active, -.datepicker table tr td.selected.disabled:hover.active, -.datepicker table tr td.selected.disabled, -.datepicker table tr td.selected:hover.disabled, -.datepicker table tr td.selected.disabled.disabled, -.datepicker table tr td.selected.disabled:hover.disabled, -.datepicker table tr td.selected[disabled], -.datepicker table tr td.selected:hover[disabled], -.datepicker table tr td.selected.disabled[disabled], -.datepicker table tr td.selected.disabled:hover[disabled] { - background-color: #808080; -} -.datepicker table tr td.selected:active, -.datepicker table tr td.selected:hover:active, -.datepicker table tr td.selected.disabled:active, -.datepicker table tr td.selected.disabled:hover:active, -.datepicker table tr td.selected.active, -.datepicker table tr td.selected:hover.active, -.datepicker table tr td.selected.disabled.active, -.datepicker table tr td.selected.disabled:hover.active { - background-color: #666666 \9; -} -.datepicker table tr td.active, -.datepicker table tr td.active:hover, -.datepicker table tr td.active.disabled, -.datepicker table tr td.active.disabled:hover { - background-color: #006dcc; - background-image: -moz-linear-gradient(top, #0088cc, #0044cc); - background-image: -ms-linear-gradient(top, #0088cc, #0044cc); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); - background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); - background-image: -o-linear-gradient(top, #0088cc, #0044cc); - background-image: linear-gradient(top, #0088cc, #0044cc); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0); - border-color: #0044cc #0044cc #002a80; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} -.datepicker table tr td.active:hover, -.datepicker table tr td.active:hover:hover, -.datepicker table tr td.active.disabled:hover, -.datepicker table tr td.active.disabled:hover:hover, -.datepicker table tr td.active:active, -.datepicker table tr td.active:hover:active, -.datepicker table tr td.active.disabled:active, -.datepicker table tr td.active.disabled:hover:active, -.datepicker table tr td.active.active, -.datepicker table tr td.active:hover.active, -.datepicker table tr td.active.disabled.active, -.datepicker table tr td.active.disabled:hover.active, -.datepicker table tr td.active.disabled, -.datepicker table tr td.active:hover.disabled, -.datepicker table tr td.active.disabled.disabled, -.datepicker table tr td.active.disabled:hover.disabled, -.datepicker table tr td.active[disabled], -.datepicker table tr td.active:hover[disabled], -.datepicker table tr td.active.disabled[disabled], -.datepicker table tr td.active.disabled:hover[disabled] { - background-color: #0044cc; -} -.datepicker table tr td.active:active, -.datepicker table tr td.active:hover:active, -.datepicker table tr td.active.disabled:active, -.datepicker table tr td.active.disabled:hover:active, -.datepicker table tr td.active.active, -.datepicker table tr td.active:hover.active, -.datepicker table tr td.active.disabled.active, -.datepicker table tr td.active.disabled:hover.active { - background-color: #003399 \9; -} -.datepicker table tr td span { - display: block; - width: 23%; - height: 54px; - line-height: 54px; - float: left; - margin: 1%; - cursor: pointer; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.datepicker table tr td span:hover { - background: #eeeeee; -} -.datepicker table tr td span.disabled, -.datepicker table tr td span.disabled:hover { - background: none; - color: #999999; - cursor: default; -} -.datepicker table tr td span.active, -.datepicker table tr td span.active:hover, -.datepicker table tr td span.active.disabled, -.datepicker table tr td span.active.disabled:hover { - background-color: #006dcc; - background-image: -moz-linear-gradient(top, #0088cc, #0044cc); - background-image: -ms-linear-gradient(top, #0088cc, #0044cc); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); - background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); - background-image: -o-linear-gradient(top, #0088cc, #0044cc); - background-image: linear-gradient(top, #0088cc, #0044cc); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0); - border-color: #0044cc #0044cc #002a80; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} -.datepicker table tr td span.active:hover, -.datepicker table tr td span.active:hover:hover, -.datepicker table tr td span.active.disabled:hover, -.datepicker table tr td span.active.disabled:hover:hover, -.datepicker table tr td span.active:active, -.datepicker table tr td span.active:hover:active, -.datepicker table tr td span.active.disabled:active, -.datepicker table tr td span.active.disabled:hover:active, -.datepicker table tr td span.active.active, -.datepicker table tr td span.active:hover.active, -.datepicker table tr td span.active.disabled.active, -.datepicker table tr td span.active.disabled:hover.active, -.datepicker table tr td span.active.disabled, -.datepicker table tr td span.active:hover.disabled, -.datepicker table tr td span.active.disabled.disabled, -.datepicker table tr td span.active.disabled:hover.disabled, -.datepicker table tr td span.active[disabled], -.datepicker table tr td span.active:hover[disabled], -.datepicker table tr td span.active.disabled[disabled], -.datepicker table tr td span.active.disabled:hover[disabled] { - background-color: #0044cc; -} -.datepicker table tr td span.active:active, -.datepicker table tr td span.active:hover:active, -.datepicker table tr td span.active.disabled:active, -.datepicker table tr td span.active.disabled:hover:active, -.datepicker table tr td span.active.active, -.datepicker table tr td span.active:hover.active, -.datepicker table tr td span.active.disabled.active, -.datepicker table tr td span.active.disabled:hover.active { - background-color: #003399 \9; -} -.datepicker table tr td span.old, -.datepicker table tr td span.new { - color: #999999; -} -.datepicker th.datepicker-switch { - width: 145px; -} -.datepicker thead tr:first-child th, -.datepicker tfoot tr th { - cursor: pointer; -} -.datepicker thead tr:first-child th:hover, -.datepicker tfoot tr th:hover { - background: #eeeeee; -} -.datepicker .cw { - font-size: 10px; - width: 12px; - padding: 0 2px 0 5px; - vertical-align: middle; -} -.datepicker thead tr:first-child th.cw { - cursor: default; - background-color: transparent; -} -.input-append.date .add-on i, -.input-prepend.date .add-on i { - display: block; - cursor: pointer; - width: 16px; - height: 16px; -} -.input-daterange input { - text-align: center; -} -.input-daterange input:first-child { - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} -.input-daterange input:last-child { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.input-daterange .add-on { - display: inline-block; - width: auto; - min-width: 16px; - height: 18px; - padding: 4px 5px; - font-weight: normal; - line-height: 18px; - text-align: center; - text-shadow: 0 1px 0 #ffffff; - vertical-align: middle; - background-color: #eeeeee; - border: 1px solid #ccc; - margin-left: -5px; - margin-right: -5px; -} diff --git a/flask_admin/static/vendor/x-editable/js/bootstrap3-editable.min.js b/flask_admin/static/vendor/x-editable/js/bootstrap3-editable.min.js deleted file mode 100755 index e2703aee8..000000000 --- a/flask_admin/static/vendor/x-editable/js/bootstrap3-editable.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! X-editable - v1.5.1 -* In-place editing with Twitter Bootstrap, jQuery UI or pure jQuery -* http://github.com/vitalets/x-editable -* Copyright (c) 2013 Vitaliy Potapov; Licensed MIT */ -!function(a){"use strict";var b=function(b,c){this.options=a.extend({},a.fn.editableform.defaults,c),this.$div=a(b),this.options.scope||(this.options.scope=this)};b.prototype={constructor:b,initInput:function(){this.input=this.options.input,this.value=this.input.str2value(this.options.value),this.input.prerender()},initTemplate:function(){this.$form=a(a.fn.editableform.template)},initButtons:function(){var b=this.$form.find(".editable-buttons");b.append(a.fn.editableform.buttons),"bottom"===this.options.showbuttons&&b.addClass("editable-buttons-bottom")},render:function(){this.$loading=a(a.fn.editableform.loading),this.$div.empty().append(this.$loading),this.initTemplate(),this.options.showbuttons?this.initButtons():this.$form.find(".editable-buttons").remove(),this.showLoading(),this.isSaving=!1,this.$div.triggerHandler("rendering"),this.initInput(),this.$form.find("div.editable-input").append(this.input.$tpl),this.$div.append(this.$form),a.when(this.input.render()).then(a.proxy(function(){if(this.options.showbuttons||this.input.autosubmit(),this.$form.find(".editable-cancel").click(a.proxy(this.cancel,this)),this.input.error)this.error(this.input.error),this.$form.find(".editable-submit").attr("disabled",!0),this.input.$input.attr("disabled",!0),this.$form.submit(function(a){a.preventDefault()});else{this.error(!1),this.input.$input.removeAttr("disabled"),this.$form.find(".editable-submit").removeAttr("disabled");var b=null===this.value||void 0===this.value||""===this.value?this.options.defaultValue:this.value;this.input.value2input(b),this.$form.submit(a.proxy(this.submit,this))}this.$div.triggerHandler("rendered"),this.showForm(),this.input.postrender&&this.input.postrender()},this))},cancel:function(){this.$div.triggerHandler("cancel")},showLoading:function(){var a,b;this.$form?(a=this.$form.outerWidth(),b=this.$form.outerHeight(),a&&this.$loading.width(a),b&&this.$loading.height(b),this.$form.hide()):(a=this.$loading.parent().width(),a&&this.$loading.width(a)),this.$loading.show()},showForm:function(a){this.$loading.hide(),this.$form.show(),a!==!1&&this.input.activate(),this.$div.triggerHandler("show")},error:function(b){var c,d=this.$form.find(".control-group"),e=this.$form.find(".editable-error-block");if(b===!1)d.removeClass(a.fn.editableform.errorGroupClass),e.removeClass(a.fn.editableform.errorBlockClass).empty().hide();else{if(b){c=(""+b).split("\n");for(var f=0;f<c.length;f++)c[f]=a("<div>").text(c[f]).html();b=c.join("<br>")}d.addClass(a.fn.editableform.errorGroupClass),e.addClass(a.fn.editableform.errorBlockClass).html(b).show()}},submit:function(b){b.stopPropagation(),b.preventDefault();var c=this.input.input2value(),d=this.validate(c);if("object"===a.type(d)&&void 0!==d.newValue){if(c=d.newValue,this.input.value2input(c),"string"==typeof d.msg)return this.error(d.msg),this.showForm(),void 0}else if(d)return this.error(d),this.showForm(),void 0;if(!this.options.savenochange&&this.input.value2str(c)==this.input.value2str(this.value))return this.$div.triggerHandler("nochange"),void 0;var e=this.input.value2submit(c);this.isSaving=!0,a.when(this.save(e)).done(a.proxy(function(a){this.isSaving=!1;var b="function"==typeof this.options.success?this.options.success.call(this.options.scope,a,c):null;return b===!1?(this.error(!1),this.showForm(!1),void 0):"string"==typeof b?(this.error(b),this.showForm(),void 0):(b&&"object"==typeof b&&b.hasOwnProperty("newValue")&&(c=b.newValue),this.error(!1),this.value=c,this.$div.triggerHandler("save",{newValue:c,submitValue:e,response:a}),void 0)},this)).fail(a.proxy(function(a){this.isSaving=!1;var b;b="function"==typeof this.options.error?this.options.error.call(this.options.scope,a,c):"string"==typeof a?a:a.responseText||a.statusText||"Unknown error!",this.error(b),this.showForm()},this))},save:function(b){this.options.pk=a.fn.editableutils.tryParseJson(this.options.pk,!0);var c,d="function"==typeof this.options.pk?this.options.pk.call(this.options.scope):this.options.pk,e=!!("function"==typeof this.options.url||this.options.url&&("always"===this.options.send||"auto"===this.options.send&&null!==d&&void 0!==d));return e?(this.showLoading(),c={name:this.options.name||"",value:b,pk:d},"function"==typeof this.options.params?c=this.options.params.call(this.options.scope,c):(this.options.params=a.fn.editableutils.tryParseJson(this.options.params,!0),a.extend(c,this.options.params)),"function"==typeof this.options.url?this.options.url.call(this.options.scope,c):a.ajax(a.extend({url:this.options.url,data:c,type:"POST"},this.options.ajaxOptions))):void 0},validate:function(a){return void 0===a&&(a=this.value),"function"==typeof this.options.validate?this.options.validate.call(this.options.scope,a):void 0},option:function(a,b){a in this.options&&(this.options[a]=b),"value"===a&&this.setValue(b)},setValue:function(a,b){this.value=b?this.input.str2value(a):a,this.$form&&this.$form.is(":visible")&&this.input.value2input(this.value)}},a.fn.editableform=function(c){var d=arguments;return this.each(function(){var e=a(this),f=e.data("editableform"),g="object"==typeof c&&c;f||e.data("editableform",f=new b(this,g)),"string"==typeof c&&f[c].apply(f,Array.prototype.slice.call(d,1))})},a.fn.editableform.Constructor=b,a.fn.editableform.defaults={type:"text",url:null,params:null,name:null,pk:null,value:null,defaultValue:null,send:"auto",validate:null,success:null,error:null,ajaxOptions:null,showbuttons:!0,scope:null,savenochange:!1},a.fn.editableform.template='<form class="form-inline editableform"><div class="control-group"><div><div class="editable-input"></div><div class="editable-buttons"></div></div><div class="editable-error-block"></div></div></form>',a.fn.editableform.loading='<div class="editableform-loading"></div>',a.fn.editableform.buttons='<button type="submit" class="editable-submit">ok</button><button type="button" class="editable-cancel">cancel</button>',a.fn.editableform.errorGroupClass=null,a.fn.editableform.errorBlockClass="editable-error",a.fn.editableform.engine="jquery"}(window.jQuery),function(a){"use strict";a.fn.editableutils={inherit:function(a,b){var c=function(){};c.prototype=b.prototype,a.prototype=new c,a.prototype.constructor=a,a.superclass=b.prototype},setCursorPosition:function(a,b){if(a.setSelectionRange)a.setSelectionRange(b,b);else if(a.createTextRange){var c=a.createTextRange();c.collapse(!0),c.moveEnd("character",b),c.moveStart("character",b),c.select()}},tryParseJson:function(a,b){if("string"==typeof a&&a.length&&a.match(/^[\{\[].*[\}\]]$/))if(b)try{a=new Function("return "+a)()}catch(c){}finally{return a}else a=new Function("return "+a)();return a},sliceObj:function(b,c,d){var e,f,g={};if(!a.isArray(c)||!c.length)return g;for(var h=0;h<c.length;h++)e=c[h],b.hasOwnProperty(e)&&(g[e]=b[e]),d!==!0&&(f=e.toLowerCase(),b.hasOwnProperty(f)&&(g[e]=b[f]));return g},getConfigData:function(b){var c={};return a.each(b.data(),function(a,b){("object"!=typeof b||b&&"object"==typeof b&&(b.constructor===Object||b.constructor===Array))&&(c[a]=b)}),c},objectKeys:function(a){if(Object.keys)return Object.keys(a);if(a!==Object(a))throw new TypeError("Object.keys called on a non-object");var b,c=[];for(b in a)Object.prototype.hasOwnProperty.call(a,b)&&c.push(b);return c},escape:function(b){return a("<div>").text(b).html()},itemsByValue:function(b,c,d){if(!c||null===b)return[];if("function"!=typeof d){var e=d||"value";d=function(a){return a[e]}}var f=a.isArray(b),g=[],h=this;return a.each(c,function(c,e){if(e.children)g=g.concat(h.itemsByValue(b,e.children,d));else if(f)a.grep(b,function(a){return a==(e&&"object"==typeof e?d(e):e)}).length&&g.push(e);else{var i=e&&"object"==typeof e?d(e):e;b==i&&g.push(e)}}),g},createInput:function(b){var c,d,e,f=b.type;return"date"===f&&("inline"===b.mode?a.fn.editabletypes.datefield?f="datefield":a.fn.editabletypes.dateuifield&&(f="dateuifield"):a.fn.editabletypes.date?f="date":a.fn.editabletypes.dateui&&(f="dateui"),"date"!==f||a.fn.editabletypes.date||(f="combodate")),"datetime"===f&&"inline"===b.mode&&(f="datetimefield"),"wysihtml5"!==f||a.fn.editabletypes[f]||(f="textarea"),"function"==typeof a.fn.editabletypes[f]?(c=a.fn.editabletypes[f],d=this.sliceObj(b,this.objectKeys(c.defaults)),e=new c(d)):(a.error("Unknown type: "+f),!1)},supportsTransitions:function(){var a=document.body||document.documentElement,b=a.style,c="transition",d=["Moz","Webkit","Khtml","O","ms"];if("string"==typeof b[c])return!0;c=c.charAt(0).toUpperCase()+c.substr(1);for(var e=0;e<d.length;e++)if("string"==typeof b[d[e]+c])return!0;return!1}}}(window.jQuery),function(a){"use strict";var b=function(a,b){this.init(a,b)},c=function(a,b){this.init(a,b)};b.prototype={containerName:null,containerDataName:null,innerCss:null,containerClass:"editable-container editable-popup",defaults:{},init:function(c,d){this.$element=a(c),this.options=a.extend({},a.fn.editableContainer.defaults,d),this.splitOptions(),this.formOptions.scope=this.$element[0],this.initContainer(),this.delayedHide=!1,this.$element.on("destroyed",a.proxy(function(){this.destroy()},this)),a(document).data("editable-handlers-attached")||(a(document).on("keyup.editable",function(b){27===b.which&&a(".editable-open").editableContainer("hide")}),a(document).on("click.editable",function(c){var d,e=a(c.target),f=[".editable-container",".ui-datepicker-header",".datepicker",".modal-backdrop",".bootstrap-wysihtml5-insert-image-modal",".bootstrap-wysihtml5-insert-link-modal"];if(a.contains(document.documentElement,c.target)&&!e.is(document)){for(d=0;d<f.length;d++)if(e.is(f[d])||e.parents(f[d]).length)return;b.prototype.closeOthers(c.target)}}),a(document).data("editable-handlers-attached",!0))},splitOptions:function(){if(this.containerOptions={},this.formOptions={},!a.fn[this.containerName])throw new Error(this.containerName+" not found. Have you included corresponding js file?");for(var b in this.options)b in this.defaults?this.containerOptions[b]=this.options[b]:this.formOptions[b]=this.options[b]},tip:function(){return this.container()?this.container().$tip:null},container:function(){var a;return this.containerDataName&&(a=this.$element.data(this.containerDataName))?a:a=this.$element.data(this.containerName)},call:function(){this.$element[this.containerName].apply(this.$element,arguments)},initContainer:function(){this.call(this.containerOptions)},renderForm:function(){this.$form.editableform(this.formOptions).on({save:a.proxy(this.save,this),nochange:a.proxy(function(){this.hide("nochange")},this),cancel:a.proxy(function(){this.hide("cancel")},this),show:a.proxy(function(){this.delayedHide?(this.hide(this.delayedHide.reason),this.delayedHide=!1):this.setPosition()},this),rendering:a.proxy(this.setPosition,this),resize:a.proxy(this.setPosition,this),rendered:a.proxy(function(){this.$element.triggerHandler("shown",a(this.options.scope).data("editable"))},this)}).editableform("render")},show:function(b){this.$element.addClass("editable-open"),b!==!1&&this.closeOthers(this.$element[0]),this.innerShow(),this.tip().addClass(this.containerClass),this.$form,this.$form=a("<div>"),this.tip().is(this.innerCss)?this.tip().append(this.$form):this.tip().find(this.innerCss).append(this.$form),this.renderForm()},hide:function(a){if(this.tip()&&this.tip().is(":visible")&&this.$element.hasClass("editable-open")){if(this.$form.data("editableform").isSaving)return this.delayedHide={reason:a},void 0;this.delayedHide=!1,this.$element.removeClass("editable-open"),this.innerHide(),this.$element.triggerHandler("hidden",a||"manual")}},innerShow:function(){},innerHide:function(){},toggle:function(a){this.container()&&this.tip()&&this.tip().is(":visible")?this.hide():this.show(a)},setPosition:function(){},save:function(a,b){this.$element.triggerHandler("save",b),this.hide("save")},option:function(a,b){this.options[a]=b,a in this.containerOptions?(this.containerOptions[a]=b,this.setContainerOption(a,b)):(this.formOptions[a]=b,this.$form&&this.$form.editableform("option",a,b))},setContainerOption:function(a,b){this.call("option",a,b)},destroy:function(){this.hide(),this.innerDestroy(),this.$element.off("destroyed"),this.$element.removeData("editableContainer")},innerDestroy:function(){},closeOthers:function(b){a(".editable-open").each(function(c,d){if(d!==b&&!a(d).find(b).length){var e=a(d),f=e.data("editableContainer");f&&("cancel"===f.options.onblur?e.data("editableContainer").hide("onblur"):"submit"===f.options.onblur&&e.data("editableContainer").tip().find("form").submit())}})},activate:function(){this.tip&&this.tip().is(":visible")&&this.$form&&this.$form.data("editableform").input.activate()}},a.fn.editableContainer=function(d){var e=arguments;return this.each(function(){var f=a(this),g="editableContainer",h=f.data(g),i="object"==typeof d&&d,j="inline"===i.mode?c:b;h||f.data(g,h=new j(this,i)),"string"==typeof d&&h[d].apply(h,Array.prototype.slice.call(e,1))})},a.fn.editableContainer.Popup=b,a.fn.editableContainer.Inline=c,a.fn.editableContainer.defaults={value:null,placement:"top",autohide:!0,onblur:"cancel",anim:!1,mode:"popup"},jQuery.event.special.destroyed={remove:function(a){a.handler&&a.handler()}}}(window.jQuery),function(a){"use strict";a.extend(a.fn.editableContainer.Inline.prototype,a.fn.editableContainer.Popup.prototype,{containerName:"editableform",innerCss:".editable-inline",containerClass:"editable-container editable-inline",initContainer:function(){this.$tip=a("<span></span>"),this.options.anim||(this.options.anim=0)},splitOptions:function(){this.containerOptions={},this.formOptions=this.options},tip:function(){return this.$tip},innerShow:function(){this.$element.hide(),this.tip().insertAfter(this.$element).show()},innerHide:function(){this.$tip.hide(this.options.anim,a.proxy(function(){this.$element.show(),this.innerDestroy()},this))},innerDestroy:function(){this.tip()&&this.tip().empty().remove()}})}(window.jQuery),function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.editable.defaults,c,a.fn.editableutils.getConfigData(this.$element)),this.options.selector?this.initLive():this.init(),this.options.highlight&&!a.fn.editableutils.supportsTransitions()&&(this.options.highlight=!1)};b.prototype={constructor:b,init:function(){var b,c=!1;if(this.options.name=this.options.name||this.$element.attr("id"),this.options.scope=this.$element[0],this.input=a.fn.editableutils.createInput(this.options),this.input){switch(void 0===this.options.value||null===this.options.value?(this.value=this.input.html2value(a.trim(this.$element.html())),c=!0):(this.options.value=a.fn.editableutils.tryParseJson(this.options.value,!0),this.value="string"==typeof this.options.value?this.input.str2value(this.options.value):this.options.value),this.$element.addClass("editable"),"textarea"===this.input.type&&this.$element.addClass("editable-pre-wrapped"),"manual"!==this.options.toggle?(this.$element.addClass("editable-click"),this.$element.on(this.options.toggle+".editable",a.proxy(function(a){if(this.options.disabled||a.preventDefault(),"mouseenter"===this.options.toggle)this.show();else{var b="click"!==this.options.toggle;this.toggle(b)}},this))):this.$element.attr("tabindex",-1),"function"==typeof this.options.display&&(this.options.autotext="always"),this.options.autotext){case"always":b=!0;break;case"auto":b=!a.trim(this.$element.text()).length&&null!==this.value&&void 0!==this.value&&!c;break;default:b=!1}a.when(b?this.render():!0).then(a.proxy(function(){this.options.disabled?this.disable():this.enable(),this.$element.triggerHandler("init",this)},this))}},initLive:function(){var b=this.options.selector;this.options.selector=!1,this.options.autotext="never",this.$element.on(this.options.toggle+".editable",b,a.proxy(function(b){var c=a(b.target);c.data("editable")||(c.hasClass(this.options.emptyclass)&&c.empty(),c.editable(this.options).trigger(b))},this))},render:function(a){return this.options.display!==!1?this.input.value2htmlFinal?this.input.value2html(this.value,this.$element[0],this.options.display,a):"function"==typeof this.options.display?this.options.display.call(this.$element[0],this.value,a):this.input.value2html(this.value,this.$element[0]):void 0},enable:function(){this.options.disabled=!1,this.$element.removeClass("editable-disabled"),this.handleEmpty(this.isEmpty),"manual"!==this.options.toggle&&"-1"===this.$element.attr("tabindex")&&this.$element.removeAttr("tabindex")},disable:function(){this.options.disabled=!0,this.hide(),this.$element.addClass("editable-disabled"),this.handleEmpty(this.isEmpty),this.$element.attr("tabindex",-1)},toggleDisabled:function(){this.options.disabled?this.enable():this.disable()},option:function(b,c){return b&&"object"==typeof b?(a.each(b,a.proxy(function(b,c){this.option(a.trim(b),c)},this)),void 0):(this.options[b]=c,"disabled"===b?c?this.disable():this.enable():("value"===b&&this.setValue(c),this.container&&this.container.option(b,c),this.input.option&&this.input.option(b,c),void 0))},handleEmpty:function(b){this.options.display!==!1&&(this.isEmpty=void 0!==b?b:"function"==typeof this.input.isEmpty?this.input.isEmpty(this.$element):""===a.trim(this.$element.html()),this.options.disabled?this.isEmpty&&(this.$element.empty(),this.options.emptyclass&&this.$element.removeClass(this.options.emptyclass)):this.isEmpty?(this.$element.html(this.options.emptytext),this.options.emptyclass&&this.$element.addClass(this.options.emptyclass)):this.options.emptyclass&&this.$element.removeClass(this.options.emptyclass))},show:function(b){if(!this.options.disabled){if(this.container){if(this.container.tip().is(":visible"))return}else{var c=a.extend({},this.options,{value:this.value,input:this.input});this.$element.editableContainer(c),this.$element.on("save.internal",a.proxy(this.save,this)),this.container=this.$element.data("editableContainer")}this.container.show(b)}},hide:function(){this.container&&this.container.hide()},toggle:function(a){this.container&&this.container.tip().is(":visible")?this.hide():this.show(a)},save:function(a,b){if(this.options.unsavedclass){var c=!1;c=c||"function"==typeof this.options.url,c=c||this.options.display===!1,c=c||void 0!==b.response,c=c||this.options.savenochange&&this.input.value2str(this.value)!==this.input.value2str(b.newValue),c?this.$element.removeClass(this.options.unsavedclass):this.$element.addClass(this.options.unsavedclass)}if(this.options.highlight){var d=this.$element,e=d.css("background-color");d.css("background-color",this.options.highlight),setTimeout(function(){"transparent"===e&&(e=""),d.css("background-color",e),d.addClass("editable-bg-transition"),setTimeout(function(){d.removeClass("editable-bg-transition")},1700)},10)}this.setValue(b.newValue,!1,b.response)},validate:function(){return"function"==typeof this.options.validate?this.options.validate.call(this,this.value):void 0},setValue:function(b,c,d){this.value=c?this.input.str2value(b):b,this.container&&this.container.option("value",this.value),a.when(this.render(d)).then(a.proxy(function(){this.handleEmpty()},this))},activate:function(){this.container&&this.container.activate()},destroy:function(){this.disable(),this.container&&this.container.destroy(),this.input.destroy(),"manual"!==this.options.toggle&&(this.$element.removeClass("editable-click"),this.$element.off(this.options.toggle+".editable")),this.$element.off("save.internal"),this.$element.removeClass("editable editable-open editable-disabled"),this.$element.removeData("editable")}},a.fn.editable=function(c){var d={},e=arguments,f="editable";switch(c){case"validate":return this.each(function(){var b,c=a(this),e=c.data(f);e&&(b=e.validate())&&(d[e.options.name]=b)}),d;case"getValue":return 2===arguments.length&&arguments[1]===!0?d=this.eq(0).data(f).value:this.each(function(){var b=a(this),c=b.data(f);c&&void 0!==c.value&&null!==c.value&&(d[c.options.name]=c.input.value2submit(c.value))}),d;case"submit":var g=arguments[1]||{},h=this,i=this.editable("validate");if(a.isEmptyObject(i)){var j={};if(1===h.length){var k=h.data("editable"),l={name:k.options.name||"",value:k.input.value2submit(k.value),pk:"function"==typeof k.options.pk?k.options.pk.call(k.options.scope):k.options.pk};"function"==typeof k.options.params?l=k.options.params.call(k.options.scope,l):(k.options.params=a.fn.editableutils.tryParseJson(k.options.params,!0),a.extend(l,k.options.params)),j={url:k.options.url,data:l,type:"POST"},g.success=g.success||k.options.success,g.error=g.error||k.options.error}else{var m=this.editable("getValue");j={url:g.url,data:m,type:"POST"}}j.success="function"==typeof g.success?function(a){g.success.call(h,a,g)}:a.noop,j.error="function"==typeof g.error?function(){g.error.apply(h,arguments)}:a.noop,g.ajaxOptions&&a.extend(j,g.ajaxOptions),g.data&&a.extend(j.data,g.data),a.ajax(j)}else"function"==typeof g.error&&g.error.call(h,i);return this}return this.each(function(){var d=a(this),g=d.data(f),h="object"==typeof c&&c;return h&&h.selector?(g=new b(this,h),void 0):(g||d.data(f,g=new b(this,h)),"string"==typeof c&&g[c].apply(g,Array.prototype.slice.call(e,1)),void 0)})},a.fn.editable.defaults={type:"text",disabled:!1,toggle:"click",emptytext:"Empty",autotext:"auto",value:null,display:null,emptyclass:"editable-empty",unsavedclass:"editable-unsaved",selector:null,highlight:"#FFFF80"}}(window.jQuery),function(a){"use strict";a.fn.editabletypes={};var b=function(){};b.prototype={init:function(b,c,d){this.type=b,this.options=a.extend({},d,c)},prerender:function(){this.$tpl=a(this.options.tpl),this.$input=this.$tpl,this.$clear=null,this.error=null},render:function(){},value2html:function(b,c){a(c)[this.options.escape?"text":"html"](a.trim(b))},html2value:function(b){return a("<div>").html(b).text()},value2str:function(a){return a},str2value:function(a){return a},value2submit:function(a){return a},value2input:function(a){this.$input.val(a)},input2value:function(){return this.$input.val()},activate:function(){this.$input.is(":visible")&&this.$input.focus()},clear:function(){this.$input.val(null)},escape:function(b){return a("<div>").text(b).html()},autosubmit:function(){},destroy:function(){},setClass:function(){this.options.inputclass&&this.$input.addClass(this.options.inputclass)},setAttr:function(a){void 0!==this.options[a]&&null!==this.options[a]&&this.$input.attr(a,this.options[a])},option:function(a,b){this.options[a]=b}},b.defaults={tpl:"",inputclass:null,escape:!0,scope:null,showbuttons:!0},a.extend(a.fn.editabletypes,{abstractinput:b})}(window.jQuery),function(a){"use strict";var b=function(){};a.fn.editableutils.inherit(b,a.fn.editabletypes.abstractinput),a.extend(b.prototype,{render:function(){var b=a.Deferred();return this.error=null,this.onSourceReady(function(){this.renderList(),b.resolve()},function(){this.error=this.options.sourceError,b.resolve()}),b.promise()},html2value:function(){return null},value2html:function(b,c,d,e){var f=a.Deferred(),g=function(){"function"==typeof d?d.call(c,b,this.sourceData,e):this.value2htmlFinal(b,c),f.resolve()};return null===b?g.call(this):this.onSourceReady(g,function(){f.resolve()}),f.promise()},onSourceReady:function(b,c){var d;if(a.isFunction(this.options.source)?(d=this.options.source.call(this.options.scope),this.sourceData=null):d=this.options.source,this.options.sourceCache&&a.isArray(this.sourceData))return b.call(this),void 0;try{d=a.fn.editableutils.tryParseJson(d,!1)}catch(e){return c.call(this),void 0}if("string"==typeof d){if(this.options.sourceCache){var f,g=d;if(a(document).data(g)||a(document).data(g,{}),f=a(document).data(g),f.loading===!1&&f.sourceData)return this.sourceData=f.sourceData,this.doPrepend(),b.call(this),void 0;if(f.loading===!0)return f.callbacks.push(a.proxy(function(){this.sourceData=f.sourceData,this.doPrepend(),b.call(this)},this)),f.err_callbacks.push(a.proxy(c,this)),void 0;f.loading=!0,f.callbacks=[],f.err_callbacks=[]}var h=a.extend({url:d,type:"get",cache:!1,dataType:"json",success:a.proxy(function(d){f&&(f.loading=!1),this.sourceData=this.makeArray(d),a.isArray(this.sourceData)?(f&&(f.sourceData=this.sourceData,a.each(f.callbacks,function(){this.call()})),this.doPrepend(),b.call(this)):(c.call(this),f&&a.each(f.err_callbacks,function(){this.call()}))},this),error:a.proxy(function(){c.call(this),f&&(f.loading=!1,a.each(f.err_callbacks,function(){this.call()}))},this)},this.options.sourceOptions);a.ajax(h)}else this.sourceData=this.makeArray(d),a.isArray(this.sourceData)?(this.doPrepend(),b.call(this)):c.call(this)},doPrepend:function(){null!==this.options.prepend&&void 0!==this.options.prepend&&(a.isArray(this.prependData)||(a.isFunction(this.options.prepend)&&(this.options.prepend=this.options.prepend.call(this.options.scope)),this.options.prepend=a.fn.editableutils.tryParseJson(this.options.prepend,!0),"string"==typeof this.options.prepend&&(this.options.prepend={"":this.options.prepend}),this.prependData=this.makeArray(this.options.prepend)),a.isArray(this.prependData)&&a.isArray(this.sourceData)&&(this.sourceData=this.prependData.concat(this.sourceData)))},renderList:function(){},value2htmlFinal:function(){},makeArray:function(b){var c,d,e,f,g=[];if(!b||"string"==typeof b)return null;if(a.isArray(b)){f=function(a,b){return d={value:a,text:b},c++>=2?!1:void 0};for(var h=0;h<b.length;h++)e=b[h],"object"==typeof e?(c=0,a.each(e,f),1===c?g.push(d):c>1&&(e.children&&(e.children=this.makeArray(e.children)),g.push(e))):g.push({value:e,text:e})}else a.each(b,function(a,b){g.push({value:a,text:b})});return g},option:function(a,b){this.options[a]=b,"source"===a&&(this.sourceData=null),"prepend"===a&&(this.prependData=null)}}),b.defaults=a.extend({},a.fn.editabletypes.abstractinput.defaults,{source:null,prepend:!1,sourceError:"Error when loading list",sourceCache:!0,sourceOptions:null}),a.fn.editabletypes.list=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("text",a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.abstractinput),a.extend(b.prototype,{render:function(){this.renderClear(),this.setClass(),this.setAttr("placeholder")},activate:function(){this.$input.is(":visible")&&(this.$input.focus(),a.fn.editableutils.setCursorPosition(this.$input.get(0),this.$input.val().length),this.toggleClear&&this.toggleClear())},renderClear:function(){this.options.clear&&(this.$clear=a('<span class="editable-clear-x"></span>'),this.$input.after(this.$clear).css("padding-right",24).keyup(a.proxy(function(b){if(!~a.inArray(b.keyCode,[40,38,9,13,27])){clearTimeout(this.t);var c=this;this.t=setTimeout(function(){c.toggleClear(b)},100)}},this)).parent().css("position","relative"),this.$clear.click(a.proxy(this.clear,this)))},postrender:function(){},toggleClear:function(){if(this.$clear){var a=this.$input.val().length,b=this.$clear.is(":visible");a&&!b&&this.$clear.show(),!a&&b&&this.$clear.hide()}},clear:function(){this.$clear.hide(),this.$input.val("").focus()}}),b.defaults=a.extend({},a.fn.editabletypes.abstractinput.defaults,{tpl:'<input type="text">',placeholder:null,clear:!0}),a.fn.editabletypes.text=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("textarea",a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.abstractinput),a.extend(b.prototype,{render:function(){this.setClass(),this.setAttr("placeholder"),this.setAttr("rows"),this.$input.keydown(function(b){b.ctrlKey&&13===b.which&&a(this).closest("form").submit()})},activate:function(){a.fn.editabletypes.text.prototype.activate.call(this)}}),b.defaults=a.extend({},a.fn.editabletypes.abstractinput.defaults,{tpl:"<textarea></textarea>",inputclass:"input-large",placeholder:null,rows:7}),a.fn.editabletypes.textarea=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("select",a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.list),a.extend(b.prototype,{renderList:function(){this.$input.empty();var b=function(c,d){var e;if(a.isArray(d))for(var f=0;f<d.length;f++)e={},d[f].children?(e.label=d[f].text,c.append(b(a("<optgroup>",e),d[f].children))):(e.value=d[f].value,d[f].disabled&&(e.disabled=!0),c.append(a("<option>",e).text(d[f].text)));return c};b(this.$input,this.sourceData),this.setClass(),this.$input.on("keydown.editable",function(b){13===b.which&&a(this).closest("form").submit()})},value2htmlFinal:function(b,c){var d="",e=a.fn.editableutils.itemsByValue(b,this.sourceData);e.length&&(d=e[0].text),a.fn.editabletypes.abstractinput.prototype.value2html.call(this,d,c)},autosubmit:function(){this.$input.off("keydown.editable").on("change.editable",function(){a(this).closest("form").submit()})}}),b.defaults=a.extend({},a.fn.editabletypes.list.defaults,{tpl:"<select></select>"}),a.fn.editabletypes.select=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("checklist",a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.list),a.extend(b.prototype,{renderList:function(){var b;if(this.$tpl.empty(),a.isArray(this.sourceData)){for(var c=0;c<this.sourceData.length;c++)b=a("<label>").append(a("<input>",{type:"checkbox",value:this.sourceData[c].value})).append(a("<span>").text(" "+this.sourceData[c].text)),a("<div>").append(b).appendTo(this.$tpl);this.$input=this.$tpl.find('input[type="checkbox"]'),this.setClass()}},value2str:function(b){return a.isArray(b)?b.sort().join(a.trim(this.options.separator)):""},str2value:function(b){var c,d=null;return"string"==typeof b&&b.length?(c=new RegExp("\\s*"+a.trim(this.options.separator)+"\\s*"),d=b.split(c)):d=a.isArray(b)?b:[b],d},value2input:function(b){this.$input.prop("checked",!1),a.isArray(b)&&b.length&&this.$input.each(function(c,d){var e=a(d);a.each(b,function(a,b){e.val()==b&&e.prop("checked",!0)})})},input2value:function(){var b=[];return this.$input.filter(":checked").each(function(c,d){b.push(a(d).val())}),b},value2htmlFinal:function(b,c){var d=[],e=a.fn.editableutils.itemsByValue(b,this.sourceData),f=this.options.escape;e.length?(a.each(e,function(b,c){var e=f?a.fn.editableutils.escape(c.text):c.text;d.push(e)}),a(c).html(d.join("<br>"))):a(c).empty()},activate:function(){this.$input.first().focus()},autosubmit:function(){this.$input.on("keydown",function(b){13===b.which&&a(this).closest("form").submit()})}}),b.defaults=a.extend({},a.fn.editabletypes.list.defaults,{tpl:'<div class="editable-checklist"></div>',inputclass:null,separator:","}),a.fn.editabletypes.checklist=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("password",a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.text),a.extend(b.prototype,{value2html:function(b,c){b?a(c).text("[hidden]"):a(c).empty()},html2value:function(){return null}}),b.defaults=a.extend({},a.fn.editabletypes.text.defaults,{tpl:'<input type="password">'}),a.fn.editabletypes.password=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("email",a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.text),b.defaults=a.extend({},a.fn.editabletypes.text.defaults,{tpl:'<input type="email">'}),a.fn.editabletypes.email=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("url",a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.text),b.defaults=a.extend({},a.fn.editabletypes.text.defaults,{tpl:'<input type="url">'}),a.fn.editabletypes.url=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("tel",a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.text),b.defaults=a.extend({},a.fn.editabletypes.text.defaults,{tpl:'<input type="tel">'}),a.fn.editabletypes.tel=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("number",a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.text),a.extend(b.prototype,{render:function(){b.superclass.render.call(this),this.setAttr("min"),this.setAttr("max"),this.setAttr("step")},postrender:function(){this.$clear&&this.$clear.css({right:24})}}),b.defaults=a.extend({},a.fn.editabletypes.text.defaults,{tpl:'<input type="number">',inputclass:"input-mini",min:null,max:null,step:null}),a.fn.editabletypes.number=b}(window.jQuery),function(a){"use strict"; -var b=function(a){this.init("range",a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.number),a.extend(b.prototype,{render:function(){this.$input=this.$tpl.filter("input"),this.setClass(),this.setAttr("min"),this.setAttr("max"),this.setAttr("step"),this.$input.on("input",function(){a(this).siblings("output").text(a(this).val())})},activate:function(){this.$input.focus()}}),b.defaults=a.extend({},a.fn.editabletypes.number.defaults,{tpl:'<input type="range"><output style="width: 30px; display: inline-block"></output>',inputclass:"input-medium"}),a.fn.editabletypes.range=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("time",a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.abstractinput),a.extend(b.prototype,{render:function(){this.setClass()}}),b.defaults=a.extend({},a.fn.editabletypes.abstractinput.defaults,{tpl:'<input type="time">'}),a.fn.editabletypes.time=b}(window.jQuery),function(a){"use strict";var b=function(c){if(this.init("select2",c,b.defaults),c.select2=c.select2||{},this.sourceData=null,c.placeholder&&(c.select2.placeholder=c.placeholder),!c.select2.tags&&c.source){var d=c.source;a.isFunction(c.source)&&(d=c.source.call(c.scope)),"string"==typeof d?(c.select2.ajax=c.select2.ajax||{},c.select2.ajax.data||(c.select2.ajax.data=function(a){return{query:a}}),c.select2.ajax.results||(c.select2.ajax.results=function(a){return{results:a}}),c.select2.ajax.url=d):(this.sourceData=this.convertSource(d),c.select2.data=this.sourceData)}if(this.options.select2=a.extend({},b.defaults.select2,c.select2),this.isMultiple=this.options.select2.tags||this.options.select2.multiple,this.isRemote="ajax"in this.options.select2,this.idFunc=this.options.select2.id,"function"!=typeof this.idFunc){var e=this.idFunc||"id";this.idFunc=function(a){return a[e]}}this.formatSelection=this.options.select2.formatSelection,"function"!=typeof this.formatSelection&&(this.formatSelection=function(a){return a.text})};a.fn.editableutils.inherit(b,a.fn.editabletypes.abstractinput),a.extend(b.prototype,{render:function(){this.setClass(),this.isRemote&&this.$input.on("select2-loaded",a.proxy(function(a){this.sourceData=a.items.results},this)),this.isMultiple&&this.$input.on("change",function(){a(this).closest("form").parent().triggerHandler("resize")})},value2html:function(c,d){var e,f="",g=this;this.options.select2.tags?e=c:this.sourceData&&(e=a.fn.editableutils.itemsByValue(c,this.sourceData,this.idFunc)),a.isArray(e)?(f=[],a.each(e,function(a,b){f.push(b&&"object"==typeof b?g.formatSelection(b):b)})):e&&(f=g.formatSelection(e)),f=a.isArray(f)?f.join(this.options.viewseparator):f,b.superclass.value2html.call(this,f,d)},html2value:function(a){return this.options.select2.tags?this.str2value(a,this.options.viewseparator):null},value2input:function(b){if(a.isArray(b)&&(b=b.join(this.getSeparator())),this.$input.data("select2")?this.$input.val(b).trigger("change",!0):(this.$input.val(b),this.$input.select2(this.options.select2)),this.isRemote&&!this.isMultiple&&!this.options.select2.initSelection){var c=this.options.select2.id,d=this.options.select2.formatSelection;if(!c&&!d){var e=a(this.options.scope);if(!e.data("editable").isEmpty){var f={id:b,text:e.text()};this.$input.select2("data",f)}}}},input2value:function(){return this.$input.select2("val")},str2value:function(b,c){if("string"!=typeof b||!this.isMultiple)return b;c=c||this.getSeparator();var d,e,f;if(null===b||b.length<1)return null;for(d=b.split(c),e=0,f=d.length;f>e;e+=1)d[e]=a.trim(d[e]);return d},autosubmit:function(){this.$input.on("change",function(b,c){c||a(this).closest("form").submit()})},getSeparator:function(){return this.options.select2.separator||a.fn.select2.defaults.separator},convertSource:function(b){if(a.isArray(b)&&b.length&&void 0!==b[0].value)for(var c=0;c<b.length;c++)void 0!==b[c].value&&(b[c].id=b[c].value,delete b[c].value);return b},destroy:function(){this.$input.data("select2")&&this.$input.select2("destroy")}}),b.defaults=a.extend({},a.fn.editabletypes.abstractinput.defaults,{tpl:'<input type="hidden">',select2:null,placeholder:null,source:null,viewseparator:", "}),a.fn.editabletypes.select2=b}(window.jQuery),function(a){var b=function(b,c){return this.$element=a(b),this.$element.is("input")?(this.options=a.extend({},a.fn.combodate.defaults,c,this.$element.data()),this.init(),void 0):(a.error("Combodate should be applied to INPUT element"),void 0)};b.prototype={constructor:b,init:function(){this.map={day:["D","date"],month:["M","month"],year:["Y","year"],hour:["[Hh]","hours"],minute:["m","minutes"],second:["s","seconds"],ampm:["[Aa]",""]},this.$widget=a('<span class="combodate"></span>').html(this.getTemplate()),this.initCombos(),this.$widget.on("change","select",a.proxy(function(b){this.$element.val(this.getValue()).change(),this.options.smartDays&&(a(b.target).is(".month")||a(b.target).is(".year"))&&this.fillCombo("day")},this)),this.$widget.find("select").css("width","auto"),this.$element.hide().after(this.$widget),this.setValue(this.$element.val()||this.options.value)},getTemplate:function(){var b=this.options.template;return a.each(this.map,function(a,c){c=c[0];var d=new RegExp(c+"+"),e=c.length>1?c.substring(1,2):c;b=b.replace(d,"{"+e+"}")}),b=b.replace(/ /g," "),a.each(this.map,function(a,c){c=c[0];var d=c.length>1?c.substring(1,2):c;b=b.replace("{"+d+"}",'<select class="'+a+'"></select>')}),b},initCombos:function(){for(var a in this.map){var b=this.$widget.find("."+a);this["$"+a]=b.length?b:null,this.fillCombo(a)}},fillCombo:function(a){var b=this["$"+a];if(b){var c="fill"+a.charAt(0).toUpperCase()+a.slice(1),d=this[c](),e=b.val();b.empty();for(var f=0;f<d.length;f++)b.append('<option value="'+d[f][0]+'">'+d[f][1]+"</option>");b.val(e)}},fillCommon:function(a){var b,c=[];if("name"===this.options.firstItem){b=moment.relativeTime||moment.langData()._relativeTime;var d="function"==typeof b[a]?b[a](1,!0,a,!1):b[a];d=d.split(" ").reverse()[0],c.push(["",d])}else"empty"===this.options.firstItem&&c.push(["",""]);return c},fillDay:function(){var a,b,c=this.fillCommon("d"),d=-1!==this.options.template.indexOf("DD"),e=31;if(this.options.smartDays&&this.$month&&this.$year){var f=parseInt(this.$month.val(),10),g=parseInt(this.$year.val(),10);isNaN(f)||isNaN(g)||(e=moment([g,f]).daysInMonth())}for(b=1;e>=b;b++)a=d?this.leadZero(b):b,c.push([b,a]);return c},fillMonth:function(){var a,b,c=this.fillCommon("M"),d=-1!==this.options.template.indexOf("MMMM"),e=-1!==this.options.template.indexOf("MMM"),f=-1!==this.options.template.indexOf("MM");for(b=0;11>=b;b++)a=d?moment().date(1).month(b).format("MMMM"):e?moment().date(1).month(b).format("MMM"):f?this.leadZero(b+1):b+1,c.push([b,a]);return c},fillYear:function(){var a,b,c=[],d=-1!==this.options.template.indexOf("YYYY");for(b=this.options.maxYear;b>=this.options.minYear;b--)a=d?b:(b+"").substring(2),c[this.options.yearDescending?"push":"unshift"]([b,a]);return c=this.fillCommon("y").concat(c)},fillHour:function(){var a,b,c=this.fillCommon("h"),d=-1!==this.options.template.indexOf("h"),e=(-1!==this.options.template.indexOf("H"),-1!==this.options.template.toLowerCase().indexOf("hh")),f=d?1:0,g=d?12:23;for(b=f;g>=b;b++)a=e?this.leadZero(b):b,c.push([b,a]);return c},fillMinute:function(){var a,b,c=this.fillCommon("m"),d=-1!==this.options.template.indexOf("mm");for(b=0;59>=b;b+=this.options.minuteStep)a=d?this.leadZero(b):b,c.push([b,a]);return c},fillSecond:function(){var a,b,c=this.fillCommon("s"),d=-1!==this.options.template.indexOf("ss");for(b=0;59>=b;b+=this.options.secondStep)a=d?this.leadZero(b):b,c.push([b,a]);return c},fillAmpm:function(){var a=-1!==this.options.template.indexOf("a"),b=(-1!==this.options.template.indexOf("A"),[["am",a?"am":"AM"],["pm",a?"pm":"PM"]]);return b},getValue:function(b){var c,d={},e=this,f=!1;return a.each(this.map,function(a){if("ampm"!==a){var b="day"===a?1:0;return d[a]=e["$"+a]?parseInt(e["$"+a].val(),10):b,isNaN(d[a])?(f=!0,!1):void 0}}),f?"":(this.$ampm&&(d.hour=12===d.hour?"am"===this.$ampm.val()?0:12:"am"===this.$ampm.val()?d.hour:d.hour+12),c=moment([d.year,d.month,d.day,d.hour,d.minute,d.second]),this.highlight(c),b=void 0===b?this.options.format:b,null===b?c.isValid()?c:null:c.isValid()?c.format(b):"")},setValue:function(b){function c(b,c){var d={};return b.children("option").each(function(b,e){var f,g=a(e).attr("value");""!==g&&(f=Math.abs(g-c),("undefined"==typeof d.distance||f<d.distance)&&(d={value:g,distance:f}))}),d.value}if(b){var d="string"==typeof b?moment(b,this.options.format):moment(b),e=this,f={};d.isValid()&&(a.each(this.map,function(a,b){"ampm"!==a&&(f[a]=d[b[1]]())}),this.$ampm&&(f.hour>=12?(f.ampm="pm",f.hour>12&&(f.hour-=12)):(f.ampm="am",0===f.hour&&(f.hour=12))),a.each(f,function(a,b){e["$"+a]&&("minute"===a&&e.options.minuteStep>1&&e.options.roundTime&&(b=c(e["$"+a],b)),"second"===a&&e.options.secondStep>1&&e.options.roundTime&&(b=c(e["$"+a],b)),e["$"+a].val(b))}),this.options.smartDays&&this.fillCombo("day"),this.$element.val(d.format(this.options.format)).change())}},highlight:function(a){a.isValid()?this.options.errorClass?this.$widget.removeClass(this.options.errorClass):this.$widget.find("select").css("border-color",this.borderColor):this.options.errorClass?this.$widget.addClass(this.options.errorClass):(this.borderColor||(this.borderColor=this.$widget.find("select").css("border-color")),this.$widget.find("select").css("border-color","red"))},leadZero:function(a){return 9>=a?"0"+a:a},destroy:function(){this.$widget.remove(),this.$element.removeData("combodate").show()}},a.fn.combodate=function(c){var d,e=Array.apply(null,arguments);return e.shift(),"getValue"===c&&this.length&&(d=this.eq(0).data("combodate"))?d.getValue.apply(d,e):this.each(function(){var d=a(this),f=d.data("combodate"),g="object"==typeof c&&c;f||d.data("combodate",f=new b(this,g)),"string"==typeof c&&"function"==typeof f[c]&&f[c].apply(f,e)})},a.fn.combodate.defaults={format:"DD-MM-YYYY HH:mm",template:"D / MMM / YYYY H : mm",value:null,minYear:1970,maxYear:2015,yearDescending:!0,minuteStep:5,secondStep:1,firstItem:"empty",errorClass:null,roundTime:!0,smartDays:!1}}(window.jQuery),function(a){"use strict";var b=function(c){this.init("combodate",c,b.defaults),this.options.viewformat||(this.options.viewformat=this.options.format),c.combodate=a.fn.editableutils.tryParseJson(c.combodate,!0),this.options.combodate=a.extend({},b.defaults.combodate,c.combodate,{format:this.options.format,template:this.options.template})};a.fn.editableutils.inherit(b,a.fn.editabletypes.abstractinput),a.extend(b.prototype,{render:function(){this.$input.combodate(this.options.combodate),"bs3"===a.fn.editableform.engine&&this.$input.siblings().find("select").addClass("form-control"),this.options.inputclass&&this.$input.siblings().find("select").addClass(this.options.inputclass)},value2html:function(a,c){var d=a?a.format(this.options.viewformat):"";b.superclass.value2html.call(this,d,c)},html2value:function(a){return a?moment(a,this.options.viewformat):null},value2str:function(a){return a?a.format(this.options.format):""},str2value:function(a){return a?moment(a,this.options.format):null},value2submit:function(a){return this.value2str(a)},value2input:function(a){this.$input.combodate("setValue",a)},input2value:function(){return this.$input.combodate("getValue",null)},activate:function(){this.$input.siblings(".combodate").find("select").eq(0).focus()},autosubmit:function(){}}),b.defaults=a.extend({},a.fn.editabletypes.abstractinput.defaults,{tpl:'<input type="text">',inputclass:null,format:"YYYY-MM-DD",viewformat:null,template:"D / MMM / YYYY",combodate:null}),a.fn.editabletypes.combodate=b}(window.jQuery),function(a){"use strict";var b=a.fn.editableform.Constructor.prototype.initInput;a.extend(a.fn.editableform.Constructor.prototype,{initTemplate:function(){this.$form=a(a.fn.editableform.template),this.$form.find(".control-group").addClass("form-group"),this.$form.find(".editable-error-block").addClass("help-block")},initInput:function(){b.apply(this);var c=null===this.input.options.inputclass||this.input.options.inputclass===!1,d="input-sm",e="text,select,textarea,password,email,url,tel,number,range,time,typeaheadjs".split(",");~a.inArray(this.input.type,e)&&(this.input.$input.addClass("form-control"),c&&(this.input.options.inputclass=d,this.input.$input.addClass(d)));for(var f=this.$form.find(".editable-buttons"),g=c?[d]:this.input.options.inputclass.split(" "),h=0;h<g.length;h++)"input-lg"===g[h].toLowerCase()&&f.find("button").removeClass("btn-sm").addClass("btn-lg")}}),a.fn.editableform.buttons='<button type="submit" class="btn btn-primary btn-sm editable-submit"><i class="glyphicon glyphicon-ok"></i></button><button type="button" class="btn btn-default btn-sm editable-cancel"><i class="glyphicon glyphicon-remove"></i></button>',a.fn.editableform.errorGroupClass="has-error",a.fn.editableform.errorBlockClass=null,a.fn.editableform.engine="bs3"}(window.jQuery),function(a){"use strict";a.extend(a.fn.editableContainer.Popup.prototype,{containerName:"popover",containerDataName:"bs.popover",innerCss:".popover-content",defaults:a.fn.popover.Constructor.DEFAULTS,initContainer:function(){a.extend(this.containerOptions,{trigger:"manual",selector:!1,content:" ",template:this.defaults.template});var b;this.$element.data("template")&&(b=this.$element.data("template"),this.$element.removeData("template")),this.call(this.containerOptions),b&&this.$element.data("template",b)},innerShow:function(){this.call("show")},innerHide:function(){this.call("hide")},innerDestroy:function(){this.call("destroy")},setContainerOption:function(a,b){this.container().options[a]=b},setPosition:function(){!function(){var a=this.tip(),b="function"==typeof this.options.placement?this.options.placement.call(this,a[0],this.$element[0]):this.options.placement,c=/\s?auto?\s?/i,d=c.test(b);d&&(b=b.replace(c,"")||"top");var e=this.getPosition(),f=a[0].offsetWidth,g=a[0].offsetHeight;if(d){var h=this.$element.parent(),i=b,j=document.documentElement.scrollTop||document.body.scrollTop,k="body"==this.options.container?window.innerWidth:h.outerWidth(),l="body"==this.options.container?window.innerHeight:h.outerHeight(),m="body"==this.options.container?0:h.offset().left;b="bottom"==b&&e.top+e.height+g-j>l?"top":"top"==b&&e.top-j-g<0?"bottom":"right"==b&&e.right+f>k?"left":"left"==b&&e.left-f<m?"right":b,a.removeClass(i).addClass(b)}var n=this.getCalculatedOffset(b,e,f,g);this.applyPlacement(n,b)}.call(this.container())}})}(window.jQuery),function(a){function b(){return new Date(Date.UTC.apply(Date,arguments))}function c(b,c){var d,e=a(b).data(),f={},g=new RegExp("^"+c.toLowerCase()+"([A-Z])"),c=new RegExp("^"+c.toLowerCase());for(var h in e)c.test(h)&&(d=h.replace(g,function(a,b){return b.toLowerCase()}),f[d]=e[h]);return f}function d(b){var c={};if(k[b]||(b=b.split("-")[0],k[b])){var d=k[b];return a.each(j,function(a,b){b in d&&(c[b]=d[b])}),c}}var e=function(b,c){this._process_options(c),this.element=a(b),this.isInline=!1,this.isInput=this.element.is("input"),this.component=this.element.is(".date")?this.element.find(".add-on, .btn"):!1,this.hasInput=this.component&&this.element.find("input").length,this.component&&0===this.component.length&&(this.component=!1),this.picker=a(l.template),this._buildEvents(),this._attachEvents(),this.isInline?this.picker.addClass("datepicker-inline").appendTo(this.element):this.picker.addClass("datepicker-dropdown dropdown-menu"),this.o.rtl&&(this.picker.addClass("datepicker-rtl"),this.picker.find(".prev i, .next i").toggleClass("icon-arrow-left icon-arrow-right")),this.viewMode=this.o.startView,this.o.calendarWeeks&&this.picker.find("tfoot th.today").attr("colspan",function(a,b){return parseInt(b)+1}),this._allow_update=!1,this.setStartDate(this.o.startDate),this.setEndDate(this.o.endDate),this.setDaysOfWeekDisabled(this.o.daysOfWeekDisabled),this.fillDow(),this.fillMonths(),this._allow_update=!0,this.update(),this.showMode(),this.isInline&&this.show()};e.prototype={constructor:e,_process_options:function(b){this._o=a.extend({},this._o,b);var c=this.o=a.extend({},this._o),d=c.language;switch(k[d]||(d=d.split("-")[0],k[d]||(d=i.language)),c.language=d,c.startView){case 2:case"decade":c.startView=2;break;case 1:case"year":c.startView=1;break;default:c.startView=0}switch(c.minViewMode){case 1:case"months":c.minViewMode=1;break;case 2:case"years":c.minViewMode=2;break;default:c.minViewMode=0}c.startView=Math.max(c.startView,c.minViewMode),c.weekStart%=7,c.weekEnd=(c.weekStart+6)%7;var e=l.parseFormat(c.format);c.startDate!==-1/0&&(c.startDate=l.parseDate(c.startDate,e,c.language)),1/0!==c.endDate&&(c.endDate=l.parseDate(c.endDate,e,c.language)),c.daysOfWeekDisabled=c.daysOfWeekDisabled||[],a.isArray(c.daysOfWeekDisabled)||(c.daysOfWeekDisabled=c.daysOfWeekDisabled.split(/[,\s]*/)),c.daysOfWeekDisabled=a.map(c.daysOfWeekDisabled,function(a){return parseInt(a,10)})},_events:[],_secondaryEvents:[],_applyEvents:function(a){for(var b,c,d=0;d<a.length;d++)b=a[d][0],c=a[d][1],b.on(c)},_unapplyEvents:function(a){for(var b,c,d=0;d<a.length;d++)b=a[d][0],c=a[d][1],b.off(c)},_buildEvents:function(){this.isInput?this._events=[[this.element,{focus:a.proxy(this.show,this),keyup:a.proxy(this.update,this),keydown:a.proxy(this.keydown,this)}]]:this.component&&this.hasInput?this._events=[[this.element.find("input"),{focus:a.proxy(this.show,this),keyup:a.proxy(this.update,this),keydown:a.proxy(this.keydown,this)}],[this.component,{click:a.proxy(this.show,this)}]]:this.element.is("div")?this.isInline=!0:this._events=[[this.element,{click:a.proxy(this.show,this)}]],this._secondaryEvents=[[this.picker,{click:a.proxy(this.click,this)}],[a(window),{resize:a.proxy(this.place,this)}],[a(document),{mousedown:a.proxy(function(a){this.element.is(a.target)||this.element.find(a.target).size()||this.picker.is(a.target)||this.picker.find(a.target).size()||this.hide()},this)}]]},_attachEvents:function(){this._detachEvents(),this._applyEvents(this._events)},_detachEvents:function(){this._unapplyEvents(this._events)},_attachSecondaryEvents:function(){this._detachSecondaryEvents(),this._applyEvents(this._secondaryEvents)},_detachSecondaryEvents:function(){this._unapplyEvents(this._secondaryEvents)},_trigger:function(b,c){var d=c||this.date,e=new Date(d.getTime()+6e4*d.getTimezoneOffset());this.element.trigger({type:b,date:e,format:a.proxy(function(a){var b=a||this.o.format;return l.formatDate(d,b,this.o.language)},this)})},show:function(a){this.isInline||this.picker.appendTo("body"),this.picker.show(),this.height=this.component?this.component.outerHeight():this.element.outerHeight(),this.place(),this._attachSecondaryEvents(),a&&a.preventDefault(),this._trigger("show")},hide:function(){this.isInline||this.picker.is(":visible")&&(this.picker.hide().detach(),this._detachSecondaryEvents(),this.viewMode=this.o.startView,this.showMode(),this.o.forceParse&&(this.isInput&&this.element.val()||this.hasInput&&this.element.find("input").val())&&this.setValue(),this._trigger("hide"))},remove:function(){this.hide(),this._detachEvents(),this._detachSecondaryEvents(),this.picker.remove(),delete this.element.data().datepicker,this.isInput||delete this.element.data().date},getDate:function(){var a=this.getUTCDate();return new Date(a.getTime()+6e4*a.getTimezoneOffset())},getUTCDate:function(){return this.date},setDate:function(a){this.setUTCDate(new Date(a.getTime()-6e4*a.getTimezoneOffset()))},setUTCDate:function(a){this.date=a,this.setValue()},setValue:function(){var a=this.getFormattedDate();this.isInput?this.element.val(a):this.component&&this.element.find("input").val(a)},getFormattedDate:function(a){return void 0===a&&(a=this.o.format),l.formatDate(this.date,a,this.o.language)},setStartDate:function(a){this._process_options({startDate:a}),this.update(),this.updateNavArrows()},setEndDate:function(a){this._process_options({endDate:a}),this.update(),this.updateNavArrows()},setDaysOfWeekDisabled:function(a){this._process_options({daysOfWeekDisabled:a}),this.update(),this.updateNavArrows()},place:function(){if(!this.isInline){var b=parseInt(this.element.parents().filter(function(){return"auto"!=a(this).css("z-index")}).first().css("z-index"))+10,c=this.component?this.component.parent().offset():this.element.offset(),d=this.component?this.component.outerHeight(!0):this.element.outerHeight(!0);this.picker.css({top:c.top+d,left:c.left,zIndex:b})}},_allow_update:!0,update:function(){if(this._allow_update){var a,b=!1;arguments&&arguments.length&&("string"==typeof arguments[0]||arguments[0]instanceof Date)?(a=arguments[0],b=!0):(a=this.isInput?this.element.val():this.element.data("date")||this.element.find("input").val(),delete this.element.data().date),this.date=l.parseDate(a,this.o.format,this.o.language),b&&this.setValue(),this.viewDate=this.date<this.o.startDate?new Date(this.o.startDate):this.date>this.o.endDate?new Date(this.o.endDate):new Date(this.date),this.fill()}},fillDow:function(){var a=this.o.weekStart,b="<tr>";if(this.o.calendarWeeks){var c='<th class="cw"> </th>';b+=c,this.picker.find(".datepicker-days thead tr:first-child").prepend(c)}for(;a<this.o.weekStart+7;)b+='<th class="dow">'+k[this.o.language].daysMin[a++%7]+"</th>";b+="</tr>",this.picker.find(".datepicker-days thead").append(b)},fillMonths:function(){for(var a="",b=0;12>b;)a+='<span class="month">'+k[this.o.language].monthsShort[b++]+"</span>";this.picker.find(".datepicker-months td").html(a)},setRange:function(b){b&&b.length?this.range=a.map(b,function(a){return a.valueOf()}):delete this.range,this.fill()},getClassNames:function(b){var c=[],d=this.viewDate.getUTCFullYear(),e=this.viewDate.getUTCMonth(),f=this.date.valueOf(),g=new Date;return b.getUTCFullYear()<d||b.getUTCFullYear()==d&&b.getUTCMonth()<e?c.push("old"):(b.getUTCFullYear()>d||b.getUTCFullYear()==d&&b.getUTCMonth()>e)&&c.push("new"),this.o.todayHighlight&&b.getUTCFullYear()==g.getFullYear()&&b.getUTCMonth()==g.getMonth()&&b.getUTCDate()==g.getDate()&&c.push("today"),f&&b.valueOf()==f&&c.push("active"),(b.valueOf()<this.o.startDate||b.valueOf()>this.o.endDate||-1!==a.inArray(b.getUTCDay(),this.o.daysOfWeekDisabled))&&c.push("disabled"),this.range&&(b>this.range[0]&&b<this.range[this.range.length-1]&&c.push("range"),-1!=a.inArray(b.valueOf(),this.range)&&c.push("selected")),c},fill:function(){var c,d=new Date(this.viewDate),e=d.getUTCFullYear(),f=d.getUTCMonth(),g=this.o.startDate!==-1/0?this.o.startDate.getUTCFullYear():-1/0,h=this.o.startDate!==-1/0?this.o.startDate.getUTCMonth():-1/0,i=1/0!==this.o.endDate?this.o.endDate.getUTCFullYear():1/0,j=1/0!==this.o.endDate?this.o.endDate.getUTCMonth():1/0;this.date&&this.date.valueOf(),this.picker.find(".datepicker-days thead th.datepicker-switch").text(k[this.o.language].months[f]+" "+e),this.picker.find("tfoot th.today").text(k[this.o.language].today).toggle(this.o.todayBtn!==!1),this.picker.find("tfoot th.clear").text(k[this.o.language].clear).toggle(this.o.clearBtn!==!1),this.updateNavArrows(),this.fillMonths();var m=b(e,f-1,28,0,0,0,0),n=l.getDaysInMonth(m.getUTCFullYear(),m.getUTCMonth());m.setUTCDate(n),m.setUTCDate(n-(m.getUTCDay()-this.o.weekStart+7)%7);var o=new Date(m);o.setUTCDate(o.getUTCDate()+42),o=o.valueOf();for(var p,q=[];m.valueOf()<o;){if(m.getUTCDay()==this.o.weekStart&&(q.push("<tr>"),this.o.calendarWeeks)){var r=new Date(+m+864e5*((this.o.weekStart-m.getUTCDay()-7)%7)),s=new Date(+r+864e5*((11-r.getUTCDay())%7)),t=new Date(+(t=b(s.getUTCFullYear(),0,1))+864e5*((11-t.getUTCDay())%7)),u=(s-t)/864e5/7+1;q.push('<td class="cw">'+u+"</td>")}p=this.getClassNames(m),p.push("day");var v=this.o.beforeShowDay(m);void 0===v?v={}:"boolean"==typeof v?v={enabled:v}:"string"==typeof v&&(v={classes:v}),v.enabled===!1&&p.push("disabled"),v.classes&&(p=p.concat(v.classes.split(/\s+/))),v.tooltip&&(c=v.tooltip),p=a.unique(p),q.push('<td class="'+p.join(" ")+'"'+(c?' title="'+c+'"':"")+">"+m.getUTCDate()+"</td>"),m.getUTCDay()==this.o.weekEnd&&q.push("</tr>"),m.setUTCDate(m.getUTCDate()+1)}this.picker.find(".datepicker-days tbody").empty().append(q.join(""));var w=this.date&&this.date.getUTCFullYear(),x=this.picker.find(".datepicker-months").find("th:eq(1)").text(e).end().find("span").removeClass("active");w&&w==e&&x.eq(this.date.getUTCMonth()).addClass("active"),(g>e||e>i)&&x.addClass("disabled"),e==g&&x.slice(0,h).addClass("disabled"),e==i&&x.slice(j+1).addClass("disabled"),q="",e=10*parseInt(e/10,10);var y=this.picker.find(".datepicker-years").find("th:eq(1)").text(e+"-"+(e+9)).end().find("td");e-=1;for(var z=-1;11>z;z++)q+='<span class="year'+(-1==z?" old":10==z?" new":"")+(w==e?" active":"")+(g>e||e>i?" disabled":"")+'">'+e+"</span>",e+=1;y.html(q)},updateNavArrows:function(){if(this._allow_update){var a=new Date(this.viewDate),b=a.getUTCFullYear(),c=a.getUTCMonth();switch(this.viewMode){case 0:this.o.startDate!==-1/0&&b<=this.o.startDate.getUTCFullYear()&&c<=this.o.startDate.getUTCMonth()?this.picker.find(".prev").css({visibility:"hidden"}):this.picker.find(".prev").css({visibility:"visible"}),1/0!==this.o.endDate&&b>=this.o.endDate.getUTCFullYear()&&c>=this.o.endDate.getUTCMonth()?this.picker.find(".next").css({visibility:"hidden"}):this.picker.find(".next").css({visibility:"visible"});break;case 1:case 2:this.o.startDate!==-1/0&&b<=this.o.startDate.getUTCFullYear()?this.picker.find(".prev").css({visibility:"hidden"}):this.picker.find(".prev").css({visibility:"visible"}),1/0!==this.o.endDate&&b>=this.o.endDate.getUTCFullYear()?this.picker.find(".next").css({visibility:"hidden"}):this.picker.find(".next").css({visibility:"visible"})}}},click:function(c){c.preventDefault();var d=a(c.target).closest("span, td, th");if(1==d.length)switch(d[0].nodeName.toLowerCase()){case"th":switch(d[0].className){case"datepicker-switch":this.showMode(1);break;case"prev":case"next":var e=l.modes[this.viewMode].navStep*("prev"==d[0].className?-1:1);switch(this.viewMode){case 0:this.viewDate=this.moveMonth(this.viewDate,e);break;case 1:case 2:this.viewDate=this.moveYear(this.viewDate,e)}this.fill();break;case"today":var f=new Date;f=b(f.getFullYear(),f.getMonth(),f.getDate(),0,0,0),this.showMode(-2);var g="linked"==this.o.todayBtn?null:"view";this._setDate(f,g);break;case"clear":var h;this.isInput?h=this.element:this.component&&(h=this.element.find("input")),h&&h.val("").change(),this._trigger("changeDate"),this.update(),this.o.autoclose&&this.hide()}break;case"span":if(!d.is(".disabled")){if(this.viewDate.setUTCDate(1),d.is(".month")){var i=1,j=d.parent().find("span").index(d),k=this.viewDate.getUTCFullYear();this.viewDate.setUTCMonth(j),this._trigger("changeMonth",this.viewDate),1===this.o.minViewMode&&this._setDate(b(k,j,i,0,0,0,0))}else{var k=parseInt(d.text(),10)||0,i=1,j=0;this.viewDate.setUTCFullYear(k),this._trigger("changeYear",this.viewDate),2===this.o.minViewMode&&this._setDate(b(k,j,i,0,0,0,0))}this.showMode(-1),this.fill()}break;case"td":if(d.is(".day")&&!d.is(".disabled")){var i=parseInt(d.text(),10)||1,k=this.viewDate.getUTCFullYear(),j=this.viewDate.getUTCMonth();d.is(".old")?0===j?(j=11,k-=1):j-=1:d.is(".new")&&(11==j?(j=0,k+=1):j+=1),this._setDate(b(k,j,i,0,0,0,0))}}},_setDate:function(a,b){b&&"date"!=b||(this.date=new Date(a)),b&&"view"!=b||(this.viewDate=new Date(a)),this.fill(),this.setValue(),this._trigger("changeDate");var c;this.isInput?c=this.element:this.component&&(c=this.element.find("input")),c&&(c.change(),!this.o.autoclose||b&&"date"!=b||this.hide())},moveMonth:function(a,b){if(!b)return a;var c,d,e=new Date(a.valueOf()),f=e.getUTCDate(),g=e.getUTCMonth(),h=Math.abs(b);if(b=b>0?1:-1,1==h)d=-1==b?function(){return e.getUTCMonth()==g}:function(){return e.getUTCMonth()!=c},c=g+b,e.setUTCMonth(c),(0>c||c>11)&&(c=(c+12)%12);else{for(var i=0;h>i;i++)e=this.moveMonth(e,b);c=e.getUTCMonth(),e.setUTCDate(f),d=function(){return c!=e.getUTCMonth()}}for(;d();)e.setUTCDate(--f),e.setUTCMonth(c);return e},moveYear:function(a,b){return this.moveMonth(a,12*b)},dateWithinRange:function(a){return a>=this.o.startDate&&a<=this.o.endDate},keydown:function(a){if(this.picker.is(":not(:visible)"))return 27==a.keyCode&&this.show(),void 0;var b,c,d,e=!1;switch(a.keyCode){case 27:this.hide(),a.preventDefault();break;case 37:case 39:if(!this.o.keyboardNavigation)break;b=37==a.keyCode?-1:1,a.ctrlKey?(c=this.moveYear(this.date,b),d=this.moveYear(this.viewDate,b)):a.shiftKey?(c=this.moveMonth(this.date,b),d=this.moveMonth(this.viewDate,b)):(c=new Date(this.date),c.setUTCDate(this.date.getUTCDate()+b),d=new Date(this.viewDate),d.setUTCDate(this.viewDate.getUTCDate()+b)),this.dateWithinRange(c)&&(this.date=c,this.viewDate=d,this.setValue(),this.update(),a.preventDefault(),e=!0);break;case 38:case 40:if(!this.o.keyboardNavigation)break;b=38==a.keyCode?-1:1,a.ctrlKey?(c=this.moveYear(this.date,b),d=this.moveYear(this.viewDate,b)):a.shiftKey?(c=this.moveMonth(this.date,b),d=this.moveMonth(this.viewDate,b)):(c=new Date(this.date),c.setUTCDate(this.date.getUTCDate()+7*b),d=new Date(this.viewDate),d.setUTCDate(this.viewDate.getUTCDate()+7*b)),this.dateWithinRange(c)&&(this.date=c,this.viewDate=d,this.setValue(),this.update(),a.preventDefault(),e=!0);break;case 13:this.hide(),a.preventDefault();break;case 9:this.hide()}if(e){this._trigger("changeDate");var f;this.isInput?f=this.element:this.component&&(f=this.element.find("input")),f&&f.change()}},showMode:function(a){a&&(this.viewMode=Math.max(this.o.minViewMode,Math.min(2,this.viewMode+a))),this.picker.find(">div").hide().filter(".datepicker-"+l.modes[this.viewMode].clsName).css("display","block"),this.updateNavArrows()}};var f=function(b,c){this.element=a(b),this.inputs=a.map(c.inputs,function(a){return a.jquery?a[0]:a}),delete c.inputs,a(this.inputs).datepicker(c).bind("changeDate",a.proxy(this.dateUpdated,this)),this.pickers=a.map(this.inputs,function(b){return a(b).data("datepicker")}),this.updateDates()};f.prototype={updateDates:function(){this.dates=a.map(this.pickers,function(a){return a.date}),this.updateRanges()},updateRanges:function(){var b=a.map(this.dates,function(a){return a.valueOf()});a.each(this.pickers,function(a,c){c.setRange(b)})},dateUpdated:function(b){var c=a(b.target).data("datepicker"),d=c.getUTCDate(),e=a.inArray(b.target,this.inputs),f=this.inputs.length;if(-1!=e){if(d<this.dates[e])for(;e>=0&&d<this.dates[e];)this.pickers[e--].setUTCDate(d);else if(d>this.dates[e])for(;f>e&&d>this.dates[e];)this.pickers[e++].setUTCDate(d);this.updateDates()}},remove:function(){a.map(this.pickers,function(a){a.remove()}),delete this.element.data().datepicker}};var g=a.fn.datepicker,h=a.fn.datepicker=function(b){var g=Array.apply(null,arguments);g.shift();var h;return this.each(function(){var j=a(this),k=j.data("datepicker"),l="object"==typeof b&&b;if(!k){var m=c(this,"date"),n=a.extend({},i,m,l),o=d(n.language),p=a.extend({},i,o,m,l);if(j.is(".input-daterange")||p.inputs){var q={inputs:p.inputs||j.find("input").toArray()};j.data("datepicker",k=new f(this,a.extend(p,q)))}else j.data("datepicker",k=new e(this,p))}return"string"==typeof b&&"function"==typeof k[b]&&(h=k[b].apply(k,g),void 0!==h)?!1:void 0}),void 0!==h?h:this},i=a.fn.datepicker.defaults={autoclose:!1,beforeShowDay:a.noop,calendarWeeks:!1,clearBtn:!1,daysOfWeekDisabled:[],endDate:1/0,forceParse:!0,format:"mm/dd/yyyy",keyboardNavigation:!0,language:"en",minViewMode:0,rtl:!1,startDate:-1/0,startView:0,todayBtn:!1,todayHighlight:!1,weekStart:0},j=a.fn.datepicker.locale_opts=["format","rtl","weekStart"];a.fn.datepicker.Constructor=e;var k=a.fn.datepicker.dates={en:{days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat","Sun"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa","Su"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],today:"Today",clear:"Clear"}},l={modes:[{clsName:"days",navFnc:"Month",navStep:1},{clsName:"months",navFnc:"FullYear",navStep:1},{clsName:"years",navFnc:"FullYear",navStep:10}],isLeapYear:function(a){return 0===a%4&&0!==a%100||0===a%400 -},getDaysInMonth:function(a,b){return[31,l.isLeapYear(a)?29:28,31,30,31,30,31,31,30,31,30,31][b]},validParts:/dd?|DD?|mm?|MM?|yy(?:yy)?/g,nonpunctuation:/[^ -\/:-@\[\u3400-\u9fff-`{-~\t\n\r]+/g,parseFormat:function(a){var b=a.replace(this.validParts,"\0").split("\0"),c=a.match(this.validParts);if(!b||!b.length||!c||0===c.length)throw new Error("Invalid date format.");return{separators:b,parts:c}},parseDate:function(c,d,f){if(c instanceof Date)return c;if("string"==typeof d&&(d=l.parseFormat(d)),/^[\-+]\d+[dmwy]([\s,]+[\-+]\d+[dmwy])*$/.test(c)){var g,h,i=/([\-+]\d+)([dmwy])/,j=c.match(/([\-+]\d+)([dmwy])/g);c=new Date;for(var m=0;m<j.length;m++)switch(g=i.exec(j[m]),h=parseInt(g[1]),g[2]){case"d":c.setUTCDate(c.getUTCDate()+h);break;case"m":c=e.prototype.moveMonth.call(e.prototype,c,h);break;case"w":c.setUTCDate(c.getUTCDate()+7*h);break;case"y":c=e.prototype.moveYear.call(e.prototype,c,h)}return b(c.getUTCFullYear(),c.getUTCMonth(),c.getUTCDate(),0,0,0)}var n,o,g,j=c&&c.match(this.nonpunctuation)||[],c=new Date,p={},q=["yyyy","yy","M","MM","m","mm","d","dd"],r={yyyy:function(a,b){return a.setUTCFullYear(b)},yy:function(a,b){return a.setUTCFullYear(2e3+b)},m:function(a,b){for(b-=1;0>b;)b+=12;for(b%=12,a.setUTCMonth(b);a.getUTCMonth()!=b;)a.setUTCDate(a.getUTCDate()-1);return a},d:function(a,b){return a.setUTCDate(b)}};r.M=r.MM=r.mm=r.m,r.dd=r.d,c=b(c.getFullYear(),c.getMonth(),c.getDate(),0,0,0);var s=d.parts.slice();if(j.length!=s.length&&(s=a(s).filter(function(b,c){return-1!==a.inArray(c,q)}).toArray()),j.length==s.length){for(var m=0,t=s.length;t>m;m++){if(n=parseInt(j[m],10),g=s[m],isNaN(n))switch(g){case"MM":o=a(k[f].months).filter(function(){var a=this.slice(0,j[m].length),b=j[m].slice(0,a.length);return a==b}),n=a.inArray(o[0],k[f].months)+1;break;case"M":o=a(k[f].monthsShort).filter(function(){var a=this.slice(0,j[m].length),b=j[m].slice(0,a.length);return a==b}),n=a.inArray(o[0],k[f].monthsShort)+1}p[g]=n}for(var u,m=0;m<q.length;m++)u=q[m],u in p&&!isNaN(p[u])&&r[u](c,p[u])}return c},formatDate:function(b,c,d){"string"==typeof c&&(c=l.parseFormat(c));var e={d:b.getUTCDate(),D:k[d].daysShort[b.getUTCDay()],DD:k[d].days[b.getUTCDay()],m:b.getUTCMonth()+1,M:k[d].monthsShort[b.getUTCMonth()],MM:k[d].months[b.getUTCMonth()],yy:b.getUTCFullYear().toString().substring(2),yyyy:b.getUTCFullYear()};e.dd=(e.d<10?"0":"")+e.d,e.mm=(e.m<10?"0":"")+e.m;for(var b=[],f=a.extend([],c.separators),g=0,h=c.parts.length;h>=g;g++)f.length&&b.push(f.shift()),b.push(e[c.parts[g]]);return b.join("")},headTemplate:'<thead><tr><th class="prev"><i class="icon-arrow-left"/></th><th colspan="5" class="datepicker-switch"></th><th class="next"><i class="icon-arrow-right"/></th></tr></thead>',contTemplate:'<tbody><tr><td colspan="7"></td></tr></tbody>',footTemplate:'<tfoot><tr><th colspan="7" class="today"></th></tr><tr><th colspan="7" class="clear"></th></tr></tfoot>'};l.template='<div class="datepicker"><div class="datepicker-days"><table class=" table-condensed">'+l.headTemplate+"<tbody></tbody>"+l.footTemplate+"</table>"+"</div>"+'<div class="datepicker-months">'+'<table class="table-condensed">'+l.headTemplate+l.contTemplate+l.footTemplate+"</table>"+"</div>"+'<div class="datepicker-years">'+'<table class="table-condensed">'+l.headTemplate+l.contTemplate+l.footTemplate+"</table>"+"</div>"+"</div>",a.fn.datepicker.DPGlobal=l,a.fn.datepicker.noConflict=function(){return a.fn.datepicker=g,this},a(document).on("focus.datepicker.data-api click.datepicker.data-api",'[data-provide="datepicker"]',function(b){var c=a(this);c.data("datepicker")||(b.preventDefault(),h.call(c,"show"))}),a(function(){h.call(a('[data-provide="datepicker-inline"]'))})}(window.jQuery),function(a){"use strict";a.fn.bdatepicker=a.fn.datepicker.noConflict(),a.fn.datepicker||(a.fn.datepicker=a.fn.bdatepicker);var b=function(a){this.init("date",a,b.defaults),this.initPicker(a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.abstractinput),a.extend(b.prototype,{initPicker:function(b,c){this.options.viewformat||(this.options.viewformat=this.options.format),b.datepicker=a.fn.editableutils.tryParseJson(b.datepicker,!0),this.options.datepicker=a.extend({},c.datepicker,b.datepicker,{format:this.options.viewformat}),this.options.datepicker.language=this.options.datepicker.language||"en",this.dpg=a.fn.bdatepicker.DPGlobal,this.parsedFormat=this.dpg.parseFormat(this.options.format),this.parsedViewFormat=this.dpg.parseFormat(this.options.viewformat)},render:function(){this.$input.bdatepicker(this.options.datepicker),this.options.clear&&(this.$clear=a('<a href="#"></a>').html(this.options.clear).click(a.proxy(function(a){a.preventDefault(),a.stopPropagation(),this.clear()},this)),this.$tpl.parent().append(a('<div class="editable-clear">').append(this.$clear)))},value2html:function(a,c){var d=a?this.dpg.formatDate(a,this.parsedViewFormat,this.options.datepicker.language):"";b.superclass.value2html.call(this,d,c)},html2value:function(a){return this.parseDate(a,this.parsedViewFormat)},value2str:function(a){return a?this.dpg.formatDate(a,this.parsedFormat,this.options.datepicker.language):""},str2value:function(a){return this.parseDate(a,this.parsedFormat)},value2submit:function(a){return this.value2str(a)},value2input:function(a){this.$input.bdatepicker("update",a)},input2value:function(){return this.$input.data("datepicker").date},activate:function(){},clear:function(){this.$input.data("datepicker").date=null,this.$input.find(".active").removeClass("active"),this.options.showbuttons||this.$input.closest("form").submit()},autosubmit:function(){this.$input.on("mouseup",".day",function(b){if(!a(b.currentTarget).is(".old")&&!a(b.currentTarget).is(".new")){var c=a(this).closest("form");setTimeout(function(){c.submit()},200)}})},parseDate:function(a,b){var c,d=null;return a&&(d=this.dpg.parseDate(a,b,this.options.datepicker.language),"string"==typeof a&&(c=this.dpg.formatDate(d,b,this.options.datepicker.language),a!==c&&(d=null))),d}}),b.defaults=a.extend({},a.fn.editabletypes.abstractinput.defaults,{tpl:'<div class="editable-date well"></div>',inputclass:null,format:"yyyy-mm-dd",viewformat:null,datepicker:{weekStart:0,startView:0,minViewMode:0,autoclose:!1},clear:"× clear"}),a.fn.editabletypes.date=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("datefield",a,b.defaults),this.initPicker(a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.date),a.extend(b.prototype,{render:function(){this.$input=this.$tpl.find("input"),this.setClass(),this.setAttr("placeholder"),this.$tpl.bdatepicker(this.options.datepicker),this.$input.off("focus keydown"),this.$input.keyup(a.proxy(function(){this.$tpl.removeData("date"),this.$tpl.bdatepicker("update")},this))},value2input:function(a){this.$input.val(a?this.dpg.formatDate(a,this.parsedViewFormat,this.options.datepicker.language):""),this.$tpl.bdatepicker("update")},input2value:function(){return this.html2value(this.$input.val())},activate:function(){a.fn.editabletypes.text.prototype.activate.call(this)},autosubmit:function(){}}),b.defaults=a.extend({},a.fn.editabletypes.date.defaults,{tpl:'<div class="input-append date"><input type="text"/><span class="add-on"><i class="icon-th"></i></span></div>',inputclass:"input-small",datepicker:{weekStart:0,startView:0,minViewMode:0,autoclose:!0}}),a.fn.editabletypes.datefield=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("datetime",a,b.defaults),this.initPicker(a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.abstractinput),a.extend(b.prototype,{initPicker:function(b,c){this.options.viewformat||(this.options.viewformat=this.options.format),b.datetimepicker=a.fn.editableutils.tryParseJson(b.datetimepicker,!0),this.options.datetimepicker=a.extend({},c.datetimepicker,b.datetimepicker,{format:this.options.viewformat}),this.options.datetimepicker.language=this.options.datetimepicker.language||"en",this.dpg=a.fn.datetimepicker.DPGlobal,this.parsedFormat=this.dpg.parseFormat(this.options.format,this.options.formatType),this.parsedViewFormat=this.dpg.parseFormat(this.options.viewformat,this.options.formatType)},render:function(){this.$input.datetimepicker(this.options.datetimepicker),this.$input.on("changeMode",function(){var b=a(this).closest("form").parent();setTimeout(function(){b.triggerHandler("resize")},0)}),this.options.clear&&(this.$clear=a('<a href="#"></a>').html(this.options.clear).click(a.proxy(function(a){a.preventDefault(),a.stopPropagation(),this.clear()},this)),this.$tpl.parent().append(a('<div class="editable-clear">').append(this.$clear)))},value2html:function(a,c){var d=a?this.dpg.formatDate(this.toUTC(a),this.parsedViewFormat,this.options.datetimepicker.language,this.options.formatType):"";return c?(b.superclass.value2html.call(this,d,c),void 0):d},html2value:function(a){var b=this.parseDate(a,this.parsedViewFormat);return b?this.fromUTC(b):null},value2str:function(a){return a?this.dpg.formatDate(this.toUTC(a),this.parsedFormat,this.options.datetimepicker.language,this.options.formatType):""},str2value:function(a){var b=this.parseDate(a,this.parsedFormat);return b?this.fromUTC(b):null},value2submit:function(a){return this.value2str(a)},value2input:function(a){a&&this.$input.data("datetimepicker").setDate(a)},input2value:function(){var a=this.$input.data("datetimepicker");return a.date?a.getDate():null},activate:function(){},clear:function(){this.$input.data("datetimepicker").date=null,this.$input.find(".active").removeClass("active"),this.options.showbuttons||this.$input.closest("form").submit()},autosubmit:function(){this.$input.on("mouseup",".minute",function(){var b=a(this).closest("form");setTimeout(function(){b.submit()},200)})},toUTC:function(a){return a?new Date(a.valueOf()-6e4*a.getTimezoneOffset()):a},fromUTC:function(a){return a?new Date(a.valueOf()+6e4*a.getTimezoneOffset()):a},parseDate:function(a,b){var c,d=null;return a&&(d=this.dpg.parseDate(a,b,this.options.datetimepicker.language,this.options.formatType),"string"==typeof a&&(c=this.dpg.formatDate(d,b,this.options.datetimepicker.language,this.options.formatType),a!==c&&(d=null))),d}}),b.defaults=a.extend({},a.fn.editabletypes.abstractinput.defaults,{tpl:'<div class="editable-date well"></div>',inputclass:null,format:"yyyy-mm-dd hh:ii",formatType:"standard",viewformat:null,datetimepicker:{todayHighlight:!1,autoclose:!1},clear:"× clear"}),a.fn.editabletypes.datetime=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("datetimefield",a,b.defaults),this.initPicker(a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.datetime),a.extend(b.prototype,{render:function(){this.$input=this.$tpl.find("input"),this.setClass(),this.setAttr("placeholder"),this.$tpl.datetimepicker(this.options.datetimepicker),this.$input.off("focus keydown"),this.$input.keyup(a.proxy(function(){this.$tpl.removeData("date"),this.$tpl.datetimepicker("update")},this))},value2input:function(a){this.$input.val(this.value2html(a)),this.$tpl.datetimepicker("update")},input2value:function(){return this.html2value(this.$input.val())},activate:function(){a.fn.editabletypes.text.prototype.activate.call(this)},autosubmit:function(){}}),b.defaults=a.extend({},a.fn.editabletypes.datetime.defaults,{tpl:'<div class="input-append date"><input type="text"/><span class="add-on"><i class="icon-th"></i></span></div>',inputclass:"input-medium",datetimepicker:{todayHighlight:!1,autoclose:!0}}),a.fn.editabletypes.datetimefield=b}(window.jQuery); \ No newline at end of file diff --git a/flask_admin/templates/bootstrap3/admin/actions.html b/flask_admin/templates/bootstrap3/admin/actions.html deleted file mode 100644 index 02257bb02..000000000 --- a/flask_admin/templates/bootstrap3/admin/actions.html +++ /dev/null @@ -1,34 +0,0 @@ -{% import 'admin/static.html' as admin_static with context %} - -{% macro dropdown(actions, btn_class='btn dropdown-toggle') -%} - <a class="{{ btn_class }}" data-toggle="dropdown" href="javascript:void(0)">{{ _gettext('With selected') }}<b class="caret"></b></a> - <ul class="dropdown-menu"> - {% for p in actions %} - <li> - <a href="javascript:void(0)" onclick="return modelActions.execute('{{ p[0] }}');">{{ _gettext(p[1]) }}</a> - </li> - {% endfor %} - </ul> -{% endmacro %} - -{% macro form(actions, url) %} - {% if actions %} - <form id="action_form" action="{{ url }}" method="POST" style="display: none"> - {% if action_form.csrf_token %} - {{ action_form.csrf_token }} - {% elif csrf_token %} - <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/> - {% endif %} - {{ action_form.url(value=return_url) }} - {{ action_form.action() }} - </form> - {% endif %} -{% endmacro %} - -{% macro script(message, actions, actions_confirmation) %} - {% if actions %} - <div id="actions-confirmation-data" style="display:none;">{{ actions_confirmation|tojson|safe }}</div> - <div id="message-data" style="display:none;">{{ message|tojson|safe }}</div> - <script src="{{ admin_static.url(filename='admin/js/actions.js', v='1.0.0') }}"></script> - {% endif %} -{% endmacro %} diff --git a/flask_admin/templates/bootstrap3/admin/base.html b/flask_admin/templates/bootstrap3/admin/base.html deleted file mode 100644 index bd532b084..000000000 --- a/flask_admin/templates/bootstrap3/admin/base.html +++ /dev/null @@ -1,98 +0,0 @@ -{% import 'admin/layout.html' as layout with context -%} -{% import 'admin/static.html' as admin_static with context %} -<!DOCTYPE html> -<html> - <head> - <title>{% block title %}{% if admin_view.category %}{{ admin_view.category }} - {% endif %}{{ admin_view.name }} - {{ admin_view.admin.name }}{% endblock %}</title> - {% block head_meta %} - <meta charset="UTF-8"> - <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <meta name="description" content=""> - <meta name="author" content=""> - {% endblock %} - {% block head_css %} - <link href="{{ admin_static.url(filename='bootstrap/bootstrap3/swatch/{swatch}/bootstrap.min.css'.format(swatch=theme.swatch), v='3.3.5') }}" rel="stylesheet"> - {%if theme.swatch == 'default' %} - <link href="{{ admin_static.url(filename='bootstrap/bootstrap3/css/bootstrap-theme.min.css', v='3.3.5') }}" rel="stylesheet"> - {%endif%} - <link href="{{ admin_static.url(filename='admin/css/bootstrap3/admin.css', v='1.1.1') }}" rel="stylesheet"> - <link href="{{ admin_static.url(filename='admin/css/bootstrap3/submenu.css') }}" rel="stylesheet"> - {% if admin_view.extra_css %} - {% for css_url in admin_view.extra_css %} - <link href="{{ css_url }}" rel="stylesheet"> - {% endfor %} - {% endif %} - <style> - body { - padding-top: 4px; - } - </style> - {% endblock %} - {% block head %} - {% endblock %} - {% block head_tail %} - {% endblock %} - </head> - <body> - {% block page_body %} - <div class="container{%if theme.fluid %}-fluid{% endif %}"> - <nav class="navbar navbar-default" role="navigation"> - <!-- Brand and toggle get grouped for better mobile display --> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#admin-navbar-collapse"> - <span class="sr-only">Toggle navigation</span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - {% block brand %} - <a class="navbar-brand" href="{{ admin_view.admin.url }}">{{ admin_view.admin.name }}</a> - {% endblock %} - </div> - <!-- navbar content --> - <div class="collapse navbar-collapse" id="admin-navbar-collapse"> - {% block main_menu %} - <ul class="nav navbar-nav"> - {{ layout.menu() }} - </ul> - {% endblock %} - - {% block menu_links %} - <ul class="nav navbar-nav navbar-right"> - {{ layout.menu_links() }} - </ul> - {% endblock %} - {% block access_control %} - {% endblock %} - </div> - </nav> - - {% block messages %} - {{ layout.messages() }} - {% endblock %} - - {# store the jinja2 context for form_rules rendering logic #} - {% set render_ctx = h.resolve_ctx() %} - - {% block body %}{% endblock %} - </div> - {% endblock %} - - {% block tail_js %} - <script src="{{ admin_static.url(filename='vendor/jquery.min.js', v='3.5.1') }}" type="text/javascript"></script> - <script src="{{ admin_static.url(filename='bootstrap/bootstrap3/js/bootstrap.min.js', v='3.3.5') }}" type="text/javascript"></script> - <script src="{{ admin_static.url(filename='vendor/moment.min.js', v='2.29.4') }}" type="text/javascript"></script> - <script src="{{ admin_static.url(filename='vendor/select2/select2.min.js', v='3.5.2') }}" type="text/javascript"></script> - <script src="{{ admin_static.url(filename='admin/js/helpers.js', v='1.0.0') }}" type="text/javascript"></script> - {% if admin_view.extra_js %} - {% for js_url in admin_view.extra_js %} - <script src="{{ js_url }}" type="text/javascript"></script> - {% endfor %} - {% endif %} - {% endblock %} - - {% block tail %} - {% endblock %} - </body> -</html> diff --git a/flask_admin/templates/bootstrap3/admin/file/form.html b/flask_admin/templates/bootstrap3/admin/file/form.html deleted file mode 100644 index 7a4474ad9..000000000 --- a/flask_admin/templates/bootstrap3/admin/file/form.html +++ /dev/null @@ -1,9 +0,0 @@ -{% extends 'admin/master.html' %} -{% import 'admin/lib.html' as lib with context %} - -{% block body %} - {% block header %}<h3>{{ header_text }}</h3>{% endblock %} - {% block fa_form %} - {{ lib.render_form(form, dir_url) }} - {% endblock %} -{% endblock %} diff --git a/flask_admin/templates/bootstrap3/admin/file/list.html b/flask_admin/templates/bootstrap3/admin/file/list.html deleted file mode 100644 index 330a8cc86..000000000 --- a/flask_admin/templates/bootstrap3/admin/file/list.html +++ /dev/null @@ -1,197 +0,0 @@ -{% extends 'admin/master.html' %} -{% import 'admin/lib.html' as lib with context %} -{% import 'admin/actions.html' as actionslib with context %} - -{% block body %} - {% block breadcrums %} - <ul class="breadcrumb"> - <li> - <a href="{{ get_dir_url('.index_view', path=None) }}">{{ _gettext('Root') }}</a> - </li> - {% for name, path in breadcrumbs[:-1] %} - <li> - <a href="{{ get_dir_url('.index_view', path=path) }}">{{ name }}</a> - </li> - {% endfor %} - {% if breadcrumbs %} - <li> - <a href="{{ get_dir_url('.index_view', path=breadcrumbs[-1][1]) }}">{{ breadcrumbs[-1][0] }}</a> - </li> - {% endif %} - </ul> - {% endblock %} - - {% block file_list_table %} - <div class="table-responsive"> - <table class="table table-striped table-bordered model-list"> - <thead> - <tr> - {% block list_header scoped %} - {% if actions %} - <th class="list-checkbox-column"> - <input type="checkbox" name="rowtoggle" class="action-rowtoggle" /> - </th> - {% endif %} - <th class="col-md-1"> </th> - {% for column in admin_view.column_list %} - <th> - {% if admin_view.is_column_sortable(column) %} - {% if sort_column == column %} - <a href="{{ sort_url(column, dir_path, True) }}" title="{{ _gettext('Sort by %(name)s', name=column) }}"> - {{ admin_view.column_label(column) }} - {% if sort_desc %} - <span class="fa fa-chevron-up glyphicon glyphicon-chevron-up"></span> - {% else %} - <span class="fa fa-chevron-down glyphicon glyphicon-chevron-down"></span> - {% endif %} - </a> - {% else %} - <a href="{{ sort_url(column, dir_path) }}" title="{{ _gettext('Sort by %(name)s', name=column) }}">{{ admin_view.column_label(column) }}</a> - {% endif %} - {% else %} - {{ _gettext(admin_view.column_label(column)) }} - {% endif %} - </th> - {% endfor %} - {% endblock %} - </tr> - </thead> - {% for name, path, is_dir, size, date in items %} - <tr> - {% block list_row scoped %} - {% if actions %} - <td> - {% if not is_dir %} - <input type="checkbox" name="rowid" class="action-checkbox" value="{{ path }}" /> - {% endif %} - </td> - {% endif %} - <td> - {% block list_row_actions scoped %} - {% if admin_view.can_rename and path and name != '..' %} - {%- if admin_view.rename_modal -%} - {{ lib.add_modal_button(url=get_url('.rename', path=path, modal=True), - title=_gettext('Rename File'), - content='<i class="fa fa-pencil glyphicon glyphicon-pencil"></i>') }} - {% else %} - <a class="icon" href="{{ get_url('.rename', path=path) }}" title="{{ _gettext('Rename File') }}"> - <i class="fa fa-pencil glyphicon glyphicon-pencil"></i> - </a> - {%- endif -%} - {% endif %} - {%- if admin_view.can_delete and path -%} - {% if is_dir %} - {% if name != '..' and admin_view.can_delete_dirs %} - <form class="icon" method="POST" action="{{ get_url('.delete') }}"> - {{ delete_form.path(value=path) }} - {% if delete_form.csrf_token %} - {{ delete_form.csrf_token }} - {% elif csrf_token %} - <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/> - {% endif %} - <button onclick="return confirm('{{ _gettext('Are you sure you want to delete \\\'%(name)s\\\' recursively?', name=name) }}')"> - <i class="fa fa-times glyphicon glyphicon-remove"></i> - </button> - </form> - {% endif %} - {% else %} - <form class="icon" method="POST" action="{{ get_url('.delete') }}"> - {{ delete_form.path(value=path) }} - {% if delete_form.csrf_token %} - {{ delete_form.csrf_token }} - {% elif csrf_token %} - <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/> - {% endif %} - <button onclick="return confirm('{{ _gettext('Are you sure you want to delete \\\'%(name)s\\\'?', name=name) }}')"> - <i class="fa fa-trash glyphicon glyphicon-trash"></i> - </button> - </form> - {% endif %} - {%- endif -%} - {% endblock %} - </td> - {% if is_dir %} - <td colspan="2"> - <a href="{{ get_dir_url('.index_view', path)|safe }}"> - <i class="fa fa-folder-o glyphicon glyphicon-folder-close"></i> <span>{{ name }}</span> - </a> - </td> - {% else %} - <td> - {% if admin_view.can_download %} - {%- if admin_view.edit_modal and admin_view.is_file_editable(path) -%} - {{ lib.add_modal_button(url=get_file_url(path, modal=True)|safe, - btn_class='', content=name) }} - {% else %} - <a href="{{ get_file_url(path)|safe }}">{{ name }}</a> - {%- endif -%} - {% else %} - {{ name }} - {% endif %} - </td> - {% if admin_view.is_column_visible('size') %} - <td> - {{ size|filesizeformat }} - </td> - {% endif %} - {% endif %} - {% if admin_view.is_column_visible('date') %} - <td> - {{ timestamp_format(date) }} - </td> - {% endif %} - {% endblock %} - </tr> - {% endfor %} - </table> - </div> - {% endblock %} - {% block toolbar %} - <div class="btn-toolbar"> - {% if admin_view.can_upload %} - <div class="btn-group"> - {%- if admin_view.upload_modal -%} - {{ lib.add_modal_button(url=get_dir_url('.upload', path=dir_path, modal=True), - btn_class="btn btn-default btn-large", - content=_gettext('Upload File')) }} - {% else %} - <a class="btn btn-default btn-large" href="{{ get_dir_url('.upload', path=dir_path) }}">{{ _gettext('Upload File') }}</a> - {%- endif -%} - </div> - {% endif %} - {% if admin_view.can_mkdir %} - <div class="btn-group"> - {%- if admin_view.mkdir_modal -%} - {{ lib.add_modal_button(url=get_dir_url('.mkdir', path=dir_path, modal=True), - btn_class="btn btn-default btn-large", - content=_gettext('Create Directory')) }} - {% else %} - <a class="btn btn-default btn-large" href="{{ get_dir_url('.mkdir', path=dir_path) }}">{{ _gettext('Create Directory') }}</a> - {%- endif -%} - </div> - {% endif %} - {% if actions %} - <div class="btn-group"> - {{ actionslib.dropdown(actions, 'dropdown-toggle btn btn-default btn-large') }} - </div> - {% endif %} - </div> - {% endblock %} - - {% block actions %} - {{ actionslib.form(actions, get_url('.action_view')) }} - {% endblock %} - - {%- if admin_view.rename_modal or admin_view.mkdir_modal - or admin_view.upload_modal or admin_view.edit_modal -%} - {{ lib.add_modal_window() }} - {%- endif -%} -{% endblock %} - -{% block tail %} - {{ super() }} - {{ actionslib.script(_gettext('Please select at least one file.'), - actions, - actions_confirmation) }} - <script src="{{ admin_static.url(filename='admin/js/bs3_modal.js', v='1.0.0') }}"></script> -{% endblock %} diff --git a/flask_admin/templates/bootstrap3/admin/file/modals/form.html b/flask_admin/templates/bootstrap3/admin/file/modals/form.html deleted file mode 100644 index 68d2f8725..000000000 --- a/flask_admin/templates/bootstrap3/admin/file/modals/form.html +++ /dev/null @@ -1,19 +0,0 @@ -{% import 'admin/static.html' as admin_static with context %} -{% import 'admin/lib.html' as lib with context %} - -{% block body %} - {# content added to modal-content #} - <div class="modal-header"> - <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> - {% block header %}<h3>{{ header_text }}</h3>{% endblock %} - </div> - <div class="modal-body"> - {% block fa_form %} - {{ lib.render_form(form, dir_url, action=request.url, is_modal=True) }} - {% endblock %} - </div> -{% endblock %} - -{% block tail %} - <script src="{{ admin_static.url(filename='admin/js/bs3_modal.js', v='1.0.0') }}"></script> -{% endblock %} diff --git a/flask_admin/templates/bootstrap3/admin/index.html b/flask_admin/templates/bootstrap3/admin/index.html deleted file mode 100644 index fbfdf4c0b..000000000 --- a/flask_admin/templates/bootstrap3/admin/index.html +++ /dev/null @@ -1,4 +0,0 @@ -{% extends 'admin/master.html' %} - -{% block body %} -{% endblock %} diff --git a/flask_admin/templates/bootstrap3/admin/layout.html b/flask_admin/templates/bootstrap3/admin/layout.html deleted file mode 100644 index a2f63ea15..000000000 --- a/flask_admin/templates/bootstrap3/admin/layout.html +++ /dev/null @@ -1,102 +0,0 @@ -{% macro menu_icon(item) -%} -{% set icon_type = item.get_icon_type() %} -{%- if icon_type %} - {% set icon_value = item.get_icon_value() %} - {% if icon_type == 'glyph' %} - <i class="glyphicon {{ icon_value }}"></i> - {% elif icon_type == 'fa' %} - <i class="fa {{ icon_value }}"></i> - {% elif icon_type == 'image' %} - <img src="{{ url_for('static', filename=icon_value) }}" alt="menu image"> - {% elif icon_type == 'image-url' %} - <img src="{{ icon_value }}" alt="menu image"> - {% endif %} -{% endif %} -{%- endmacro %} - -{% macro menu(menu_root=None) %} - {% if menu_root is none %}{% set menu_root = admin_view.admin.menu() %}{% endif %} - {%- for item in menu_root %} - {%- if item.is_category() -%} - {% set children = item.get_children() %} - {%- if children %} - {% set class_name = item.get_class_name() or '' %} - {%- if item.is_active(admin_view) %} - <li class="active dropdown{% if class_name %} {{class_name}}{% endif %}"> - {% else -%} - <li class="dropdown{% if class_name %} {{class_name}}{% endif %}"> - {%- endif %} - <a class="dropdown-toggle" data-toggle="dropdown" href="javascript:void(0)"> - {% if item.class_name %}<span class="{{ item.class_name }}"></span> {% endif %} - {{ menu_icon(item) }}{{ item.name }} - {%- if 'dropdown-submenu' in class_name -%} - <i class="glyphicon glyphicon-chevron-right small"></i> - {%- else -%} - <i class="glyphicon glyphicon-chevron-down small"></i> - {%- endif -%} - </a> - <ul class="dropdown-menu"> - {%- for child in children -%} - {%- if child.is_category() -%} - {{ menu(menu_root=[child]) }} - {% else %} - {% set class_name = child.get_class_name() %} - {%- if child.is_active(admin_view) %} - <li class="active{% if class_name %} {{class_name}}{% endif %}"> - {% else %} - <li{% if class_name %} class="{{class_name}}"{% endif %}> - {%- endif %} - <a href="{{ child.get_url() }}"{% if child.target %} - target="{{ child.target }}"{% endif %}> - {{ menu_icon(child) }}{{ child.name }}</a> - </li> - {%- endif %} - {%- endfor %} - </ul> - </li> - {% endif %} - {%- else %} - {%- if item.is_accessible() and item.is_visible() -%} - {% set class_name = item.get_class_name() %} - {%- if item.is_active(admin_view) %} - <li class="active{% if class_name %} {{class_name}}{% endif %}"> - {%- else %} - <li{% if class_name %} class="{{class_name}}"{% endif %}> - {%- endif %} - <a href="{{ item.get_url() }}"{% if item.target %} target="{{ item.target }}"{% endif %}>{{ menu_icon(item) }}{{ item.name }}</a> - </li> - {%- endif -%} - {% endif -%} - {% endfor %} -{% endmacro %} - -{% macro menu_links(links=None) %} - {% if links is none %}{% set links = admin_view.admin.menu_links() %}{% endif %} - {% for item in links %} - {% set class_name = item.get_class_name() %} - {% if item.is_accessible() and item.is_visible() %} - <li{% if class_name %} class="{{ class_name }}"{% endif %}> - <a href="{{ item.get_url() }}">{{ menu_icon(item) }}{{ item.name }}</a> - </li> - {% endif %} - {% endfor %} -{% endmacro %} - -{% macro messages() %} - {% with messages = get_flashed_messages(with_categories=True) %} - {% if messages %} - {% for category, m in messages %} - {% if category %} - {# alert-error changed to alert-danger in bootstrap 3, mapping is for backwards compatibility #} - {% set mapping = {'message': 'info', 'error': 'danger'} %} - <div class="alert alert-{{ mapping.get(category, category) }} alert-dismissable"> - {% else %} - <div class="alert alert-dismissable"> - {% endif %} - <button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button> - {{ m }} - </div> - {% endfor %} - {% endif %} - {% endwith %} -{% endmacro %} diff --git a/flask_admin/templates/bootstrap3/admin/lib.html b/flask_admin/templates/bootstrap3/admin/lib.html deleted file mode 100644 index d3a441118..000000000 --- a/flask_admin/templates/bootstrap3/admin/lib.html +++ /dev/null @@ -1,257 +0,0 @@ -{% import 'admin/static.html' as admin_static with context %} - -{# ---------------------- Pager -------------------------- #} -{% macro pager(page, pages, generator) -%} -{% if pages > 1 %} -<ul class="pagination"> - {% set min = page - 3 %} - {% set max = page + 3 + 1 %} - - {% if min < 0 %} - {% set max = max - min %} - {% endif %} - {% if max >= pages %} - {% set min = min - max + pages %} - {% endif %} - - {% if min < 0 %} - {% set min = 0 %} - {% endif %} - {% if max >= pages %} - {% set max = pages %} - {% endif %} - - {% if min > 0 %} - <li> - <a href="{{ generator(0) }}">«</a> - </li> - {% else %} - <li class="disabled"> - <a href="javascript:void(0)">«</a> - </li> - {% endif %} - {% if page > 0 %} - <li> - <a href="{{ generator(page-1) }}"><</a> - </li> - {% else %} - <li class="disabled"> - <a href="javascript:void(0)"><</a> - </li> - {% endif %} - - {% for p in range(min, max) %} - {% if page == p %} - <li class="active"> - <a href="javascript:void(0)">{{ p + 1 }}</a> - </li> - {% else %} - <li> - <a href="{{ generator(p) }}">{{ p + 1 }}</a> - </li> - {% endif %} - {% endfor %} - - {% if page + 1 < pages %} - <li> - <a href="{{ generator(page + 1) }}">></a> - </li> - {% else %} - <li class="disabled"> - <a href="javascript:void(0)">></a> - </li> - {% endif %} - {% if max < pages %} - <li> - <a href="{{ generator(pages - 1) }}">»</a> - </li> - {% else %} - <li class="disabled"> - <a href="javascript:void(0)">»</a> - </li> - {% endif %} -</ul> -{% endif %} -{%- endmacro %} - -{% macro simple_pager(page, have_next, generator) -%} -<ul class="pagination"> - {% if page > 0 %} - <li> - <a href="{{ generator(page - 1) }}"><</a> - </li> - {% else %} - <li class="disabled"> - <a href="{{ generator(0) }}"><</a> - </li> - {% endif %} - {% if have_next %} - <li> - <a href="{{ generator(page + 1) }}">></a> - </li> - {% else %} - <li class="disabled"> - <a href="{{ generator(page) }}">></a> - </li> - {% endif %} -</ul> -{%- endmacro %} - -{# ---------------------- Modal Window ------------------- #} -{% macro add_modal_window(modal_window_id='fa_modal_window', modal_label_id='fa_modal_label') %} - <div class="modal fade" id="{{ modal_window_id }}" tabindex="-1" role="dialog" aria-labelledby="{{ modal_label_id }}"> - <div class="modal-dialog" role="document"> - {# bootstrap version > 3.1.0 required for this to work #} - <div class="modal-content"> - </div> - </div> - </div> -{% endmacro %} - -{% macro add_modal_button(url='', title='', content='', modal_window_id='fa_modal_window', btn_class='icon') %} - <a class="{{ btn_class }}" data-target="#{{ modal_window_id }}" title="{{ title }}" href="{{ url }}" data-toggle="modal"> - {{ content|safe }} - </a> -{% endmacro %} - -{# ---------------------- Forms -------------------------- #} -{% macro render_field(form, field, kwargs={}, caller=None) %} - {% set direct_error = h.is_field_error(field.errors) %} - <div class="form-group{{ ' has-error' if direct_error else '' }}"> - <label for="{{ field.id }}" class="col-md-2 control-label">{{ field.label.text }} - {% if h.is_required_form_field(field) %} - <strong style="color: red">*</strong> - {%- else -%} - - {%- endif %} - </label> - <div class="{{ kwargs.get('column_class', 'col-md-10') }}"> - {% set _dummy = kwargs.setdefault('class', 'form-control') %} - {{ field(**kwargs)|safe }} - {% if field.description %} - <p class="help-block">{{ field.description|safe }}</p> - {% endif %} - {% if direct_error %} - <ul class="help-block input-errors"> - {% for e in field.errors if e is string %} - <li>{{ e }}</li> - {% endfor %} - </ul> - {% endif %} - </div> - {% if caller %} - {{ caller(form, field, direct_error, kwargs) }} - {% endif %} - </div> -{% endmacro %} - -{% macro render_header(form, text) %} - <h3>{{ text }}</h3> -{% endmacro %} - -{% macro render_form_fields(form, form_opts=None) %} - {% if form.hidden_tag is defined %} - {{ form.hidden_tag() }} - {% else %} - {% if csrf_token %} - <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/> - {% endif %} - {% for f in form if f.widget.input_type == 'hidden' %} - {{ f }} - {% endfor %} - {% endif %} - - {% if form_opts and form_opts.form_rules %} - {% for r in form_opts.form_rules %} - {{ r(form, form_opts=form_opts) }} - {% endfor %} - {% else %} - {% for f in form if f.widget.input_type != 'hidden' %} - {% if form_opts %} - {% set kwargs = form_opts.widget_args.get(f.short_name, {}) %} - {% else %} - {% set kwargs = {} %} - {% endif %} - {{ render_field(form, f, kwargs) }} - {% endfor %} - {% endif %} -{% endmacro %} - -{% macro form_tag(form=None, action=None) %} - <form action="{{ action or '' }}" method="POST" role="form" class="admin-form form-horizontal" enctype="multipart/form-data"> - {{ caller() }} - </form> -{% endmacro %} - -{% macro render_form_buttons(cancel_url, extra=None, is_modal=False) %} - <hr> - <div class="form-group"> - <div class="col-md-offset-2 col-md-10 submit-row"> - <input type="submit" class="btn btn-primary" value="{{ _gettext('Save') }}" /> - {% if extra %} - {{ extra }} - {% endif %} - {% if cancel_url %} - <a href="{{ cancel_url }}" class="btn btn-danger" role="button" {% if is_modal %}data-dismiss="modal"{% endif %}>{{ _gettext('Cancel') }}</a> - {% endif %} - </div> - </div> -{% endmacro %} - -{% macro render_form(form, cancel_url, extra=None, form_opts=None, action=None, is_modal=False) -%} - {% call form_tag(action=action) %} - {{ render_form_fields(form, form_opts=form_opts) }} - {{ render_form_buttons(cancel_url, extra, is_modal) }} - {% endcall %} -{% endmacro %} - -{% macro form_css() %} - <link href="{{ admin_static.url(filename='vendor/select2/select2.css', v='3.5.2') }}" rel="stylesheet"> - <link href="{{ admin_static.url(filename='vendor/select2/select2-bootstrap3.css', v='1.4.6') }}" rel="stylesheet"> - <link href="{{ admin_static.url(filename='vendor/bootstrap-daterangepicker/daterangepicker-bs3.css', v='1.3.22') }}" rel="stylesheet"> - {% if config.FLASK_ADMIN_MAPS %} - <link href="{{ admin_static.url(filename='vendor/leaflet/leaflet.css', v='1.0.2') }}" rel="stylesheet"> - <link href="{{ admin_static.url(filename='vendor/leaflet/leaflet.draw.css', v='0.4.6') }}" rel="stylesheet"> - {% endif %} - {% if editable_columns %} - <link href="{{ admin_static.url(filename='vendor/x-editable/css/bootstrap3-editable.css', v='1.5.1.1') }}" rel="stylesheet"> - {% endif %} -{% endmacro %} - -{% macro form_js() %} - {% if config.FLASK_ADMIN_MAPS %} - <script> - window.FLASK_ADMIN_MAPS = true; - window.FLASK_ADMIN_MAPBOX_MAP_ID = "{{ config.FLASK_ADMIN_MAPBOX_MAP_ID }}"; - {% if config.FLASK_ADMIN_MAPBOX_ACCESS_TOKEN %} - window.FLASK_ADMIN_MAPBOX_ACCESS_TOKEN = "{{ config.FLASK_ADMIN_MAPBOX_ACCESS_TOKEN }}"; - {% endif %} - {% if config.FLASK_ADMIN_DEFAULT_CENTER_LAT and config.FLASK_ADMIN_DEFAULT_CENTER_LONG %} - window.FLASK_ADMIN_DEFAULT_CENTER_LAT = "{{ config.FLASK_ADMIN_DEFAULT_CENTER_LAT }}"; - window.FLASK_ADMIN_DEFAULT_CENTER_LONG = "{{ config.FLASK_ADMIN_DEFAULT_CENTER_LONG }}"; - {% endif %} - </script> - <script src="{{ admin_static.url(filename='vendor/leaflet/leaflet.js', v='1.0.2') }}"></script> - <script src="{{ admin_static.url(filename='vendor/leaflet/leaflet.draw.js', v='0.4.6') }}"></script> - {% if config.FLASK_ADMIN_MAPS_SEARCH %} - <script> - window.FLASK_ADMIN_MAPS_SEARCH = "{{ config.FLASK_ADMIN_MAPS_SEARCH }}"; - </script> - <script src="https://maps.googleapis.com/maps/api/js?v=3&libraries=places&key={{ config.get('FLASK_ADMIN_GOOGLE_MAPS_API_KEY') }}"></script> - {% endif %} - {% endif %} - <script src="{{ admin_static.url(filename='vendor/bootstrap-daterangepicker/daterangepicker.js', v='1.3.22') }}"></script> - {% if editable_columns %} - <script src="{{ admin_static.url(filename='vendor/x-editable/js/bootstrap3-editable.min.js', v='1.5.1.1') }}"></script> - {% endif %} - <script src="{{ admin_static.url(filename='admin/js/form.js', v='1.0.1') }}"></script> -{% endmacro %} - -{% macro extra() %} - {% if admin_view.can_create %} - <input name="_add_another" type="submit" class="btn btn-default" value="{{ _gettext('Save and Add Another') }}" /> - {% endif %} - {% if admin_view.can_edit %} - <input name="_continue_editing" type="submit" class="btn btn-default" value="{{ _gettext('Save and Continue Editing') }}" /> - {% endif %} -{% endmacro %} diff --git a/flask_admin/templates/bootstrap3/admin/master.html b/flask_admin/templates/bootstrap3/admin/master.html deleted file mode 100644 index 8f27dad00..000000000 --- a/flask_admin/templates/bootstrap3/admin/master.html +++ /dev/null @@ -1 +0,0 @@ -{% extends admin_base_template %} diff --git a/flask_admin/templates/bootstrap3/admin/model/create.html b/flask_admin/templates/bootstrap3/admin/model/create.html deleted file mode 100644 index 9e0834edb..000000000 --- a/flask_admin/templates/bootstrap3/admin/model/create.html +++ /dev/null @@ -1,30 +0,0 @@ -{% extends 'admin/master.html' %} -{% import 'admin/lib.html' as lib with context %} -{% from 'admin/lib.html' import extra with context %} {# backward compatible #} - -{% block head %} - {{ super() }} - {{ lib.form_css() }} -{% endblock %} - -{% block body %} - {% block navlinks %} - <ul class="nav nav-tabs"> - <li> - <a href="{{ return_url }}">{{ _gettext('List') }}</a> - </li> - <li class="active"> - <a href="javascript:void(0)">{{ _gettext('Create') }}</a> - </li> - </ul> - {% endblock %} - - {% block create_form %} - {{ lib.render_form(form, return_url, extra(), form_opts) }} - {% endblock %} -{% endblock %} - -{% block tail %} - {{ super() }} - {{ lib.form_js() }} -{% endblock %} diff --git a/flask_admin/templates/bootstrap3/admin/model/details.html b/flask_admin/templates/bootstrap3/admin/model/details.html deleted file mode 100644 index 0008c5a1b..000000000 --- a/flask_admin/templates/bootstrap3/admin/model/details.html +++ /dev/null @@ -1,52 +0,0 @@ -{% extends 'admin/master.html' %} -{% import 'admin/lib.html' as lib with context %} - -{% block body %} - {% block navlinks %} - <ul class="nav nav-tabs"> - <li> - <a href="{{ return_url }}">{{ _gettext('List') }}</a> - </li> - {%- if admin_view.can_create -%} - <li> - <a href="{{ get_url('.create_view', url=return_url) }}">{{ _gettext('Create') }}</a> - </li> - {%- endif -%} - {%- if admin_view.can_edit -%} - <li> - <a href="{{ get_url('.edit_view', id=request.args.get('id'), url=return_url) }}">{{ _gettext('Edit') }}</a> - </li> - {%- endif -%} - <li class="active"> - <a href="javascript:void(0)">{{ _gettext('Details') }}</a> - </li> - </ul> - {% endblock %} - - {% block details_search %} - <div class="input-group fa_filter_container col-lg-6"> - <span class="input-group-addon">{{ _gettext('Filter') }}</span> - <input id="fa_filter" type="text" class="form-control"> - </div> - {% endblock %} - - {% block details_table %} - <table class="table table-hover table-bordered searchable"> - {% for c, name in details_columns %} - <tr> - <td> - <b>{{ name }}</b> - </td> - <td> - {{ get_value(model, c) }} - </td> - </tr> - {% endfor %} - </table> - {% endblock %} -{% endblock %} - -{% block tail %} - {{ super() }} - <script src="{{ admin_static.url(filename='admin/js/details_filter.js', v='1.0.0') }}"></script> -{% endblock %} diff --git a/flask_admin/templates/bootstrap3/admin/model/edit.html b/flask_admin/templates/bootstrap3/admin/model/edit.html deleted file mode 100644 index 5bd409992..000000000 --- a/flask_admin/templates/bootstrap3/admin/model/edit.html +++ /dev/null @@ -1,40 +0,0 @@ -{% extends 'admin/master.html' %} -{% import 'admin/lib.html' as lib with context %} -{% from 'admin/lib.html' import extra with context %} {# backward compatible #} - -{% block head %} - {{ super() }} - {{ lib.form_css() }} -{% endblock %} - -{% block body %} - {% block navlinks %} - <ul class="nav nav-tabs"> - <li> - <a href="{{ return_url }}">{{ _gettext('List') }}</a> - </li> - {%- if admin_view.can_create -%} - <li> - <a href="{{ get_url('.create_view', url=return_url) }}">{{ _gettext('Create') }}</a> - </li> - {%- endif -%} - <li class="active"> - <a href="javascript:void(0)">{{ _gettext('Edit') }}</a> - </li> - {%- if admin_view.can_view_details -%} - <li> - <a href="{{ get_url('.details_view', id=request.args.get('id'), url=return_url) }}">{{ _gettext('Details') }}</a> - </li> - {%- endif -%} - </ul> - {% endblock %} - - {% block edit_form %} - {{ lib.render_form(form, return_url, extra(), form_opts) }} - {% endblock %} -{% endblock %} - -{% block tail %} - {{ super() }} - {{ lib.form_js() }} -{% endblock %} diff --git a/flask_admin/templates/bootstrap3/admin/model/inline_field_list.html b/flask_admin/templates/bootstrap3/admin/model/inline_field_list.html deleted file mode 100644 index b19dc2ee3..000000000 --- a/flask_admin/templates/bootstrap3/admin/model/inline_field_list.html +++ /dev/null @@ -1,15 +0,0 @@ -{% import 'admin/model/inline_list_base.html' as base with context %} - -{% macro render_field(field) %} - {{ field }} - - {% if h.is_field_error(field.errors) %} - <ul class="help-block input-errors"> - {% for e in field.errors if e is string %} - <li>{{ e }}</li> - {% endfor %} - </ul> - {% endif %} -{% endmacro %} - -{{ base.render_inline_fields(field, template, render_field, check) }} diff --git a/flask_admin/templates/bootstrap3/admin/model/inline_form.html b/flask_admin/templates/bootstrap3/admin/model/inline_form.html deleted file mode 100644 index 6ae3f6c05..000000000 --- a/flask_admin/templates/bootstrap3/admin/model/inline_form.html +++ /dev/null @@ -1,4 +0,0 @@ -{% import 'admin/lib.html' as lib with context %} -<div class="inline-form-field"> - {{ lib.render_form_fields(field.form, form_opts=form_opts) }} -</div> diff --git a/flask_admin/templates/bootstrap3/admin/model/inline_list_base.html b/flask_admin/templates/bootstrap3/admin/model/inline_list_base.html deleted file mode 100644 index 79a93db38..000000000 --- a/flask_admin/templates/bootstrap3/admin/model/inline_list_base.html +++ /dev/null @@ -1,45 +0,0 @@ -{% macro render_inline_fields(field, template, render, check=None) %} -<div class="inline-field" id="{{ field.id }}"> - {# existing inline form fields #} - <div class="inline-field-list"> - {% for subfield in field %} - <div id="{{ subfield.id }}" class="inline-field well well-sm"> - {%- if not check or check(subfield) %} - <legend> - <small> - {{ field.label.text }} #{{ loop.index }} - <div class="pull-right"> - {% if subfield.get_pk and subfield.get_pk() %} - <input type="checkbox" name="del-{{ subfield.id }}" id="del-{{ subfield.id }}" /> - <label for="del-{{ subfield.id }}" style="display: inline">{{ _gettext('Delete?') }}</label> - {% else %} - <a href="javascript:void(0)" value="{{ _gettext('Are you sure you want to delete this record?') }}" class="inline-remove-field"><i class="fa fa-times glyphicon glyphicon-remove"></i></a> - {% endif %} - </div> - </small> - </legend> - <div class='clearfix'></div> - {%- endif -%} - {{ render(subfield) }} - </div> - {% endfor %} - </div> - - {# template for new inline form fields #} - <div class="inline-field-template hide"> - {% filter forceescape %} - <div class="inline-field well well-sm"> - <legend> - <small>{{ _gettext('New') }} {{ field.label.text }}</small> - <div class="pull-right"> - <a href="javascript:void(0)" value="{{ _gettext('Are you sure you want to delete this record?') }}" class="inline-remove-field"><span class="fa fa-times glyphicon glyphicon-remove"></span></a> - </div> - </legend> - <div class='clearfix'></div> - {{ render(template) }} - </div> - {% endfilter %} - </div> - <a id="{{ field.id }}-button" href="javascript:void(0)" class="btn btn-default" onclick="faForm.addInlineField(this, '{{ field.id }}');">{{ _gettext('Add') }} {{ field.label.text }}</a> -</div> -{% endmacro %} diff --git a/flask_admin/templates/bootstrap3/admin/model/layout.html b/flask_admin/templates/bootstrap3/admin/model/layout.html deleted file mode 100644 index d31a39c74..000000000 --- a/flask_admin/templates/bootstrap3/admin/model/layout.html +++ /dev/null @@ -1,107 +0,0 @@ -{% macro filter_options(btn_class='dropdown-toggle') %} - <a class="{{ btn_class }}" data-toggle="dropdown" href="javascript:void(0)"> - {{ _gettext('Add Filter') }}<b class="caret"></b> - </a> - <ul class="dropdown-menu field-filters"> - {% for k in filter_groups %} - <li> - <a href="javascript:void(0)" class="filter" onclick="return false;">{{ k }}</a> - </li> - {% endfor %} - </ul> -{% endmacro %} - -{% macro export_options(btn_class='dropdown-toggle') %} - {% if admin_view.export_types|length > 1 %} - <li class="dropdown"> - <a class="{{ btn_class }}" data-toggle="dropdown" href="javascript:void(0)"> - {{ _gettext('Export') }}<b class="caret"></b> - </a> - <ul class="dropdown-menu field-filters"> - {% for export_type in admin_view.export_types %} - <li> - <a href="{{ get_url('.export', export_type=export_type, **request.args) }}" title="{{ _gettext('Export') }}">{{ _gettext('Export') + ' ' + export_type|upper }}</a> - </li> - {% endfor %} - </ul> - </li> - {% else %} - <li> - <a href="{{ get_url('.export', export_type=admin_view.export_types[0], **request.args) }}" title="{{ _gettext('Export') }}">{{ _gettext('Export') }}</a> - </li> - {% endif %} -{% endmacro %} - -{% macro filter_form() %} - <form id="filter_form" method="GET" action="{{ return_url }}"> - {% for arg_name, arg_value in extra_args.items() %} - <input type="hidden" name="{{ arg_name }}" value="{{ arg_value }}"> - {% endfor %} - {% if sort_column is not none %} - <input type="hidden" name="sort" value="{{ sort_column }}"> - {% endif %} - {% if sort_desc %} - <input type="hidden" name="desc" value="1"> - {% endif %} - {% if search %} - <input type="hidden" name="search" value="{{ search }}"> - {% endif %} - {% if page_size != default_page_size %} - <input type="hidden" name="page_size" value="{{ page_size }}"> - {% endif %} - <div class="pull-right"> - <button type="submit" class="btn btn-primary" style="display: none">{{ _gettext('Apply') }}</button> - {% if active_filters %} - <a href="{{ clear_search_url }}" class="btn btn-default">{{ _gettext('Reset Filters') }}</a> - {% endif %} - </div> - - <table class="filters"></table> - </form> - <div class="clearfix"></div> -{% endmacro %} - -{% macro search_form(input_class=None) %} -<form method="GET" action="{{ return_url }}" class="navbar-form navbar-left" role="search"> - {% for flt_name, flt_value in filter_args.items() %} - <input type="hidden" name="{{ flt_name }}" value="{{ flt_value }}"> - {% endfor %} - {% for arg_name, arg_value in extra_args.items() %} - <input type="hidden" name="{{ arg_name }}" value="{{ arg_value }}"> - {% endfor %} - {% if page_size != default_page_size %} - <input type="hidden" name="page_size" value="{{ page_size }}"> - {% endif %} - {% if sort_column is not none %} - <input type="hidden" name="sort" value="{{ sort_column }}"> - {% endif %} - {% if sort_desc %} - <input type="hidden" name="desc" value="1"> - {% endif %} - {%- set full_search_placeholder = _gettext('Search') %} - {%- set max_size = config.get('FLASK_ADMIN_SEARCH_SIZE_MAX', 100) %} - {%- if search_placeholder %}{% set full_search_placeholder = [full_search_placeholder, search_placeholder] | join(": ") %}{% endif %} - {%- set input_size = [[full_search_placeholder | length, 30] | max, max_size] | min %} - {% if search %} - <div class="input-group"> - <input type="search" name="search" value="{{ search }}" class="form-control{% if input_class %} {{ input_class }}{% endif %}" size="{{ input_size }}" placeholder="{{ full_search_placeholder }}"> - <a href="{{ clear_search_url }}" class="input-group-addon clear"><span class="fa fa-times glyphicon glyphicon-remove"></span></a> - </div> - {% else %} - <div class="form-group"> - <input type="search" name="search" value="" class="form-control{% if input_class %} {{ input_class }}{% endif %}" size="{{ input_size }}" placeholder="{{ full_search_placeholder }}"> - </div> - {% endif %} -</form> -{% endmacro %} - -{% macro page_size_form(generator, btn_class='dropdown-toggle') %} - <a class="{{ btn_class }}" data-toggle="dropdown" href="javascript:void(0)"> - {{ page_size }} {{ _gettext('items') }}<b class="caret"></b> - </a> - <ul class="dropdown-menu"> - <li><a href="{{ generator(20) }}">20 {{ _gettext('items') }}</a></li> - <li><a href="{{ generator(50) }}">50 {{ _gettext('items') }}</a></li> - <li><a href="{{ generator(100) }}">100 {{ _gettext('items') }}</a></li> - </ul> -{% endmacro %} diff --git a/flask_admin/templates/bootstrap3/admin/model/list.html b/flask_admin/templates/bootstrap3/admin/model/list.html deleted file mode 100755 index 11ef4332b..000000000 --- a/flask_admin/templates/bootstrap3/admin/model/list.html +++ /dev/null @@ -1,198 +0,0 @@ -{% extends 'admin/master.html' %} -{% import 'admin/lib.html' as lib with context %} -{% import 'admin/static.html' as admin_static with context%} -{% import 'admin/model/layout.html' as model_layout with context %} -{% import 'admin/actions.html' as actionlib with context %} -{% import 'admin/model/row_actions.html' as row_actions with context %} - -{% block head %} - {{ super() }} - {{ lib.form_css() }} -{% endblock %} - -{% block body %} - {% block model_menu_bar %} - <ul class="nav nav-tabs actions-nav"> - <li class="active"> - <a href="javascript:void(0)">{{ _gettext('List') }}{% if count %} ({{ count }}){% endif %}</a> - </li> - - {% if admin_view.can_create %} - <li> - {%- if admin_view.create_modal -%} - {{ lib.add_modal_button(url=get_url('.create_view', url=return_url, modal=True), title=_gettext('Create New Record'), content=_gettext('Create')) }} - {% else %} - <a href="{{ get_url('.create_view', url=return_url) }}" title="{{ _gettext('Create New Record') }}">{{ _gettext('Create') }}</a> - {%- endif -%} - </li> - {% endif %} - - {% if admin_view.can_export %} - {{ model_layout.export_options() }} - {% endif %} - - {% block model_menu_bar_before_filters %}{% endblock %} - - {% if filters %} - <li class="dropdown"> - {{ model_layout.filter_options() }} - </li> - {% endif %} - - {% if can_set_page_size %} - <li class="dropdown"> - {{ model_layout.page_size_form(page_size_url) }} - </li> - {% endif %} - - {% if actions %} - <li class="dropdown"> - {{ actionlib.dropdown(actions) }} - </li> - {% endif %} - - {% if search_supported %} - <li> - {{ model_layout.search_form() }} - </li> - {% endif %} - {% block model_menu_bar_after_filters %}{% endblock %} - </ul> - {% endblock %} - - {% if filters %} - {{ model_layout.filter_form() }} - <div class="clearfix"></div> - {% endif %} - - {% block model_list_table %} - <div class="table-responsive"> - <table class="table table-striped table-bordered table-hover model-list"> - <thead> - <tr> - {% block list_header scoped %} - {% if actions %} - <th class="list-checkbox-column"> - <input type="checkbox" name="rowtoggle" class="action-rowtoggle" title="{{ _gettext('Select all records') }}" /> - </th> - {% endif %} - {% block list_row_actions_header %} - {% if admin_view.column_display_actions %} - <th class="col-md-1"> </th> - {% endif %} - {% endblock %} - {% for c, name in list_columns %} - {% set column = loop.index0 %} - <th class="column-header col-{{c}}"> - {% if admin_view.is_sortable(c) %} - {% if sort_column == column %} - <a href="{{ sort_url(column, True) }}" title="{{ _gettext('Sort by %(name)s', name=name) }}"> - {{ name }} - {% if sort_desc %} - <span class="fa fa-chevron-up glyphicon glyphicon-chevron-up"></span> - {% else %} - <span class="fa fa-chevron-down glyphicon glyphicon-chevron-down"></span> - {% endif %} - </a> - {% else %} - <a href="{{ sort_url(column) }}" title="{{ _gettext('Sort by %(name)s', name=name) }}">{{ name }}</a> - {% endif %} - {% else %} - {{ name }} - {% endif %} - {% if admin_view.column_descriptions.get(c) %} - <a class="fa fa-question-circle glyphicon glyphicon-question-sign" - title="{{ admin_view.column_descriptions[c] }}" - href="javascript:void(0)" data-role="tooltip" - ></a> - {% endif %} - </th> - {% endfor %} - {% endblock %} - </tr> - </thead> - {% for row in data %} - <tr> - {% block list_row scoped %} - {% if actions %} - <td> - <input type="checkbox" name="rowid" class="action-checkbox" value="{{ get_pk_value(row) }}" title="{{ _gettext('Select record') }}" /> - </td> - {% endif %} - {% block list_row_actions_column scoped %} - {% if admin_view.column_display_actions %} - <td class="list-buttons-column"> - {% block list_row_actions scoped %} - {% for action in list_row_actions %} - {{ action.render_ctx(get_pk_value(row), row) }} - {% endfor %} - {% endblock %} - </td> - {%- endif -%} - {% endblock %} - - {% for c, name in list_columns %} - <td class="col-{{c}}"> - {% if admin_view.is_editable(c) %} - {% set form = list_forms[get_pk_value(row)] %} - {% if form.csrf_token %} - {{ form[c](pk=get_pk_value(row), display_value=get_value(row, c), csrf=form.csrf_token._value()) }} - {% elif csrf_token %} - {{ form[c](pk=get_pk_value(row), display_value=get_value(row, c), csrf=csrf_token()) }} - {% else %} - {{ form[c](pk=get_pk_value(row), display_value=get_value(row, c)) }} - {% endif %} - {% else %} - {{ get_value(row, c) }} - {% endif %} - </td> - {% endfor %} - {% endblock %} - </tr> - {% else %} - <tr> - <td colspan="999"> - {% block empty_list_message %} - <div class="text-center"> - {{ admin_view.get_empty_list_message() }} - </div> - {% endblock %} - </td> - </tr> - {% endfor %} - </table> - </div> - {% block list_pager %} - {% if num_pages is not none %} - {{ lib.pager(page, num_pages, pager_url) }} - {% else %} - {{ lib.simple_pager(page, data|length == page_size, pager_url) }} - {% endif %} - {% endblock %} - {% endblock %} - - {% block actions %} - {{ actionlib.form(actions, get_url('.action_view')) }} - {% endblock %} - - {%- if admin_view.edit_modal or admin_view.create_modal or admin_view.details_modal -%} - {{ lib.add_modal_window() }} - {%- endif -%} -{% endblock %} - -{% block tail %} - {{ super() }} - - {% if filter_groups %} - <div id="filter-groups-data" style="display:none;">{{ filter_groups|tojson|safe }}</div> - <div id="active-filters-data" style="display:none;">{{ active_filters|tojson|safe }}</div> - {% endif %} - - {{ lib.form_js() }} - <script src="{{ admin_static.url(filename='admin/js/filters.js', v='1.0.0') }}"></script> - <script src="{{ admin_static.url(filename='admin/js/bs3_modal.js', v='1.0.0') }}"></script> - - {{ actionlib.script(_gettext('Please select at least one record.'), - actions, - actions_confirmation) }} -{% endblock %} diff --git a/flask_admin/templates/bootstrap3/admin/model/modals/create.html b/flask_admin/templates/bootstrap3/admin/model/modals/create.html deleted file mode 100644 index 4638bfd0f..000000000 --- a/flask_admin/templates/bootstrap3/admin/model/modals/create.html +++ /dev/null @@ -1,24 +0,0 @@ -{% import 'admin/static.html' as admin_static with context%} -{% import 'admin/lib.html' as lib with context %} - -{# store the jinja2 context for form_rules rendering logic #} -{% set render_ctx = h.resolve_ctx() %} - -{% block body %} - <div class="modal-header"> - <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> - {% block header_text %}<h3>{{ _gettext('Create New Record') }}</h3>{% endblock %} - </div> - <div class="modal-body"> - {# "save and add" button is removed from modal (it won't function properly) #} - {% block create_form %} - {{ lib.render_form(form, return_url, extra=None, form_opts=form_opts, - action=url_for('.create_view', url=return_url), - is_modal=True) }} - {% endblock %} - </div> -{% endblock %} - -{% block tail %} - <script>window.faForm.applyGlobalStyles(document.getElementsByClassName('modal-content'));</script> -{% endblock %} diff --git a/flask_admin/templates/bootstrap3/admin/model/modals/details.html b/flask_admin/templates/bootstrap3/admin/model/modals/details.html deleted file mode 100755 index 540e31ae1..000000000 --- a/flask_admin/templates/bootstrap3/admin/model/modals/details.html +++ /dev/null @@ -1,40 +0,0 @@ -{% import 'admin/static.html' as admin_static with context%} -{% import 'admin/lib.html' as lib with context %} - -{% block body %} - <div class="modal-header"> - <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> - {% block header_text %} - <h3>{{ _gettext('View Record') + ' #' + request.args.get('id') }}</h3> - {% endblock %} - </div> - - <div class="modal-body"> - {% block details_search %} - <div class="input-group fa_filter_container col-lg-6"> - <span class="input-group-addon">{{ _gettext('Filter') }}</span> - <input id="fa_filter" type="text" class="form-control"> - </div> - {% endblock %} - - {% block details_table %} - <table class="table table-hover table-bordered searchable"> - {% for c, name in details_columns %} - <tr> - <td> - <b>{{ name }}</b> - </td> - <td> - {{ get_value(model, c) }} - </td> - </tr> - {% endfor %} - </table> - {% endblock %} - </div> -{% endblock %} - -{% block tail %} - <script src="{{ admin_static.url(filename='admin/js/details_filter.js', v='1.0.0') }}"></script> - <script>window.faForm.applyGlobalStyles(document.getElementsByClassName('modal-content'));</script> -{% endblock %} diff --git a/flask_admin/templates/bootstrap3/admin/model/modals/edit.html b/flask_admin/templates/bootstrap3/admin/model/modals/edit.html deleted file mode 100644 index ceaaca074..000000000 --- a/flask_admin/templates/bootstrap3/admin/model/modals/edit.html +++ /dev/null @@ -1,26 +0,0 @@ -{% import 'admin/static.html' as admin_static with context%} -{% import 'admin/lib.html' as lib with context %} - -{# store the jinja2 context for form_rules rendering logic #} -{% set render_ctx = h.resolve_ctx() %} - -{% block body %} - <div class="modal-header"> - <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> - {% block header_text %} - <h3>{{ _gettext('Edit Record') + ' #' + request.args.get('id') }}</h3> - {% endblock %} - </div> - <div class="modal-body"> - {# "save and continue" button is removed from modal (it won't function properly) #} - {% block edit_form %} - {{ lib.render_form(form, return_url, extra=None, form_opts=form_opts, - action=url_for('.edit_view', id=request.args.get('id'), url=return_url), - is_modal=True) }} - {% endblock %} - </div> -{% endblock %} - -{% block tail %} - <script>window.faForm.applyGlobalStyles(document.getElementsByClassName('modal-content'));</script> -{% endblock %} diff --git a/flask_admin/templates/bootstrap3/admin/model/row_actions.html b/flask_admin/templates/bootstrap3/admin/model/row_actions.html deleted file mode 100644 index 74d65ca43..000000000 --- a/flask_admin/templates/bootstrap3/admin/model/row_actions.html +++ /dev/null @@ -1,38 +0,0 @@ -{% import 'admin/lib.html' as lib with context %} - -{% macro link(action, url, icon_class=None) %} -<a class="icon" href="{{ url }}" title="{{ action.title or '' }}"> - <span class="{{ icon_class or action.icon_class }}"></span> -</a> -{% endmacro %} - -{% macro view_row(action, row_id, row) %} - {{ link(action, get_url('.details_view', id=row_id, url=return_url), 'fa fa-eye glyphicon glyphicon-eye-open') }} -{% endmacro %} - -{% macro view_row_popup(action, row_id, row) %} - {{ lib.add_modal_button(url=get_url('.details_view', id=row_id, url=return_url, modal=True), title=action.title, content='<span class="fa fa-eye glyphicon glyphicon-eye-open"></span>') }} -{% endmacro %} - -{% macro edit_row(action, row_id, row) %} - {{ link(action, get_url('.edit_view', id=row_id, url=return_url), 'fa fa-pencil glyphicon glyphicon-pencil') }} -{% endmacro %} - -{% macro edit_row_popup(action, row_id, row) %} - {{ lib.add_modal_button(url=get_url('.edit_view', id=row_id, url=return_url, modal=True), title=action.title, content='<span class="fa fa-pencil glyphicon glyphicon-pencil"></span>') }} -{% endmacro %} - -{% macro delete_row(action, row_id, row) %} -<form class="icon" method="POST" action="{{ get_url('.delete_view') }}"> - {{ delete_form.id(value=get_pk_value(row)) }} - {{ delete_form.url(value=return_url) }} - {% if delete_form.csrf_token %} - {{ delete_form.csrf_token }} - {% elif csrf_token %} - <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/> - {% endif %} - <button onclick="return faHelpers.safeConfirm('{{ _gettext('Are you sure you want to delete this record?') }}');" title="{{ _gettext('Delete record') }}"> - <span class="fa fa-trash glyphicon glyphicon-trash"></span> - </button> -</form> -{% endmacro %} diff --git a/flask_admin/templates/bootstrap3/admin/rediscli/console.html b/flask_admin/templates/bootstrap3/admin/rediscli/console.html deleted file mode 100644 index 368f55dda..000000000 --- a/flask_admin/templates/bootstrap3/admin/rediscli/console.html +++ /dev/null @@ -1,27 +0,0 @@ -{% extends 'admin/master.html' %} -{% import 'admin/lib.html' as lib with context %} -{% import 'admin/static.html' as admin_static with context%} - -{% block head %} - {{ super() }} - <link href="{{ admin_static.url(filename='admin/css/bootstrap3/rediscli.css', v='1.0.0') }}" rel="stylesheet"> -{% endblock %} - -{% block body %} -<div class="console"> - <div class="console-container"> - </div> - <div class="console-line"> - <form action="#"> - <input type="text"></input> - </form> - </div> -</div> -{% endblock %} - -{% block tail %} - {{ super() }} - - <div id="execute-view-data" style="display:none;">{{ admin_view.get_url('.execute_view')|tojson|safe }}</div> - <script src="{{ admin_static.url(filename='admin/js/rediscli.js', v='1.0.0') }}"></script> -{% endblock %} diff --git a/flask_admin/templates/bootstrap3/admin/rediscli/response.html b/flask_admin/templates/bootstrap3/admin/rediscli/response.html deleted file mode 100644 index f4a950a87..000000000 --- a/flask_admin/templates/bootstrap3/admin/rediscli/response.html +++ /dev/null @@ -1,32 +0,0 @@ -{% macro render(item, depth=0) %} - {% set type = type_name(item) %} - - {% if type == 'tuple' or type == 'list' %} - {% if not item %} - Empty {{ type }}. - {% else %} - {% for n in item %} - {{ loop.index }}) {{ render(n, depth + 1) }}<br/> - {% endfor %} - {% endif %} - {% elif type == 'bool' %} - {% if depth == 0 and item %} - OK - {% else %} - <span class="type-bool">{{ item }}</span> - {% endif %} - {% elif type == 'str' or type == 'unicode' %} - "{{ item }}" - {% elif type == 'bytes' %} - "{{ item.decode('utf-8') }}" - {% elif type == 'TextWrapper' %} - <pre>{{ item }}</pre> - {% elif type == 'dict' %} - {% for k, v in item.items() %} - {{ loop.index }}) {{ k }} - {{ render(v, depth + 1) }}<br/> - {% endfor %} - {% else %} - {{ item }} - {% endif %} -{% endmacro %} -{{ render(result) }} \ No newline at end of file diff --git a/flask_admin/templates/bootstrap3/admin/static.html b/flask_admin/templates/bootstrap3/admin/static.html deleted file mode 100644 index de632ee14..000000000 --- a/flask_admin/templates/bootstrap3/admin/static.html +++ /dev/null @@ -1,3 +0,0 @@ -{% macro url() -%} - {{ get_url('{admin_endpoint}.static'.format(admin_endpoint=admin_view.admin.endpoint), *varargs, **kwargs) }} -{%- endmacro %} diff --git a/flask_admin/tests/fileadmin/test_fileadmin.py b/flask_admin/tests/fileadmin/test_fileadmin.py index d48f71b06..3eb738108 100644 --- a/flask_admin/tests/fileadmin/test_fileadmin.py +++ b/flask_admin/tests/fileadmin/test_fileadmin.py @@ -2,7 +2,7 @@ import os import os.path as op -from flask_admin.theme import Bootstrap3Theme, Bootstrap4Theme +from flask_admin.theme import Bootstrap4Theme from flask_admin.contrib import fileadmin from flask_admin import Admin @@ -127,46 +127,6 @@ class MyFileAdmin(fileadmin_class): assert 'path=dummy_renamed_dir' not in rv.data.decode('utf-8') assert 'path=dummy.txt' in rv.data.decode('utf-8') - def test_modal_edit_bs3(self, app, babel): - admin_bs3 = Admin(app, theme=Bootstrap3Theme()) - - fileadmin_class = self.fileadmin_class() - fileadmin_args, fileadmin_kwargs = self.fileadmin_args() - - class EditModalOn(fileadmin_class): - edit_modal = True - editable_extensions = ('txt',) - - class EditModalOff(fileadmin_class): - edit_modal = False - editable_extensions = ('txt',) - - on_view_kwargs = dict(fileadmin_kwargs) - on_view_kwargs.setdefault('endpoint', 'edit_modal_on') - edit_modal_on = EditModalOn(*fileadmin_args, **on_view_kwargs) - - off_view_kwargs = dict(fileadmin_kwargs) - off_view_kwargs.setdefault('endpoint', 'edit_modal_off') - edit_modal_off = EditModalOff(*fileadmin_args, **off_view_kwargs) - - admin_bs3.add_view(edit_modal_on) - admin_bs3.add_view(edit_modal_off) - - client_bs3 = app.test_client() - - # bootstrap 3 - ensure modal window is added when edit_modal is - # enabled - rv = client_bs3.get('/admin/edit_modal_on/') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'fa_modal_window' in data - - # bootstrap 3 - test modal disabled - rv = client_bs3.get('/admin/edit_modal_off/') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'fa_modal_window' not in data - def test_modal_edit_bs4(self, app, babel): admin_bs4 = Admin(app, theme=Bootstrap4Theme()) diff --git a/flask_admin/tests/test_model.py b/flask_admin/tests/test_model.py index d25e8897f..38a7bc558 100644 --- a/flask_admin/tests/test_model.py +++ b/flask_admin/tests/test_model.py @@ -7,7 +7,7 @@ from flask_admin import Admin, form from flask_admin._compat import iteritems, itervalues -from flask_admin.theme import Bootstrap3Theme, Bootstrap4Theme +from flask_admin.theme import Bootstrap4Theme from flask_admin.model import base, filters from flask_admin.model.template import macro @@ -422,45 +422,6 @@ class TestForm(form.BaseForm): assert not hasattr(view._create_form_class, 'col1') -def test_modal_edit_bs3(app, babel): - admin_bs3 = Admin(app, theme=Bootstrap3Theme()) - - edit_modal_on = MockModelView(Model, edit_modal=True, endpoint="edit_modal_on") - edit_modal_off = MockModelView(Model, edit_modal=False, endpoint="edit_modal_off") - create_modal_on = MockModelView(Model, create_modal=True, endpoint="create_modal_on") - create_modal_off = MockModelView(Model, create_modal=False, endpoint="create_modal_off") - admin_bs3.add_view(edit_modal_on) - admin_bs3.add_view(edit_modal_off) - admin_bs3.add_view(create_modal_on) - admin_bs3.add_view(create_modal_off) - - client_bs3 = app.test_client() - - # bootstrap 3 - ensure modal window is added when edit_modal is enabled - rv = client_bs3.get('/admin/edit_modal_on/') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'fa_modal_window' in data - - # bootstrap 3 - test modal disabled - rv = client_bs3.get('/admin/edit_modal_off/') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'fa_modal_window' not in data - - # bootstrap 3 - ensure modal window is added when edit_modal is enabled - rv = client_bs3.get('/admin/create_modal_on/') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'fa_modal_window' in data - - # bootstrap 3 - test modal disabled - rv = client_bs3.get('/admin/create_modal_off/') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'fa_modal_window' not in data - - def test_modal_edit_bs4(app, babel): admin_bs4 = Admin(app, theme=Bootstrap4Theme()) diff --git a/flask_admin/theme.py b/flask_admin/theme.py index 2c19d44bf..bbee6b877 100644 --- a/flask_admin/theme.py +++ b/flask_admin/theme.py @@ -11,11 +11,10 @@ class Theme: @dataclass class BootstrapTheme(Theme): - folder: typing.Literal['bootstrap3', 'bootstrap4'] + folder: typing.Literal['bootstrap4'] base_template: str = 'admin/base.html' swatch: str = 'default' fluid: bool = False -Bootstrap3Theme = partial(BootstrapTheme, folder='bootstrap3') Bootstrap4Theme = partial(BootstrapTheme, folder='bootstrap4') From cbedb228f5d66755c82388e42c47bff25f917191 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Tue, 23 Jul 2024 21:33:52 +0100 Subject: [PATCH 058/156] Fix failing tests for bootstrap4 --- flask_admin/templates/bootstrap4/admin/model/layout.html | 3 +++ flask_admin/tests/test_base.py | 4 ++-- flask_admin/tests/test_host_matching.py | 5 ++--- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/flask_admin/templates/bootstrap4/admin/model/layout.html b/flask_admin/templates/bootstrap4/admin/model/layout.html index 7917dd1a0..00211f79a 100644 --- a/flask_admin/templates/bootstrap4/admin/model/layout.html +++ b/flask_admin/templates/bootstrap4/admin/model/layout.html @@ -30,6 +30,9 @@ {% macro filter_form() %} <form id="filter_form" method="GET" action="{{ return_url }}"> + {% for arg_name, arg_value in extra_args.items() %} + <input type="hidden" name="{{ arg_name }}" value="{{ arg_value }}"> + {% endfor %} {% if sort_column is not none %} <input type="hidden" name="sort" value="{{ sort_column }}"> {% endif %} diff --git a/flask_admin/tests/test_base.py b/flask_admin/tests/test_base.py index 63ac2ee30..74664adc5 100644 --- a/flask_admin/tests/test_base.py +++ b/flask_admin/tests/test_base.py @@ -164,7 +164,7 @@ def test_admin_customizations(app, babel): # test custom static_url_path with app.test_request_context('/'): - rv = client.get(url_for('admin.static', filename='bootstrap/bootstrap4/css/bootstrap.css')) + rv = client.get(url_for('admin.static', filename='bootstrap/bootstrap4/css/bootstrap.min.css')) assert rv.status_code == 200 @@ -400,7 +400,7 @@ def test_root_mount(app, babel): # test static files when url='/' with app.test_request_context('/'): - rv = client.get(url_for('admin.static', filename='bootstrap/bootstrap4/css/bootstrap.css')) + rv = client.get(url_for('admin.static', filename='bootstrap/bootstrap4/css/bootstrap.min.css')) rv.close() assert rv.status_code == 200 diff --git a/flask_admin/tests/test_host_matching.py b/flask_admin/tests/test_host_matching.py index b715a7d91..82c787ac1 100644 --- a/flask_admin/tests/test_host_matching.py +++ b/flask_admin/tests/test_host_matching.py @@ -132,7 +132,7 @@ def test_mounting_on_host(app, babel, initialise_using_init_app): # Check that static assets are embedded with the expected (relative) URLs assert ( b'<link href="/static/admin/bootstrap/bootstrap4/swatch' - b'/default/bootstrap.min.css?v=2.3.2" rel="stylesheet">' + b'/default/bootstrap.min.css?v=4.2.1"' in rv.data ) assert ( @@ -186,8 +186,7 @@ def test_mounting_on_wildcard_host(app, babel, initialise_using_init_app): # Check that static assets are embedded with the expected (relative) URLs assert ( b'<link href="/static/admin/bootstrap/bootstrap4/swatch' - b'/default/bootstrap.min.css?v=2.3.2" ' - b'rel="stylesheet">' + b'/default/bootstrap.min.css?v=4.2.1"' in rv.data ) assert ( From 260505fe73bc58009eedf8063264e334621e11f3 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Tue, 23 Jul 2024 21:51:34 +0100 Subject: [PATCH 059/156] Fix auth example for babel+theme change --- examples/auth/app.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/examples/auth/app.py b/examples/auth/app.py index 8710238e8..62973bf36 100644 --- a/examples/auth/app.py +++ b/examples/auth/app.py @@ -8,12 +8,14 @@ from flask_admin.theme import Bootstrap4Theme from flask_admin.contrib import sqla from flask_admin import helpers as admin_helpers +from flask_babel import Babel # Create Flask application app = Flask(__name__) app.config.from_pyfile('config.py') db = SQLAlchemy(app) +babel = Babel(app) # Define models @@ -97,6 +99,7 @@ def security_context_processor(): return dict( admin_base_template=admin.theme.base_template, admin_view=admin.index_view, + theme=admin.theme, h=admin_helpers, get_url=url_for ) From 3dd352670be8937fa2881bc9dcc73a2120b9f805 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Tue, 23 Jul 2024 22:15:16 +0100 Subject: [PATCH 060/156] Small example app fixes --- examples/auth/app.py | 2 -- examples/auth/templates/my_master.html | 2 +- examples/mongoengine/requirements.txt | 3 ++- examples/peewee/requirements.txt | 1 + 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/auth/app.py b/examples/auth/app.py index 62973bf36..134ca6873 100644 --- a/examples/auth/app.py +++ b/examples/auth/app.py @@ -8,14 +8,12 @@ from flask_admin.theme import Bootstrap4Theme from flask_admin.contrib import sqla from flask_admin import helpers as admin_helpers -from flask_babel import Babel # Create Flask application app = Flask(__name__) app.config.from_pyfile('config.py') db = SQLAlchemy(app) -babel = Babel(app) # Define models diff --git a/examples/auth/templates/my_master.html b/examples/auth/templates/my_master.html index 6a7ba8348..37aa28e2e 100644 --- a/examples/auth/templates/my_master.html +++ b/examples/auth/templates/my_master.html @@ -11,7 +11,7 @@ {{ current_user.email }} {%- endif %}<span class="caret"></span></a> <ul class="dropdown-menu" role="menu"> - <li><a href="{{ url_for('security.logout') }}">Log out</a></li> + <li><a class="text-black-50" href="{{ url_for('security.logout') }}">Log out</a></li> </ul> </div> {% endif %} diff --git a/examples/mongoengine/requirements.txt b/examples/mongoengine/requirements.txt index 385aeb98c..922ac3742 100644 --- a/examples/mongoengine/requirements.txt +++ b/examples/mongoengine/requirements.txt @@ -2,4 +2,5 @@ Flask Flask-Admin Flask-MongoEngine Flask-Login>=0.3.0 -Pillow \ No newline at end of file +Pillow +sqlalchemy diff --git a/examples/peewee/requirements.txt b/examples/peewee/requirements.txt index 5f4212903..67e5e59ea 100644 --- a/examples/peewee/requirements.txt +++ b/examples/peewee/requirements.txt @@ -2,3 +2,4 @@ Flask Flask-Admin peewee wtf-peewee +sqlalchemy From edf5990f0793386cd8b0cad124f261e612afde89 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Wed, 24 Jul 2024 09:43:53 +0100 Subject: [PATCH 061/156] Prevent hard requirement on optional deps when loading type information --- flask_admin/_types.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/flask_admin/_types.py b/flask_admin/_types.py index 57d221d22..9fd90cbd1 100644 --- a/flask_admin/_types.py +++ b/flask_admin/_types.py @@ -1,7 +1,8 @@ -from typing import Union, Sequence, Dict, Callable, Any +from typing import Union, Sequence, Dict, Callable, Any, TYPE_CHECKING -import sqlalchemy +if TYPE_CHECKING: + import sqlalchemy # noqa -T_COLUMN_LIST = Sequence[Union[str, sqlalchemy.Column]] +T_COLUMN_LIST = Sequence[Union[str, "sqlalchemy.Column"]] T_FORMATTER = Callable[[Any, Any, Any], Any] T_FORMATTERS = Dict[type, T_FORMATTER] From 6cad6c17d75a981f86d9999f9d943c6b1cec485c Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Wed, 24 Jul 2024 17:10:42 +0100 Subject: [PATCH 062/156] Record our dependencies using pip extras Flask-Admin does not yet support Flask v3+, WTForms v3+, or SQLAlchemy 2+. Let's clearly mark this. And then we also define a set of pip extras, which should let users pull in the supported versions of dependencies for additional features (eg supporting geography, mapping, redis CLI, exporting to lots of formats, etc). And fix our minimum python version from 3.6 to 3.8. This was done a little while ago, but not updated here correctly. --- examples/auth-flask-login/requirements.txt | 6 +- examples/auth-mongoengine/requirements.txt | 6 +- examples/auth/requirements.txt | 7 +-- examples/babel/requirements.txt | 6 +- examples/bootstrap4/requirements.txt | 5 +- examples/custom-layout/requirements.txt | 5 +- examples/forms-files-images/requirements.txt | 7 +-- examples/geo_alchemy/app.py | 2 - examples/geo_alchemy/requirements.txt | 10 ++- examples/host-matching/requirements.txt | 3 +- examples/methodview/requirements.txt | 3 +- examples/mongoengine/requirements.txt | 7 +-- .../multiple-admin-instances/requirements.txt | 3 +- examples/peewee/requirements.txt | 6 +- examples/pymongo/requirements.txt | 4 +- examples/simple/requirements.txt | 3 +- .../sqla-association_proxy/requirements.txt | 4 +- .../sqla-custom-inline-forms/requirements.txt | 5 +- examples/sqla/requirements.txt | 16 +---- examples/tinymongo/requirements.txt | 5 +- pyproject.toml | 61 ++++++++++++++++++- requirements/dev.txt | 17 ++++-- requirements/docs.txt | 6 +- requirements/tests.in | 48 +++++++++------ requirements/typing.txt | 18 +++--- tox.ini | 3 +- 26 files changed, 145 insertions(+), 121 deletions(-) diff --git a/examples/auth-flask-login/requirements.txt b/examples/auth-flask-login/requirements.txt index 2b4cc7cd2..78d1e8f78 100644 --- a/examples/auth-flask-login/requirements.txt +++ b/examples/auth-flask-login/requirements.txt @@ -1,4 +1,4 @@ -Flask -Flask-Admin -Flask-SQLAlchemy +# Install Flask-Admin with required extras from the root of the repository +../..[db-sqlalchemy] + Flask-Login>=0.3.0 diff --git a/examples/auth-mongoengine/requirements.txt b/examples/auth-mongoengine/requirements.txt index c1e73d241..532baeaad 100644 --- a/examples/auth-mongoengine/requirements.txt +++ b/examples/auth-mongoengine/requirements.txt @@ -1,4 +1,4 @@ -Flask -Flask-Admin -flask-mongoengine +# Install Flask-Admin with required extras from the root of the repository +../..[db-mongoengine] + Flask-Login>=0.3.0 diff --git a/examples/auth/requirements.txt b/examples/auth/requirements.txt index 33f9f6216..2bfc1d884 100644 --- a/examples/auth/requirements.txt +++ b/examples/auth/requirements.txt @@ -1,5 +1,4 @@ -Flask -Flask-Admin -Flask-SQLAlchemy +# Install Flask-Admin with required extras from the root of the repository +../..[db-sqlalchemy-with-utils] + flask-security-too -email_validator diff --git a/examples/babel/requirements.txt b/examples/babel/requirements.txt index f0e72f2b4..0524aefd7 100644 --- a/examples/babel/requirements.txt +++ b/examples/babel/requirements.txt @@ -1,4 +1,2 @@ -Flask -Flask-Admin -Flask-SQLAlchemy -Flask-Babel +# Install Flask-Admin with required extras from the root of the repository +../..[db-sqlalchemy,translation] diff --git a/examples/bootstrap4/requirements.txt b/examples/bootstrap4/requirements.txt index f0e0ebaf8..b0be83909 100644 --- a/examples/bootstrap4/requirements.txt +++ b/examples/bootstrap4/requirements.txt @@ -1,3 +1,2 @@ -Flask -Flask-Admin -Flask-SQLAlchemy +# Install Flask-Admin with required extras from the root of the repository +../..[db-sqlalchemy] diff --git a/examples/custom-layout/requirements.txt b/examples/custom-layout/requirements.txt index f0e0ebaf8..b0be83909 100644 --- a/examples/custom-layout/requirements.txt +++ b/examples/custom-layout/requirements.txt @@ -1,3 +1,2 @@ -Flask -Flask-Admin -Flask-SQLAlchemy +# Install Flask-Admin with required extras from the root of the repository +../..[db-sqlalchemy] diff --git a/examples/forms-files-images/requirements.txt b/examples/forms-files-images/requirements.txt index 8c069c110..9097f1e8f 100644 --- a/examples/forms-files-images/requirements.txt +++ b/examples/forms-files-images/requirements.txt @@ -1,5 +1,2 @@ -Flask -Flask-Admin -Flask-SQLAlchemy -pillow -redis +# Install Flask-Admin with required extras from the root of the repository +../..[db-sqlalchemy,images,rediscli] diff --git a/examples/geo_alchemy/app.py b/examples/geo_alchemy/app.py index 9257e537d..397145229 100644 --- a/examples/geo_alchemy/app.py +++ b/examples/geo_alchemy/app.py @@ -1,5 +1,4 @@ from flask import Flask -from flask_babel import Babel from flask_sqlalchemy import SQLAlchemy import flask_admin as admin @@ -11,7 +10,6 @@ # Create application app = Flask(__name__) -babel = Babel(app) app.config.from_pyfile('config.py') db = SQLAlchemy(app) diff --git a/examples/geo_alchemy/requirements.txt b/examples/geo_alchemy/requirements.txt index 2d1da2188..00c1c737a 100644 --- a/examples/geo_alchemy/requirements.txt +++ b/examples/geo_alchemy/requirements.txt @@ -1,6 +1,4 @@ -Flask -Flask-Admin -Flask-SQLAlchemy -shapely -geoalchemy2 -psycopg2 \ No newline at end of file +# Install Flask-Admin with required extras from the root of the repository +../..[db-sqlalchemy,db-geoalchemy] + +psycopg2 diff --git a/examples/host-matching/requirements.txt b/examples/host-matching/requirements.txt index a821c9bd4..aab0408ce 100644 --- a/examples/host-matching/requirements.txt +++ b/examples/host-matching/requirements.txt @@ -1,2 +1 @@ -Flask -Flask-Admin +../.. diff --git a/examples/methodview/requirements.txt b/examples/methodview/requirements.txt index a821c9bd4..aab0408ce 100644 --- a/examples/methodview/requirements.txt +++ b/examples/methodview/requirements.txt @@ -1,2 +1 @@ -Flask -Flask-Admin +../.. diff --git a/examples/mongoengine/requirements.txt b/examples/mongoengine/requirements.txt index 922ac3742..44b83daf7 100644 --- a/examples/mongoengine/requirements.txt +++ b/examples/mongoengine/requirements.txt @@ -1,6 +1,3 @@ -Flask -Flask-Admin -Flask-MongoEngine +../..[db-mongoengine,images] + Flask-Login>=0.3.0 -Pillow -sqlalchemy diff --git a/examples/multiple-admin-instances/requirements.txt b/examples/multiple-admin-instances/requirements.txt index a821c9bd4..aab0408ce 100644 --- a/examples/multiple-admin-instances/requirements.txt +++ b/examples/multiple-admin-instances/requirements.txt @@ -1,2 +1 @@ -Flask -Flask-Admin +../.. diff --git a/examples/peewee/requirements.txt b/examples/peewee/requirements.txt index 67e5e59ea..af92da7b3 100644 --- a/examples/peewee/requirements.txt +++ b/examples/peewee/requirements.txt @@ -1,5 +1 @@ -Flask -Flask-Admin -peewee -wtf-peewee -sqlalchemy +../..[db-peewee] diff --git a/examples/pymongo/requirements.txt b/examples/pymongo/requirements.txt index d208105e8..a9ca3de16 100644 --- a/examples/pymongo/requirements.txt +++ b/examples/pymongo/requirements.txt @@ -1,3 +1 @@ -Flask -Flask-Admin -pymongo +../..[db-pymongo] diff --git a/examples/simple/requirements.txt b/examples/simple/requirements.txt index a821c9bd4..aab0408ce 100644 --- a/examples/simple/requirements.txt +++ b/examples/simple/requirements.txt @@ -1,2 +1 @@ -Flask -Flask-Admin +../.. diff --git a/examples/sqla-association_proxy/requirements.txt b/examples/sqla-association_proxy/requirements.txt index f0e0ebaf8..5b323f878 100644 --- a/examples/sqla-association_proxy/requirements.txt +++ b/examples/sqla-association_proxy/requirements.txt @@ -1,3 +1 @@ -Flask -Flask-Admin -Flask-SQLAlchemy +../..[db-sqlalchemy] diff --git a/examples/sqla-custom-inline-forms/requirements.txt b/examples/sqla-custom-inline-forms/requirements.txt index 2952b5464..5b323f878 100644 --- a/examples/sqla-custom-inline-forms/requirements.txt +++ b/examples/sqla-custom-inline-forms/requirements.txt @@ -1,4 +1 @@ -Flask -Flask-Admin -Flask-SQLAlchemy -WTForms +../..[db-sqlalchemy] diff --git a/examples/sqla/requirements.txt b/examples/sqla/requirements.txt index efaafbd20..b8e21b9dd 100644 --- a/examples/sqla/requirements.txt +++ b/examples/sqla/requirements.txt @@ -1,14 +1,2 @@ -Flask -Flask-Admin -Flask-Babel -Flask-SQLAlchemy -tablib -enum34; python_version < '3.0' -sqlalchemy_utils -arrow -colour -email_validator - -# note: for local development, replace 'Flask-Admin' above with a reference to -# your local copy of the repo e.g. '-e .' if you're installing this from the -# repo's root directory +# Install Flask-Admin with required extras from the root of the repository +../..[db-sqlalchemy-with-utils,export,translation] diff --git a/examples/tinymongo/requirements.txt b/examples/tinymongo/requirements.txt index 000ae24cf..d06565f90 100644 --- a/examples/tinymongo/requirements.txt +++ b/examples/tinymongo/requirements.txt @@ -1,4 +1,3 @@ -Flask -Flask-Admin -pymongo==2.5.2 +../..[db-pymongo] + git+https://github.com/schapman1974/tinymongo.git#egg=tinymongo diff --git a/pyproject.toml b/pyproject.toml index ac2e3bd8d..776514f17 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,10 +20,65 @@ classifiers = [ 'Programming Language :: Python :: 3.11', 'Programming Language :: Python :: 3.12', ] -requires-python = ">=3.6" +requires-python = ">=3.8" dependencies = [ - "flask>=0.7", - "wtforms" + "flask>=2.0,<3", + "wtforms>=2,<3", +] + +[project.optional-dependencies] +db-sqlalchemy = [ + "flask-sqlalchemy>=3", + "sqlalchemy>=1.4,<2", +] +db-sqlalchemy-with-utils = [ + "Flask-Admin[db-sqlalchemy]", + "sqlalchemy_utils>=0.36.6", + "sqlalchemy-citext", + "colour", + "email_validator", + "arrow<0.14.0", +] +db-geoalchemy = [ + "Flask-Admin[db-sqlalchemy]", + "geoalchemy2", + "shapely>=2", +] +db-mongoengine = [ # TODO: seems out-of-date/unmaintained; replace or deprecate? + "Flask-Admin[db-sqlalchemy]", + "flask-mongoengine<1", + "Flask<2.3.0", # flask-mongoengine tries to access `flask.json` +] +db-pymongo = ["pymongo>=3.7.0"] +db-peewee = [ + "peewee>3", + "wtf-peewee>3" +] +db-appengine = [ + "Flask-Admin[db-sqlalchemy]", + "appengine-python-standard", + "wtforms-appengine" +] +files-s3 = ["boto"] # TODO: migrate to boto3 +files-azure = ["azure-storage-blob<=3"] # TODO: update to v12+ +images = ["pillow>=3.3.2"] +export = ["tablib"] +rediscli = ["redis"] +translation = ["flask-babel>=3"] +all = [ + "Flask-Admin[db-sqlalchemy]", + "Flask-Admin[db-sqlalchemy-with-utils]", + "Flask-Admin[db-geoalchemy]", + "Flask-Admin[db-mongoengine]", + "Flask-Admin[db-pymongo]", + "Flask-Admin[db-peewee]", + "Flask-Admin[db-appengine]", + "Flask-Admin[files-s3]", + "Flask-Admin[files-azure]", + "Flask-Admin[images]", + "Flask-Admin[export]", + "Flask-Admin[rediscli]", + "Flask-Admin[translation]", ] [project.urls] diff --git a/requirements/dev.txt b/requirements/dev.txt index d5f18631b..f665443db 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -32,10 +32,13 @@ azure-storage-common==2.1.0 babel==2.15.0 # via # -r docs.txt - # -r tests.in # -r typing.txt # flask-babel # sphinx +blinker==1.8.2 + # via + # -r typing.txt + # flask cachetools==5.3.3 # via tox certifi==2024.7.4 @@ -113,8 +116,9 @@ flake8==3.9.2 # via # -r tests.in # -r typing.txt -flask==2.1.3 +flask==3.0.3 # via + # -r tests.in # -r typing.txt # flask-babel # flask-mongoengine @@ -128,7 +132,7 @@ flask-mongoengine==0.8.2 # via # -r tests.in # -r typing.txt -flask-sqlalchemy==2.5.1 +flask-sqlalchemy==3.0.5 # via # -r tests.in # -r typing.txt @@ -166,7 +170,7 @@ isort==5.11.5 # via # -r typing.txt # pylint -itsdangerous==2.0.1 +itsdangerous==2.2.0 # via # -r tests.in # -r typing.txt @@ -184,13 +188,14 @@ lazy-object-proxy==1.9.0 # via # -r typing.txt # astroid -markupsafe==2.0.1 +markupsafe==2.1.5 # via # -r docs.txt # -r tests.in # -r typing.txt # jinja2 # types-wtforms + # werkzeug # wtforms mccabe==0.6.1 # via @@ -438,7 +443,7 @@ virtualenv==20.26.3 # via # pre-commit # tox -werkzeug==2.1.2 +werkzeug==3.0.3 # via # -r tests.in # -r typing.txt diff --git a/requirements/docs.txt b/requirements/docs.txt index 7de031b9a..296528734 100644 --- a/requirements/docs.txt +++ b/requirements/docs.txt @@ -7,9 +7,7 @@ alabaster==0.7.13 # via sphinx babel==2.15.0 - # via - # -c tests.in - # sphinx + # via sphinx certifi==2024.7.4 # via requests charset-normalizer==3.3.2 @@ -26,7 +24,7 @@ jinja2==3.1.4 # via # -c tests.in # sphinx -markupsafe==2.0.1 +markupsafe==2.1.5 # via # -c tests.in # jinja2 diff --git a/requirements/tests.in b/requirements/tests.in index 4952c7526..86c249654 100644 --- a/requirements/tests.in +++ b/requirements/tests.in @@ -1,30 +1,38 @@ -flake8 -werkzeug +flask>=2.3.0 # transitively pins werkzeug>=2.3.0, jinja2>=3.1.2, itsdangerous>=2.1.2 +werkzeug>=2.3.0 +jinja2>=3.1.2 +itsdangerous>=2.1.2 +MarkupSafe>=2.0.0 + +wtforms +Flask-Babel>=3.0.0 + +psycopg2 sqlalchemy<2.0 -itsdangerous<2.1.0 -MarkupSafe<2.1.0 -jinja2>=2.0.0 -Flask-SQLAlchemy<3.0.0 -peewee -wtf-peewee +Flask-SQLAlchemy>=3.0.0 +sqlalchemy-citext +sqlalchemy-utils>=0.36.6 + +geoalchemy2 + mongoengine pymongo>=3.7.0 flask-mongoengine==0.8.2 + +peewee +wtf-peewee + +azure-storage-blob<=3 + pillow>=3.3.2 -Babel>=2.0.0 -flask-babel>=3.0.0 shapely>=2 -geoalchemy2 -psycopg2 -pytest -pytest-cov -coveralls -pylint -sqlalchemy-citext -sqlalchemy-utils>=0.36.6 -azure-storage-blob<=3 arrow<0.14.0 colour email-validator -wtforms tablib + +coveralls +flake8 +pylint +pytest +pytest-cov diff --git a/requirements/typing.txt b/requirements/typing.txt index 3bce31eb3..ea9f2f6b7 100644 --- a/requirements/typing.txt +++ b/requirements/typing.txt @@ -17,9 +17,9 @@ azure-storage-blob==2.1.0 azure-storage-common==2.1.0 # via azure-storage-blob babel==2.15.0 - # via - # -r tests.in - # flask-babel + # via flask-babel +blinker==1.8.2 + # via flask certifi==2024.7.4 # via requests cffi==1.15.1 @@ -50,8 +50,9 @@ exceptiongroup==1.2.1 # via pytest flake8==3.9.2 # via -r tests.in -flask==2.1.3 +flask==3.0.3 # via + # -r tests.in # flask-babel # flask-mongoengine # flask-sqlalchemy @@ -60,7 +61,7 @@ flask-babel==4.0.0 # via -r tests.in flask-mongoengine==0.8.2 # via -r tests.in -flask-sqlalchemy==2.5.1 +flask-sqlalchemy==3.0.5 # via -r tests.in flask-wtf==1.1.1 # via flask-mongoengine @@ -76,7 +77,7 @@ iniconfig==2.0.0 # via pytest isort==5.11.5 # via pylint -itsdangerous==2.0.1 +itsdangerous==2.2.0 # via # -r tests.in # flask @@ -88,11 +89,12 @@ jinja2==3.1.4 # flask-babel lazy-object-proxy==1.9.0 # via astroid -markupsafe==2.0.1 +markupsafe==2.1.5 # via # -r tests.in # jinja2 # types-wtforms + # werkzeug # wtforms mccabe==0.6.1 # via @@ -217,7 +219,7 @@ typing-extensions==4.7.1 # pylint urllib3==2.0.7 # via requests -werkzeug==2.1.2 +werkzeug==3.0.3 # via # -r tests.in # flask diff --git a/tox.ini b/tox.ini index 9dfe9ddbe..3ccd1cdec 100644 --- a/tox.ini +++ b/tox.ini @@ -18,8 +18,7 @@ setenv = AZURE_STORAGE_CONNECTION_STRING = DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1; deps = -r requirements/tests.in - flask2: Flask>=2.0.0,<3 - wtforms1: WTForms==1.0.5 + flask2: Flask>=2.3.0,<3 wtforms2: WTForms>=2.0,<3 commands = pytest -v --tb=short --basetemp={envtmpdir} flask_admin/tests {posargs} From aa6d644e4179ef29f6b847bb7b07d4863096c025 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Wed, 24 Jul 2024 17:10:45 +0100 Subject: [PATCH 063/156] Update tox dependencies/setup And pin requirements files again now that we don't include any direct project dependencies within the `requirements/*` files. --- .github/workflows/tests.yaml | 10 +- requirements/build.txt | 8 +- requirements/dev.in | 1 + requirements/dev.txt | 255 ++++++----------------------------- requirements/docs.txt | 30 ++--- requirements/tests.in | 35 +---- requirements/tests.txt | 71 ++++++++++ requirements/typing.txt | 188 +++++--------------------- tox.ini | 23 ++-- 9 files changed, 174 insertions(+), 447 deletions(-) create mode 100644 requirements/tests.txt diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index d468c965f..980ca3b7a 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -15,20 +15,16 @@ on: - '*.rst' jobs: tests: - name: ${{ matrix.tox == 'normal' && format('py{0}-flask{1}-wtforms{2}', matrix.python, matrix.flask, matrix.wtforms) || matrix.tox }} + name: ${{ matrix.tox == 'normal' && format('py{0}', matrix.python) || matrix.tox }} runs-on: ${{ matrix.os || 'ubuntu-latest' }} strategy: fail-fast: false matrix: python: ['3.8', '3.9', '3.10', '3.11', '3.12'] - flask: ['2'] - wtforms: ['2'] tox: ['normal'] include: - python: '3.12' - flask: '2' - wtforms: '2' - tox: 'py312-flask2-wtforms2-no-flask-babel' + tox: 'py312-noflaskbabel' services: # Label used to access the service container postgres: @@ -75,7 +71,7 @@ jobs: PGPASSWORD: postgres run: psql -U postgres -h localhost -c 'CREATE EXTENSION hstore;' flask_admin_test - run: pip install tox - - run: tox run -e ${{ matrix.tox == 'normal' && format('py{0}-flask{1}-wtforms{2}', matrix.python, matrix.flask, matrix.wtforms) || matrix.tox }} + - run: tox run -e ${{ matrix.tox == 'normal' && format('py{0}', matrix.python) || matrix.tox }} not_tests: name: ${{ matrix.tox }} runs-on: ubuntu-latest diff --git a/requirements/build.txt b/requirements/build.txt index d3db1d5f6..a2fe14428 100644 --- a/requirements/build.txt +++ b/requirements/build.txt @@ -4,15 +4,15 @@ # # pip-compile build.in # -build==1.1.1 +build==1.2.1 # via -r build.in -importlib-metadata==6.7.0 +importlib-metadata==8.1.0 # via build -packaging==24.0 +packaging==24.1 # via build pyproject-hooks==1.1.0 # via build tomli==2.0.1 # via build -zipp==3.15.0 +zipp==3.19.2 # via importlib-metadata diff --git a/requirements/dev.in b/requirements/dev.in index 6d176eff4..6394d613a 100644 --- a/requirements/dev.in +++ b/requirements/dev.in @@ -1,5 +1,6 @@ -r docs.txt -r tests.in -r typing.txt + pre-commit tox diff --git a/requirements/dev.txt b/requirements/dev.txt index f665443db..d31ef15ae 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -8,49 +8,22 @@ alabaster==0.7.13 # via # -r docs.txt # sphinx -arrow==0.13.2 - # via - # -r tests.in - # -r typing.txt -astroid==2.15.8 +astroid==3.2.4 # via # -r typing.txt # pylint -azure-common==1.1.28 - # via - # -r typing.txt - # azure-storage-blob - # azure-storage-common -azure-storage-blob==2.1.0 - # via - # -r tests.in - # -r typing.txt -azure-storage-common==2.1.0 - # via - # -r typing.txt - # azure-storage-blob babel==2.15.0 # via # -r docs.txt - # -r typing.txt - # flask-babel # sphinx -blinker==1.8.2 - # via - # -r typing.txt - # flask -cachetools==5.3.3 +cachetools==5.4.0 # via tox certifi==2024.7.4 # via # -r docs.txt # -r typing.txt # requests -cffi==1.15.1 - # via - # -r typing.txt - # cryptography -cfgv==3.3.1 +cfgv==3.4.0 # via pre-commit chardet==5.2.0 # via tox @@ -59,155 +32,82 @@ charset-normalizer==3.3.2 # -r docs.txt # -r typing.txt # requests -click==8.1.7 - # via - # -r typing.txt - # flask colorama==0.4.6 # via tox -colour==0.1.5 - # via - # -r tests.in - # -r typing.txt -coverage[toml]==6.5.0 +coverage[toml]==7.6.0 # via # -r typing.txt # coveralls # pytest-cov -coveralls==3.3.1 +coveralls==4.0.1 # via # -r tests.in # -r typing.txt -cryptography==42.0.8 - # via - # -r typing.txt - # azure-storage-common -dill==0.3.7 +dill==0.3.8 # via # -r typing.txt # pylint distlib==0.3.8 # via virtualenv -dnspython==2.3.0 - # via - # -r typing.txt - # email-validator docopt==0.6.2 # via # -r typing.txt # coveralls -docutils==0.19 +docutils==0.20.1 # via # -r docs.txt # sphinx -email-validator==2.0.0.post2 - # via - # -r tests.in - # -r typing.txt -exceptiongroup==1.2.1 +exceptiongroup==1.2.2 # via # -r typing.txt # pytest -filelock==3.12.2 +filelock==3.15.4 # via # tox # virtualenv -flake8==3.9.2 - # via - # -r tests.in - # -r typing.txt -flask==3.0.3 - # via - # -r tests.in - # -r typing.txt - # flask-babel - # flask-mongoengine - # flask-sqlalchemy - # flask-wtf -flask-babel==4.0.0 - # via - # -r tests.in - # -r typing.txt -flask-mongoengine==0.8.2 - # via - # -r tests.in - # -r typing.txt -flask-sqlalchemy==3.0.5 - # via - # -r tests.in - # -r typing.txt -flask-wtf==1.1.1 - # via - # -r typing.txt - # flask-mongoengine -geoalchemy2==0.15.2 +flake8==7.1.0 # via # -r tests.in # -r typing.txt -identify==2.5.24 +identify==2.6.0 # via pre-commit idna==3.7 # via # -r docs.txt # -r typing.txt - # email-validator # requests imagesize==1.4.1 # via # -r docs.txt # sphinx -importlib-metadata==6.7.0 +importlib-metadata==8.1.0 # via # -r docs.txt - # -r typing.txt - # flask # sphinx iniconfig==2.0.0 # via # -r typing.txt # pytest -isort==5.11.5 +isort==5.13.2 # via # -r typing.txt # pylint -itsdangerous==2.2.0 - # via - # -r tests.in - # -r typing.txt - # flask - # flask-wtf jinja2==3.1.4 # via # -r docs.txt - # -r tests.in - # -r typing.txt - # flask - # flask-babel # sphinx -lazy-object-proxy==1.9.0 - # via - # -r typing.txt - # astroid markupsafe==2.1.5 # via # -r docs.txt - # -r tests.in # -r typing.txt # jinja2 # types-wtforms - # werkzeug - # wtforms -mccabe==0.6.1 +mccabe==0.7.0 # via # -r typing.txt # flake8 # pylint -mongoengine==0.21.0 - # via - # -r tests.in - # -r typing.txt - # flask-mongoengine -mypy==1.4.1 +mypy==1.11.0 # via -r typing.txt mypy-extensions==1.0.0 # via @@ -221,123 +121,86 @@ nodeenv==1.9.1 numpy==1.24.4 # via # -r typing.txt - # shapely # types-shapely -packaging==24.0 +packaging==24.1 # via # -r docs.txt # -r typing.txt - # geoalchemy2 # pallets-sphinx-themes # pyproject-api # pytest # sphinx # tox -pallets-sphinx-themes==2.0.3 +pallets-sphinx-themes==2.1.3 # via -r docs.txt -peewee==3.17.6 - # via - # -r tests.in - # -r typing.txt - # wtf-peewee -pillow==9.5.0 - # via - # -r tests.in - # -r typing.txt -platformdirs==4.0.0 +platformdirs==4.2.2 # via # -r typing.txt # pylint # tox # virtualenv -pluggy==1.2.0 +pluggy==1.5.0 # via # -r typing.txt # pytest # tox -pre-commit==2.21.0 +pre-commit==3.5.0 # via -r dev.in psycopg2==2.9.9 # via # -r tests.in # -r typing.txt -pycodestyle==2.7.0 +pycodestyle==2.12.0 # via # -r typing.txt # flake8 -pycparser==2.21 - # via - # -r typing.txt - # cffi -pyflakes==2.3.1 +pyflakes==3.2.0 # via # -r typing.txt # flake8 -pygments==2.17.2 +pygments==2.18.0 # via # -r docs.txt # sphinx -pylint==2.17.7 - # via - # -r tests.in - # -r typing.txt -pymongo==3.13.0 +pylint==3.2.6 # via # -r tests.in # -r typing.txt - # mongoengine -pyproject-api==1.5.3 +pyproject-api==1.7.1 # via tox -pyright==1.1.370 +pyright==1.1.373 # via -r typing.txt -pytest==7.4.4 +pytest==8.3.1 # via # -r tests.in # -r typing.txt # pytest-cov -pytest-cov==4.1.0 +pytest-cov==5.0.0 # via # -r tests.in # -r typing.txt -python-dateutil==2.9.0.post0 - # via - # -r typing.txt - # arrow - # azure-storage-common pytz==2024.1 # via # -r docs.txt - # -r typing.txt # babel - # flask-babel pyyaml==6.0.1 # via pre-commit -requests==2.31.0 +requests==2.32.3 # via # -r docs.txt # -r typing.txt - # azure-storage-common # coveralls # sphinx -shapely==2.0.5 - # via - # -r tests.in - # -r typing.txt -six==1.16.0 - # via - # -r typing.txt - # flask-mongoengine - # python-dateutil snowballstemmer==2.2.0 # via # -r docs.txt # sphinx -sphinx==5.3.0 +sphinx==7.1.2 # via # -r docs.txt # pallets-sphinx-themes # sphinxcontrib-log-cabinet -sphinxcontrib-applehelp==1.0.2 +sphinxcontrib-applehelp==1.0.4 # via # -r docs.txt # sphinx @@ -345,7 +208,7 @@ sphinxcontrib-devhelp==1.0.2 # via # -r docs.txt # sphinx -sphinxcontrib-htmlhelp==2.0.0 +sphinxcontrib-htmlhelp==2.0.1 # via # -r docs.txt # sphinx @@ -363,22 +226,6 @@ sphinxcontrib-serializinghtml==1.1.5 # via # -r docs.txt # sphinx -sqlalchemy==1.4.52 - # via - # -r tests.in - # -r typing.txt - # flask-sqlalchemy - # geoalchemy2 - # sqlalchemy-citext - # sqlalchemy-utils -sqlalchemy-citext==1.8.0 - # via - # -r tests.in - # -r typing.txt -sqlalchemy-utils==0.41.2 - # via - # -r tests.in - # -r typing.txt tomli==2.0.1 # via # -r typing.txt @@ -388,13 +235,13 @@ tomli==2.0.1 # pyproject-api # pytest # tox -tomlkit==0.12.5 +tomlkit==0.13.0 # via # -r typing.txt # pylint -tox==4.8.0 +tox==4.16.0 # via -r dev.in -types-boto==2.49.18.9 +types-boto==2.49.18.20240205 # via -r typing.txt types-click==7.1.8 # via @@ -412,9 +259,9 @@ types-markupsafe==1.1.10 # via # -r typing.txt # types-jinja2 -types-peewee==3.17.0.0 +types-peewee==3.17.6.20240722 # via -r typing.txt -types-pillow==10.1.0.2 +types-pillow==10.2.0.20240520 # via -r typing.txt types-shapely==2.0.0.20240714 # via -r typing.txt @@ -426,15 +273,15 @@ types-werkzeug==1.0.9 # via # -r typing.txt # types-flask -types-wtforms==3.1.0.2 +types-wtforms==3.1.0.20240425 # via -r typing.txt -typing-extensions==4.7.1 +typing-extensions==4.12.2 # via # -r typing.txt # astroid # mypy # pylint -urllib3==2.0.7 +urllib3==2.2.2 # via # -r docs.txt # -r typing.txt @@ -443,27 +290,7 @@ virtualenv==20.26.3 # via # pre-commit # tox -werkzeug==3.0.3 - # via - # -r tests.in - # -r typing.txt - # flask -wrapt==1.16.0 - # via - # -r typing.txt - # astroid -wtf-peewee==3.0.5 - # via - # -r tests.in - # -r typing.txt -wtforms==3.0.1 - # via - # -r tests.in - # -r typing.txt - # flask-wtf - # wtf-peewee -zipp==3.15.0 +zipp==3.19.2 # via # -r docs.txt - # -r typing.txt # importlib-metadata diff --git a/requirements/docs.txt b/requirements/docs.txt index 296528734..07fed90cc 100644 --- a/requirements/docs.txt +++ b/requirements/docs.txt @@ -12,46 +12,42 @@ certifi==2024.7.4 # via requests charset-normalizer==3.3.2 # via requests -docutils==0.19 +docutils==0.20.1 # via sphinx idna==3.7 # via requests imagesize==1.4.1 # via sphinx -importlib-metadata==6.7.0 +importlib-metadata==8.1.0 # via sphinx jinja2==3.1.4 - # via - # -c tests.in - # sphinx + # via sphinx markupsafe==2.1.5 - # via - # -c tests.in - # jinja2 -packaging==24.0 + # via jinja2 +packaging==24.1 # via # pallets-sphinx-themes # sphinx -pallets-sphinx-themes==2.0.3 +pallets-sphinx-themes==2.1.3 # via -r docs.in -pygments==2.17.2 +pygments==2.18.0 # via sphinx pytz==2024.1 # via babel -requests==2.31.0 +requests==2.32.3 # via sphinx snowballstemmer==2.2.0 # via sphinx -sphinx==5.3.0 +sphinx==7.1.2 # via # -r docs.in # pallets-sphinx-themes # sphinxcontrib-log-cabinet -sphinxcontrib-applehelp==1.0.2 +sphinxcontrib-applehelp==1.0.4 # via sphinx sphinxcontrib-devhelp==1.0.2 # via sphinx -sphinxcontrib-htmlhelp==2.0.0 +sphinxcontrib-htmlhelp==2.0.1 # via sphinx sphinxcontrib-jsmath==1.0.1 # via sphinx @@ -61,7 +57,7 @@ sphinxcontrib-qthelp==1.0.3 # via sphinx sphinxcontrib-serializinghtml==1.1.5 # via sphinx -urllib3==2.0.7 +urllib3==2.2.2 # via requests -zipp==3.15.0 +zipp==3.19.2 # via importlib-metadata diff --git a/requirements/tests.in b/requirements/tests.in index 86c249654..cef4ee220 100644 --- a/requirements/tests.in +++ b/requirements/tests.in @@ -1,38 +1,7 @@ -flask>=2.3.0 # transitively pins werkzeug>=2.3.0, jinja2>=3.1.2, itsdangerous>=2.1.2 -werkzeug>=2.3.0 -jinja2>=3.1.2 -itsdangerous>=2.1.2 -MarkupSafe>=2.0.0 - -wtforms -Flask-Babel>=3.0.0 - -psycopg2 -sqlalchemy<2.0 -Flask-SQLAlchemy>=3.0.0 -sqlalchemy-citext -sqlalchemy-utils>=0.36.6 - -geoalchemy2 - -mongoengine -pymongo>=3.7.0 -flask-mongoengine==0.8.2 - -peewee -wtf-peewee - -azure-storage-blob<=3 - -pillow>=3.3.2 -shapely>=2 -arrow<0.14.0 -colour -email-validator -tablib - coveralls flake8 pylint pytest pytest-cov + +psycopg2 diff --git a/requirements/tests.txt b/requirements/tests.txt new file mode 100644 index 000000000..c8fb53bec --- /dev/null +++ b/requirements/tests.txt @@ -0,0 +1,71 @@ +# +# This file is autogenerated by pip-compile with Python 3.8 +# by the following command: +# +# pip-compile tests.in +# +astroid==3.2.4 + # via pylint +certifi==2024.7.4 + # via requests +charset-normalizer==3.3.2 + # via requests +coverage[toml]==7.6.0 + # via + # coveralls + # pytest-cov +coveralls==4.0.1 + # via -r tests.in +dill==0.3.8 + # via pylint +docopt==0.6.2 + # via coveralls +exceptiongroup==1.2.2 + # via pytest +flake8==7.1.0 + # via -r tests.in +idna==3.7 + # via requests +iniconfig==2.0.0 + # via pytest +isort==5.13.2 + # via pylint +mccabe==0.7.0 + # via + # flake8 + # pylint +packaging==24.1 + # via pytest +platformdirs==4.2.2 + # via pylint +pluggy==1.5.0 + # via pytest +psycopg2==2.9.9 + # via -r tests.in +pycodestyle==2.12.0 + # via flake8 +pyflakes==3.2.0 + # via flake8 +pylint==3.2.6 + # via -r tests.in +pytest==8.3.1 + # via + # -r tests.in + # pytest-cov +pytest-cov==5.0.0 + # via -r tests.in +requests==2.32.3 + # via coveralls +tomli==2.0.1 + # via + # coverage + # pylint + # pytest +tomlkit==0.13.0 + # via pylint +typing-extensions==4.12.2 + # via + # astroid + # pylint +urllib3==2.2.2 + # via requests diff --git a/requirements/typing.txt b/requirements/typing.txt index ea9f2f6b7..c1aa0a685 100644 --- a/requirements/typing.txt +++ b/requirements/typing.txt @@ -4,191 +4,80 @@ # # pip-compile typing.in # -arrow==0.13.2 - # via -r tests.in -astroid==2.15.8 +astroid==3.2.4 # via pylint -azure-common==1.1.28 - # via - # azure-storage-blob - # azure-storage-common -azure-storage-blob==2.1.0 - # via -r tests.in -azure-storage-common==2.1.0 - # via azure-storage-blob -babel==2.15.0 - # via flask-babel -blinker==1.8.2 - # via flask certifi==2024.7.4 # via requests -cffi==1.15.1 - # via cryptography charset-normalizer==3.3.2 # via requests -click==8.1.7 - # via flask -colour==0.1.5 - # via -r tests.in -coverage[toml]==6.5.0 +coverage[toml]==7.6.0 # via # coveralls # pytest-cov -coveralls==3.3.1 +coveralls==4.0.1 # via -r tests.in -cryptography==42.0.8 - # via azure-storage-common -dill==0.3.7 +dill==0.3.8 # via pylint -dnspython==2.3.0 - # via email-validator docopt==0.6.2 # via coveralls -email-validator==2.0.0.post2 - # via -r tests.in -exceptiongroup==1.2.1 +exceptiongroup==1.2.2 # via pytest -flake8==3.9.2 - # via -r tests.in -flask==3.0.3 - # via - # -r tests.in - # flask-babel - # flask-mongoengine - # flask-sqlalchemy - # flask-wtf -flask-babel==4.0.0 - # via -r tests.in -flask-mongoengine==0.8.2 - # via -r tests.in -flask-sqlalchemy==3.0.5 - # via -r tests.in -flask-wtf==1.1.1 - # via flask-mongoengine -geoalchemy2==0.15.2 +flake8==7.1.0 # via -r tests.in idna==3.7 - # via - # email-validator - # requests -importlib-metadata==6.7.0 - # via flask + # via requests iniconfig==2.0.0 # via pytest -isort==5.11.5 +isort==5.13.2 # via pylint -itsdangerous==2.2.0 - # via - # -r tests.in - # flask - # flask-wtf -jinja2==3.1.4 - # via - # -r tests.in - # flask - # flask-babel -lazy-object-proxy==1.9.0 - # via astroid markupsafe==2.1.5 - # via - # -r tests.in - # jinja2 - # types-wtforms - # werkzeug - # wtforms -mccabe==0.6.1 + # via types-wtforms +mccabe==0.7.0 # via # flake8 # pylint -mongoengine==0.21.0 - # via - # -r tests.in - # flask-mongoengine -mypy==1.4.1 +mypy==1.11.0 # via -r typing.in mypy-extensions==1.0.0 # via mypy nodeenv==1.9.1 # via pyright numpy==1.24.4 - # via - # shapely - # types-shapely -packaging==24.0 - # via - # geoalchemy2 - # pytest -peewee==3.17.6 - # via - # -r tests.in - # wtf-peewee -pillow==9.5.0 - # via -r tests.in -platformdirs==4.0.0 + # via types-shapely +packaging==24.1 + # via pytest +platformdirs==4.2.2 # via pylint -pluggy==1.2.0 +pluggy==1.5.0 # via pytest psycopg2==2.9.9 # via -r tests.in -pycodestyle==2.7.0 +pycodestyle==2.12.0 # via flake8 -pycparser==2.21 - # via cffi -pyflakes==2.3.1 +pyflakes==3.2.0 # via flake8 -pylint==2.17.7 +pylint==3.2.6 # via -r tests.in -pymongo==3.13.0 - # via - # -r tests.in - # mongoengine -pyright==1.1.370 +pyright==1.1.373 # via -r typing.in -pytest==7.4.4 +pytest==8.3.1 # via # -r tests.in # -r typing.in # pytest-cov -pytest-cov==4.1.0 - # via -r tests.in -python-dateutil==2.9.0.post0 - # via - # arrow - # azure-storage-common -pytz==2024.1 - # via - # babel - # flask-babel -requests==2.31.0 - # via - # azure-storage-common - # coveralls -shapely==2.0.5 - # via -r tests.in -six==1.16.0 - # via - # flask-mongoengine - # python-dateutil -sqlalchemy==1.4.52 - # via - # -r tests.in - # flask-sqlalchemy - # geoalchemy2 - # sqlalchemy-citext - # sqlalchemy-utils -sqlalchemy-citext==1.8.0 - # via -r tests.in -sqlalchemy-utils==0.41.2 +pytest-cov==5.0.0 # via -r tests.in +requests==2.32.3 + # via coveralls tomli==2.0.1 # via # coverage # mypy # pylint # pytest -tomlkit==0.12.5 +tomlkit==0.13.0 # via pylint -types-boto==2.49.18.9 +types-boto==2.49.18.20240205 # via -r typing.in types-click==7.1.8 # via types-flask @@ -200,9 +89,9 @@ types-jinja2==2.11.9 # via types-flask types-markupsafe==1.1.10 # via types-jinja2 -types-peewee==3.17.0.0 +types-peewee==3.17.6.20240722 # via -r typing.in -types-pillow==10.1.0.2 +types-pillow==10.2.0.20240520 # via -r typing.in types-shapely==2.0.0.20240714 # via -r typing.in @@ -210,27 +99,12 @@ types-sqlalchemy==1.4.53.38 # via types-flask-sqlalchemy types-werkzeug==1.0.9 # via types-flask -types-wtforms==3.1.0.2 +types-wtforms==3.1.0.20240425 # via -r typing.in -typing-extensions==4.7.1 +typing-extensions==4.12.2 # via # astroid # mypy # pylint -urllib3==2.0.7 +urllib3==2.2.2 # via requests -werkzeug==3.0.3 - # via - # -r tests.in - # flask -wrapt==1.16.0 - # via astroid -wtf-peewee==3.0.5 - # via -r tests.in -wtforms==3.0.1 - # via - # -r tests.in - # flask-wtf - # wtf-peewee -zipp==3.15.0 - # via importlib-metadata diff --git a/tox.ini b/tox.ini index 3ccd1cdec..fcdf809b2 100644 --- a/tox.ini +++ b/tox.ini @@ -1,7 +1,7 @@ [tox] envlist = - py3{8,9,10,11,12}-flask{2}-wtforms{2} - py312-flask2-wtforms2-no-flask-babel # only tested against latest of all configurations, sans flask-babel + py3{8,9,10,11,12} + py312-noflaskbabel # only tested against latest of all configurations, sans flask-babel # style typing docs @@ -10,23 +10,19 @@ skip_missing_interpreters = true [testenv] package = wheel wheel_build_env = .pkg -constrain_package_deps = true +extras = all +;constrain_package_deps = true # FIXME: sort out dependency conflicts and re-enable this use_frozen_constraints = true -# TODO: Remove SQLALCHEMY_SILENCE_UBER_WARNINGwhen Flask-Admin is compatible with SQLAlchemy>=2.0.0 +# TODO: Remove SQLALCHEMY_SILENCE_UBER_WARNING when Flask-Admin is compatible with SQLAlchemy>=2.0.0 setenv = SQLALCHEMY_SILENCE_UBER_WARNING = 1 AZURE_STORAGE_CONNECTION_STRING = DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1; deps = -r requirements/tests.in - flask2: Flask>=2.3.0,<3 - wtforms2: WTForms>=2.0,<3 +commands_pre = + noflaskbabel: pip uninstall -y flask-babel commands = pytest -v --tb=short --basetemp={envtmpdir} flask_admin/tests {posargs} -[testenv:py312-flask2-wtforms2-no-flask-babel] -commands = - pip uninstall -y flask-babel - pytest -v --tb=short --basetemp={envtmpdir} flask_admin/tests {posargs} - [testenv:style] deps = pre-commit skip_install = true @@ -58,9 +54,6 @@ change_dir = requirements commands = pip-compile build.in -q {posargs:-U} pip-compile docs.in -q {posargs:-U} -; pip-compile tests.in -q {posargs:-U} -; # TODO: remove? There are a lot of test -; dependencies; unsure if we can compile these in a way that would work for all -; python versions supported? + pip-compile tests.in -q {posargs:-U} pip-compile typing.in -q {posargs:-U} pip-compile dev.in -q {posargs:-U} From 69bb9ac6f7349231181339240a19cf7dfc0e5f09 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Wed, 24 Jul 2024 17:10:46 +0100 Subject: [PATCH 064/156] Address test failures after changing how we specify dependencies - Disable `mongoengine` tests. This is the main problem here: `Flask-Mongoengine` is now fairly out-of-date and doesn't support recent Flask 2.x versions, which our tests try to pull in. With the change to how we declare our dependencies (flask), we can't really install a specific version of flask that's lower than what we support across all of Flask-Admin, which we'd need to do. I don't think we want a special case for Flask-Mongoengine. I think we need to accept that Flask-Mongoengine is now unsupported and doesn't work with Flask-Admin, assuming people are using recent versions of Flask etc. We may need to consider deprecating Flask-Mongoengine support altogether, but I'm leaving that for a separate issue. - flask.Markup was removed; use markupsafe instead - Use BytesIO for file uploads rv = client.post('/admin/myfileadmin/upload/', > data=dict(upload=(StringIO(""), 'dummy.txt'))) E TypeError: a bytes-like object is required, not 'str' - Update import path - Ignore deprecation warning from flask.testing - Flask now requires all routes/views to be registered before the first request - Werkzeug 2.3.0+ no longer quotes URL params - Ignore SQLAlchemy2 deprecation warning --- examples/sqla/admin/main.py | 3 +- flask_admin/tests/fileadmin/test_fileadmin.py | 4 +- flask_admin/tests/mongoengine/test_basic.py | 8 +- flask_admin/tests/peeweemodel/test_basic.py | 70 +++--- flask_admin/tests/sqla/test_basic.py | 5 +- flask_admin/tests/sqla/test_multi_pk.py | 2 +- flask_admin/tests/test_model.py | 224 +++++++++--------- pyproject.toml | 8 +- tox.ini | 2 +- 9 files changed, 168 insertions(+), 158 deletions(-) diff --git a/examples/sqla/admin/main.py b/examples/sqla/admin/main.py index ae7c40539..244648024 100644 --- a/examples/sqla/admin/main.py +++ b/examples/sqla/admin/main.py @@ -1,6 +1,7 @@ from admin import app, db from admin.models import AVAILABLE_USER_TYPES, User, Post, Tag, Tree -from flask import Markup, send_file +from flask import send_file +from markupsafe import Markup from wtforms import validators diff --git a/flask_admin/tests/fileadmin/test_fileadmin.py b/flask_admin/tests/fileadmin/test_fileadmin.py index 3eb738108..21156c2b7 100644 --- a/flask_admin/tests/fileadmin/test_fileadmin.py +++ b/flask_admin/tests/fileadmin/test_fileadmin.py @@ -1,4 +1,4 @@ -from io import StringIO +from io import BytesIO import os import os.path as op @@ -71,7 +71,7 @@ class MyFileAdmin(fileadmin_class): assert rv.status_code == 200 rv = client.post('/admin/myfileadmin/upload/', - data=dict(upload=(StringIO(""), 'dummy.txt'))) + data=dict(upload=(BytesIO(b""), 'dummy.txt'))) assert rv.status_code == 302 rv = client.get('/admin/myfileadmin/') diff --git a/flask_admin/tests/mongoengine/test_basic.py b/flask_admin/tests/mongoengine/test_basic.py index 98b10d328..80ee8cee1 100644 --- a/flask_admin/tests/mongoengine/test_basic.py +++ b/flask_admin/tests/mongoengine/test_basic.py @@ -148,6 +148,10 @@ def test_column_editable_list(app, db, admin): column_editable_list=['test1', 'datetime_field']) admin.add_view(view) + # Test in-line editing for relations + view = CustomModelView(Model2, column_editable_list=['model1']) + admin.add_view(view) + fill_db(Model1, Model2) client = app.test_client() @@ -195,10 +199,6 @@ def test_column_editable_list(app, db, admin): data = rv.data.decode('utf-8') assert 'problematic-input' not in data - # Test in-line editing for relations - view = CustomModelView(Model2, column_editable_list=['model1']) - admin.add_view(view) - obj3 = Model2.objects.get(string_field='string_field_val_1') rv = client.post('/admin/model2/ajax/update/', data={ 'list_form_pk': str(obj3.id), diff --git a/flask_admin/tests/peeweemodel/test_basic.py b/flask_admin/tests/peeweemodel/test_basic.py index c4c0d96b6..8f456f221 100644 --- a/flask_admin/tests/peeweemodel/test_basic.py +++ b/flask_admin/tests/peeweemodel/test_basic.py @@ -183,6 +183,10 @@ def test_column_editable_list(app, db, admin): form_args=form_args) admin.add_view(view) + # Test in-line editing for relations + view = CustomModelView(Model2, column_editable_list=['model1']) + admin.add_view(view) + fill_db(Model1, Model2) client = app.test_client() @@ -230,10 +234,6 @@ def test_column_editable_list(app, db, admin): data = rv.data.decode('utf-8') assert 'problematic-input' not in data - # Test in-line editing for relations - view = CustomModelView(Model2, column_editable_list=['model1']) - admin.add_view(view) - rv = client.post('/admin/model2/ajax/update/', data={ 'list_form_pk': '1', 'model1': '3', @@ -307,6 +307,26 @@ def test_column_filters(app, db, admin): view = CustomModelView(Model1, column_filters=['test1']) admin.add_view(view) + # Test int filter + view2 = CustomModelView(Model2, column_filters=['int_field']) + admin.add_view(view2) + + # Test boolean filter + view3 = CustomModelView(Model2, column_filters=['bool_field'], + endpoint="_bools") + admin.add_view(view3) + + # Test float filter + view4 = CustomModelView(Model2, column_filters=['float_field'], + endpoint="_float") + admin.add_view(view4) + + # Test date, time, and datetime filters + view5 = CustomModelView(Model1, + column_filters=['date_field', 'datetime_field', 'timeonly_field'], + endpoint="_datetime") + admin.add_view(view5) + assert len(view._filters) == 7 assert \ @@ -386,12 +406,8 @@ def test_column_filters(app, db, admin): assert 'test1_val_3' in data assert 'test1_val_4' in data - # Test int filter - view = CustomModelView(Model2, column_filters=['int_field']) - admin.add_view(view) - assert \ - [(f['index'], f['operation']) for f in view._filter_groups[u'Int Field']] == \ + [(f['index'], f['operation']) for f in view2._filter_groups[u'Int Field']] == \ [ (0, 'equals'), (1, 'not equal'), @@ -492,13 +508,8 @@ def test_column_filters(app, db, admin): assert 'char_field_val_3' not in data assert 'char_field_val_4' not in data - # Test boolean filter - view = CustomModelView(Model2, column_filters=['bool_field'], - endpoint="_bools") - admin.add_view(view) - assert \ - [(f['index'], f['operation']) for f in view._filter_groups[u'Bool Field']] == \ + [(f['index'], f['operation']) for f in view3._filter_groups[u'Bool Field']] == \ [ (0, 'equals'), (1, 'not equal'), @@ -536,13 +547,8 @@ def test_column_filters(app, db, admin): assert 'char_field_val_2' not in data assert 'char_field_val_3' not in data - # Test float filter - view = CustomModelView(Model2, column_filters=['float_field'], - endpoint="_float") - admin.add_view(view) - assert \ - [(f['index'], f['operation']) for f in view._filter_groups[u'Float Field']] == \ + [(f['index'], f['operation']) for f in view4._filter_groups[u'Float Field']] == \ [ (0, 'equals'), (1, 'not equal'), @@ -629,14 +635,8 @@ def test_column_filters(app, db, admin): assert 'char_field_val_3' not in data assert 'char_field_val_4' not in data - # Test date, time, and datetime filters - view = CustomModelView(Model1, - column_filters=['date_field', 'datetime_field', 'timeonly_field'], - endpoint="_datetime") - admin.add_view(view) - assert \ - [(f['index'], f['operation']) for f in view._filter_groups[u'Date Field']] == \ + [(f['index'], f['operation']) for f in view5._filter_groups[u'Date Field']] == \ [ (0, 'equals'), (1, 'not equal'), @@ -648,7 +648,7 @@ def test_column_filters(app, db, admin): ] assert \ - [(f['index'], f['operation']) for f in view._filter_groups[u'Datetime Field']] == \ + [(f['index'], f['operation']) for f in view5._filter_groups[u'Datetime Field']] == \ [ (7, 'equals'), (8, 'not equal'), @@ -660,7 +660,7 @@ def test_column_filters(app, db, admin): ] assert \ - [(f['index'], f['operation']) for f in view._filter_groups[u'Timeonly Field']] == \ + [(f['index'], f['operation']) for f in view5._filter_groups[u'Timeonly Field']] == \ [ (14, 'equals'), (15, 'not equal'), @@ -1028,6 +1028,11 @@ def test_export_csv(app, db, admin): endpoint='row_limit_2') admin.add_view(view) + view2 = CustomModelView(Model1, can_export=True, + column_list=['test1', 'test2'], + endpoint='no_row_limit') + admin.add_view(view2) + for x in range(5): fill_db(Model1, Model2) @@ -1041,11 +1046,6 @@ def test_export_csv(app, db, admin): "test1_val_1,test2_val_1\r\n" + \ "test1_val_2,test2_val_2\r\n" == data - view = CustomModelView(Model1, can_export=True, - column_list=['test1', 'test2'], - endpoint='no_row_limit') - admin.add_view(view) - # test row limit without export_max_rows rv = client.get('/admin/no_row_limit/export/csv/') data = rv.data.decode('utf-8') diff --git a/flask_admin/tests/sqla/test_basic.py b/flask_admin/tests/sqla/test_basic.py index b0fb2f348..0a4e34600 100644 --- a/flask_admin/tests/sqla/test_basic.py +++ b/flask_admin/tests/sqla/test_basic.py @@ -533,6 +533,7 @@ def test_column_editable_list(app, db, admin): view = CustomModelView(Model1, db.session, column_editable_list=['test1', 'enum_field']) admin.add_view(view) + # Test in-line editing for relations view = CustomModelView(Model2, db.session, column_editable_list=['model1']) admin.add_view(view) @@ -2409,7 +2410,7 @@ def test_safe_redirect(app, db, admin): expected = 'http://localhost' + expected assert rv.location.startswith(expected) - assert 'url=http%3A%2F%2Flocalhost%2Fadmin%2Fmodel2view%2F' in rv.location + assert 'url=http://localhost/admin/model2view/' in rv.location assert 'id=1' in rv.location rv = client.post('/admin/model1/new/?url=http://google.com/evil/', @@ -2418,7 +2419,7 @@ def test_safe_redirect(app, db, admin): assert rv.status_code == 302 assert rv.location.startswith(expected) - assert 'url=%2Fadmin%2Fmodel1%2F' in rv.location + assert 'url=/admin/model1/' in rv.location assert 'id=2' in rv.location diff --git a/flask_admin/tests/sqla/test_multi_pk.py b/flask_admin/tests/sqla/test_multi_pk.py index 59bfa9bee..5c347a0e1 100644 --- a/flask_admin/tests/sqla/test_multi_pk.py +++ b/flask_admin/tests/sqla/test_multi_pk.py @@ -1,6 +1,6 @@ from .test_basic import CustomModelView -from flask_sqlalchemy import Model +from flask_sqlalchemy.model import Model from sqlalchemy.ext.declarative import declarative_base diff --git a/flask_admin/tests/test_model.py b/flask_admin/tests/test_model.py index 38a7bc558..d4c229dd9 100644 --- a/flask_admin/tests/test_model.py +++ b/flask_admin/tests/test_model.py @@ -1,3 +1,5 @@ +import copy + from flask import Flask from werkzeug.middleware.dispatcher import DispatcherMiddleware @@ -476,9 +478,6 @@ def test_export_csv(app, admin): view = MockModelView(Model, column_list=['col1', 'col2'], endpoint="test") admin.add_view(view) - rv = client.get('/admin/test/export/csv/') - assert rv.status_code == 302 - # basic test of csv export with a few records view_data = { 1: Model(1, "col1_1", "col2_1"), @@ -486,9 +485,109 @@ def test_export_csv(app, admin): 3: Model(3, "col1_3", "col2_3"), } - view = MockModelView(Model, view_data, can_export=True, + view2 = MockModelView(Model, view_data, can_export=True, column_list=['col1', 'col2']) - admin.add_view(view) + admin.add_view(view2) + + # test explicit use of column_export_list + view3 = MockModelView(Model, view_data, can_export=True, + column_list=['col1', 'col2'], + column_export_list=['id', 'col1', 'col2'], + endpoint='exportinclusion') + admin.add_view(view3) + + # test explicit use of column_export_exclude_list + view4 = MockModelView(Model, view_data, can_export=True, + column_list=['col1', 'col2'], + column_export_exclude_list=['col2'], + endpoint='exportexclusion') + admin.add_view(view4) + + # test utf8 characters in csv export + view_data_v2 = {**view_data, 4: Model(1, u'\u2013ut8_1\u2013', u'\u2013utf8_2\u2013')} + view5 = MockModelView(Model, view_data_v2, can_export=True, + column_list=['col1', 'col2'], endpoint="utf8") + admin.add_view(view5) + + # test None type, integer type, column_labels, and column_formatters + view_data_v3 = { + 1: Model(1, "col1_1", 1), + 2: Model(2, "col1_2", 2), + 3: Model(3, None, 3), + } + + view6 = MockModelView( + Model, view_data_v3, can_export=True, column_list=['col1', 'col2'], + column_labels={'col1': 'Str Field', 'col2': 'Int Field'}, + column_formatters=dict(col2=lambda v, c, m, p: m.col2 * 2), + endpoint="types_and_formatters" + ) + admin.add_view(view6) + + # test column_formatters_export and column_formatters_export + type_formatters = {type(None): lambda view, value, name: "null"} + + view7 = MockModelView( + Model, view_data_v3, can_export=True, column_list=['col1', 'col2'], + column_formatters_export=dict(col2=lambda v, c, m, p: m.col2 * 3), + column_formatters=dict(col2=lambda v, c, m, p: m.col2 * 2), # overridden + column_type_formatters_export=type_formatters, + endpoint="export_types_and_formatters" + ) + admin.add_view(view7) + + # Macros are not implemented for csv export yet and will throw an error + view8 = MockModelView( + Model, can_export=True, column_list=['col1', 'col2'], + column_formatters=dict(col1=macro('render_macro')), + endpoint="macro_exception" + ) + admin.add_view(view8) + + # We should be able to specify column_formatters_export + # and not get an exception if a column_formatter is using a macro + def export_formatter(v, c, m, p): + return m.col1 if m else '' + + view9 = MockModelView( + Model, view_data_v3, can_export=True, column_list=['col1', 'col2'], + column_formatters=dict(col1=macro('render_macro')), + column_formatters_export=dict(col1=export_formatter), + endpoint="macro_exception_formatter_override" + ) + admin.add_view(view9) + + # We should not get an exception if a column_formatter is + # using a macro but it is on the column_export_exclude_list + view10 = MockModelView( + Model, view_data_v3, can_export=True, column_list=['col1', 'col2'], + column_formatters=dict(col1=macro('render_macro')), + column_export_exclude_list=['col1'], + endpoint="macro_exception_exclude_override" + ) + admin.add_view(view10) + + # When we use column_export_list to hide the macro field + # we should not get an exception + view11 = MockModelView( + Model, view_data_v3, can_export=True, column_list=['col1', 'col2'], + column_formatters=dict(col1=macro('render_macro')), + column_export_list=['col2'], + endpoint="macro_exception_list_override" + ) + admin.add_view(view11) + + # If they define a macro on the column_formatters_export list + # then raise an exception + view12 = MockModelView( + Model, view_data_v3, can_export=True, column_list=['col1', 'col2'], + column_formatters=dict(col1=macro('render_macro')), + endpoint="macro_exception_macro_override" + ) + admin.add_view(view12) + + rv = client.get('/admin/test/export/csv/') + assert rv.status_code == 302 rv = client.get('/admin/model/export/csv/') data = rv.data.decode('utf-8') @@ -499,13 +598,6 @@ def test_export_csv(app, admin): "col1_2,col2_2\r\n" + \ "col1_3,col2_3\r\n" == data - # test explicit use of column_export_list - view = MockModelView(Model, view_data, can_export=True, - column_list=['col1', 'col2'], - column_export_list=['id', 'col1', 'col2'], - endpoint='exportinclusion') - admin.add_view(view) - rv = client.get('/admin/exportinclusion/export/csv/') data = rv.data.decode('utf-8') assert rv.mimetype == 'text/csv' @@ -515,13 +607,6 @@ def test_export_csv(app, admin): "2,col1_2,col2_2\r\n" + \ "3,col1_3,col2_3\r\n" == data - # test explicit use of column_export_exclude_list - view = MockModelView(Model, view_data, can_export=True, - column_list=['col1', 'col2'], - column_export_exclude_list=['col2'], - endpoint='exportexclusion') - admin.add_view(view) - rv = client.get('/admin/exportexclusion/export/csv/') data = rv.data.decode('utf-8') assert rv.mimetype == 'text/csv' @@ -531,32 +616,11 @@ def test_export_csv(app, admin): "col1_2\r\n" + \ "col1_3\r\n" == data - # test utf8 characters in csv export - view_data[4] = Model(1, u'\u2013ut8_1\u2013', u'\u2013utf8_2\u2013') - view = MockModelView(Model, view_data, can_export=True, - column_list=['col1', 'col2'], endpoint="utf8") - admin.add_view(view) - rv = client.get('/admin/utf8/export/csv/') data = rv.data.decode('utf-8') assert rv.status_code == 200 assert u'\u2013ut8_1\u2013,\u2013utf8_2\u2013\r\n' in data - # test None type, integer type, column_labels, and column_formatters - view_data = { - 1: Model(1, "col1_1", 1), - 2: Model(2, "col1_2", 2), - 3: Model(3, None, 3), - } - - view = MockModelView( - Model, view_data, can_export=True, column_list=['col1', 'col2'], - column_labels={'col1': 'Str Field', 'col2': 'Int Field'}, - column_formatters=dict(col2=lambda v, c, m, p: m.col2 * 2), - endpoint="types_and_formatters" - ) - admin.add_view(view) - rv = client.get('/admin/types_and_formatters/export/csv/') data = rv.data.decode('utf-8') assert rv.status_code == 200 @@ -565,18 +629,6 @@ def test_export_csv(app, admin): "col1_2,4\r\n" + \ ",6\r\n" == data - # test column_formatters_export and column_formatters_export - type_formatters = {type(None): lambda view, value, name: "null"} - - view = MockModelView( - Model, view_data, can_export=True, column_list=['col1', 'col2'], - column_formatters_export=dict(col2=lambda v, c, m, p: m.col2 * 3), - column_formatters=dict(col2=lambda v, c, m, p: m.col2 * 2), # overridden - column_type_formatters_export=type_formatters, - endpoint="export_types_and_formatters" - ) - admin.add_view(view) - rv = client.get('/admin/export_types_and_formatters/export/csv/') data = rv.data.decode('utf-8') assert rv.status_code == 200 @@ -585,31 +637,10 @@ def test_export_csv(app, admin): "col1_2,6\r\n" + \ "null,9\r\n" == data - # Macros are not implemented for csv export yet and will throw an error - view = MockModelView( - Model, can_export=True, column_list=['col1', 'col2'], - column_formatters=dict(col1=macro('render_macro')), - endpoint="macro_exception" - ) - admin.add_view(view) - rv = client.get('/admin/macro_exception/export/csv/') data = rv.data.decode('utf-8') assert rv.status_code == 500 - # We should be able to specify column_formatters_export - # and not get an exception if a column_formatter is using a macro - def export_formatter(v, c, m, p): - return m.col1 if m else '' - - view = MockModelView( - Model, view_data, can_export=True, column_list=['col1', 'col2'], - column_formatters=dict(col1=macro('render_macro')), - column_formatters_export=dict(col1=export_formatter), - endpoint="macro_exception_formatter_override" - ) - admin.add_view(view) - rv = client.get('/admin/macro_exception_formatter_override/export/csv/') data = rv.data.decode('utf-8') assert rv.status_code == 200 @@ -618,16 +649,6 @@ def export_formatter(v, c, m, p): "col1_2,2\r\n" + \ ",3\r\n" == data - # We should not get an exception if a column_formatter is - # using a macro but it is on the column_export_exclude_list - view = MockModelView( - Model, view_data, can_export=True, column_list=['col1', 'col2'], - column_formatters=dict(col1=macro('render_macro')), - column_export_exclude_list=['col1'], - endpoint="macro_exception_exclude_override" - ) - admin.add_view(view) - rv = client.get('/admin/macro_exception_exclude_override/export/csv/') data = rv.data.decode('utf-8') assert rv.status_code == 200 @@ -636,16 +657,6 @@ def export_formatter(v, c, m, p): "2\r\n" + \ "3\r\n" == data - # When we use column_export_list to hide the macro field - # we should not get an exception - view = MockModelView( - Model, view_data, can_export=True, column_list=['col1', 'col2'], - column_formatters=dict(col1=macro('render_macro')), - column_export_list=['col2'], - endpoint="macro_exception_list_override" - ) - admin.add_view(view) - rv = client.get('/admin/macro_exception_list_override/export/csv/') data = rv.data.decode('utf-8') assert rv.status_code == 200 @@ -654,15 +665,6 @@ def export_formatter(v, c, m, p): "2\r\n" + \ "3\r\n" == data - # If they define a macro on the column_formatters_export list - # then raise an exception - view = MockModelView( - Model, view_data, can_export=True, column_list=['col1', 'col2'], - column_formatters=dict(col1=macro('render_macro')), - endpoint="macro_exception_macro_override" - ) - admin.add_view(view) - rv = client.get('/admin/macro_exception_macro_override/export/csv/') data = rv.data.decode('utf-8') assert rv.status_code == 500 @@ -706,9 +708,6 @@ def test_list_row_actions(app, admin): assert isinstance(actions[0], template.EditRowAction) assert isinstance(actions[1], template.DeleteRowAction) - rv = client.get('/admin/test/') - assert rv.status_code == 200 - # Test default actions view = MockModelView(Model, endpoint='test1', can_edit=False, can_delete=False, can_view_details=True) admin.add_view(view) @@ -717,9 +716,6 @@ def test_list_row_actions(app, admin): assert len(actions) == 1 assert isinstance(actions[0], template.ViewRowAction) - rv = client.get('/admin/test1/') - assert rv.status_code == 200 - # Test popups view = MockModelView(Model, endpoint='test2', can_view_details=True, @@ -732,9 +728,6 @@ def test_list_row_actions(app, admin): assert isinstance(actions[1], template.EditPopupRowAction) assert isinstance(actions[2], template.DeleteRowAction) - rv = client.get('/admin/test2/') - assert rv.status_code == 200 - # Test custom views view = MockModelView(Model, endpoint='test3', column_extra_row_actions=[ @@ -749,6 +742,15 @@ def test_list_row_actions(app, admin): assert isinstance(actions[2], template.LinkRowAction) assert isinstance(actions[3], template.EndpointLinkRowAction) + rv = client.get('/admin/test/') + assert rv.status_code == 200 + + rv = client.get('/admin/test1/') + assert rv.status_code == 200 + + rv = client.get('/admin/test2/') + assert rv.status_code == 200 + rv = client.get('/admin/test3/') assert rv.status_code == 200 diff --git a/pyproject.toml b/pyproject.toml index 776514f17..9b9279e5a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -116,7 +116,13 @@ filterwarnings = [ "default:'pkgutil\\.get_loader' is deprecated and slated for removal in Python 3\\.14:DeprecationWarning", "default:'pkgutil\\.find_loader' is deprecated and slated for removal in Python 3\\.14:DeprecationWarning", - "default:datetime\\.datetime\\.utcnow\\(\\) is deprecated and scheduled for removal in a future version:DeprecationWarning" + "default:datetime\\.datetime\\.utcnow\\(\\) is deprecated and scheduled for removal in a future version:DeprecationWarning", + + # `flask.testing` accesses this attribute; remove when they have updated their code. + "default:The '__version__' attribute is deprecated and will be removed in Werkzeug 3\\.1\\.:DeprecationWarning", + + # TODO: Remove when we've added SQLAlchemy 2.0 compatibility + "default:Deprecated API features detected!:DeprecationWarning:flask_admin.tests.sqla.test_basic:99", ] [tool.coverage.run] diff --git a/tox.ini b/tox.ini index fcdf809b2..d2302a331 100644 --- a/tox.ini +++ b/tox.ini @@ -21,7 +21,7 @@ deps = -r requirements/tests.in commands_pre = noflaskbabel: pip uninstall -y flask-babel -commands = pytest -v --tb=short --basetemp={envtmpdir} flask_admin/tests {posargs} +commands = pytest -v --tb=short --basetemp={envtmpdir} flask_admin/tests --ignore flask_admin/tests/mongoengine {posargs} [testenv:style] deps = pre-commit From 033b69812e057a780fc38979314dcb50908ead70 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Wed, 24 Jul 2024 17:10:47 +0100 Subject: [PATCH 065/156] Add a snowflake test flow for flaskmongoengine --- .github/workflows/tests.yaml | 2 ++ pyproject.toml | 6 +++++- tox.ini | 10 ++++++++-- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 980ca3b7a..60d42f517 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -25,6 +25,8 @@ jobs: include: - python: '3.12' tox: 'py312-noflaskbabel' + - python: '3.12' + tox: 'py312-flaskmongoengine' services: # Label used to access the service container postgres: diff --git a/pyproject.toml b/pyproject.toml index 9b9279e5a..4116ef059 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -69,7 +69,11 @@ all = [ "Flask-Admin[db-sqlalchemy]", "Flask-Admin[db-sqlalchemy-with-utils]", "Flask-Admin[db-geoalchemy]", - "Flask-Admin[db-mongoengine]", + +# FIXME: disabling db-mongoengine as flask-mongoengine is now out-of-date and is +# incompatible with newer versions of flask that we want to test. +# "Flask-Admin[db-mongoengine]", + "Flask-Admin[db-pymongo]", "Flask-Admin[db-peewee]", "Flask-Admin[db-appengine]", diff --git a/tox.ini b/tox.ini index d2302a331..7ca696317 100644 --- a/tox.ini +++ b/tox.ini @@ -2,6 +2,7 @@ envlist = py3{8,9,10,11,12} py312-noflaskbabel # only tested against latest of all configurations, sans flask-babel + py312-flaskmongoengine # style typing docs @@ -10,7 +11,9 @@ skip_missing_interpreters = true [testenv] package = wheel wheel_build_env = .pkg -extras = all +extras = + flaskmongoengine: all,db-mongoengine + !flaskmongoengine: all ;constrain_package_deps = true # FIXME: sort out dependency conflicts and re-enable this use_frozen_constraints = true # TODO: Remove SQLALCHEMY_SILENCE_UBER_WARNING when Flask-Admin is compatible with SQLAlchemy>=2.0.0 @@ -21,7 +24,10 @@ deps = -r requirements/tests.in commands_pre = noflaskbabel: pip uninstall -y flask-babel -commands = pytest -v --tb=short --basetemp={envtmpdir} flask_admin/tests --ignore flask_admin/tests/mongoengine {posargs} + flaskmongoengine: pip install Flask==2.1.3 Werkzeug==2.3.8 flask-sqlalchemy<3 +commands = + flaskmongoengine: pytest -v --tb=short --basetemp={envtmpdir} flask_admin/tests -W 'default::DeprecationWarning' {posargs} + !flaskmongoengine: pytest -v --tb=short --basetemp={envtmpdir} flask_admin/tests --ignore flask_admin/tests/mongoengine {posargs} [testenv:style] deps = pre-commit From 7863334789c5703794fd7ecf35c72909ccbd85d9 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Wed, 24 Jul 2024 17:48:04 +0100 Subject: [PATCH 066/156] Rename env vars to template context vars --- doc/introduction.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/doc/introduction.rst b/doc/introduction.rst index fb58856d6..fccdbb9d1 100644 --- a/doc/introduction.rst +++ b/doc/introduction.rst @@ -467,17 +467,18 @@ empty_list_message Message that will be displayed if there are no models fo Have a look at the `layout` example at https://github.com/flask-admin/flask-admin/tree/master/examples/custom-layout to see how you can take full stylistic control over the admin interface. -Environment Variables ---------------------- +Template Context Variables +-------------------------- While working in any of the templates that extend `admin/master.html`, you have access to a small number of -environment variables: +context variables: ==================== ================================ Variable Name Description ==================== ================================ admin_view Current administrative view admin_base_template Base template name +theme The Theme configuration passed into Flask-Admin at instantiation _gettext Babel gettext _ngettext Babel ngettext h Helpers from :mod:`~flask_admin.helpers` module From d6ae47f6b64f00cdf1d25188e27c2391f4bc17be Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Wed, 24 Jul 2024 18:02:14 +0100 Subject: [PATCH 067/156] Shorten extra names by removing prefixes --- examples/auth-flask-login/requirements.txt | 2 +- examples/auth-mongoengine/requirements.txt | 2 +- examples/auth/requirements.txt | 2 +- examples/babel/requirements.txt | 2 +- examples/bootstrap4/requirements.txt | 2 +- examples/custom-layout/requirements.txt | 2 +- examples/forms-files-images/requirements.txt | 2 +- examples/geo_alchemy/requirements.txt | 2 +- examples/mongoengine/requirements.txt | 2 +- examples/peewee/requirements.txt | 2 +- examples/pymongo/requirements.txt | 2 +- .../sqla-association_proxy/requirements.txt | 2 +- .../sqla-custom-inline-forms/requirements.txt | 2 +- examples/sqla/requirements.txt | 2 +- examples/tinymongo/requirements.txt | 2 +- pyproject.toml | 46 +++++++++---------- tox.ini | 2 +- 17 files changed, 39 insertions(+), 39 deletions(-) diff --git a/examples/auth-flask-login/requirements.txt b/examples/auth-flask-login/requirements.txt index 78d1e8f78..439c53913 100644 --- a/examples/auth-flask-login/requirements.txt +++ b/examples/auth-flask-login/requirements.txt @@ -1,4 +1,4 @@ # Install Flask-Admin with required extras from the root of the repository -../..[db-sqlalchemy] +../..[sqlalchemy] Flask-Login>=0.3.0 diff --git a/examples/auth-mongoengine/requirements.txt b/examples/auth-mongoengine/requirements.txt index 532baeaad..5ac5edc81 100644 --- a/examples/auth-mongoengine/requirements.txt +++ b/examples/auth-mongoengine/requirements.txt @@ -1,4 +1,4 @@ # Install Flask-Admin with required extras from the root of the repository -../..[db-mongoengine] +../..[mongoengine] Flask-Login>=0.3.0 diff --git a/examples/auth/requirements.txt b/examples/auth/requirements.txt index 2bfc1d884..c16d40038 100644 --- a/examples/auth/requirements.txt +++ b/examples/auth/requirements.txt @@ -1,4 +1,4 @@ # Install Flask-Admin with required extras from the root of the repository -../..[db-sqlalchemy-with-utils] +../..[sqlalchemy-with-utils] flask-security-too diff --git a/examples/babel/requirements.txt b/examples/babel/requirements.txt index 0524aefd7..e51dde942 100644 --- a/examples/babel/requirements.txt +++ b/examples/babel/requirements.txt @@ -1,2 +1,2 @@ # Install Flask-Admin with required extras from the root of the repository -../..[db-sqlalchemy,translation] +../..[sqlalchemy,translation] diff --git a/examples/bootstrap4/requirements.txt b/examples/bootstrap4/requirements.txt index b0be83909..d669ed2ec 100644 --- a/examples/bootstrap4/requirements.txt +++ b/examples/bootstrap4/requirements.txt @@ -1,2 +1,2 @@ # Install Flask-Admin with required extras from the root of the repository -../..[db-sqlalchemy] +../..[sqlalchemy] diff --git a/examples/custom-layout/requirements.txt b/examples/custom-layout/requirements.txt index b0be83909..d669ed2ec 100644 --- a/examples/custom-layout/requirements.txt +++ b/examples/custom-layout/requirements.txt @@ -1,2 +1,2 @@ # Install Flask-Admin with required extras from the root of the repository -../..[db-sqlalchemy] +../..[sqlalchemy] diff --git a/examples/forms-files-images/requirements.txt b/examples/forms-files-images/requirements.txt index 9097f1e8f..7cb9c4cc1 100644 --- a/examples/forms-files-images/requirements.txt +++ b/examples/forms-files-images/requirements.txt @@ -1,2 +1,2 @@ # Install Flask-Admin with required extras from the root of the repository -../..[db-sqlalchemy,images,rediscli] +../..[sqlalchemy,images,rediscli] diff --git a/examples/geo_alchemy/requirements.txt b/examples/geo_alchemy/requirements.txt index 00c1c737a..e2bd62852 100644 --- a/examples/geo_alchemy/requirements.txt +++ b/examples/geo_alchemy/requirements.txt @@ -1,4 +1,4 @@ # Install Flask-Admin with required extras from the root of the repository -../..[db-sqlalchemy,db-geoalchemy] +../..[sqlalchemy,geoalchemy] psycopg2 diff --git a/examples/mongoengine/requirements.txt b/examples/mongoengine/requirements.txt index 44b83daf7..b92cbe6f8 100644 --- a/examples/mongoengine/requirements.txt +++ b/examples/mongoengine/requirements.txt @@ -1,3 +1,3 @@ -../..[db-mongoengine,images] +../..[mongoengine,images] Flask-Login>=0.3.0 diff --git a/examples/peewee/requirements.txt b/examples/peewee/requirements.txt index af92da7b3..760899886 100644 --- a/examples/peewee/requirements.txt +++ b/examples/peewee/requirements.txt @@ -1 +1 @@ -../..[db-peewee] +../..[peewee] diff --git a/examples/pymongo/requirements.txt b/examples/pymongo/requirements.txt index a9ca3de16..1185e3662 100644 --- a/examples/pymongo/requirements.txt +++ b/examples/pymongo/requirements.txt @@ -1 +1 @@ -../..[db-pymongo] +../..[pymongo] diff --git a/examples/sqla-association_proxy/requirements.txt b/examples/sqla-association_proxy/requirements.txt index 5b323f878..c4c313095 100644 --- a/examples/sqla-association_proxy/requirements.txt +++ b/examples/sqla-association_proxy/requirements.txt @@ -1 +1 @@ -../..[db-sqlalchemy] +../..[sqlalchemy] diff --git a/examples/sqla-custom-inline-forms/requirements.txt b/examples/sqla-custom-inline-forms/requirements.txt index 5b323f878..c4c313095 100644 --- a/examples/sqla-custom-inline-forms/requirements.txt +++ b/examples/sqla-custom-inline-forms/requirements.txt @@ -1 +1 @@ -../..[db-sqlalchemy] +../..[sqlalchemy] diff --git a/examples/sqla/requirements.txt b/examples/sqla/requirements.txt index b8e21b9dd..c76d83fad 100644 --- a/examples/sqla/requirements.txt +++ b/examples/sqla/requirements.txt @@ -1,2 +1,2 @@ # Install Flask-Admin with required extras from the root of the repository -../..[db-sqlalchemy-with-utils,export,translation] +../..[sqlalchemy-with-utils,export,translation] diff --git a/examples/tinymongo/requirements.txt b/examples/tinymongo/requirements.txt index d06565f90..c4cd11d4f 100644 --- a/examples/tinymongo/requirements.txt +++ b/examples/tinymongo/requirements.txt @@ -1,3 +1,3 @@ -../..[db-pymongo] +../..[pymongo] git+https://github.com/schapman1974/tinymongo.git#egg=tinymongo diff --git a/pyproject.toml b/pyproject.toml index 4116ef059..b7307c3c7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,58 +27,58 @@ dependencies = [ ] [project.optional-dependencies] -db-sqlalchemy = [ +sqlalchemy = [ "flask-sqlalchemy>=3", "sqlalchemy>=1.4,<2", ] -db-sqlalchemy-with-utils = [ - "Flask-Admin[db-sqlalchemy]", +sqlalchemy-with-utils = [ + "Flask-Admin[sqlalchemy]", "sqlalchemy_utils>=0.36.6", "sqlalchemy-citext", "colour", "email_validator", "arrow<0.14.0", ] -db-geoalchemy = [ - "Flask-Admin[db-sqlalchemy]", +geoalchemy = [ + "Flask-Admin[sqlalchemy]", "geoalchemy2", "shapely>=2", ] -db-mongoengine = [ # TODO: seems out-of-date/unmaintained; replace or deprecate? - "Flask-Admin[db-sqlalchemy]", +mongoengine = [ # TODO: seems out-of-date/unmaintained; replace or deprecate? + "Flask-Admin[sqlalchemy]", "flask-mongoengine<1", "Flask<2.3.0", # flask-mongoengine tries to access `flask.json` ] -db-pymongo = ["pymongo>=3.7.0"] -db-peewee = [ +pymongo = ["pymongo>=3.7.0"] +peewee = [ "peewee>3", "wtf-peewee>3" ] -db-appengine = [ - "Flask-Admin[db-sqlalchemy]", +appengine = [ + "Flask-Admin[sqlalchemy]", "appengine-python-standard", "wtforms-appengine" ] -files-s3 = ["boto"] # TODO: migrate to boto3 -files-azure = ["azure-storage-blob<=3"] # TODO: update to v12+ +s3 = ["boto"] # TODO: migrate to boto3 +azure-blob-storage = ["azure-storage-blob<=3"] # TODO: update to v12+ images = ["pillow>=3.3.2"] export = ["tablib"] rediscli = ["redis"] translation = ["flask-babel>=3"] all = [ - "Flask-Admin[db-sqlalchemy]", - "Flask-Admin[db-sqlalchemy-with-utils]", - "Flask-Admin[db-geoalchemy]", + "Flask-Admin[sqlalchemy]", + "Flask-Admin[sqlalchemy-with-utils]", + "Flask-Admin[geoalchemy]", -# FIXME: disabling db-mongoengine as flask-mongoengine is now out-of-date and is +# FIXME: disabling mongoengine as flask-mongoengine is now out-of-date and is # incompatible with newer versions of flask that we want to test. -# "Flask-Admin[db-mongoengine]", +# "Flask-Admin[mongoengine]", - "Flask-Admin[db-pymongo]", - "Flask-Admin[db-peewee]", - "Flask-Admin[db-appengine]", - "Flask-Admin[files-s3]", - "Flask-Admin[files-azure]", + "Flask-Admin[pymongo]", + "Flask-Admin[peewee]", + "Flask-Admin[appengine]", + "Flask-Admin[s3]", + "Flask-Admin[azure-blob-storage]", "Flask-Admin[images]", "Flask-Admin[export]", "Flask-Admin[rediscli]", diff --git a/tox.ini b/tox.ini index 7ca696317..340b75068 100644 --- a/tox.ini +++ b/tox.ini @@ -12,7 +12,7 @@ skip_missing_interpreters = true package = wheel wheel_build_env = .pkg extras = - flaskmongoengine: all,db-mongoengine + flaskmongoengine: all,mongoengine !flaskmongoengine: all ;constrain_package_deps = true # FIXME: sort out dependency conflicts and re-enable this use_frozen_constraints = true From 2751c881d97236da72e3259f69289ab75cf992de Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Wed, 24 Jul 2024 17:55:50 +0100 Subject: [PATCH 068/156] Add documentation around installing with extras --- doc/introduction.rst | 38 +++++++++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/doc/introduction.rst b/doc/introduction.rst index fccdbb9d1..c69576cbb 100644 --- a/doc/introduction.rst +++ b/doc/introduction.rst @@ -6,7 +6,39 @@ Introduction To Flask-Admin Getting Started =============== -**** +Installing Flask-Admin +---------------------- + +Flask-Admin provides an easy-to-use layer on top of a number of databases and file stores. +Whether you use SQLAlchemy, peewee, AWS S3, or something else that Flask-Admin supports, +we don't install those things out-of-the-box. This reduces the risk of compatibility issues +and means that you don't download/install anything you don't need. + +Depending on what you use, you should install Flask-Admin with your required extras selected. + +Flask-Admin has these optional extras you can select: + +=========================== ================================================ +Extra name What functionality does this add to Flask-Admin? +=========================== ================================================ +sqlalchemy SQLAlchemy, for accessing many database engines +sqlalchemy-with-utils As above, with some additional utilities for different data types +geoalchemy As with SQLAlchemy, but adding support for geographic data and maps +mongoengine Supports the Flask-Mongoengine library +pymongo Supports the PyMongo library +peewee Supports the peewee library +appengine Supports Google's appengine library +s3 Supports file admin using AWS S3 +azure-blob-storage Supports file admin using Azure blob store +images Allows working with image data +export Supports downloading data in a variety of formats (eg TSV, JSON, etc) +rediscli Allows Flask-Admin to display a CLI for Redis +translation Supports translating Flask-Admin into a number of languages +=========================== ================================================ + +Once you've chosen the extras you need, install Flask-Admin by specifying them like so:: + + pip install flask-admin[sqlalchemy,s3,images,export,translation] Initialization -------------- @@ -73,8 +105,6 @@ So, now you can add any content to the index page, while maintaining a consisten Authorization & Permissions =========================== -**** - When setting up an admin interface for your application, one of the first problems you'll want to solve is how to keep unwanted users out. With Flask-Admin there are a few different ways of approaching this. @@ -310,8 +340,6 @@ And to add arbitrary hyperlinks to the menu:: Adding Your Own Views ===================== -**** - For situations where your requirements are really specific and you struggle to meet them with the built-in :class:`~flask_admin.model.ModelView` class, Flask-Admin makes it easy for you to take full control and add your own views to the interface. From b8509bd78e4c60508e38c8da696fdb876ca2d10a Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Wed, 24 Jul 2024 20:28:11 +0100 Subject: [PATCH 069/156] Restrict page_size to hard-coded options --- examples/sqla/admin/main.py | 1 + flask_admin/contrib/appengine/view.py | 2 +- flask_admin/model/base.py | 13 ++++-- flask_admin/tests/mongoengine/test_basic.py | 52 +++++++++++++++++++++ flask_admin/tests/peeweemodel/test_basic.py | 52 +++++++++++++++++++++ flask_admin/tests/sqla/test_basic.py | 52 +++++++++++++++++++++ 6 files changed, 168 insertions(+), 4 deletions(-) diff --git a/examples/sqla/admin/main.py b/examples/sqla/admin/main.py index ae7c40539..5addd1b3a 100644 --- a/examples/sqla/admin/main.py +++ b/examples/sqla/admin/main.py @@ -61,6 +61,7 @@ def is_numberic_validator(form, field): class UserAdmin(sqla.ModelView): + can_set_page_size = True can_view_details = True # show a modal dialog with records details action_disallowed_list = ['delete', ] diff --git a/flask_admin/contrib/appengine/view.py b/flask_admin/contrib/appengine/view.py index 010e4bdab..99fac7519 100644 --- a/flask_admin/contrib/appengine/view.py +++ b/flask_admin/contrib/appengine/view.py @@ -86,7 +86,7 @@ def get_list(self, page, sort_field, sort_desc, search, filters, order_field = -order_field q = q.order(order_field) - if not page_size: + if page_size is None: page_size = self.page_size results = q.fetch(page_size, offset=page * page_size) diff --git a/flask_admin/model/base.py b/flask_admin/model/base.py index 920cc8531..a0fee4c03 100755 --- a/flask_admin/model/base.py +++ b/flask_admin/model/base.py @@ -1507,6 +1507,14 @@ def _get_default_order(self): return None + def get_safe_page_size(self, page_size): + safe_page_size = self.page_size + + if self.can_set_page_size and page_size in {20, 50, 100}: + safe_page_size = page_size + + return safe_page_size + # Database-related API def get_list(self, page, sort_field, sort_desc, search, filters, page_size=None): @@ -1806,8 +1814,7 @@ def _get_list_url(self, view_args): kwargs = dict(page=page, sort=view_args.sort, desc=desc, search=view_args.search) kwargs.update(view_args.extra_args) - if view_args.page_size: - kwargs['page_size'] = view_args.page_size + kwargs['page_size'] = self.get_safe_page_size(view_args.page_size) kwargs.update(self._get_filters(view_args.filters)) @@ -1989,7 +1996,7 @@ def index_view(self): sort_column = sort_column[0] # Get page size - page_size = view_args.page_size or self.page_size + page_size = self.get_safe_page_size(view_args.page_size) # Get count and data count, data = self.get_list(view_args.page, sort_column, view_args.sort_desc, diff --git a/flask_admin/tests/mongoengine/test_basic.py b/flask_admin/tests/mongoengine/test_basic.py index 98b10d328..b8099dd70 100644 --- a/flask_admin/tests/mongoengine/test_basic.py +++ b/flask_admin/tests/mongoengine/test_basic.py @@ -1136,6 +1136,58 @@ def get_count_query(self): assert count is None +def test_customising_page_size(app, db, admin): + with app.app_context(): + M1, _ = create_models(db) + + instances = [M1(test1=f'instance-{x+1:03d}') for x in range(101)] + for instance in instances: + instance.save() + + view1 = CustomModelView(M1, endpoint='view1', page_size=20, can_set_page_size=False) + admin.add_view(view1) + + view2 = CustomModelView(M1, db, endpoint='view2', page_size=5, can_set_page_size=False) + admin.add_view(view2) + + view3 = CustomModelView(M1, db, endpoint='view3', page_size=20, can_set_page_size=True) + admin.add_view(view3) + + client = app.test_client() + + rv = client.get('/admin/view1/') + assert 'instance-020' in rv.text + assert 'instance-021' not in rv.text + + # `can_set_page_size=False`, so only the default of 20 is available. + rv = client.get('/admin/view1/?page_size=50') + assert 'instance-020' in rv.text + assert 'instance-021' not in rv.text + + # Check view2, which has `page_size=5` to change the default page size + rv = client.get('/admin/view2/') + assert 'instance-005' in rv.text + assert 'instance-006' not in rv.text + + # Check view3, which has `can_set_page_size=True` + rv = client.get('/admin/view3/') + assert 'instance-020' in rv.text + assert 'instance-021' not in rv.text + + rv = client.get('/admin/view3/?page_size=50') + assert 'instance-050' in rv.text + assert 'instance-051' not in rv.text + + rv = client.get('/admin/view3/?page_size=100') + assert 'instance-100' in rv.text + assert 'instance-101' not in rv.text + + # Invalid page sizes are reset to the default + rv = client.get('/admin/view3/?page_size=1') + assert 'instance-020' in rv.text + assert 'instance-021' not in rv.text + + def test_export_csv(app, db, admin): Model1, Model2 = create_models(db) diff --git a/flask_admin/tests/peeweemodel/test_basic.py b/flask_admin/tests/peeweemodel/test_basic.py index c4c0d96b6..1603e0329 100644 --- a/flask_admin/tests/peeweemodel/test_basic.py +++ b/flask_admin/tests/peeweemodel/test_basic.py @@ -1020,6 +1020,58 @@ class Model2(BaseModel): assert mdl.model1.test1 == u'first' +def test_customising_page_size(app, db, admin): + with app.app_context(): + M1, _ = create_models(db) + + instances = [M1(f'instance-{x+1:03d}') for x in range(101)] + for instance in instances: + instance.save() + + view1 = CustomModelView(M1, endpoint='view1', page_size=20, can_set_page_size=False) + admin.add_view(view1) + + view2 = CustomModelView(M1, db, endpoint='view2', page_size=5, can_set_page_size=False) + admin.add_view(view2) + + view3 = CustomModelView(M1, db, endpoint='view3', page_size=20, can_set_page_size=True) + admin.add_view(view3) + + client = app.test_client() + + rv = client.get('/admin/view1/') + assert 'instance-020' in rv.text + assert 'instance-021' not in rv.text + + # `can_set_page_size=False`, so only the default of 20 is available. + rv = client.get('/admin/view1/?page_size=50') + assert 'instance-020' in rv.text + assert 'instance-021' not in rv.text + + # Check view2, which has `page_size=5` to change the default page size + rv = client.get('/admin/view2/') + assert 'instance-005' in rv.text + assert 'instance-006' not in rv.text + + # Check view3, which has `can_set_page_size=True` + rv = client.get('/admin/view3/') + assert 'instance-020' in rv.text + assert 'instance-021' not in rv.text + + rv = client.get('/admin/view3/?page_size=50') + assert 'instance-050' in rv.text + assert 'instance-051' not in rv.text + + rv = client.get('/admin/view3/?page_size=100') + assert 'instance-100' in rv.text + assert 'instance-101' not in rv.text + + # Invalid page sizes are reset to the default + rv = client.get('/admin/view3/?page_size=1') + assert 'instance-020' in rv.text + assert 'instance-021' not in rv.text + + def test_export_csv(app, db, admin): Model1, Model2 = create_models(db) diff --git a/flask_admin/tests/sqla/test_basic.py b/flask_admin/tests/sqla/test_basic.py index b0fb2f348..2e4c0cbb0 100644 --- a/flask_admin/tests/sqla/test_basic.py +++ b/flask_admin/tests/sqla/test_basic.py @@ -2439,6 +2439,58 @@ def get_count_query(self): assert count is None +def test_customising_page_size(app, db, admin): + with app.app_context(): + M1, _ = create_models(db) + + db.session.add_all( + [M1(str(f'instance-{x+1:03d}')) for x in range(101)] + ) + + view1 = CustomModelView(M1, db.session, endpoint='view1', page_size=20, can_set_page_size=False) + admin.add_view(view1) + + view2 = CustomModelView(M1, db.session, endpoint='view2', page_size=5, can_set_page_size=False) + admin.add_view(view2) + + view3 = CustomModelView(M1, db.session, endpoint='view3', page_size=20, can_set_page_size=True) + admin.add_view(view3) + + client = app.test_client() + + rv = client.get('/admin/view1/') + assert 'instance-020' in rv.text + assert 'instance-021' not in rv.text + + # `can_set_page_size=False`, so only the default of 20 is available. + rv = client.get('/admin/view1/?page_size=50') + assert 'instance-020' in rv.text + assert 'instance-021' not in rv.text + + # Check view2, which has `page_size=5` to change the default page size + rv = client.get('/admin/view2/') + assert 'instance-005' in rv.text + assert 'instance-006' not in rv.text + + # Check view3, which has `can_set_page_size=True` + rv = client.get('/admin/view3/') + assert 'instance-020' in rv.text + assert 'instance-021' not in rv.text + + rv = client.get('/admin/view3/?page_size=50') + assert 'instance-050' in rv.text + assert 'instance-051' not in rv.text + + rv = client.get('/admin/view3/?page_size=100') + assert 'instance-100' in rv.text + assert 'instance-101' not in rv.text + + # Invalid page sizes are reset to the default + rv = client.get('/admin/view3/?page_size=1') + assert 'instance-020' in rv.text + assert 'instance-021' not in rv.text + + def test_unlimited_page_size(app, db, admin): with app.app_context(): M1, _ = create_models(db) From eca8e8b3ae0c56aa432eca7ed36fca1b5b259fd7 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Wed, 24 Jul 2024 21:54:47 +0100 Subject: [PATCH 070/156] Allow customising the page size options --- examples/sqla/admin/main.py | 2 ++ flask_admin/model/base.py | 13 +++++++++++- .../bootstrap4/admin/model/layout.html | 8 +++---- .../bootstrap4/admin/model/list.html | 4 ++-- flask_admin/tests/mongoengine/test_basic.py | 21 +++++++++++++++++++ flask_admin/tests/peeweemodel/test_basic.py | 21 +++++++++++++++++++ flask_admin/tests/sqla/test_basic.py | 21 +++++++++++++++++++ 7 files changed, 83 insertions(+), 7 deletions(-) diff --git a/examples/sqla/admin/main.py b/examples/sqla/admin/main.py index 5addd1b3a..4babf416e 100644 --- a/examples/sqla/admin/main.py +++ b/examples/sqla/admin/main.py @@ -62,6 +62,8 @@ def is_numberic_validator(form, field): class UserAdmin(sqla.ModelView): can_set_page_size = True + page_size = 5 + page_size_options = (5,10,15) can_view_details = True # show a modal dialog with records details action_disallowed_list = ['delete', ] diff --git a/flask_admin/model/base.py b/flask_admin/model/base.py index a0fee4c03..33cb7d3fb 100755 --- a/flask_admin/model/base.py +++ b/flask_admin/model/base.py @@ -788,6 +788,11 @@ class MyModelView(BaseModelView): Allows to select page size via dropdown list """ + page_size_options: tuple = (20, 50, 100) + """ + Sets the page size options available, if `can_set_page_size` is True + """ + def __init__(self, model, name=None, category=None, endpoint=None, url=None, static_folder=None, menu_class_name=None, menu_icon_type=None, menu_icon_value=None): @@ -833,6 +838,12 @@ def __init__(self, model, # Scaffolding self._refresh_cache() + if self.can_set_page_size and self.page_size not in self.page_size_options: + warnings.warn( + f"{self.page_size=} is not in {self.page_size_options=}", + UserWarning + ) + # Endpoint def _get_endpoint(self, endpoint): if endpoint: @@ -1510,7 +1521,7 @@ def _get_default_order(self): def get_safe_page_size(self, page_size): safe_page_size = self.page_size - if self.can_set_page_size and page_size in {20, 50, 100}: + if self.can_set_page_size and page_size in self.page_size_options: safe_page_size = page_size return safe_page_size diff --git a/flask_admin/templates/bootstrap4/admin/model/layout.html b/flask_admin/templates/bootstrap4/admin/model/layout.html index 00211f79a..972b27a2e 100644 --- a/flask_admin/templates/bootstrap4/admin/model/layout.html +++ b/flask_admin/templates/bootstrap4/admin/model/layout.html @@ -97,13 +97,13 @@ </form> {% endmacro %} -{% macro page_size_form(generator, btn_class='nav-link dropdown-toggle') %} +{% macro page_size_form(generator, page_size_options, btn_class='nav-link dropdown-toggle') %} <a class="{{ btn_class }}" data-toggle="dropdown" href="javascript:void(0)"> {{ page_size }} {{ _gettext('items') }}<b class="caret"></b> </a> <div class="dropdown-menu"> - <a class="dropdown-item{% if page_size == 20 %} active{% endif %}" href="{{ generator(20) }}">20 {{ _gettext('items') }}</a> - <a class="dropdown-item{% if page_size == 50 %} active{% endif %}" href="{{ generator(50) }}">50 {{ _gettext('items') }}</a> - <a class="dropdown-item{% if page_size == 100 %} active{% endif %}" href="{{ generator(100) }}">100 {{ _gettext('items') }}</a> + {% for option in page_size_options %} + <a class="dropdown-item{% if page_size == option %} active{% endif %}" href="{{ generator(option) }}">{{ _ngettext('{} item'.format(option), '{} items'.format(option), option) }}</a> + {% endfor %} </div> {% endmacro %} diff --git a/flask_admin/templates/bootstrap4/admin/model/list.html b/flask_admin/templates/bootstrap4/admin/model/list.html index b58a7e224..06d1820d5 100755 --- a/flask_admin/templates/bootstrap4/admin/model/list.html +++ b/flask_admin/templates/bootstrap4/admin/model/list.html @@ -41,7 +41,7 @@ {% if can_set_page_size %} <li class="nav-item dropdown"> - {{ model_layout.page_size_form(page_size_url) }} + {{ model_layout.page_size_form(page_size_url, admin_view.page_size_options) }} </li> {% endif %} @@ -190,7 +190,7 @@ {{ lib.form_js() }} <script src="{{ admin_static.url(filename='admin/js/bs4_modal.js', v='1.0.0') }}"></script> <script src="{{ admin_static.url(filename='admin/js/bs4_filters.js', v='1.0.0') }}"></script> - + {{ actionlib.script(_gettext('Please select at least one record.'), actions, diff --git a/flask_admin/tests/mongoengine/test_basic.py b/flask_admin/tests/mongoengine/test_basic.py index b8099dd70..d1399ef0f 100644 --- a/flask_admin/tests/mongoengine/test_basic.py +++ b/flask_admin/tests/mongoengine/test_basic.py @@ -1153,6 +1153,9 @@ def test_customising_page_size(app, db, admin): view3 = CustomModelView(M1, db, endpoint='view3', page_size=20, can_set_page_size=True) admin.add_view(view3) + view4 = CustomModelView(M1, db, endpoint='view4', page_size=5, page_size_options=(5, 10, 15), can_set_page_size=True) + admin.add_view(view4) + client = app.test_client() rv = client.get('/admin/view1/') @@ -1187,6 +1190,24 @@ def test_customising_page_size(app, db, admin): assert 'instance-020' in rv.text assert 'instance-021' not in rv.text + # Check view4, which has custom `page_size_options` + rv = client.get('/admin/view4/') + assert 'instance-005' in rv.text + assert 'instance-006' not in rv.text + + # Invalid page sizes are reset to the default + rv = client.get('/admin/view4/?page_size=1') + assert 'instance-005' in rv.text + assert 'instance-006' not in rv.text + + rv = client.get('/admin/view4/?page_size=10') + assert 'instance-010' in rv.text + assert 'instance-011' not in rv.text + + rv = client.get('/admin/view4/?page_size=15') + assert 'instance-015' in rv.text + assert 'instance-016' not in rv.text + def test_export_csv(app, db, admin): Model1, Model2 = create_models(db) diff --git a/flask_admin/tests/peeweemodel/test_basic.py b/flask_admin/tests/peeweemodel/test_basic.py index 1603e0329..4aac685b0 100644 --- a/flask_admin/tests/peeweemodel/test_basic.py +++ b/flask_admin/tests/peeweemodel/test_basic.py @@ -1037,6 +1037,9 @@ def test_customising_page_size(app, db, admin): view3 = CustomModelView(M1, db, endpoint='view3', page_size=20, can_set_page_size=True) admin.add_view(view3) + view4 = CustomModelView(M1, db, endpoint='view4', page_size=5, page_size_options=(5, 10, 15), can_set_page_size=True) + admin.add_view(view4) + client = app.test_client() rv = client.get('/admin/view1/') @@ -1071,6 +1074,24 @@ def test_customising_page_size(app, db, admin): assert 'instance-020' in rv.text assert 'instance-021' not in rv.text + # Check view4, which has custom `page_size_options` + rv = client.get('/admin/view4/') + assert 'instance-005' in rv.text + assert 'instance-006' not in rv.text + + # Invalid page sizes are reset to the default + rv = client.get('/admin/view4/?page_size=1') + assert 'instance-005' in rv.text + assert 'instance-006' not in rv.text + + rv = client.get('/admin/view4/?page_size=10') + assert 'instance-010' in rv.text + assert 'instance-011' not in rv.text + + rv = client.get('/admin/view4/?page_size=15') + assert 'instance-015' in rv.text + assert 'instance-016' not in rv.text + def test_export_csv(app, db, admin): Model1, Model2 = create_models(db) diff --git a/flask_admin/tests/sqla/test_basic.py b/flask_admin/tests/sqla/test_basic.py index 2e4c0cbb0..5da05a24a 100644 --- a/flask_admin/tests/sqla/test_basic.py +++ b/flask_admin/tests/sqla/test_basic.py @@ -2456,6 +2456,9 @@ def test_customising_page_size(app, db, admin): view3 = CustomModelView(M1, db.session, endpoint='view3', page_size=20, can_set_page_size=True) admin.add_view(view3) + view4 = CustomModelView(M1, db.session, endpoint='view4', page_size=5, page_size_options=(5, 10, 15), can_set_page_size=True) + admin.add_view(view4) + client = app.test_client() rv = client.get('/admin/view1/') @@ -2490,6 +2493,24 @@ def test_customising_page_size(app, db, admin): assert 'instance-020' in rv.text assert 'instance-021' not in rv.text + # Check view4, which has custom `page_size_options` + rv = client.get('/admin/view4/') + assert 'instance-005' in rv.text + assert 'instance-006' not in rv.text + + # Invalid page sizes are reset to the default + rv = client.get('/admin/view4/?page_size=1') + assert 'instance-005' in rv.text + assert 'instance-006' not in rv.text + + rv = client.get('/admin/view4/?page_size=10') + assert 'instance-010' in rv.text + assert 'instance-011' not in rv.text + + rv = client.get('/admin/view4/?page_size=15') + assert 'instance-015' in rv.text + assert 'instance-016' not in rv.text + def test_unlimited_page_size(app, db, admin): with app.app_context(): From ee20ab94ee517ff44c3153e011898a3d1234dbd1 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Thu, 25 Jul 2024 07:42:42 +0100 Subject: [PATCH 071/156] Update import error messages to suggest installing extras --- doc/introduction.rst | 1 + flask_admin/contrib/appengine/__init__.py | 5 ++++- flask_admin/contrib/fileadmin/azure.py | 8 +++++--- flask_admin/contrib/fileadmin/s3.py | 6 ++++-- flask_admin/contrib/geoa/__init__.py | 5 ++++- flask_admin/contrib/mongoengine/__init__.py | 5 ++++- flask_admin/contrib/peewee/__init__.py | 5 ++++- flask_admin/contrib/pymongo/__init__.py | 5 ++++- flask_admin/form/upload.py | 5 ++++- flask_admin/model/base.py | 6 ++++-- 10 files changed, 38 insertions(+), 13 deletions(-) diff --git a/doc/introduction.rst b/doc/introduction.rst index c69576cbb..8b4276abc 100644 --- a/doc/introduction.rst +++ b/doc/introduction.rst @@ -34,6 +34,7 @@ images Allows working with image data export Supports downloading data in a variety of formats (eg TSV, JSON, etc) rediscli Allows Flask-Admin to display a CLI for Redis translation Supports translating Flask-Admin into a number of languages +all Installs support for all features =========================== ================================================ Once you've chosen the extras you need, install Flask-Admin by specifying them like so:: diff --git a/flask_admin/contrib/appengine/__init__.py b/flask_admin/contrib/appengine/__init__.py index 737b65c85..4da149665 100644 --- a/flask_admin/contrib/appengine/__init__.py +++ b/flask_admin/contrib/appengine/__init__.py @@ -2,6 +2,9 @@ try: import wtforms_appengine except ImportError: - raise Exception('Please install wtforms_appengine in order to use appengine backend') + raise Exception( + 'Could not import `wtforms-appengine`. ' + 'Enable `appengine` integration by installing `flask-admin[appengine]`' + ) from .view import ModelView diff --git a/flask_admin/contrib/fileadmin/azure.py b/flask_admin/contrib/fileadmin/azure.py index 8e0fb44e3..e0e0e291f 100644 --- a/flask_admin/contrib/fileadmin/azure.py +++ b/flask_admin/contrib/fileadmin/azure.py @@ -49,9 +49,11 @@ def __init__(self, container_name, connection_string): """ if not BlockBlobService: - raise ValueError('Could not import Azure Blob Storage SDK. ' - 'You can install the SDK using ' - 'pip install azure-storage-blob') + raise ValueError( + 'Could not import `azure.storage.blob`. ' + 'Enable `azure-blob-storage` integration ' + 'by installing `flask-admin[azure-blob-storage]`' + ) self._container_name = container_name self._connection_string = connection_string diff --git a/flask_admin/contrib/fileadmin/s3.py b/flask_admin/contrib/fileadmin/s3.py index 55340167a..3843aa757 100644 --- a/flask_admin/contrib/fileadmin/s3.py +++ b/flask_admin/contrib/fileadmin/s3.py @@ -56,8 +56,10 @@ def __init__(self, bucket_name, region, aws_access_key_id, """ if not s3: - raise ValueError('Could not import boto. You can install boto by ' - 'using pip install boto') + raise ValueError( + 'Could not import `boto`. ' + 'Enable `s3` integration by installing `flask-admin[s3]`' + ) connection = s3.connect_to_region( region, diff --git a/flask_admin/contrib/geoa/__init__.py b/flask_admin/contrib/geoa/__init__.py index d802ae308..0c74a64c3 100644 --- a/flask_admin/contrib/geoa/__init__.py +++ b/flask_admin/contrib/geoa/__init__.py @@ -3,6 +3,9 @@ import geoalchemy2 import shapely except ImportError: - raise Exception('Please install geoalchemy2 and shapely in order to use geoalchemy integration') + raise Exception( + 'Could not import `geoalchemy2` or `shapely`. ' + 'Enable `geoalchemy` integration by installing `flask-admin[geoalchemy]`' + ) from .view import ModelView diff --git a/flask_admin/contrib/mongoengine/__init__.py b/flask_admin/contrib/mongoengine/__init__.py index b4920e280..6559404c6 100644 --- a/flask_admin/contrib/mongoengine/__init__.py +++ b/flask_admin/contrib/mongoengine/__init__.py @@ -2,7 +2,10 @@ try: import flask_mongoengine except ImportError: - raise Exception('Please install flask-mongoengine in order to use mongoengine backend') + raise Exception( + 'Could not import `flask-mongoengine`. ' + 'Enable `mongoengine` integration by installing `flask-admin[mongoengine]`' + ) from .view import ModelView from .form import EmbeddedForm diff --git a/flask_admin/contrib/peewee/__init__.py b/flask_admin/contrib/peewee/__init__.py index 8ad282638..d3f30fc39 100644 --- a/flask_admin/contrib/peewee/__init__.py +++ b/flask_admin/contrib/peewee/__init__.py @@ -3,6 +3,9 @@ import peewee import wtfpeewee except ImportError: - raise Exception('Please install peewee and wtf-peewee packages in order to use peewee integration') + raise Exception( + 'Could not import `peewee` or `wtfpeewee`. ' + 'Enable `peewee` integration by installing `flask-admin[peewee]`' + ) from .view import ModelView diff --git a/flask_admin/contrib/pymongo/__init__.py b/flask_admin/contrib/pymongo/__init__.py index bfa85e2b0..57bded8ac 100644 --- a/flask_admin/contrib/pymongo/__init__.py +++ b/flask_admin/contrib/pymongo/__init__.py @@ -2,6 +2,9 @@ try: import pymongo except ImportError: - raise Exception('Please install pymongo in order to use pymongo integration') + raise Exception( + 'Could not import `pymongo`. ' + 'Enable `pymongo` integration by installing `flask-admin[pymongo]`' + ) from .view import ModelView diff --git a/flask_admin/form/upload.py b/flask_admin/form/upload.py index 7c702c64c..646419c4d 100644 --- a/flask_admin/form/upload.py +++ b/flask_admin/form/upload.py @@ -387,7 +387,10 @@ class MyForm(BaseForm): """ # Check if PIL is installed if Image is None: - raise ImportError('PIL library was not found') + raise Exception( + 'Could not import `PIL`. ' + 'Enable `images` integration by installing `flask-admin[images]`' + ) self.max_size = max_size self.thumbnail_fn = thumbgen or thumbgen_filename diff --git a/flask_admin/model/base.py b/flask_admin/model/base.py index 920cc8531..0a7740efe 100755 --- a/flask_admin/model/base.py +++ b/flask_admin/model/base.py @@ -2356,8 +2356,10 @@ def _export_tablib(self, export_type, return_url): Exports a variety of formats using the tablib library. """ if tablib is None: - flash(gettext('Tablib dependency not installed.'), 'error') - return redirect(return_url) + raise Exception( + 'Could not import `tablib`. ' + 'Enable `export` integration by installing `flask-admin[export]`' + ) filename = self.get_export_name(export_type) From dba4c21d4f19bbd8de24fd34eafd6e9948e55aee Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Thu, 25 Jul 2024 08:14:21 +0100 Subject: [PATCH 072/156] Add tests-constraints.txt appengine-python-standard is becoming slightly out-of-date; it requires urllib3 < 2.0.0. Our tests dependencies want to install a version above 2.0.0, and with `constrain_package_deps` enabled this then causes tox to be unable to install flask-admin's dependencies because they conflict with the test dependencies. Using a constraints file we can force tox to install urllib3<2 when installing test deps, which then allows flask-admin to be installed with no dependency conflicts. --- requirements/build.txt | 2 +- requirements/dev.txt | 25 ++++++++++- requirements/docs.in | 3 +- requirements/docs.txt | 66 ++++++++++++++++++++++++++++-- requirements/tests-constraints.txt | 1 + requirements/typing.in | 1 + requirements/typing.txt | 6 ++- tox.ini | 11 +++-- 8 files changed, 102 insertions(+), 13 deletions(-) create mode 100644 requirements/tests-constraints.txt diff --git a/requirements/build.txt b/requirements/build.txt index a2fe14428..4e078ff3b 100644 --- a/requirements/build.txt +++ b/requirements/build.txt @@ -6,7 +6,7 @@ # build==1.2.1 # via -r build.in -importlib-metadata==8.1.0 +importlib-metadata==8.2.0 # via build packaging==24.1 # via build diff --git a/requirements/dev.txt b/requirements/dev.txt index d31ef15ae..e170cfa97 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -10,6 +10,7 @@ alabaster==0.7.13 # sphinx astroid==3.2.4 # via + # -r docs.txt # -r typing.txt # pylint babel==2.15.0 @@ -36,21 +37,25 @@ colorama==0.4.6 # via tox coverage[toml]==7.6.0 # via + # -r docs.txt # -r typing.txt # coveralls # pytest-cov coveralls==4.0.1 # via + # -r docs.txt # -r tests.in # -r typing.txt dill==0.3.8 # via + # -r docs.txt # -r typing.txt # pylint distlib==0.3.8 # via virtualenv docopt==0.6.2 # via + # -r docs.txt # -r typing.txt # coveralls docutils==0.20.1 @@ -59,6 +64,7 @@ docutils==0.20.1 # sphinx exceptiongroup==1.2.2 # via + # -r docs.txt # -r typing.txt # pytest filelock==3.15.4 @@ -67,6 +73,7 @@ filelock==3.15.4 # virtualenv flake8==7.1.0 # via + # -r docs.txt # -r tests.in # -r typing.txt identify==2.6.0 @@ -80,16 +87,18 @@ imagesize==1.4.1 # via # -r docs.txt # sphinx -importlib-metadata==8.1.0 +importlib-metadata==8.2.0 # via # -r docs.txt # sphinx iniconfig==2.0.0 # via + # -r docs.txt # -r typing.txt # pytest isort==5.13.2 # via + # -r docs.txt # -r typing.txt # pylint jinja2==3.1.4 @@ -104,6 +113,7 @@ markupsafe==2.1.5 # types-wtforms mccabe==0.7.0 # via + # -r docs.txt # -r typing.txt # flake8 # pylint @@ -135,12 +145,14 @@ pallets-sphinx-themes==2.1.3 # via -r docs.txt platformdirs==4.2.2 # via + # -r docs.txt # -r typing.txt # pylint # tox # virtualenv pluggy==1.5.0 # via + # -r docs.txt # -r typing.txt # pytest # tox @@ -148,14 +160,17 @@ pre-commit==3.5.0 # via -r dev.in psycopg2==2.9.9 # via + # -r docs.txt # -r tests.in # -r typing.txt pycodestyle==2.12.0 # via + # -r docs.txt # -r typing.txt # flake8 pyflakes==3.2.0 # via + # -r docs.txt # -r typing.txt # flake8 pygments==2.18.0 @@ -164,6 +179,7 @@ pygments==2.18.0 # sphinx pylint==3.2.6 # via + # -r docs.txt # -r tests.in # -r typing.txt pyproject-api==1.7.1 @@ -172,11 +188,13 @@ pyright==1.1.373 # via -r typing.txt pytest==8.3.1 # via + # -r docs.txt # -r tests.in # -r typing.txt # pytest-cov pytest-cov==5.0.0 # via + # -r docs.txt # -r tests.in # -r typing.txt pytz==2024.1 @@ -228,6 +246,7 @@ sphinxcontrib-serializinghtml==1.1.5 # sphinx tomli==2.0.1 # via + # -r docs.txt # -r typing.txt # coverage # mypy @@ -237,6 +256,7 @@ tomli==2.0.1 # tox tomlkit==0.13.0 # via + # -r docs.txt # -r typing.txt # pylint tox==4.16.0 @@ -277,11 +297,12 @@ types-wtforms==3.1.0.20240425 # via -r typing.txt typing-extensions==4.12.2 # via + # -r docs.txt # -r typing.txt # astroid # mypy # pylint -urllib3==2.2.2 +urllib3==1.26.19 # via # -r docs.txt # -r typing.txt diff --git a/requirements/docs.in b/requirements/docs.in index 8fa5a39c6..74211d150 100644 --- a/requirements/docs.in +++ b/requirements/docs.in @@ -1,4 +1,5 @@ --c tests.in +-c tests-constraints.txt +-r tests.in pallets-sphinx-themes sphinx diff --git a/requirements/docs.txt b/requirements/docs.txt index 07fed90cc..a3b4a52fd 100644 --- a/requirements/docs.txt +++ b/requirements/docs.txt @@ -6,36 +6,81 @@ # alabaster==0.7.13 # via sphinx +astroid==3.2.4 + # via pylint babel==2.15.0 # via sphinx certifi==2024.7.4 # via requests charset-normalizer==3.3.2 # via requests +coverage[toml]==7.6.0 + # via + # coveralls + # pytest-cov +coveralls==4.0.1 + # via -r tests.in +dill==0.3.8 + # via pylint +docopt==0.6.2 + # via coveralls docutils==0.20.1 # via sphinx +exceptiongroup==1.2.2 + # via pytest +flake8==7.1.0 + # via -r tests.in idna==3.7 # via requests imagesize==1.4.1 # via sphinx -importlib-metadata==8.1.0 +importlib-metadata==8.2.0 # via sphinx +iniconfig==2.0.0 + # via pytest +isort==5.13.2 + # via pylint jinja2==3.1.4 # via sphinx markupsafe==2.1.5 # via jinja2 +mccabe==0.7.0 + # via + # flake8 + # pylint packaging==24.1 # via # pallets-sphinx-themes + # pytest # sphinx pallets-sphinx-themes==2.1.3 # via -r docs.in +platformdirs==4.2.2 + # via pylint +pluggy==1.5.0 + # via pytest +psycopg2==2.9.9 + # via -r tests.in +pycodestyle==2.12.0 + # via flake8 +pyflakes==3.2.0 + # via flake8 pygments==2.18.0 # via sphinx +pylint==3.2.6 + # via -r tests.in +pytest==8.3.1 + # via + # -r tests.in + # pytest-cov +pytest-cov==5.0.0 + # via -r tests.in pytz==2024.1 # via babel requests==2.32.3 - # via sphinx + # via + # coveralls + # sphinx snowballstemmer==2.2.0 # via sphinx sphinx==7.1.2 @@ -57,7 +102,20 @@ sphinxcontrib-qthelp==1.0.3 # via sphinx sphinxcontrib-serializinghtml==1.1.5 # via sphinx -urllib3==2.2.2 - # via requests +tomli==2.0.1 + # via + # coverage + # pylint + # pytest +tomlkit==0.13.0 + # via pylint +typing-extensions==4.12.2 + # via + # astroid + # pylint +urllib3==1.26.19 + # via + # -c tests-constraints.txt + # requests zipp==3.19.2 # via importlib-metadata diff --git a/requirements/tests-constraints.txt b/requirements/tests-constraints.txt new file mode 100644 index 000000000..d4db0ea1e --- /dev/null +++ b/requirements/tests-constraints.txt @@ -0,0 +1 @@ +urllib3<2 # remove when appengine-python-standard supports urllib3>=2 diff --git a/requirements/typing.in b/requirements/typing.in index 982982adf..f17e08219 100644 --- a/requirements/typing.in +++ b/requirements/typing.in @@ -1,3 +1,4 @@ +-c tests-constraints.txt -r tests.in mypy diff --git a/requirements/typing.txt b/requirements/typing.txt index c1aa0a685..50154bae2 100644 --- a/requirements/typing.txt +++ b/requirements/typing.txt @@ -106,5 +106,7 @@ typing-extensions==4.12.2 # astroid # mypy # pylint -urllib3==2.2.2 - # via requests +urllib3==1.26.19 + # via + # -c tests-constraints.txt + # requests diff --git a/tox.ini b/tox.ini index 340b75068..5290141e2 100644 --- a/tox.ini +++ b/tox.ini @@ -14,13 +14,14 @@ wheel_build_env = .pkg extras = flaskmongoengine: all,mongoengine !flaskmongoengine: all -;constrain_package_deps = true # FIXME: sort out dependency conflicts and re-enable this +constrain_package_deps = true use_frozen_constraints = true # TODO: Remove SQLALCHEMY_SILENCE_UBER_WARNING when Flask-Admin is compatible with SQLAlchemy>=2.0.0 setenv = SQLALCHEMY_SILENCE_UBER_WARNING = 1 AZURE_STORAGE_CONNECTION_STRING = DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1; deps = + -c requirements/tests-constraints.txt -r requirements/tests.in commands_pre = noflaskbabel: pip uninstall -y flask-babel @@ -35,13 +36,17 @@ skip_install = true commands = pre-commit run --all-files [testenv:typing] -deps = -r requirements/typing.txt +deps = + -c requirements/tests-constraints.txt + -r requirements/typing.txt commands = mypy --python-version 3.8 mypy --python-version 3.12 [testenv:docs] -deps = -r requirements/docs.txt +deps = + -c requirements/tests-constraints.txt + -r requirements/docs.txt # commands = sphinx-build -E -W -b dirhtml doc doc/_build/dirhtml # TODO: Switch to the above command when docs have been migrated to use the Pallets theme. commands = sphinx-build -b html -d build/doctrees doc build/html From 5a59a5b7eda701c119b13bcf3b5535de7121d682 Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Sun, 29 Oct 2023 17:14:59 +0000 Subject: [PATCH 073/156] Fix Exception: Cannot find reverse relation for model SQLAlchemy 2.0.2 removed the invocation of registry.configure() from Mapper.iterate_properties causing this problem. https://docs.sqlalchemy.org/changelog/changelog_20.html#change-45fe5664c88893d899c991ca3675142c Observed as test failures in: flask_admin/tests/sqla/test_basic.py flask_admin/tests/sqla/test_form_rules.py flask_admin/tests/sqla/test_inlineform.py --- flask_admin/contrib/sqla/form.py | 2 +- flask_admin/contrib/sqla/view.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/flask_admin/contrib/sqla/form.py b/flask_admin/contrib/sqla/form.py index 543342ae3..ea0dbc847 100644 --- a/flask_admin/contrib/sqla/form.py +++ b/flask_admin/contrib/sqla/form.py @@ -515,7 +515,7 @@ def get_form(model, converter, mapper = model._sa_class_manager.mapper field_args = field_args or {} - properties = ((p.key, p) for p in mapper.iterate_properties) + properties = ((p.key, p) for p in mapper.attrs) if only: def find(name): diff --git a/flask_admin/contrib/sqla/view.py b/flask_admin/contrib/sqla/view.py index 531985832..6dafa165a 100755 --- a/flask_admin/contrib/sqla/view.py +++ b/flask_admin/contrib/sqla/view.py @@ -370,7 +370,7 @@ def _get_model_iterator(self, model=None): if model is None: model = self.model - return model._sa_class_manager.mapper.iterate_properties + return model._sa_class_manager.mapper.attrs def _apply_path_joins(self, query, joins, path, inner_join=True): """ From a50acd2802c6e0f0a7d12f535f67b73bb73a2888 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Thu, 25 Jul 2024 22:55:06 +0100 Subject: [PATCH 074/156] Remove `appengine` support Appengine's integration with Flask-Admin: * has seen no commits since 2017 * has an example that doesn't run * has no tests * has very limited code/features * is causing maintenance issues with other features because of outdated dependencies On these grounds, I believe we should remove support. If there is an outswell of interest, we should look to support it fresh from the ground up with a clean slate. --- .gitignore | 3 +- doc/introduction.rst | 1 - examples/appengine/app.py | 51 ----- examples/appengine/app.yaml | 8 - examples/appengine/appengine_config.py | 3 - examples/appengine/run.sh | 5 - flask_admin/contrib/appengine/__init__.py | 10 - flask_admin/contrib/appengine/fields.py | 18 -- flask_admin/contrib/appengine/form.py | 10 - flask_admin/contrib/appengine/view.py | 235 ---------------------- pyproject.toml | 8 - requirements/dev.txt | 4 +- requirements/docs.in | 1 - requirements/docs.txt | 8 +- requirements/tests-constraints.txt | 1 - requirements/tests.txt | 2 +- requirements/typing.in | 1 - requirements/typing.txt | 8 +- tox.ini | 12 +- 19 files changed, 13 insertions(+), 376 deletions(-) delete mode 100644 examples/appengine/app.py delete mode 100644 examples/appengine/app.yaml delete mode 100644 examples/appengine/appengine_config.py delete mode 100755 examples/appengine/run.sh delete mode 100644 flask_admin/contrib/appengine/__init__.py delete mode 100644 flask_admin/contrib/appengine/fields.py delete mode 100644 flask_admin/contrib/appengine/form.py delete mode 100644 flask_admin/contrib/appengine/view.py delete mode 100644 requirements/tests-constraints.txt diff --git a/.gitignore b/.gitignore index f253fc31f..243c83924 100644 --- a/.gitignore +++ b/.gitignore @@ -19,7 +19,6 @@ __pycache__ examples/sqla-inline/static examples/file/files examples/forms/files -examples/appengine/lib .DS_Store .idea/ *.sqlite @@ -27,4 +26,4 @@ env *.egg .eggs .tox/ -.env \ No newline at end of file +.env diff --git a/doc/introduction.rst b/doc/introduction.rst index 8b4276abc..b651d8376 100644 --- a/doc/introduction.rst +++ b/doc/introduction.rst @@ -27,7 +27,6 @@ geoalchemy As with SQLAlchemy, but adding support for geographi mongoengine Supports the Flask-Mongoengine library pymongo Supports the PyMongo library peewee Supports the peewee library -appengine Supports Google's appengine library s3 Supports file admin using AWS S3 azure-blob-storage Supports file admin using Azure blob store images Allows working with image data diff --git a/examples/appengine/app.py b/examples/appengine/app.py deleted file mode 100644 index 48b2c7636..000000000 --- a/examples/appengine/app.py +++ /dev/null @@ -1,51 +0,0 @@ - -from flask import Flask -import flask_admin -from flask_admin.contrib import appengine -from google.appengine.ext import db -from google.appengine.ext import ndb - -# Create application -app = Flask(__name__) - -# Create dummy secrey key so we can use sessions -app.config['SECRET_KEY'] = '123456790' - -admin = flask_admin.Admin(app, name="Admin") - -# Flask views -@app.route('/') -def index(): - return '<a href="/admin/">Click me to get to Admin!</a>' - -class Car(db.Model): - owner = db.StringProperty() - make_model = db.StringProperty() - indexed_int = db.IntegerProperty() - unindexed_int = db.IntegerProperty(indexed=False) - -class Tire(db.Model): - car = db.ReferenceProperty(Car) - position = db.StringProperty() - -class House(ndb.Model): - address = db.StringProperty() - json_property = ndb.JsonProperty() - indexed_int = ndb.IntegerProperty() - unindexed_int = ndb.IntegerProperty(indexed=False) - text_property = ndb.TextProperty() - datetime_property = ndb.DateTimeProperty() - -class Room(ndb.Model): - house = ndb.KeyProperty(kind=House) - name = ndb.StringProperty() - -admin.add_view(appengine.ModelView(Car)) -admin.add_view(appengine.ModelView(Tire)) -admin.add_view(appengine.ModelView(House)) -admin.add_view(appengine.ModelView(Room)) - -if __name__ == '__main__': - - # Start app - app.run(debug=True) diff --git a/examples/appengine/app.yaml b/examples/appengine/app.yaml deleted file mode 100644 index 3c4e3d080..000000000 --- a/examples/appengine/app.yaml +++ /dev/null @@ -1,8 +0,0 @@ -runtime: python27 -threadsafe: true -api_version: 1 -module: default - -handlers: -- url: /admin.* - script: app.app diff --git a/examples/appengine/appengine_config.py b/examples/appengine/appengine_config.py deleted file mode 100644 index edbd09015..000000000 --- a/examples/appengine/appengine_config.py +++ /dev/null @@ -1,3 +0,0 @@ -# This file gets imported as part of running dev_appserver.py -import sys -sys.path = ['lib'] + sys.path diff --git a/examples/appengine/run.sh b/examples/appengine/run.sh deleted file mode 100755 index 451b62b79..000000000 --- a/examples/appengine/run.sh +++ /dev/null @@ -1,5 +0,0 @@ -BASEDIR=$(dirname $0) -# Install wtforms-admin to our lib/ directory, using our local source tree -pip install -t $BASEDIR/lib/ $BASEDIR/../.. wtforms_appengine -# Now run our server -dev_appserver.py $BASEDIR/app.yaml diff --git a/flask_admin/contrib/appengine/__init__.py b/flask_admin/contrib/appengine/__init__.py deleted file mode 100644 index 4da149665..000000000 --- a/flask_admin/contrib/appengine/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -# flake8: noqa -try: - import wtforms_appengine -except ImportError: - raise Exception( - 'Could not import `wtforms-appengine`. ' - 'Enable `appengine` integration by installing `flask-admin[appengine]`' - ) - -from .view import ModelView diff --git a/flask_admin/contrib/appengine/fields.py b/flask_admin/contrib/appengine/fields.py deleted file mode 100644 index e75213f74..000000000 --- a/flask_admin/contrib/appengine/fields.py +++ /dev/null @@ -1,18 +0,0 @@ -from wtforms.fields import StringField -from google.appengine.ext import ndb - -import decimal - - -class GeoPtPropertyField(StringField): - def process_formdata(self, valuelist): - if valuelist: - try: - lat, lon = valuelist[0].split(',') - self.data = ndb.GeoPt( - decimal.Decimal(lat.strip()), - decimal.Decimal(lon.strip()) - ) - - except (decimal.InvalidOperation, ValueError): - raise ValueError('Not a valid coordinate location') diff --git a/flask_admin/contrib/appengine/form.py b/flask_admin/contrib/appengine/form.py deleted file mode 100644 index fa5f490a7..000000000 --- a/flask_admin/contrib/appengine/form.py +++ /dev/null @@ -1,10 +0,0 @@ -from wtforms_appengine.ndb import ModelConverter -from .fields import GeoPtPropertyField -from flask_admin.model.form import converts - - -class AdminModelConverter(ModelConverter): - @converts('GeoPt') - def convert_GeoPtProperty(self, model, prop, kwargs): - """Returns a form field for a ``ndb.GeoPtProperty``.""" - return GeoPtPropertyField(**kwargs) diff --git a/flask_admin/contrib/appengine/view.py b/flask_admin/contrib/appengine/view.py deleted file mode 100644 index 99fac7519..000000000 --- a/flask_admin/contrib/appengine/view.py +++ /dev/null @@ -1,235 +0,0 @@ -import logging - -from flask_admin.model import BaseModelView -from wtforms_appengine import db as wt_db -from wtforms_appengine import ndb as wt_ndb - -from google.appengine.ext import db -from google.appengine.ext import ndb - -from flask_wtf import Form -from flask_admin.model.form import create_editable_list_form -from .form import AdminModelConverter - - -class NdbModelView(BaseModelView): - """ - AppEngine NDB model scaffolding. - """ - - def get_pk_value(self, model): - return model.key.urlsafe() - - def scaffold_list_columns(self): - return sorted([k for (k, v) in self.model.__dict__.iteritems() if isinstance(v, ndb.Property)]) - - def scaffold_sortable_columns(self): - return [k for (k, v) in self.model.__dict__.iteritems() if isinstance(v, ndb.Property) and v._indexed] - - def init_search(self): - return None - - def is_valid_filter(self): - pass - - def scaffold_filters(self): - # TODO: implement - pass - - form_args = None - - model_form_converter = AdminModelConverter - """ - Model form conversion class. Use this to implement custom field conversion logic. - - For example:: - - class MyModelConverter(AdminModelConverter): - pass - - - class MyAdminView(ModelView): - model_form_converter = MyModelConverter - """ - - def scaffold_form(self): - form_class = wt_ndb.model_form( - self.model(), - base_class=Form, - only=self.form_columns, - exclude=self.form_excluded_columns, - field_args=self.form_args, - converter=self.model_form_converter(), - ) - return form_class - - def scaffold_list_form(self, widget=None, validators=None): - form_class = wt_ndb.model_form( - self.model(), - base_class=Form, - only=self.column_editable_list, - field_args=self.form_args, - converter=self.model_form_converter(), - ) - result = create_editable_list_form(Form, form_class, widget) - return result - - def get_list(self, page, sort_field, sort_desc, search, filters, - page_size=None): - # TODO: implement filters (don't think search can work here) - - q = self.model.query() - - if sort_field: - order_field = getattr(self.model, sort_field) - if sort_desc: - order_field = -order_field - q = q.order(order_field) - - if page_size is None: - page_size = self.page_size - - results = q.fetch(page_size, offset=page * page_size) - - return q.count(), results - - def get_one(self, urlsafe_key): - return ndb.Key(urlsafe=urlsafe_key).get() - - def create_model(self, form): - try: - model = self.model() - form.populate_obj(model) - model.put() - except Exception as ex: - if not self.handle_view_exception(ex): - # flash(gettext('Failed to create record. %(error)s', - # error=ex), 'error') - logging.exception('Failed to create record.') - return False - else: - self.after_model_change(form, model, True) - - return model - - def update_model(self, form, model): - try: - form.populate_obj(model) - model.put() - except Exception as ex: - if not self.handle_view_exception(ex): - # flash(gettext('Failed to update record. %(error)s', - # error=ex), 'error') - logging.exception('Failed to update record.') - return False - else: - self.after_model_change(form, model, False) - - return True - - def delete_model(self, model): - try: - model.key.delete() - except Exception as ex: - if not self.handle_view_exception(ex): - # flash(gettext('Failed to delete record. %(error)s', - # error=ex), - # 'error') - logging.exception('Failed to delete record.') - return False - else: - self.after_model_delete(model) - - return True - - -class DbModelView(BaseModelView): - """ - AppEngine DB model scaffolding. - """ - - def get_pk_value(self, model): - return str(model.key()) - - def scaffold_list_columns(self): - return sorted([k for (k, v) in self.model.__dict__.iteritems() if isinstance(v, db.Property)]) - - def scaffold_sortable_columns(self): - # We use getattr() because ReferenceProperty does not specify a 'indexed' field - return [k for (k, v) in self.model.__dict__.iteritems() - if isinstance(v, db.Property) and getattr(v, 'indexed', None)] - - def init_search(self): - return None - - def is_valid_filter(self): - pass - - def scaffold_filters(self): - # TODO: implement - pass - - def scaffold_form(self): - return wt_db.model_form(self.model()) - - def get_list(self, page, sort_field, sort_desc, search, filters): - # TODO: implement filters (don't think search can work here) - - q = self.model.all() - - if sort_field: - if sort_desc: - sort_field = "-" + sort_field - q.order(sort_field) - - results = q.fetch(self.page_size, offset=page * self.page_size) - return q.count(), results - - def get_one(self, encoded_key): - return db.get(db.Key(encoded=encoded_key)) - - def create_model(self, form): - try: - model = self.model() - form.populate_obj(model) - model.put() - return model - except Exception as ex: - if not self.handle_view_exception(ex): - # flash(gettext('Failed to create record. %(error)s', - # error=ex), 'error') - logging.exception('Failed to create record.') - return False - - def update_model(self, form, model): - try: - form.populate_obj(model) - model.put() - return True - except Exception as ex: - if not self.handle_view_exception(ex): - # flash(gettext('Failed to update record. %(error)s', - # error=ex), 'error') - logging.exception('Failed to update record.') - return False - - def delete_model(self, model): - try: - model.delete() - return True - except Exception as ex: - if not self.handle_view_exception(ex): - # flash(gettext('Failed to delete record. %(error)s', - # error=ex), - # 'error') - logging.exception('Failed to delete record.') - return False - - -def ModelView(model): - if issubclass(model, ndb.Model): - return NdbModelView(model) - elif issubclass(model, db.Model): - return DbModelView(model) - else: - raise ValueError("Unsupported model: %s" % model) diff --git a/pyproject.toml b/pyproject.toml index b7307c3c7..5fde81f01 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -54,11 +54,6 @@ peewee = [ "peewee>3", "wtf-peewee>3" ] -appengine = [ - "Flask-Admin[sqlalchemy]", - "appengine-python-standard", - "wtforms-appengine" -] s3 = ["boto"] # TODO: migrate to boto3 azure-blob-storage = ["azure-storage-blob<=3"] # TODO: update to v12+ images = ["pillow>=3.3.2"] @@ -76,7 +71,6 @@ all = [ "Flask-Admin[pymongo]", "Flask-Admin[peewee]", - "Flask-Admin[appengine]", "Flask-Admin[s3]", "Flask-Admin[azure-blob-storage]", "Flask-Admin[images]", @@ -182,7 +176,6 @@ module = [ "flask_babel", "flask_mongoengine.*", "flask_wtf", - "google.appengine.ext", "gridfs", "marker", "mongoengine.*", @@ -193,7 +186,6 @@ module = [ "sqlalchemy_utils", "tablib", "wtforms.*", - "wtforms_appengine.*", "wtfpeewee.*", ] ignore_missing_imports = true diff --git a/requirements/dev.txt b/requirements/dev.txt index e170cfa97..68232ade3 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -186,7 +186,7 @@ pyproject-api==1.7.1 # via tox pyright==1.1.373 # via -r typing.txt -pytest==8.3.1 +pytest==8.3.2 # via # -r docs.txt # -r tests.in @@ -302,7 +302,7 @@ typing-extensions==4.12.2 # astroid # mypy # pylint -urllib3==1.26.19 +urllib3==2.2.2 # via # -r docs.txt # -r typing.txt diff --git a/requirements/docs.in b/requirements/docs.in index 74211d150..652d61aee 100644 --- a/requirements/docs.in +++ b/requirements/docs.in @@ -1,4 +1,3 @@ --c tests-constraints.txt -r tests.in pallets-sphinx-themes diff --git a/requirements/docs.txt b/requirements/docs.txt index a3b4a52fd..df2c324bf 100644 --- a/requirements/docs.txt +++ b/requirements/docs.txt @@ -69,7 +69,7 @@ pygments==2.18.0 # via sphinx pylint==3.2.6 # via -r tests.in -pytest==8.3.1 +pytest==8.3.2 # via # -r tests.in # pytest-cov @@ -113,9 +113,7 @@ typing-extensions==4.12.2 # via # astroid # pylint -urllib3==1.26.19 - # via - # -c tests-constraints.txt - # requests +urllib3==2.2.2 + # via requests zipp==3.19.2 # via importlib-metadata diff --git a/requirements/tests-constraints.txt b/requirements/tests-constraints.txt deleted file mode 100644 index d4db0ea1e..000000000 --- a/requirements/tests-constraints.txt +++ /dev/null @@ -1 +0,0 @@ -urllib3<2 # remove when appengine-python-standard supports urllib3>=2 diff --git a/requirements/tests.txt b/requirements/tests.txt index c8fb53bec..3f70eb261 100644 --- a/requirements/tests.txt +++ b/requirements/tests.txt @@ -48,7 +48,7 @@ pyflakes==3.2.0 # via flake8 pylint==3.2.6 # via -r tests.in -pytest==8.3.1 +pytest==8.3.2 # via # -r tests.in # pytest-cov diff --git a/requirements/typing.in b/requirements/typing.in index f17e08219..982982adf 100644 --- a/requirements/typing.in +++ b/requirements/typing.in @@ -1,4 +1,3 @@ --c tests-constraints.txt -r tests.in mypy diff --git a/requirements/typing.txt b/requirements/typing.txt index 50154bae2..95d06b2ff 100644 --- a/requirements/typing.txt +++ b/requirements/typing.txt @@ -60,7 +60,7 @@ pylint==3.2.6 # via -r tests.in pyright==1.1.373 # via -r typing.in -pytest==8.3.1 +pytest==8.3.2 # via # -r tests.in # -r typing.in @@ -106,7 +106,5 @@ typing-extensions==4.12.2 # astroid # mypy # pylint -urllib3==1.26.19 - # via - # -c tests-constraints.txt - # requests +urllib3==2.2.2 + # via requests diff --git a/tox.ini b/tox.ini index 5290141e2..21494a982 100644 --- a/tox.ini +++ b/tox.ini @@ -20,9 +20,7 @@ use_frozen_constraints = true setenv = SQLALCHEMY_SILENCE_UBER_WARNING = 1 AZURE_STORAGE_CONNECTION_STRING = DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1; -deps = - -c requirements/tests-constraints.txt - -r requirements/tests.in +deps = -r requirements/tests.in commands_pre = noflaskbabel: pip uninstall -y flask-babel flaskmongoengine: pip install Flask==2.1.3 Werkzeug==2.3.8 flask-sqlalchemy<3 @@ -36,17 +34,13 @@ skip_install = true commands = pre-commit run --all-files [testenv:typing] -deps = - -c requirements/tests-constraints.txt - -r requirements/typing.txt +deps = -r requirements/typing.txt commands = mypy --python-version 3.8 mypy --python-version 3.12 [testenv:docs] -deps = - -c requirements/tests-constraints.txt - -r requirements/docs.txt +deps = -r requirements/docs.txt # commands = sphinx-build -E -W -b dirhtml doc doc/_build/dirhtml # TODO: Switch to the above command when docs have been migrated to use the Pallets theme. commands = sphinx-build -b html -d build/doctrees doc build/html From 18c3b28a8e25c1a58998bc18ddaf24f924eed53a Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Thu, 25 Jul 2024 23:21:06 +0100 Subject: [PATCH 075/156] Define and test minimum dependency requirements --- .github/workflows/tests.yaml | 4 + pyproject.toml | 24 ++--- requirements-skip/tests-min.in | 41 +++++++ requirements-skip/tests-min.txt | 184 ++++++++++++++++++++++++++++++++ tox.ini | 15 ++- 5 files changed, 255 insertions(+), 13 deletions(-) create mode 100644 requirements-skip/tests-min.in create mode 100644 requirements-skip/tests-min.txt diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 60d42f517..e9977b34c 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -23,6 +23,10 @@ jobs: python: ['3.8', '3.9', '3.10', '3.11', '3.12'] tox: ['normal'] include: + - python: '3.8' + tox: 'py38-min' + - python: '3.12' + tox: 'py312-min' - python: '3.12' tox: 'py312-noflaskbabel' - python: '3.12' diff --git a/pyproject.toml b/pyproject.toml index 5fde81f01..1858201fb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,19 +29,19 @@ dependencies = [ [project.optional-dependencies] sqlalchemy = [ "flask-sqlalchemy>=3", - "sqlalchemy>=1.4,<2", + "sqlalchemy>=1.4.18,<2", ] sqlalchemy-with-utils = [ "Flask-Admin[sqlalchemy]", - "sqlalchemy_utils>=0.36.6", - "sqlalchemy-citext", - "colour", - "email_validator", - "arrow<0.14.0", + "sqlalchemy_utils>=0.38.0", + "sqlalchemy-citext>=1.8.0", + "colour>=0.1.5", + "email_validator>=2", + "arrow>=0.13.0", ] geoalchemy = [ "Flask-Admin[sqlalchemy]", - "geoalchemy2", + "geoalchemy2>=0.14.0", "shapely>=2", ] mongoengine = [ # TODO: seems out-of-date/unmaintained; replace or deprecate? @@ -51,14 +51,14 @@ mongoengine = [ # TODO: seems out-of-date/unmaintained; replace or deprecate? ] pymongo = ["pymongo>=3.7.0"] peewee = [ - "peewee>3", - "wtf-peewee>3" + "peewee>=3.14.0", + "wtf-peewee>=3.0.4" ] s3 = ["boto"] # TODO: migrate to boto3 azure-blob-storage = ["azure-storage-blob<=3"] # TODO: update to v12+ -images = ["pillow>=3.3.2"] -export = ["tablib"] -rediscli = ["redis"] +images = ["pillow>=10.0.0"] +export = ["tablib>=3.0.0"] +rediscli = ["redis>=4.0.0"] translation = ["flask-babel>=3"] all = [ "Flask-Admin[sqlalchemy]", diff --git a/requirements-skip/tests-min.in b/requirements-skip/tests-min.in new file mode 100644 index 000000000..0636f9328 --- /dev/null +++ b/requirements-skip/tests-min.in @@ -0,0 +1,41 @@ +coveralls +flake8 +pylint +pytest +pytest-cov + +psycopg2 + +# -------------------------------------- +# Flask-Admin minimum supported versions +# -------------------------------------- + +flask==2.2.0 +werkzeug==2.3.8 +wtforms==2.3.0 +sqlalchemy==1.4.18 +sqlalchemy_utils==0.38.0 +sqlalchemy-citext==1.8.0 +flask-sqlalchemy==3.0.0 + +colour==0.1.5 +email_validator==2.0.0 +arrow==0.13.0 + +geoalchemy2==0.14.0 +shapely==2 + +pymongo==3.7.0 + +peewee==3.14.0 +wtf-peewee==3.0.4 + +azure-storage-blob==2.1.0 + +pillow==10.0.0 + +flask-babel==3.0.0 + +tablib==3.0.0 + +redis==4.0.0 diff --git a/requirements-skip/tests-min.txt b/requirements-skip/tests-min.txt new file mode 100644 index 000000000..3ff2cc124 --- /dev/null +++ b/requirements-skip/tests-min.txt @@ -0,0 +1,184 @@ +# +# This file is autogenerated by pip-compile with Python 3.8 +# by the following command: +# +# pip-compile tests-min.in +# +arrow==0.13.0 + # via -r tests-min.in +astroid==3.2.4 + # via pylint +azure-common==1.1.28 + # via + # azure-storage-blob + # azure-storage-common +azure-storage-blob==2.1.0 + # via -r tests-min.in +azure-storage-common==2.1.0 + # via azure-storage-blob +babel==2.15.0 + # via flask-babel +certifi==2024.7.4 + # via requests +cffi==1.16.0 + # via cryptography +charset-normalizer==3.3.2 + # via requests +click==8.1.7 + # via flask +colour==0.1.5 + # via -r tests-min.in +coverage[toml]==7.6.0 + # via + # coveralls + # pytest-cov +coveralls==4.0.1 + # via -r tests-min.in +cryptography==43.0.0 + # via azure-storage-common +deprecated==1.2.14 + # via redis +dill==0.3.8 + # via pylint +dnspython==2.6.1 + # via email-validator +docopt==0.6.2 + # via coveralls +email-validator==2.0.0 + # via -r tests-min.in +exceptiongroup==1.2.2 + # via pytest +flake8==7.1.0 + # via -r tests-min.in +flask==2.2.0 + # via + # -r tests-min.in + # flask-babel + # flask-sqlalchemy +flask-babel==3.0.0 + # via -r tests-min.in +flask-sqlalchemy==3.0.0 + # via -r tests-min.in +geoalchemy2==0.14.0 + # via -r tests-min.in +greenlet==3.0.3 + # via sqlalchemy +idna==3.7 + # via + # email-validator + # requests +importlib-metadata==8.2.0 + # via flask +iniconfig==2.0.0 + # via pytest +isort==5.13.2 + # via pylint +itsdangerous==2.2.0 + # via flask +jinja2==3.1.4 + # via + # flask + # flask-babel +markupsafe==2.1.5 + # via + # jinja2 + # werkzeug + # wtforms +mccabe==0.7.0 + # via + # flake8 + # pylint +numpy==1.24.4 + # via shapely +packaging==24.1 + # via + # geoalchemy2 + # pytest +peewee==3.14.0 + # via + # -r tests-min.in + # wtf-peewee +pillow==10.0.0 + # via -r tests-min.in +platformdirs==4.2.2 + # via pylint +pluggy==1.5.0 + # via pytest +psycopg2==2.9.9 + # via -r tests-min.in +pycodestyle==2.12.0 + # via flake8 +pycparser==2.22 + # via cffi +pyflakes==3.2.0 + # via flake8 +pylint==3.2.6 + # via -r tests-min.in +pymongo==3.7.0 + # via -r tests-min.in +pytest==8.3.2 + # via + # -r tests-min.in + # pytest-cov +pytest-cov==5.0.0 + # via -r tests-min.in +python-dateutil==2.9.0.post0 + # via + # arrow + # azure-storage-common +pytz==2022.7.1 + # via + # babel + # flask-babel +redis==4.0.0 + # via -r tests-min.in +requests==2.32.3 + # via + # azure-storage-common + # coveralls +shapely==2.0.0 + # via -r tests-min.in +six==1.16.0 + # via + # python-dateutil + # sqlalchemy-utils +sqlalchemy==1.4.18 + # via + # -r tests-min.in + # flask-sqlalchemy + # geoalchemy2 + # sqlalchemy-citext + # sqlalchemy-utils +sqlalchemy-citext==1.8.0 + # via -r tests-min.in +sqlalchemy-utils==0.38.0 + # via -r tests-min.in +tablib==3.0.0 + # via -r tests-min.in +tomli==2.0.1 + # via + # coverage + # pylint + # pytest +tomlkit==0.13.0 + # via pylint +typing-extensions==4.12.2 + # via + # astroid + # pylint +urllib3==2.2.2 + # via requests +werkzeug==2.3.8 + # via + # -r tests-min.in + # flask +wrapt==1.16.0 + # via deprecated +wtf-peewee==3.0.4 + # via -r tests-min.in +wtforms==2.3.0 + # via + # -r tests-min.in + # wtf-peewee +zipp==3.19.2 + # via importlib-metadata diff --git a/tox.ini b/tox.ini index 21494a982..ee96e5722 100644 --- a/tox.ini +++ b/tox.ini @@ -3,6 +3,7 @@ envlist = py3{8,9,10,11,12} py312-noflaskbabel # only tested against latest of all configurations, sans flask-babel py312-flaskmongoengine + py{38,312}-min # style typing docs @@ -20,7 +21,7 @@ use_frozen_constraints = true setenv = SQLALCHEMY_SILENCE_UBER_WARNING = 1 AZURE_STORAGE_CONNECTION_STRING = DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1; -deps = -r requirements/tests.in +deps = -r requirements/tests.txt commands_pre = noflaskbabel: pip uninstall -y flask-babel flaskmongoengine: pip install Flask==2.1.3 Werkzeug==2.3.8 flask-sqlalchemy<3 @@ -28,6 +29,10 @@ commands = flaskmongoengine: pytest -v --tb=short --basetemp={envtmpdir} flask_admin/tests -W 'default::DeprecationWarning' {posargs} !flaskmongoengine: pytest -v --tb=short --basetemp={envtmpdir} flask_admin/tests --ignore flask_admin/tests/mongoengine {posargs} +[testenv:{py38,py312}-min] +deps = -r requirements-skip/tests-min.txt +commands = pytest -v --tb=short --basetemp={envtmpdir} flask_admin/tests -W 'default::DeprecationWarning' --ignore flask_admin/tests/mongoengine {posargs} + [testenv:style] deps = pre-commit skip_install = true @@ -62,3 +67,11 @@ commands = pip-compile tests.in -q {posargs:-U} pip-compile typing.in -q {posargs:-U} pip-compile dev.in -q {posargs:-U} + +[testenv:update-requirements_skip] +labels = update +deps = pip-tools +skip_install = true +change_dir = requirements-skip +commands = + pip-compile tests-min.in -q {posargs:-U} From fc0bdae107f34555f573dc9070e7d1a307d94e10 Mon Sep 17 00:00:00 2001 From: David Gilman <davidgilman1@gmail.com> Date: Sat, 27 Jul 2024 17:26:55 +0100 Subject: [PATCH 076/156] Resolve LegacyAPIWarning for Query.get() LegacyAPIWarning: The Query.get() method is considered legacy as of the 1.x series of SQLAlchemy and becomes a legacy construct in 2.0. The method is now available as Session.get() (deprecated since: 2.0) --- flask_admin/contrib/sqla/ajax.py | 2 +- flask_admin/tests/sqla/test_inlineform.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/flask_admin/contrib/sqla/ajax.py b/flask_admin/contrib/sqla/ajax.py index 8e4ab3cf9..c2db01259 100644 --- a/flask_admin/contrib/sqla/ajax.py +++ b/flask_admin/contrib/sqla/ajax.py @@ -64,7 +64,7 @@ def get_query(self): def get_one(self, pk): # prevent autoflush from occuring during populate_obj with self.session.no_autoflush: - return self.get_query().get(pk) + return self.session.get(self.model, pk) def get_list(self, term, offset=0, limit=DEFAULT_PAGE_SIZE): query = self.get_query() diff --git a/flask_admin/tests/sqla/test_inlineform.py b/flask_admin/tests/sqla/test_inlineform.py index 61e7a14f8..eaf74baa7 100644 --- a/flask_admin/tests/sqla/test_inlineform.py +++ b/flask_admin/tests/sqla/test_inlineform.py @@ -92,7 +92,7 @@ class UserModelView(ModelView): rv = client.post('/admin/user/edit/?id=2', data=data) assert rv.status_code == 302 assert User.query.count() == 2 - assert User.query.get(2).name == u'barf' + assert db.session.get(User, 2).name == 'barf' assert UserInfo.query.count() == 1 assert UserInfo.query.one().key == u'bar' From 7976461b77ae8cd3136b2bd48fb62071307548c4 Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Sat, 27 Jul 2024 17:26:55 +0100 Subject: [PATCH 077/156] Remove SQLAlchemy < 1.4 imports and comments Neither 'Column' object nor 'Comparator' object has an attribute 'not_between' --- flask_admin/contrib/sqla/filters.py | 1 - flask_admin/contrib/sqla/tools.py | 14 +++++--------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/flask_admin/contrib/sqla/filters.py b/flask_admin/contrib/sqla/filters.py index cdbe680eb..67d19504f 100644 --- a/flask_admin/contrib/sqla/filters.py +++ b/flask_admin/contrib/sqla/filters.py @@ -207,7 +207,6 @@ def apply(self, query, value, alias=None): class DateNotBetweenFilter(DateBetweenFilter): def apply(self, query, value, alias=None): start, end = value - # ~between() isn't possible until sqlalchemy 1.0.0 return query.filter(not_(self.get_column(alias).between(start, end))) def operation(self): diff --git a/flask_admin/contrib/sqla/tools.py b/flask_admin/contrib/sqla/tools.py index 4149d5214..0e02ecec7 100644 --- a/flask_admin/contrib/sqla/tools.py +++ b/flask_admin/contrib/sqla/tools.py @@ -1,19 +1,15 @@ import types from sqlalchemy import tuple_, or_, and_, inspect -try: - # Attempt _class_resolver import from SQLALchemy 1.4/2.0 module architecture. - from sqlalchemy.orm.clsregistry import _class_resolver -except ImportError: - # If 1.4/2.0 module import fails, fall back to <1.3.x architecture. - from sqlalchemy.ext.declarative.clsregistry import _class_resolver # type: ignore[no-redef] +from sqlalchemy.orm.clsregistry import _class_resolver from sqlalchemy.ext.hybrid import hybrid_property try: - # Attempt ASSOCATION_PROXY import from pre-2.0 release - from sqlalchemy.ext.associationproxy import ASSOCIATION_PROXY -except ImportError: + # SQLAlchemy 2.0 from sqlalchemy.ext.associationproxy import AssociationProxyExtensionType # type: ignore[attr-defined] ASSOCIATION_PROXY = AssociationProxyExtensionType.ASSOCIATION_PROXY +except ImportError: + from sqlalchemy.ext.associationproxy import ASSOCIATION_PROXY + from sqlalchemy.sql.operators import eq # type: ignore[attr-defined] from sqlalchemy.exc import DBAPIError from sqlalchemy.orm.attributes import InstrumentedAttribute From 013346dd97271980e7f7ed8f773078e847235e1e Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Sat, 27 Jul 2024 17:26:55 +0100 Subject: [PATCH 078/156] Resolve SQLAlchemy 2.0 "declarative_base() now in sqlalchemy.orm" --- flask_admin/tests/sqla/test_multi_pk.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flask_admin/tests/sqla/test_multi_pk.py b/flask_admin/tests/sqla/test_multi_pk.py index 5c347a0e1..bbb769bfd 100644 --- a/flask_admin/tests/sqla/test_multi_pk.py +++ b/flask_admin/tests/sqla/test_multi_pk.py @@ -1,7 +1,7 @@ from .test_basic import CustomModelView from flask_sqlalchemy.model import Model -from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import declarative_base def test_multiple_pk(app, db, admin): From a797847a4247b71122e05f22971b30d07f6bff2f Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Sat, 27 Jul 2024 17:26:55 +0100 Subject: [PATCH 079/156] Fix test_citext 'Engine' object has no attribute 'execute' > db.engine.execute('CREATE EXTENSION IF NOT EXISTS citext') E AttributeError: 'Engine' object has no attribute 'execute' --- flask_admin/tests/sqla/test_postgres.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/flask_admin/tests/sqla/test_postgres.py b/flask_admin/tests/sqla/test_postgres.py index c374b6c43..7c23bd307 100644 --- a/flask_admin/tests/sqla/test_postgres.py +++ b/flask_admin/tests/sqla/test_postgres.py @@ -1,5 +1,6 @@ from .test_basic import CustomModelView +from sqlalchemy import text from sqlalchemy.dialects.postgresql import HSTORE, JSON from citext import CIText @@ -80,7 +81,8 @@ class CITextModel(postgres_db.Model): id = postgres_db.Column(postgres_db.Integer, primary_key=True, autoincrement=True) citext_test = postgres_db.Column(CIText) - postgres_db.engine.execute('CREATE EXTENSION IF NOT EXISTS citext') + with postgres_db.engine.begin() as connection: + connection.execute(text('CREATE EXTENSION IF NOT EXISTS citext')) postgres_db.create_all() view = CustomModelView(CITextModel, postgres_db.session) From 5342bb3b1bb63afe48ad4af5c6aeb35e5dcc285a Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Sun, 28 Jul 2024 22:39:26 +0100 Subject: [PATCH 080/156] Bump minimum flask-babel to fix language support The two tests for `zh_CN` and `zh_TW` localisation fail with Flask-Babel 3.0.0, but pass with 3.0.1. Flask-Babel changelog: https://github.com/python-babel/flask-babel/compare/v3.0.0...v3.0.1 --- pyproject.toml | 2 +- requirements-skip/tests-min.in | 2 +- requirements-skip/tests-min.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 1858201fb..96b6dd3d6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -59,7 +59,7 @@ azure-blob-storage = ["azure-storage-blob<=3"] # TODO: update to v12+ images = ["pillow>=10.0.0"] export = ["tablib>=3.0.0"] rediscli = ["redis>=4.0.0"] -translation = ["flask-babel>=3"] +translation = ["flask-babel>=3.0.1"] all = [ "Flask-Admin[sqlalchemy]", "Flask-Admin[sqlalchemy-with-utils]", diff --git a/requirements-skip/tests-min.in b/requirements-skip/tests-min.in index 0636f9328..a085c3b61 100644 --- a/requirements-skip/tests-min.in +++ b/requirements-skip/tests-min.in @@ -34,7 +34,7 @@ azure-storage-blob==2.1.0 pillow==10.0.0 -flask-babel==3.0.0 +flask-babel==3.0.1 tablib==3.0.0 diff --git a/requirements-skip/tests-min.txt b/requirements-skip/tests-min.txt index 3ff2cc124..c1c602bf3 100644 --- a/requirements-skip/tests-min.txt +++ b/requirements-skip/tests-min.txt @@ -55,7 +55,7 @@ flask==2.2.0 # -r tests-min.in # flask-babel # flask-sqlalchemy -flask-babel==3.0.0 +flask-babel==3.0.1 # via -r tests-min.in flask-sqlalchemy==3.0.0 # via -r tests-min.in From 2f7dfa961c80cec81bf5b303571f8ad10ac7681a Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Sun, 28 Jul 2024 22:41:58 +0100 Subject: [PATCH 081/156] Remove min deps test on py312 --- .github/workflows/tests.yaml | 2 -- tox.ini | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index e9977b34c..eef7a8052 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -25,8 +25,6 @@ jobs: include: - python: '3.8' tox: 'py38-min' - - python: '3.12' - tox: 'py312-min' - python: '3.12' tox: 'py312-noflaskbabel' - python: '3.12' diff --git a/tox.ini b/tox.ini index ee96e5722..6328ab07d 100644 --- a/tox.ini +++ b/tox.ini @@ -3,7 +3,7 @@ envlist = py3{8,9,10,11,12} py312-noflaskbabel # only tested against latest of all configurations, sans flask-babel py312-flaskmongoengine - py{38,312}-min + py38-min # style typing docs @@ -29,7 +29,7 @@ commands = flaskmongoengine: pytest -v --tb=short --basetemp={envtmpdir} flask_admin/tests -W 'default::DeprecationWarning' {posargs} !flaskmongoengine: pytest -v --tb=short --basetemp={envtmpdir} flask_admin/tests --ignore flask_admin/tests/mongoengine {posargs} -[testenv:{py38,py312}-min] +[testenv:py38-min] deps = -r requirements-skip/tests-min.txt commands = pytest -v --tb=short --basetemp={envtmpdir} flask_admin/tests -W 'default::DeprecationWarning' --ignore flask_admin/tests/mongoengine {posargs} From c8dde90f61b0ef7f8b76dc0a0f781136a2e73a3b Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Sun, 28 Jul 2024 22:50:34 +0100 Subject: [PATCH 082/156] Run CI suite every Monday morning at 3am This should help flag any issues with new releases of our dependencies (when we've got unlocked upper bounds on our dependencies). --- .github/workflows/tests.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index eef7a8052..6931e5480 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -13,6 +13,8 @@ on: - 'docs/**' - '*.md' - '*.rst' + schedule: + - cron: '0 3 * * 1' jobs: tests: name: ${{ matrix.tox == 'normal' && format('py{0}', matrix.python) || matrix.tox }} From 0265d8c1a8eeaa3051228134c7ba5df845a914ac Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Mon, 29 Jul 2024 19:57:04 +0100 Subject: [PATCH 083/156] Enable pyproject.toml for SQLAlchemy 2 --- pyproject.toml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 5fde81f01..c712abe78 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,7 +29,7 @@ dependencies = [ [project.optional-dependencies] sqlalchemy = [ "flask-sqlalchemy>=3", - "sqlalchemy>=1.4,<2", + "sqlalchemy>=1.4", ] sqlalchemy-with-utils = [ "Flask-Admin[sqlalchemy]", @@ -118,9 +118,6 @@ filterwarnings = [ # `flask.testing` accesses this attribute; remove when they have updated their code. "default:The '__version__' attribute is deprecated and will be removed in Werkzeug 3\\.1\\.:DeprecationWarning", - - # TODO: Remove when we've added SQLAlchemy 2.0 compatibility - "default:Deprecated API features detected!:DeprecationWarning:flask_admin.tests.sqla.test_basic:99", ] [tool.coverage.run] From f0224aee70f834e6087c9bc591f51f86cfae4d79 Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Mon, 29 Jul 2024 19:57:04 +0100 Subject: [PATCH 084/156] Add SQLAlchemy 1 test environments to tox.ini --- .github/workflows/tests.yaml | 6 +++++- tox.ini | 5 ++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 60d42f517..91b642f75 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -26,7 +26,11 @@ jobs: - python: '3.12' tox: 'py312-noflaskbabel' - python: '3.12' - tox: 'py312-flaskmongoengine' + tox: 'py312-flaskmongoengine-sqlalchemy1' + - python: '3.8' + tox: 'py38-sqlalchemy1' + - python: '3.12' + tox: 'py312-sqlalchemy1' services: # Label used to access the service container postgres: diff --git a/tox.ini b/tox.ini index 21494a982..bb55b805d 100644 --- a/tox.ini +++ b/tox.ini @@ -1,8 +1,10 @@ [tox] envlist = py3{8,9,10,11,12} + py3{8,12}-sqlalchemy1 py312-noflaskbabel # only tested against latest of all configurations, sans flask-babel - py312-flaskmongoengine + py312-flaskmongoengine-sqlalchemy1 + # style typing docs @@ -24,6 +26,7 @@ deps = -r requirements/tests.in commands_pre = noflaskbabel: pip uninstall -y flask-babel flaskmongoengine: pip install Flask==2.1.3 Werkzeug==2.3.8 flask-sqlalchemy<3 + sqlalchemy1: pip install sqlalchemy<2 flask-sqlalchemy<3.1 commands = flaskmongoengine: pytest -v --tb=short --basetemp={envtmpdir} flask_admin/tests -W 'default::DeprecationWarning' {posargs} !flaskmongoengine: pytest -v --tb=short --basetemp={envtmpdir} flask_admin/tests --ignore flask_admin/tests/mongoengine {posargs} From a050b567035c605bd44dd837108c0e24cbfd4c12 Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Mon, 29 Jul 2024 19:57:04 +0100 Subject: [PATCH 085/156] Add SQLAlchemy 1 support back to test_multi_pk.py --- flask_admin/tests/sqla/test_multi_pk.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/flask_admin/tests/sqla/test_multi_pk.py b/flask_admin/tests/sqla/test_multi_pk.py index bbb769bfd..8fcd25230 100644 --- a/flask_admin/tests/sqla/test_multi_pk.py +++ b/flask_admin/tests/sqla/test_multi_pk.py @@ -1,7 +1,11 @@ from .test_basic import CustomModelView from flask_sqlalchemy.model import Model -from sqlalchemy.orm import declarative_base +try: + # SQLAlchemy 2.0 + from sqlalchemy.orm import declarative_base +except ImportError: + from sqlalchemy.ext.declarative import declarative_base def test_multiple_pk(app, db, admin): From 2bc4a324960e71bd4e08d726262c4b9654685dd1 Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Mon, 29 Jul 2024 20:05:30 +0100 Subject: [PATCH 086/156] Fix test_different_bind_joins UnboundExecutionError sqlalchemy.exc.UnboundExecutionError: Bind key 'other' is not in 'SQLALCHEMY_BINDS' config. --- flask_admin/tests/sqla/test_basic.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/flask_admin/tests/sqla/test_basic.py b/flask_admin/tests/sqla/test_basic.py index c1b99130b..188f38eb1 100644 --- a/flask_admin/tests/sqla/test_basic.py +++ b/flask_admin/tests/sqla/test_basic.py @@ -2637,12 +2637,11 @@ class Model2(db.Model): assert rv.status_code == 200 -# TODO: Why this fails? -@pytest.mark.xfail(raises=Exception) -def test_different_bind_joins(app, db, admin): - app.config['SQLALCHEMY_BINDS'] = { - 'other': 'sqlite:///' - } +def test_different_bind_joins(request, app): + app.config['SQLALCHEMY_BINDS'] = {'other': 'sqlite:///'} + + db = request.getfixturevalue('db') + admin = request.getfixturevalue('admin') with app.app_context(): class Model1(db.Model): From dd48a273f4fb90b68cdf53ff45cf700aebef084f Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Mon, 29 Jul 2024 22:53:35 +0100 Subject: [PATCH 087/156] Fix constraints and tests for mongoengine/sqlalchemy1 --- flask_admin/tests/mongoengine/test_basic.py | 148 +++++++++--------- .../constraints-flaskmongoengine.txt | 3 + requirements-skip/constraints-sqlalchemy1.txt | 1 + tox.ini | 7 +- 4 files changed, 82 insertions(+), 77 deletions(-) create mode 100644 requirements-skip/constraints-flaskmongoengine.txt create mode 100644 requirements-skip/constraints-sqlalchemy1.txt diff --git a/flask_admin/tests/mongoengine/test_basic.py b/flask_admin/tests/mongoengine/test_basic.py index f3cc7bd4b..aca1ac8ef 100644 --- a/flask_admin/tests/mongoengine/test_basic.py +++ b/flask_admin/tests/mongoengine/test_basic.py @@ -275,13 +275,13 @@ def test_column_filters(app, db, admin): fill_db(Model1, Model2) # Test string filter - view = CustomModelView(Model1, column_filters=['test1']) - admin.add_view(view) + view1 = CustomModelView(Model1, column_filters=['test1']) + admin.add_view(view1) - assert len(view._filters) == 7 + assert len(view1._filters) == 7 assert \ - [(f['index'], f['operation']) for f in view._filter_groups[u'Test1']] == \ + [(f['index'], f['operation']) for f in view1._filter_groups[u'Test1']] == \ [ (0, 'contains'), (1, 'not contains'), @@ -292,6 +292,69 @@ def test_column_filters(app, db, admin): (6, 'not in list'), ] + # Test numeric filter + view2 = CustomModelView(Model2, column_filters=['int_field']) + admin.add_view(view2) + + assert \ + [(f['index'], f['operation']) for f in view2._filter_groups[u'Int Field']] == \ + [ + (0, 'equals'), + (1, 'not equal'), + (2, 'greater than'), + (3, 'smaller than'), + (4, 'empty'), + (5, 'in list'), + (6, 'not in list'), + ] + + # Test boolean filter + view3 = CustomModelView(Model2, column_filters=['bool_field'], + endpoint="_bools") + admin.add_view(view3) + + assert \ + [(f['index'], f['operation']) for f in view3._filter_groups[u'Bool Field']] == \ + [ + (0, 'equals'), + (1, 'not equal'), + ] + + # Test float filter + view4 = CustomModelView(Model2, column_filters=['float_field'], + endpoint="_float") + admin.add_view(view4) + + assert \ + [(f['index'], f['operation']) for f in view4._filter_groups[u'Float Field']] == \ + [ + (0, 'equals'), + (1, 'not equal'), + (2, 'greater than'), + (3, 'smaller than'), + (4, 'empty'), + (5, 'in list'), + (6, 'not in list'), + ] + + # Test datetime filter + view5 = CustomModelView(Model1, + column_filters=['datetime_field'], + endpoint="_datetime") + admin.add_view(view5) + + assert \ + [(f['index'], f['operation']) for f in view5._filter_groups[u'Datetime Field']] == \ + [ + (0, 'equals'), + (1, 'not equal'), + (2, 'greater than'), + (3, 'smaller than'), + (4, 'between'), + (5, 'not between'), + (6, 'empty'), + ] + # Make some test clients client = app.test_client() @@ -357,22 +420,6 @@ def test_column_filters(app, db, admin): assert 'test1_val_3' in data assert 'test1_val_4' in data - # Test numeric filter - view = CustomModelView(Model2, column_filters=['int_field']) - admin.add_view(view) - - assert \ - [(f['index'], f['operation']) for f in view._filter_groups[u'Int Field']] == \ - [ - (0, 'equals'), - (1, 'not equal'), - (2, 'greater than'), - (3, 'smaller than'), - (4, 'empty'), - (5, 'in list'), - (6, 'not in list'), - ] - # integer - equals rv = client.get('/admin/model2/?flt0_0=5000') assert rv.status_code == 200 @@ -463,18 +510,6 @@ def test_column_filters(app, db, admin): assert 'string_field_val_3' not in data assert 'string_field_val_4' not in data - # Test boolean filter - view = CustomModelView(Model2, column_filters=['bool_field'], - endpoint="_bools") - admin.add_view(view) - - assert \ - [(f['index'], f['operation']) for f in view._filter_groups[u'Bool Field']] == \ - [ - (0, 'equals'), - (1, 'not equal'), - ] - # boolean - equals - Yes rv = client.get('/admin/_bools/?flt0_0=1') assert rv.status_code == 200 @@ -503,23 +538,6 @@ def test_column_filters(app, db, admin): assert 'string_field_val_1' in data assert 'string_field_val_2' not in data - # Test float filter - view = CustomModelView(Model2, column_filters=['float_field'], - endpoint="_float") - admin.add_view(view) - - assert \ - [(f['index'], f['operation']) for f in view._filter_groups[u'Float Field']] == \ - [ - (0, 'equals'), - (1, 'not equal'), - (2, 'greater than'), - (3, 'smaller than'), - (4, 'empty'), - (5, 'in list'), - (6, 'not in list'), - ] - # float - equals rv = client.get('/admin/_float/?flt0_0=25.9') assert rv.status_code == 200 @@ -596,24 +614,6 @@ def test_column_filters(app, db, admin): assert 'string_field_val_3' not in data assert 'string_field_val_4' not in data - # Test datetime filter - view = CustomModelView(Model1, - column_filters=['datetime_field'], - endpoint="_datetime") - admin.add_view(view) - - assert \ - [(f['index'], f['operation']) for f in view._filter_groups[u'Datetime Field']] == \ - [ - (0, 'equals'), - (1, 'not equal'), - (2, 'greater than'), - (3, 'smaller than'), - (4, 'between'), - (5, 'not between'), - (6, 'empty'), - ] - # datetime - equals rv = client.get('/admin/_datetime/?flt0_0=2014-04-03+01%3A09%3A00') assert rv.status_code == 200 @@ -1212,10 +1212,15 @@ def test_customising_page_size(app, db, admin): def test_export_csv(app, db, admin): Model1, Model2 = create_models(db) - view = CustomModelView(Model1, can_export=True, + view1 = CustomModelView(Model1, can_export=True, column_list=['test1', 'test2'], export_max_rows=2, endpoint='row_limit_2') - admin.add_view(view) + admin.add_view(view1) + + view2 = CustomModelView(Model1, can_export=True, + column_list=['test1', 'test2'], + endpoint='no_row_limit') + admin.add_view(view2) for x in range(5): fill_db(Model1, Model2) @@ -1230,11 +1235,6 @@ def test_export_csv(app, db, admin): "test1_val_1,test2_val_1\r\n" + \ "test1_val_2,test2_val_2\r\n" == data - view = CustomModelView(Model1, can_export=True, - column_list=['test1', 'test2'], - endpoint='no_row_limit') - admin.add_view(view) - # test row limit without export_max_rows rv = client.get('/admin/no_row_limit/export/csv/') data = rv.data.decode('utf-8') diff --git a/requirements-skip/constraints-flaskmongoengine.txt b/requirements-skip/constraints-flaskmongoengine.txt new file mode 100644 index 000000000..bfa9e9639 --- /dev/null +++ b/requirements-skip/constraints-flaskmongoengine.txt @@ -0,0 +1,3 @@ +Flask==2.1.3 +Werkzeug==2.3.8 +flask-sqlalchemy<3 diff --git a/requirements-skip/constraints-sqlalchemy1.txt b/requirements-skip/constraints-sqlalchemy1.txt new file mode 100644 index 000000000..19c6d85dd --- /dev/null +++ b/requirements-skip/constraints-sqlalchemy1.txt @@ -0,0 +1 @@ +sqlalchemy<2 diff --git a/tox.ini b/tox.ini index 2089584e3..3b60eec87 100644 --- a/tox.ini +++ b/tox.ini @@ -22,11 +22,12 @@ use_frozen_constraints = true setenv = SQLALCHEMY_SILENCE_UBER_WARNING = 1 AZURE_STORAGE_CONNECTION_STRING = DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1; -deps = -r requirements/tests.txt +deps = + sqlalchemy1: -c requirements-skip/constraints-sqlalchemy1.txt + flaskmongoengine: -c requirements-skip/constraints-flaskmongoengine.txt + -r requirements/tests.txt commands_pre = noflaskbabel: pip uninstall -y flask-babel - flaskmongoengine: pip install Flask==2.1.3 Werkzeug==2.3.8 flask-sqlalchemy<3 - sqlalchemy1: pip install sqlalchemy<2 flask-sqlalchemy<3.1 commands = flaskmongoengine: pytest -v --tb=short --basetemp={envtmpdir} flask_admin/tests -W 'default::DeprecationWarning' {posargs} !flaskmongoengine: pytest -v --tb=short --basetemp={envtmpdir} flask_admin/tests --ignore flask_admin/tests/mongoengine {posargs} From 9ea52a876c134b7ce8e86b33fc164336e487f853 Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Tue, 30 Jul 2024 19:24:54 +0100 Subject: [PATCH 088/156] Revert "Add SQLAlchemy 1 support back to test_multi_pk.py" declarative_base is available from sqlalchemy.orm in SQLAlchemy 1.4. This reverts commit a050b567035c605bd44dd837108c0e24cbfd4c12. --- flask_admin/tests/sqla/test_multi_pk.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/flask_admin/tests/sqla/test_multi_pk.py b/flask_admin/tests/sqla/test_multi_pk.py index 8fcd25230..bbb769bfd 100644 --- a/flask_admin/tests/sqla/test_multi_pk.py +++ b/flask_admin/tests/sqla/test_multi_pk.py @@ -1,11 +1,7 @@ from .test_basic import CustomModelView from flask_sqlalchemy.model import Model -try: - # SQLAlchemy 2.0 - from sqlalchemy.orm import declarative_base -except ImportError: - from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import declarative_base def test_multiple_pk(app, db, admin): From 32ff7bd8c5044532b4cee88b686e839e6918d665 Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Wed, 31 Jul 2024 20:01:30 +0100 Subject: [PATCH 089/156] Filter wtforms 3.1 iter_groups warning --- flask_admin/tests/sqla/test_basic.py | 11 ++++++++++- flask_admin/tests/sqla/test_form_rules.py | 8 +++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/flask_admin/tests/sqla/test_basic.py b/flask_admin/tests/sqla/test_basic.py index 188f38eb1..1849b2d3c 100644 --- a/flask_admin/tests/sqla/test_basic.py +++ b/flask_admin/tests/sqla/test_basic.py @@ -155,7 +155,10 @@ def fill_db(db, Model1, Model2): db.session.commit() -@pytest.mark.filterwarnings("ignore:Please update your type formatter:UserWarning") +@pytest.mark.filterwarnings( + "ignore:'iter_groups' is expected to return 4 items tuple since wtforms 3.1, this will be mandatory in wtforms 3.2:DeprecationWarning", + "ignore:Please update your type formatter:UserWarning", +) def test_model(app, db, admin): with app.app_context(): Model1, Model2 = create_models(db) @@ -2118,6 +2121,9 @@ def test_default_complex_sort(app, db, admin): assert data[1].model1.test1 == 'b' +@pytest.mark.filterwarnings( + "ignore:'iter_groups' is expected to return 4 items tuple since wtforms 3.1, this will be mandatory in wtforms 3.2:DeprecationWarning", +) def test_extra_fields(app, db, admin): with app.app_context(): Model1, _ = create_models(db) @@ -2184,6 +2190,9 @@ def test_extra_field_order(app, db, admin): ('zh_TW', '首頁'), ) ) +@pytest.mark.filterwarnings( + "ignore:'iter_groups' is expected to return 4 items tuple since wtforms 3.1, this will be mandatory in wtforms 3.2:DeprecationWarning", +) @flask_babel_test_decorator def test_modelview_localization(request, app, locale, expect_text): # We need to configure the default Babel locale _before_ the `babel` fixture is diff --git a/flask_admin/tests/sqla/test_form_rules.py b/flask_admin/tests/sqla/test_form_rules.py index 75558240b..a07bff27a 100644 --- a/flask_admin/tests/sqla/test_form_rules.py +++ b/flask_admin/tests/sqla/test_form_rules.py @@ -123,7 +123,10 @@ def test_rule_field_set(app, db, admin): assert pos3 == -1 -@pytest.mark.filterwarnings("ignore:Fields missing:UserWarning") +@pytest.mark.filterwarnings( + "ignore:'iter_groups' is expected to return 4 items tuple since wtforms 3.1, this will be mandatory in wtforms 3.2:DeprecationWarning", + "ignore:Please update your type formatter:UserWarning", +) def test_rule_inlinefieldlist(app, db, admin): with app.app_context(): Model1, Model2 = create_models(db) @@ -140,6 +143,9 @@ def test_rule_inlinefieldlist(app, db, admin): assert rv.status_code == 200 +@pytest.mark.filterwarnings( + "ignore:'iter_groups' is expected to return 4 items tuple since wtforms 3.1, this will be mandatory in wtforms 3.2:DeprecationWarning", +) def test_inline_model_rules(app, db, admin): with app.app_context(): Model1, Model2 = create_models(db) From 0dcb6ad15ec1658d3cb91c301e88a474420e81a5 Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Wed, 31 Jul 2024 20:01:30 +0100 Subject: [PATCH 090/156] Filter test_rule_inlinefieldlist "Fields missing from ruleset" warning flask_admin/tests/sqla/test_form_rules.py:135: in test_rule_inlinefieldlist view = CustomModelView(Model1, db.session, flask_admin/tests/sqla/test_basic.py:33: in __init__ super(CustomModelView, self).__init__(model, session, name, category, flask_admin/contrib/sqla/view.py:346: in __init__ super(ModelView, self).__init__(model, name, category, endpoint, url, static_folder, flask_admin/model/base.py:834: in __init__ self._refresh_cache() flask_admin/model/base.py:968: in _refresh_cache self._validate_form_class(self._form_create_rules, self._create_form_class) flask_admin/model/base.py:1447: in _validate_form_class self._show_missing_fields_warning('Fields missing from ruleset: %s' % (','.join(missing_fields))) flask_admin/model/base.py:1431: in _show_missing_fields_warning warnings.warn(text) E UserWarning: Fields missing from ruleset: test2,test3,test4,bool_field,date_field,time_field,datetime_field,email_field,enum_field,choice_field,sqla_utils_choice,sqla_utils_enum,sqla_utils_arrow,sqla_utils_uuid,sqla_utils_url,sqla_utils_ip_address,sqla_utils_currency,sqla_utils_color --- flask_admin/tests/sqla/test_form_rules.py | 1 + 1 file changed, 1 insertion(+) diff --git a/flask_admin/tests/sqla/test_form_rules.py b/flask_admin/tests/sqla/test_form_rules.py index a07bff27a..d30298c32 100644 --- a/flask_admin/tests/sqla/test_form_rules.py +++ b/flask_admin/tests/sqla/test_form_rules.py @@ -125,6 +125,7 @@ def test_rule_field_set(app, db, admin): @pytest.mark.filterwarnings( "ignore:'iter_groups' is expected to return 4 items tuple since wtforms 3.1, this will be mandatory in wtforms 3.2:DeprecationWarning", + "ignore:Fields missing from ruleset.*:UserWarning", "ignore:Please update your type formatter:UserWarning", ) def test_rule_inlinefieldlist(app, db, admin): From aa7cb911c855f7d7241fb237c612c87c110104aa Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Wed, 31 Jul 2024 20:01:30 +0100 Subject: [PATCH 091/156] Allow flask 3 and wtforms 3 --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 369193548..6b33a6c47 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,8 +22,8 @@ classifiers = [ ] requires-python = ">=3.8" dependencies = [ - "flask>=2.0,<3", - "wtforms>=2,<3", + "flask>=2.0", + "wtforms>=2", ] [project.optional-dependencies] From eeeadb48578ce105b79dbad539bc02d8e4048b07 Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Wed, 31 Jul 2024 20:01:30 +0100 Subject: [PATCH 092/156] Restrict flask-mongoengine to sqlalchemy 1 and wtforms 2 __________________________________ test_model __________________________________ flask_admin/tests/mongoengine/test_basic.py:117: in test_model assert model.test3 == '' E AssertionError: assert None == '' E + where None = <Model1: test1large>.test3 --- pyproject.toml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 6b33a6c47..c8ca33a1b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -47,7 +47,9 @@ geoalchemy = [ mongoengine = [ # TODO: seems out-of-date/unmaintained; replace or deprecate? "Flask-Admin[sqlalchemy]", "flask-mongoengine<1", - "Flask<2.3.0", # flask-mongoengine tries to access `flask.json` + "Flask<2.3.0", # flask-mongoengine tries to access `flask.json`, + "sqlalchemy>=1.4,<2", + "wtforms>=2,<3", ] pymongo = ["pymongo>=3.7.0"] peewee = [ From be57df225ea1fc65e9035d959ca2fe51bcb5fee1 Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Wed, 31 Jul 2024 20:01:30 +0100 Subject: [PATCH 093/156] Remove type formatter warning filter from tests Resolved in: 25ac435e ("Update formatter function signatures", 2024-07-15) --- flask_admin/tests/geoa/test_basic.py | 1 - flask_admin/tests/peeweemodel/test_basic.py | 1 - flask_admin/tests/sqla/test_basic.py | 6 ------ flask_admin/tests/sqla/test_form_rules.py | 1 - 4 files changed, 9 deletions(-) diff --git a/flask_admin/tests/geoa/test_basic.py b/flask_admin/tests/geoa/test_basic.py index 650d71660..d24952691 100644 --- a/flask_admin/tests/geoa/test_basic.py +++ b/flask_admin/tests/geoa/test_basic.py @@ -25,7 +25,6 @@ def __unicode__(self): return GeoModel -@pytest.mark.filterwarnings("ignore:Please update your type formatter:UserWarning") def test_model(app, db, admin): GeoModel = create_models(db) with app.app_context(): diff --git a/flask_admin/tests/peeweemodel/test_basic.py b/flask_admin/tests/peeweemodel/test_basic.py index a744e5a99..639465318 100644 --- a/flask_admin/tests/peeweemodel/test_basic.py +++ b/flask_admin/tests/peeweemodel/test_basic.py @@ -173,7 +173,6 @@ def test_model(app, db, admin): assert Model1.select().count() == 0 -# @pytest.mark.filterwarnings("ignore:Please update your type formatter:UserWarning") def test_column_editable_list(app, db, admin): Model1, Model2 = create_models(db) diff --git a/flask_admin/tests/sqla/test_basic.py b/flask_admin/tests/sqla/test_basic.py index 1849b2d3c..796c07d5f 100644 --- a/flask_admin/tests/sqla/test_basic.py +++ b/flask_admin/tests/sqla/test_basic.py @@ -157,7 +157,6 @@ def fill_db(db, Model1, Model2): @pytest.mark.filterwarnings( "ignore:'iter_groups' is expected to return 4 items tuple since wtforms 3.1, this will be mandatory in wtforms 3.2:DeprecationWarning", - "ignore:Please update your type formatter:UserWarning", ) def test_model(app, db, admin): with app.app_context(): @@ -473,7 +472,6 @@ def test_extra_args_filter(app, db, admin): assert '<input type="hidden" name="foo" value="bar">' in data -@pytest.mark.filterwarnings("ignore:Please update your type formatter:UserWarning") def test_complex_searchable_list(app, db, admin): with app.app_context(): Model1, Model2 = create_models(db) @@ -508,7 +506,6 @@ def test_complex_searchable_list(app, db, admin): assert 'model1-test2-val' not in data -@pytest.mark.filterwarnings("ignore:Please update your type formatter:UserWarning") def test_complex_searchable_list_missing_children(app, db, admin): with app.app_context(): Model1, Model2 = create_models(db) @@ -528,7 +525,6 @@ def test_complex_searchable_list_missing_children(app, db, admin): assert 'magic string' in data -@pytest.mark.filterwarnings("ignore:Please update your type formatter:UserWarning") def test_column_editable_list(app, db, admin): with app.app_context(): Model1, Model2 = create_models(db) @@ -687,7 +683,6 @@ def __init__(self, id=None, val1=None): assert 'change-success-1' in data -@pytest.mark.filterwarnings("ignore:Please update your type formatter:UserWarning") def test_column_filters(app, db, admin): with app.app_context(): Model1, Model2 = create_models(db) @@ -1673,7 +1668,6 @@ class Model2(db.Model): assert 'Jim Smith' in data -@pytest.mark.filterwarnings("ignore:Please update your type formatter:UserWarning") def test_url_args(app, db, admin): with app.app_context(): Model1, Model2 = create_models(db) diff --git a/flask_admin/tests/sqla/test_form_rules.py b/flask_admin/tests/sqla/test_form_rules.py index d30298c32..53ce55c32 100644 --- a/flask_admin/tests/sqla/test_form_rules.py +++ b/flask_admin/tests/sqla/test_form_rules.py @@ -126,7 +126,6 @@ def test_rule_field_set(app, db, admin): @pytest.mark.filterwarnings( "ignore:'iter_groups' is expected to return 4 items tuple since wtforms 3.1, this will be mandatory in wtforms 3.2:DeprecationWarning", "ignore:Fields missing from ruleset.*:UserWarning", - "ignore:Please update your type formatter:UserWarning", ) def test_rule_inlinefieldlist(app, db, admin): with app.app_context(): From fef1357eb1fc845b6cae41222cbe200d8e7e710a Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Wed, 24 Jul 2024 23:27:48 +0100 Subject: [PATCH 094/156] Support Content-Security-Policies via nonce values Content-Security-Policy is a common way of restricting which assets (javascript, styles, etc) are loaded by the browser as a way of preventing a number of vulnerabilities. Flask-Admin loads a fair amount of JavaScript and styling to support its functionality, and previously it has been difficult to get this to pass CSP checks. We can add support for CSP by taking a CSP nonce generator and using that to inject a nonce value wherever we load these resources (either asking the client to download files or with inline scripts/styles). --- doc/advanced.rst | 33 ++++++++++++++++ examples/csp-nonce/README.rst | 22 +++++++++++ examples/csp-nonce/__init__.py | 0 examples/csp-nonce/app.py | 39 +++++++++++++++++++ examples/csp-nonce/requirements.txt | 4 ++ examples/csp-nonce/templates/admin/index.html | 34 ++++++++++++++++ flask_admin/base.py | 12 +++++- flask_admin/helpers.py | 2 + .../templates/bootstrap4/admin/actions.html | 2 +- .../templates/bootstrap4/admin/base.html | 32 +++++++-------- .../templates/bootstrap4/admin/file/list.html | 2 +- .../bootstrap4/admin/file/modals/form.html | 2 +- .../templates/bootstrap4/admin/lib.html | 16 ++++---- .../bootstrap4/admin/model/details.html | 2 +- .../bootstrap4/admin/model/list.html | 4 +- .../bootstrap4/admin/model/modals/create.html | 2 +- .../admin/model/modals/details.html | 4 +- .../bootstrap4/admin/model/modals/edit.html | 2 +- .../bootstrap4/admin/rediscli/console.html | 2 +- flask_admin/tests/test_csp.py | 37 ++++++++++++++++++ flask_admin/tests/test_host_matching.py | 4 +- requirements-skip/tests-min.in | 1 + requirements-skip/tests-min.txt | 4 ++ requirements/dev.txt | 14 +++++++ requirements/tests.in | 1 + requirements/tests.txt | 4 ++ requirements/typing.in | 1 + requirements/typing.txt | 8 ++++ 28 files changed, 252 insertions(+), 38 deletions(-) create mode 100644 examples/csp-nonce/README.rst create mode 100644 examples/csp-nonce/__init__.py create mode 100644 examples/csp-nonce/app.py create mode 100644 examples/csp-nonce/requirements.txt create mode 100644 examples/csp-nonce/templates/admin/index.html create mode 100644 flask_admin/tests/test_csp.py diff --git a/doc/advanced.rst b/doc/advanced.rst index 711668512..ac05eaea1 100644 --- a/doc/advanced.rst +++ b/doc/advanced.rst @@ -20,6 +20,39 @@ SecureForm class in your *ModelView* subclass by specifying the *form_base_class SecureForm requires WTForms 2 or greater. It uses the WTForms SessionCSRF class to generate and validate the tokens for you when the forms are submitted. +CSP support +----------- + +**** + +To support `CSP <https://cheatsheetseries.owasp.org/cheatsheets/Content_Security_Policy_Cheat_Sheet.html>`_ +in Flask-Admin, you can pass a `csp_nonce_generator` function through to Flask-Admin on +initialisation. This function should return a CSP nonce that will be attached to all +`<script>` and `<style>` resources. You are responsible for making sure that your Flask +responses include an appropriate 'Content-Security-Policy` header that also includes the +same nonce value. + +We recommend using `Flask-Talisman <https://pypi.org/project/flask-talisman/>`_. Here's an example +of how to configure Flask-Admin to inject CSP nonce values:: + + app = Flask(__name__) + + talisman = Talisman( + app, + content_security_policy={ + "default-src": "'self'", + }, + content_security_policy_nonce_in=["script-src", "style-src"] + ) + csp_nonce_generator = app.jinja_env.globals["csp_nonce"] # this is talisman's generator function + + admin = admin.Admin(app, name="Example", theme=Bootstrap4Theme(), csp_nonce_generator=csp_nonce_generator) + +If you decide to use a content security policy, you should pay close attention to the policy you set to +make sure it is appropriate for your project's security needs. + +If you create any of your own templates for Flask-Admin pages, you will need to inject the CSP nonces yourself as appropriate. + Adding Custom Javascript and CSS -------------------------------- diff --git a/examples/csp-nonce/README.rst b/examples/csp-nonce/README.rst new file mode 100644 index 000000000..f25d8e21e --- /dev/null +++ b/examples/csp-nonce/README.rst @@ -0,0 +1,22 @@ +This example shows how to make Flask-Admin work with a Content-Security-Policy by injecting +a nonce into HTML tags. + +To run this example: + +1. Clone the repository:: + + git clone https://github.com/flask-admin/flask-admin.git + cd flask-admin + +2. Create and activate a virtual environment:: + + virtualenv env + source env/bin/activate + +3. Install requirements:: + + pip install -r 'examples/csp-nonce/requirements.txt' + +4. Run the application:: + + python examples/csp-nonce/app.py diff --git a/examples/csp-nonce/__init__.py b/examples/csp-nonce/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/examples/csp-nonce/app.py b/examples/csp-nonce/app.py new file mode 100644 index 000000000..a08b25793 --- /dev/null +++ b/examples/csp-nonce/app.py @@ -0,0 +1,39 @@ +from flask import Flask + +import flask_admin as admin +from flask_talisman import Talisman + + +# Create custom admin view +from flask_admin.theme import Bootstrap4Theme + + +# Create flask app +app = Flask(__name__, template_folder='templates') +app.debug = True + +talisman = Talisman( + app, + content_security_policy={ + 'default-src': '\'self\'', + 'object-src': '\'none\'', + 'script-src': '\'self\'', + 'style-src': '\'self\'', + }, + content_security_policy_nonce_in=['script-src', 'style-src'] +) +csp_nonce_generator = app.jinja_env.globals['csp_nonce'] # this is added by talisman + +# Flask views +@app.route('/') +def index(): + return '<a href="/admin/">Click me to get to Admin!</a>' + +# Create admin interface +admin = admin.Admin(name="Example: Simple Views", theme=Bootstrap4Theme(), csp_nonce_generator=csp_nonce_generator) +admin.init_app(app) + +if __name__ == '__main__': + + # Start app + app.run() diff --git a/examples/csp-nonce/requirements.txt b/examples/csp-nonce/requirements.txt new file mode 100644 index 000000000..266ab9a68 --- /dev/null +++ b/examples/csp-nonce/requirements.txt @@ -0,0 +1,4 @@ +Flask +Flask-Admin + +flask-talisman diff --git a/examples/csp-nonce/templates/admin/index.html b/examples/csp-nonce/templates/admin/index.html new file mode 100644 index 000000000..b7eb8dc75 --- /dev/null +++ b/examples/csp-nonce/templates/admin/index.html @@ -0,0 +1,34 @@ +{% extends 'admin/master.html' %} + +{% block head_tail %} + <style> + .insecure-style { + color: red; + } + </style> + <style {{ admin_csp_nonce_attribute }}> + .secure-style { + color: green; + } + </style> +{% endblock head_tail %} +{% block body %} +{{ super() }} +<div class="container"> + <div class="row"> + <div class="col-sm-10 col-sm-offset-1"> + <h1>Flask-Admin Content-Security-Policy (CSP) example</h1> + <p class="lead"> + Simple admin views, not related to models. + </p> + <p class="secure-style"> + I have an inline style applied that passes CSP checks because I've injected a nonce value. + </p> + <p class="insecure-style"> + But I don't have any styling applied because CSP is protecting me. + </p> + <a class="btn btn-primary" href="/"><i class="glyphicon glyphicon-chevron-left"></i> Back</a> + </div> + </div> +</div> +{% endblock body %} diff --git a/flask_admin/base.py b/flask_admin/base.py index 54c3d0f8b..3ac8c31d1 100644 --- a/flask_admin/base.py +++ b/flask_admin/base.py @@ -6,6 +6,8 @@ from flask import current_app, render_template, abort, g, url_for, request from flask import Blueprint, current_app, render_template, abort, g, url_for +from markupsafe import Markup + from flask_admin import babel from flask_admin._compat import as_unicode from flask_admin import helpers as h @@ -298,6 +300,9 @@ def render(self, template, **kwargs): # Store self as admin_view kwargs['admin_view'] = self kwargs['admin_base_template'] = self.admin.theme.base_template + kwargs['admin_csp_nonce_attribute'] = ( + Markup(f'nonce="{self.admin.csp_nonce_generator()}"') if self.admin.csp_nonce_generator else '' + ) # Provide i18n support even if flask-babel is not installed # or enabled. @@ -477,7 +482,8 @@ def __init__(self, app=None, name=None, static_url_path=None, theme: t.Optional[Theme] = None, category_icon_classes=None, - host=None): + host=None, + csp_nonce_generator: t.Optional[t.Callable] = None): """ Constructor. @@ -507,6 +513,8 @@ def __init__(self, app=None, name=None, Example: {'Favorites': 'glyphicon glyphicon-star'} :param host: The host to register all admin views on. Mutually exclusive with `subdomain` + :param csp_nonce_generator: + A callable that returns a nonce to inject into Flask-Admin JS, CSS, etc. """ self.app = app @@ -532,6 +540,8 @@ def __init__(self, app=None, name=None, self._validate_admin_host_and_subdomain() + self.csp_nonce_generator = csp_nonce_generator + # Add index view self._set_admin_index_view(index_view=index_view, endpoint=endpoint, url=url) diff --git a/flask_admin/helpers.py b/flask_admin/helpers.py index cb22e100c..08d364a3b 100644 --- a/flask_admin/helpers.py +++ b/flask_admin/helpers.py @@ -1,7 +1,9 @@ from re import sub, compile +from typing import Callable, Optional from urllib.parse import urljoin, urlparse from flask import g, request, url_for, flash +from markupsafe import Markup from wtforms.validators import DataRequired, InputRequired from flask_admin._compat import iteritems, pass_context diff --git a/flask_admin/templates/bootstrap4/admin/actions.html b/flask_admin/templates/bootstrap4/admin/actions.html index cd645d832..81e177085 100644 --- a/flask_admin/templates/bootstrap4/admin/actions.html +++ b/flask_admin/templates/bootstrap4/admin/actions.html @@ -29,6 +29,6 @@ {% if actions %} <div id="actions-confirmation-data" style="display:none;">{{ actions_confirmation|tojson|safe }}</div> <div id="message-data" style="display:none;">{{ message|tojson|safe }}</div> - <script src="{{ admin_static.url(filename='admin/js/actions.js', v='1.0.0') }}"></script> + <script {{ admin_csp_nonce_attribute }} src="{{ admin_static.url(filename='admin/js/actions.js', v='1.0.0') }}"></script> {% endif %} {% endmacro %} diff --git a/flask_admin/templates/bootstrap4/admin/base.html b/flask_admin/templates/bootstrap4/admin/base.html index a46d5d54c..039f3470e 100644 --- a/flask_admin/templates/bootstrap4/admin/base.html +++ b/flask_admin/templates/bootstrap4/admin/base.html @@ -13,18 +13,18 @@ {% endblock %} {% block head_css %} <link href="{{ admin_static.url(filename='bootstrap/bootstrap4/swatch/{swatch}/bootstrap.min.css'.format(swatch=theme.swatch), v='4.2.1') }}" - rel="stylesheet"> + rel="stylesheet" {{ admin_csp_nonce_attribute }}> {% if theme.swatch == 'default' %} - <link href="{{ admin_static.url(filename='bootstrap/bootstrap4/css/bootstrap.min.css', v='4.2.1') }}" rel="stylesheet"> + <link href="{{ admin_static.url(filename='bootstrap/bootstrap4/css/bootstrap.min.css', v='4.2.1') }}" rel="stylesheet" {{ admin_csp_nonce_attribute }}> {% endif %} - <link href="{{ admin_static.url(filename='admin/css/bootstrap4/admin.css', v='1.1.1') }}" rel="stylesheet"> - <link href="{{ admin_static.url(filename='bootstrap/bootstrap4/css/font-awesome.min.css', v='4.7.0') }}" rel="stylesheet"> + <link href="{{ admin_static.url(filename='admin/css/bootstrap4/admin.css', v='1.1.1') }}" rel="stylesheet" {{ admin_csp_nonce_attribute }}> + <link href="{{ admin_static.url(filename='bootstrap/bootstrap4/css/font-awesome.min.css', v='4.7.0') }}" rel="stylesheet" {{ admin_csp_nonce_attribute }}> {% if admin_view.extra_css %} {% for css_url in admin_view.extra_css %} - <link href="{{ css_url }}" rel="stylesheet"> + <link href="{{ css_url }}" rel="stylesheet" {{ admin_csp_nonce_attribute }}> {% endfor %} {% endif %} - <style> + <style {{ admin_csp_nonce_attribute }}> .hide { display: none; } @@ -77,20 +77,20 @@ {% endblock %} {% block tail_js %} - <script src="{{ admin_static.url(filename='vendor/jquery.min.js', v='3.5.1') }}" type="text/javascript"></script> - <script src="{{ admin_static.url(filename='bootstrap/bootstrap4/js/popper.min.js') }}" type="text/javascript"></script> - <script src="{{ admin_static.url(filename='bootstrap/bootstrap4/js/bootstrap.min.js', v='4.2.1') }}" + <script {{ admin_csp_nonce_attribute }} src="{{ admin_static.url(filename='vendor/jquery.min.js', v='3.5.1') }}" type="text/javascript"></script> + <script {{ admin_csp_nonce_attribute }} src="{{ admin_static.url(filename='bootstrap/bootstrap4/js/popper.min.js') }}" type="text/javascript"></script> + <script {{ admin_csp_nonce_attribute }} src="{{ admin_static.url(filename='bootstrap/bootstrap4/js/bootstrap.min.js', v='4.2.1') }}" type="text/javascript"></script> - <script src="{{ admin_static.url(filename='vendor/moment.min.js', v='2.9.4') }}" type="text/javascript"></script> - <script src="{{ admin_static.url(filename='vendor/bootstrap4/util.js', v='4.3.1') }}" type="text/javascript"></script> - <script src="{{ admin_static.url(filename='vendor/bootstrap4/dropdown.js', v='4.3.1') }}" type="text/javascript"></script> - <script src="{{ admin_static.url(filename='vendor/select2/select2.min.js', v='4.2.1') }}" + <script {{ admin_csp_nonce_attribute }} src="{{ admin_static.url(filename='vendor/moment.min.js', v='2.9.4') }}" type="text/javascript"></script> + <script {{ admin_csp_nonce_attribute }} src="{{ admin_static.url(filename='vendor/bootstrap4/util.js', v='4.3.1') }}" type="text/javascript"></script> + <script {{ admin_csp_nonce_attribute }} src="{{ admin_static.url(filename='vendor/bootstrap4/dropdown.js', v='4.3.1') }}" type="text/javascript"></script> + <script {{ admin_csp_nonce_attribute }} src="{{ admin_static.url(filename='vendor/select2/select2.min.js', v='4.2.1') }}" type="text/javascript"></script> - <script src="{{ admin_static.url(filename='vendor/multi-level-dropdowns-bootstrap/bootstrap4-dropdown-ml-hack.js') }}" type="text/javascript"></script> - <script src="{{ admin_static.url(filename='admin/js/helpers.js', v='1.0.0') }}" type="text/javascript"></script> + <script {{ admin_csp_nonce_attribute }} src="{{ admin_static.url(filename='vendor/multi-level-dropdowns-bootstrap/bootstrap4-dropdown-ml-hack.js') }}" type="text/javascript"></script> + <script {{ admin_csp_nonce_attribute }} src="{{ admin_static.url(filename='admin/js/helpers.js', v='1.0.0') }}" type="text/javascript"></script> {% if admin_view.extra_js %} {% for js_url in admin_view.extra_js %} - <script src="{{ js_url }}" type="text/javascript"></script> + <script {{ admin_csp_nonce_attribute }} src="{{ js_url }}" type="text/javascript"></script> {% endfor %} {% endif %} {% endblock %} diff --git a/flask_admin/templates/bootstrap4/admin/file/list.html b/flask_admin/templates/bootstrap4/admin/file/list.html index bd9f3458c..ca9ce77c0 100644 --- a/flask_admin/templates/bootstrap4/admin/file/list.html +++ b/flask_admin/templates/bootstrap4/admin/file/list.html @@ -187,5 +187,5 @@ {{ actionslib.script(_gettext('Please select at least one file.'), actions, actions_confirmation) }} - <script src="{{ admin_static.url(filename='admin/js/bs4_modal.js', v='1.0.0') }}"></script> + <script {{ admin_csp_nonce_attribute }} src="{{ admin_static.url(filename='admin/js/bs4_modal.js', v='1.0.0') }}"></script> {% endblock %} diff --git a/flask_admin/templates/bootstrap4/admin/file/modals/form.html b/flask_admin/templates/bootstrap4/admin/file/modals/form.html index eebc69989..3a6615097 100644 --- a/flask_admin/templates/bootstrap4/admin/file/modals/form.html +++ b/flask_admin/templates/bootstrap4/admin/file/modals/form.html @@ -15,5 +15,5 @@ {% endblock %} {% block tail %} - <script src="{{ admin_static.url(filename='admin/js/bs4_modal.js', v='1.0.0') }}"></script> + <script {{ admin_csp_nonce_attribute }} src="{{ admin_static.url(filename='admin/js/bs4_modal.js', v='1.0.0') }}"></script> {% endblock %} diff --git a/flask_admin/templates/bootstrap4/admin/lib.html b/flask_admin/templates/bootstrap4/admin/lib.html index 7574ff9a6..c040bd504 100644 --- a/flask_admin/templates/bootstrap4/admin/lib.html +++ b/flask_admin/templates/bootstrap4/admin/lib.html @@ -258,7 +258,7 @@ <h3>{{ text }}</h3> {% macro form_js() %} {% if config.FLASK_ADMIN_MAPS %} - <script> + <script {{ admin_csp_nonce_attribute }}> window.FLASK_ADMIN_MAPS = true; window.FLASK_ADMIN_MAPBOX_MAP_ID = "{{ config.FLASK_ADMIN_MAPBOX_MAP_ID }}"; {% if config.FLASK_ADMIN_MAPBOX_ACCESS_TOKEN %} @@ -269,20 +269,20 @@ <h3>{{ text }}</h3> window.FLASK_ADMIN_DEFAULT_CENTER_LONG = "{{ config.FLASK_ADMIN_DEFAULT_CENTER_LONG }}"; {% endif %} </script> - <script src="{{ admin_static.url(filename='vendor/leaflet/leaflet.js', v='1.0.2') }}"></script> - <script src="{{ admin_static.url(filename='vendor/leaflet/leaflet.draw.js', v='0.4.6') }}"></script> + <script {{ admin_csp_nonce_attribute }} src="{{ admin_static.url(filename='vendor/leaflet/leaflet.js', v='1.0.2') }}"></script> + <script {{ admin_csp_nonce_attribute }} src="{{ admin_static.url(filename='vendor/leaflet/leaflet.draw.js', v='0.4.6') }}"></script> {% if config.FLASK_ADMIN_MAPS_SEARCH %} - <script> + <script {{ admin_csp_nonce_attribute }}> window.FLASK_ADMIN_MAPS_SEARCH = "{{ config.FLASK_ADMIN_MAPS_SEARCH }}"; </script> - <script src="https://maps.googleapis.com/maps/api/js?v=3&libraries=places&key={{ config.get('FLASK_ADMIN_GOOGLE_MAPS_API_KEY') }}"></script> + <script {{ admin_csp_nonce_attribute }} src="https://maps.googleapis.com/maps/api/js?v=3&libraries=places&key={{ config.get('FLASK_ADMIN_GOOGLE_MAPS_API_KEY') }}"></script> {% endif %} {% endif %} - <script src="{{ admin_static.url(filename='vendor/bootstrap-daterangepicker/daterangepicker.js', v='1.3.22') }}"></script> + <script {{ admin_csp_nonce_attribute }} src="{{ admin_static.url(filename='vendor/bootstrap-daterangepicker/daterangepicker.js', v='1.3.22') }}"></script> {% if editable_columns %} - <script src="{{ admin_static.url(filename='vendor/x-editable/js/bootstrap4-editable.min.js', v='1.5.1.1') }}"></script> + <script {{ admin_csp_nonce_attribute }} src="{{ admin_static.url(filename='vendor/x-editable/js/bootstrap4-editable.min.js', v='1.5.1.1') }}"></script> {% endif %} - <script src="{{ admin_static.url(filename='admin/js/form.js', v='1.0.1') }}"></script> + <script {{ admin_csp_nonce_attribute }} src="{{ admin_static.url(filename='admin/js/form.js', v='1.0.1') }}"></script> {% endmacro %} {% macro extra() %} diff --git a/flask_admin/templates/bootstrap4/admin/model/details.html b/flask_admin/templates/bootstrap4/admin/model/details.html index f4017e3df..4e6408b27 100644 --- a/flask_admin/templates/bootstrap4/admin/model/details.html +++ b/flask_admin/templates/bootstrap4/admin/model/details.html @@ -48,5 +48,5 @@ {% block tail %} {{ super() }} - <script src="{{ admin_static.url(filename='admin/js/details_filter.js', v='1.0.0') }}"></script> + <script {{ admin_csp_nonce_attribute }} src="{{ admin_static.url(filename='admin/js/details_filter.js', v='1.0.0') }}"></script> {% endblock %} diff --git a/flask_admin/templates/bootstrap4/admin/model/list.html b/flask_admin/templates/bootstrap4/admin/model/list.html index 06d1820d5..d8d65c95b 100755 --- a/flask_admin/templates/bootstrap4/admin/model/list.html +++ b/flask_admin/templates/bootstrap4/admin/model/list.html @@ -188,8 +188,8 @@ <div id="active-filters-data" style="display:none;">{{ active_filters|tojson|safe }}</div> {% endif %} {{ lib.form_js() }} - <script src="{{ admin_static.url(filename='admin/js/bs4_modal.js', v='1.0.0') }}"></script> - <script src="{{ admin_static.url(filename='admin/js/bs4_filters.js', v='1.0.0') }}"></script> + <script {{ admin_csp_nonce_attribute }} src="{{ admin_static.url(filename='admin/js/bs4_modal.js', v='1.0.0') }}"></script> + <script {{ admin_csp_nonce_attribute }} src="{{ admin_static.url(filename='admin/js/bs4_filters.js', v='1.0.0') }}"></script> {{ actionlib.script(_gettext('Please select at least one record.'), diff --git a/flask_admin/templates/bootstrap4/admin/model/modals/create.html b/flask_admin/templates/bootstrap4/admin/model/modals/create.html index 2338b042a..6b3ac699b 100644 --- a/flask_admin/templates/bootstrap4/admin/model/modals/create.html +++ b/flask_admin/templates/bootstrap4/admin/model/modals/create.html @@ -32,5 +32,5 @@ {% endblock %} {% block tail %} - <script>window.faForm.applyGlobalStyles(document.getElementsByClassName('modal-content'));</script> + <script {{ admin_csp_nonce_attribute }}>window.faForm.applyGlobalStyles(document.getElementsByClassName('modal-content'));</script> {% endblock %} diff --git a/flask_admin/templates/bootstrap4/admin/model/modals/details.html b/flask_admin/templates/bootstrap4/admin/model/modals/details.html index 30e631347..3aba4703a 100755 --- a/flask_admin/templates/bootstrap4/admin/model/modals/details.html +++ b/flask_admin/templates/bootstrap4/admin/model/modals/details.html @@ -35,6 +35,6 @@ <h3>{{ _gettext('View Record') + ' #' + request.args.get('id') }}</h3> {% endblock %} {% block tail %} - <script src="{{ admin_static.url(filename='admin/js/details_filter.js', v='1.0.0') }}"></script> - <script>window.faForm.applyGlobalStyles(document.getElementsByClassName('modal-content'));</script> + <script {{ admin_csp_nonce_attribute }} src="{{ admin_static.url(filename='admin/js/details_filter.js', v='1.0.0') }}"></script> + <script {{ admin_csp_nonce_attribute }}>window.faForm.applyGlobalStyles(document.getElementsByClassName('modal-content'));</script> {% endblock %} diff --git a/flask_admin/templates/bootstrap4/admin/model/modals/edit.html b/flask_admin/templates/bootstrap4/admin/model/modals/edit.html index 4f69e26e4..35315f4a7 100644 --- a/flask_admin/templates/bootstrap4/admin/model/modals/edit.html +++ b/flask_admin/templates/bootstrap4/admin/model/modals/edit.html @@ -26,5 +26,5 @@ <h5 class="modal-title">{{ _gettext('Edit Record') + ' #' + request.args.get('id {% endblock %} {% block tail %} - <script>window.faForm.applyGlobalStyles(document.getElementsByClassName('modal-content'));</script> + <script {{ admin_csp_nonce_attribute }}>window.faForm.applyGlobalStyles(document.getElementsByClassName('modal-content'));</script> {% endblock %} diff --git a/flask_admin/templates/bootstrap4/admin/rediscli/console.html b/flask_admin/templates/bootstrap4/admin/rediscli/console.html index 498fdcc8b..6fa3179e3 100644 --- a/flask_admin/templates/bootstrap4/admin/rediscli/console.html +++ b/flask_admin/templates/bootstrap4/admin/rediscli/console.html @@ -23,5 +23,5 @@ {{ super() }} <div id="execute-view-data" style="display:none;">{{ admin_view.get_url('.execute_view')|tojson|safe }}</div> - <script src="{{ admin_static.url(filename='admin/js/rediscli.js', v='1.0.0') }}"></script> + <script {{ admin_csp_nonce_attribute }} src="{{ admin_static.url(filename='admin/js/rediscli.js', v='1.0.0') }}"></script> {% endblock %} diff --git a/flask_admin/tests/test_csp.py b/flask_admin/tests/test_csp.py new file mode 100644 index 000000000..5df30c536 --- /dev/null +++ b/flask_admin/tests/test_csp.py @@ -0,0 +1,37 @@ +import secrets + +from bs4 import BeautifulSoup +import pytest + +from flask_admin import Admin + + +@pytest.fixture +def nonce(): + return secrets.token_urlsafe(32) + +@pytest.fixture +def admin(app, babel, nonce): + def csp_nonce_generator(): + return nonce + + admin = Admin(app, csp_nonce_generator=csp_nonce_generator) + yield admin + + +def test_csp_nonces_injected(app, admin, nonce): + client = app.test_client() + rv = client.get('/admin/') + assert rv.status_code == 200 + + soup = BeautifulSoup(rv.data, 'html.parser') + + scripts = soup.select('script') + assert len(scripts) == 9 + for tag in scripts: + assert tag.attrs['nonce'] == nonce + + styles = soup.select('style') + assert len(styles) == 1 + for tag in styles: + assert tag.attrs['nonce'] == nonce diff --git a/flask_admin/tests/test_host_matching.py b/flask_admin/tests/test_host_matching.py index 82c787ac1..c6dc662a9 100644 --- a/flask_admin/tests/test_host_matching.py +++ b/flask_admin/tests/test_host_matching.py @@ -136,7 +136,7 @@ def test_mounting_on_host(app, babel, initialise_using_init_app): in rv.data ) assert ( - b'<script src="/static/admin/vendor' + b'<script src="/static/admin/vendor' b'/jquery.min.js?v=3.5.1" type="text/javascript">' in rv.data ) @@ -190,7 +190,7 @@ def test_mounting_on_wildcard_host(app, babel, initialise_using_init_app): in rv.data ) assert ( - b'<script src="/static/admin/vendor' + b'<script src="/static/admin/vendor' b'/jquery.min.js?v=3.5.1" type="text/javascript">' in rv.data ) diff --git a/requirements-skip/tests-min.in b/requirements-skip/tests-min.in index a085c3b61..982ee94fe 100644 --- a/requirements-skip/tests-min.in +++ b/requirements-skip/tests-min.in @@ -5,6 +5,7 @@ pytest pytest-cov psycopg2 +beautifulsoup4 # -------------------------------------- # Flask-Admin minimum supported versions diff --git a/requirements-skip/tests-min.txt b/requirements-skip/tests-min.txt index c1c602bf3..2eedb653d 100644 --- a/requirements-skip/tests-min.txt +++ b/requirements-skip/tests-min.txt @@ -18,6 +18,8 @@ azure-storage-common==2.1.0 # via azure-storage-blob babel==2.15.0 # via flask-babel +beautifulsoup4==4.12.3 + # via -r tests-min.in certifi==2024.7.4 # via requests cffi==1.16.0 @@ -142,6 +144,8 @@ six==1.16.0 # via # python-dateutil # sqlalchemy-utils +soupsieve==2.5 + # via beautifulsoup4 sqlalchemy==1.4.18 # via # -r tests-min.in diff --git a/requirements/dev.txt b/requirements/dev.txt index 68232ade3..2b343f1ca 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -17,6 +17,10 @@ babel==2.15.0 # via # -r docs.txt # sphinx +beautifulsoup4==4.12.3 + # via + # -r tests.in + # -r typing.txt cachetools==5.4.0 # via tox certifi==2024.7.4 @@ -213,6 +217,10 @@ snowballstemmer==2.2.0 # via # -r docs.txt # sphinx +soupsieve==2.5 + # via + # -r typing.txt + # beautifulsoup4 sphinx==7.1.2 # via # -r docs.txt @@ -261,6 +269,8 @@ tomlkit==0.13.0 # pylint tox==4.16.0 # via -r dev.in +types-beautifulsoup4==4.12.0.20240511 + # via -r typing.txt types-boto==2.49.18.20240205 # via -r typing.txt types-click==7.1.8 @@ -271,6 +281,10 @@ types-flask==1.1.6 # via -r typing.txt types-flask-sqlalchemy==2.5.9.4 # via -r typing.txt +types-html5lib==1.1.11.20240228 + # via + # -r typing.txt + # types-beautifulsoup4 types-jinja2==2.11.9 # via # -r typing.txt diff --git a/requirements/tests.in b/requirements/tests.in index cef4ee220..b86178392 100644 --- a/requirements/tests.in +++ b/requirements/tests.in @@ -5,3 +5,4 @@ pytest pytest-cov psycopg2 +beautifulsoup4 diff --git a/requirements/tests.txt b/requirements/tests.txt index 3f70eb261..8608ac9a6 100644 --- a/requirements/tests.txt +++ b/requirements/tests.txt @@ -6,6 +6,8 @@ # astroid==3.2.4 # via pylint +beautifulsoup4==4.12.3 + # via -r tests.in certifi==2024.7.4 # via requests charset-normalizer==3.3.2 @@ -56,6 +58,8 @@ pytest-cov==5.0.0 # via -r tests.in requests==2.32.3 # via coveralls +soupsieve==2.5 + # via beautifulsoup4 tomli==2.0.1 # via # coverage diff --git a/requirements/typing.in b/requirements/typing.in index 982982adf..95f40d7a0 100644 --- a/requirements/typing.in +++ b/requirements/typing.in @@ -5,6 +5,7 @@ pyright pytest types-Flask-SQLAlchemy types-Pillow +types-beautifulsoup4 types-boto types-peewee types-Flask diff --git a/requirements/typing.txt b/requirements/typing.txt index 95d06b2ff..2506639cb 100644 --- a/requirements/typing.txt +++ b/requirements/typing.txt @@ -6,6 +6,8 @@ # astroid==3.2.4 # via pylint +beautifulsoup4==4.12.3 + # via -r tests.in certifi==2024.7.4 # via requests charset-normalizer==3.3.2 @@ -69,6 +71,8 @@ pytest-cov==5.0.0 # via -r tests.in requests==2.32.3 # via coveralls +soupsieve==2.5 + # via beautifulsoup4 tomli==2.0.1 # via # coverage @@ -77,6 +81,8 @@ tomli==2.0.1 # pytest tomlkit==0.13.0 # via pylint +types-beautifulsoup4==4.12.0.20240511 + # via -r typing.in types-boto==2.49.18.20240205 # via -r typing.in types-click==7.1.8 @@ -85,6 +91,8 @@ types-flask==1.1.6 # via -r typing.in types-flask-sqlalchemy==2.5.9.4 # via -r typing.in +types-html5lib==1.1.11.20240228 + # via types-beautifulsoup4 types-jinja2==2.11.9 # via types-flask types-markupsafe==1.1.10 From e8449f579fe37308721a659e78ccdf066ba9ee74 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Sat, 3 Aug 2024 17:24:49 +0100 Subject: [PATCH 095/156] Support WTForms 3.1 iter_choices 4 item return values --- flask_admin/contrib/sqla/widgets.py | 8 ++++++-- flask_admin/model/widgets.py | 6 +++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/flask_admin/contrib/sqla/widgets.py b/flask_admin/contrib/sqla/widgets.py index 8bf760a99..3c901c77c 100644 --- a/flask_admin/contrib/sqla/widgets.py +++ b/flask_admin/contrib/sqla/widgets.py @@ -20,9 +20,13 @@ class CheckboxListInput: def __call__(self, field, **kwargs): items = [] - for val, label, selected in field.iter_choices(): + for field_choices in field.iter_choices(): + if len(field_choices) == 3: # wtforms <3.1, >=3.1.1, <3.2 + value, label, selected = field_choices + else: + value, label, selected, _ = field_choices args = { - 'id': val, + 'id': value, 'name': field.name, 'label': escape(label), 'selected': ' checked' if selected else '', diff --git a/flask_admin/model/widgets.py b/flask_admin/model/widgets.py index 08012270a..c00347fa4 100644 --- a/flask_admin/model/widgets.py +++ b/flask_admin/model/widgets.py @@ -158,7 +158,11 @@ def get_kwargs(self, field, kwargs): choices = [] selected_ids = [] - for value, label, selected in field.iter_choices(): + for field_choices in field.iter_choices(): + if len(field_choices) == 3: # wtforms <3.1, >=3.1.1, <3.2 + value, label, selected = field_choices + else: + value, label, selected, _ = field_choices try: label = text_type(label) except TypeError: From 8326c46103c2bac7db9d0435065aa14d761e498a Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Sat, 3 Aug 2024 17:29:12 +0100 Subject: [PATCH 096/156] Replace obsolete intersphinx_mapping Old format removed in Sphinx 8.0, new format introduced in Sphinx 1.0. --- doc/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/conf.py b/doc/conf.py index b1bfbddca..e9cf1f4a8 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -251,7 +251,7 @@ # Example configuration for intersphinx: refer to the Python standard library. -intersphinx_mapping = {'http://docs.python.org/': None} +intersphinx_mapping = {'python': ('https://docs.python.org/3', None)} # fall back if theme is not there try: From 33506d28331d801ea1d64c1c9ed4c96cf853d2e9 Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Mon, 5 Aug 2024 19:21:15 +0100 Subject: [PATCH 097/156] Replace filter support for sqlalchemy_enum34 with sqlalchemy.Enum PEP-435-style enumerated classes supported by sqlalchemy.Enum since SQLAlchemy 1.1. --- flask_admin/contrib/sqla/filters.py | 35 ++++------ flask_admin/tests/sqla/test_basic.py | 101 ++++++++++++++++++++++----- pyproject.toml | 1 - 3 files changed, 98 insertions(+), 39 deletions(-) diff --git a/flask_admin/contrib/sqla/filters.py b/flask_admin/contrib/sqla/filters.py index 67d19504f..60367f940 100644 --- a/flask_admin/contrib/sqla/filters.py +++ b/flask_admin/contrib/sqla/filters.py @@ -288,54 +288,54 @@ def operation(self): class EnumEqualFilter(FilterEqual): - def __init__(self, column, name, options=None, enum_class=None, **kwargs): - self.enum_class = enum_class + def __init__(self, column, name, options=None, **kwargs): + self.enum_class = column.type.enum_class super(EnumEqualFilter, self).__init__(column, name, options, **kwargs) def clean(self, value): if self.enum_class is None: return super(EnumEqualFilter, self).clean(value) - return self.enum_class(value) + return self.enum_class[value] class EnumFilterNotEqual(FilterNotEqual): - def __init__(self, column, name, options=None, enum_class=None, **kwargs): - self.enum_class = enum_class + def __init__(self, column, name, options=None, **kwargs): + self.enum_class = column.type.enum_class super(EnumFilterNotEqual, self).__init__(column, name, options, **kwargs) def clean(self, value): if self.enum_class is None: return super(EnumFilterNotEqual, self).clean(value) - return self.enum_class(value) + return self.enum_class[value] class EnumFilterEmpty(FilterEmpty): - def __init__(self, column, name, options=None, enum_class=None, **kwargs): - self.enum_class = enum_class + def __init__(self, column, name, options=None, **kwargs): + self.enum_class = column.type.enum_class super(EnumFilterEmpty, self).__init__(column, name, options, **kwargs) class EnumFilterInList(FilterInList): - def __init__(self, column, name, options=None, enum_class=None, **kwargs): - self.enum_class = enum_class + def __init__(self, column, name, options=None, **kwargs): + self.enum_class = column.type.enum_class super(EnumFilterInList, self).__init__(column, name, options, **kwargs) def clean(self, value): values = super(EnumFilterInList, self).clean(value) if self.enum_class is not None: - values = [self.enum_class(val) for val in values] + values = [self.enum_class[val] for val in values] return values class EnumFilterNotInList(FilterNotInList): - def __init__(self, column, name, options=None, enum_class=None, **kwargs): - self.enum_class = enum_class + def __init__(self, column, name, options=None, **kwargs): + self.enum_class = column.type.enum_class super(EnumFilterNotInList, self).__init__(column, name, options, **kwargs) def clean(self, value): values = super(EnumFilterNotInList, self).clean(value) if self.enum_class is not None: - values = [self.enum_class(val) for val in values] + values = [self.enum_class[val] for val in values] return values @@ -540,13 +540,6 @@ def conv_enum(self, column, name, options=None, **kwargs): (v, v) for v in column.type.enums ] - try: - from sqlalchemy_enum34 import EnumType - except ImportError: - pass - else: - if isinstance(column.type, EnumType): - kwargs['enum_class'] = column.type._enum_class return [f(column, name, options, **kwargs) for f in self.enum] diff --git a/flask_admin/tests/sqla/test_basic.py b/flask_admin/tests/sqla/test_basic.py index 188f38eb1..7bd6f9a4c 100644 --- a/flask_admin/tests/sqla/test_basic.py +++ b/flask_admin/tests/sqla/test_basic.py @@ -42,7 +42,7 @@ class Model1(db.Model): def __init__(self, test1=None, test2=None, test3=None, test4=None, bool_field=False, date_field=None, time_field=None, datetime_field=None, email_field=None, - choice_field=None, enum_field=None): + choice_field=None, enum_field=None, enum_type_field=None): self.test1 = test1 self.test2 = test2 self.test3 = test3 @@ -54,6 +54,7 @@ def __init__(self, test1=None, test2=None, test3=None, test4=None, self.email_field = email_field self.choice_field = choice_field self.enum_field = enum_field + self.enum_type_field = enum_type_field class EnumChoices(enum.Enum): first = 1 @@ -70,6 +71,7 @@ class EnumChoices(enum.Enum): datetime_field = db.Column(db.DateTime) email_field = db.Column(EmailType) enum_field = db.Column(db.Enum('model1_v1', 'model1_v2'), nullable=True) + enum_type_field = db.Column(db.Enum(EnumChoices), nullable=True) choice_field = db.Column(db.String, nullable=True) sqla_utils_choice = db.Column(ChoiceType([ ('choice-1', u'First choice'), @@ -143,6 +145,9 @@ def fill_db(db, Model1, Model2): enum_obj1 = Model1('enum_obj1', enum_field="model1_v1") enum_obj2 = Model1('enum_obj2', enum_field="model1_v2") + enum_type_obj1 = Model1('enum_type_obj1', enum_type_field=Model1.EnumChoices.first) + enum_type_obj2 = Model1('enum_type_obj2', enum_type_field=Model1.EnumChoices.second) + empty_obj = Model1(test2="empty_obj") db.session.add_all([ @@ -150,7 +155,7 @@ def fill_db(db, Model1, Model2): model2_obj1, model2_obj2, model2_obj3, model2_obj4, model2_obj5, date_obj1, timeonly_obj1, datetime_obj1, date_obj2, timeonly_obj2, datetime_obj2, - enum_obj1, enum_obj2, empty_obj + enum_obj1, enum_obj2, enum_type_obj1, enum_type_obj2, empty_obj ]) db.session.commit() @@ -379,8 +384,8 @@ def test_exclude_columns(app, db, admin): view = CustomModelView( Model1, db.session, - column_exclude_list=['test2', 'test4', 'enum_field', 'date_field', 'time_field', 'datetime_field', - 'sqla_utils_choice', 'sqla_utils_enum', 'sqla_utils_arrow', 'sqla_utils_uuid', + column_exclude_list=['test2', 'test4', 'enum_field', 'enum_type_field', 'date_field', 'datetime_field', + 'time_field', 'sqla_utils_choice', 'sqla_utils_enum', 'sqla_utils_arrow', 'sqla_utils_uuid', 'sqla_utils_url', 'sqla_utils_ip_address', 'sqla_utils_currency', 'sqla_utils_color'] ) admin.add_view(view) @@ -755,6 +760,11 @@ def test_column_filters(app, db, admin): ], endpoint='_relation_test') admin.add_view(view13) + view14 = CustomModelView(Model1, db.session, + column_filters=['enum_type_field'], + endpoint="_enumtypefield") + admin.add_view(view14) + # Test views assert \ [(f['index'], f['operation']) for f in view1._filter_groups[u'Test1']] == \ @@ -883,29 +893,29 @@ def test_column_filters(app, db, admin): ] assert \ - [(f['index'], f['operation']) for f in view2._filter_groups[u'Model1 / Choice Field']] == \ + [(f['index'], f['operation']) for f in view2._filter_groups[u'Model1 / Enum Type Field']] == \ [ - (63, u'contains'), - (64, u'not contains'), - (65, u'equals'), - (66, u'not equal'), - (67, u'empty'), - (68, u'in list'), - (69, u'not in list'), + (63, u'equals'), + (64, u'not equal'), + (65, u'empty'), + (66, u'in list'), + (67, u'not in list'), ] assert \ - [(f['index'], f['operation']) for f in view2._filter_groups[u'Model1 / Sqla Utils Choice']] == \ + [(f['index'], f['operation']) for f in view2._filter_groups[u'Model1 / Choice Field']] == \ [ + (68, u'contains'), + (69, u'not contains'), (70, u'equals'), (71, u'not equal'), - (72, u'contains'), - (73, u'not contains'), - (74, u'empty'), + (72, u'empty'), + (73, u'in list'), + (74, u'not in list'), ] assert \ - [(f['index'], f['operation']) for f in view2._filter_groups[u'Model1 / Sqla Utils Enum']] == \ + [(f['index'], f['operation']) for f in view2._filter_groups[u'Model1 / Sqla Utils Choice']] == \ [ (75, u'equals'), (76, u'not equal'), @@ -914,6 +924,16 @@ def test_column_filters(app, db, admin): (79, u'empty'), ] + assert \ + [(f['index'], f['operation']) for f in view2._filter_groups[u'Model1 / Sqla Utils Enum']] == \ + [ + (80, u'equals'), + (81, u'not equal'), + (82, u'contains'), + (83, u'not contains'), + (84, u'empty'), + ] + # Test filter with a dot view3 = CustomModelView(Model2, db.session, column_filters=['model1.bool_field']) @@ -1536,6 +1556,53 @@ def test_column_filters(app, db, admin): assert 'enum_obj1' not in data assert 'enum_obj2' not in data + # Test enum type filter + # enum type - equals + rv = client.get('/admin/_enumtypefield/?flt0_0=first') + assert rv.status_code == 200 + data = rv.data.decode('utf-8') + assert 'enum_type_obj1' in data + assert 'enum_type_obj2' not in data + + # enum - not equal + rv = client.get('/admin/_enumtypefield/?flt0_1=first') + assert rv.status_code == 200 + data = rv.data.decode('utf-8') + assert 'enum_type_obj1' not in data + assert 'enum_type_obj2' in data + + # enum - empty + rv = client.get('/admin/_enumtypefield/?flt0_2=1') + assert rv.status_code == 200 + data = rv.data.decode('utf-8') + assert 'test1_val_1' in data + assert 'enum_type_obj1' not in data + assert 'enum_type_obj2' not in data + + # enum - not empty + rv = client.get('/admin/_enumtypefield/?flt0_2=0') + assert rv.status_code == 200 + data = rv.data.decode('utf-8') + assert 'test1_val_1' not in data + assert 'enum_type_obj1' in data + assert 'enum_type_obj2' in data + + # enum - in list + rv = client.get('/admin/_enumtypefield/?flt0_3=first%2Csecond') + assert rv.status_code == 200 + data = rv.data.decode('utf-8') + assert 'test1_val_1' not in data + assert 'enum_type_obj1' in data + assert 'enum_type_obj2' in data + + # enum - not in list + rv = client.get('/admin/_enumtypefield/?flt0_4=first%2Csecond') + assert rv.status_code == 200 + data = rv.data.decode('utf-8') + assert 'test1_val_1' in data + assert 'enum_type_obj1' not in data + assert 'enum_type_obj2' not in data + # Test single custom filter on relation rv = client.get('/admin/_relation_test/?flt1_0=test1_val_1') data = rv.data.decode('utf-8') diff --git a/pyproject.toml b/pyproject.toml index 369193548..06af53b97 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -179,7 +179,6 @@ module = [ "playhouse.*", "pymongo", "sqlalchemy.*", - "sqlalchemy_enum34", "sqlalchemy_utils", "tablib", "wtforms.*", From fbc877c6a8b4791b571242f4ef4356bcd5f8fc1a Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Mon, 5 Aug 2024 19:26:29 +0100 Subject: [PATCH 098/156] Update PostGIS Docker image 12-master was last updated 3 years ago. PostgreSQL 12 will stop receiving fixes in November 2024. --- .github/workflows/tests.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 0f89da373..93142195f 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -39,7 +39,7 @@ jobs: # Label used to access the service container postgres: # Docker Hub image - image: postgis/postgis:12-master # postgres with postgis installed + image: postgis/postgis:16-3.4 # postgres with postgis installed # Provide the password for postgres env: POSTGRES_PASSWORD: postgres From e33d90ad3bfe62df954ce71d2bf2827db9479b86 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Thu, 1 Aug 2024 21:31:30 +0100 Subject: [PATCH 099/156] Remove mongoengine references from translation files --- babel/admin.pot | 20 ------- .../translations/af/LC_MESSAGES/admin.po | 20 ------- .../translations/ar/LC_MESSAGES/admin.po | 20 ------- .../translations/be/LC_MESSAGES/admin.po | 20 ------- .../translations/ca_ES/LC_MESSAGES/admin.po | 20 ------- .../translations/cs/LC_MESSAGES/admin.po | 20 ------- .../translations/da/LC_MESSAGES/admin.po | 20 ------- .../translations/de/LC_MESSAGES/admin.po | 20 ------- .../translations/el/LC_MESSAGES/admin.po | 20 ------- .../translations/en/LC_MESSAGES/admin.po | 19 ------ .../translations/es/LC_MESSAGES/admin.po | 20 ------- .../translations/et/LC_MESSAGES/admin.po | 20 ------- .../translations/fa/LC_MESSAGES/admin.po | 20 ------- .../translations/fi/LC_MESSAGES/admin.po | 20 ------- .../translations/fr/LC_MESSAGES/admin.po | 20 ------- .../translations/he/LC_MESSAGES/admin.po | 20 ------- .../translations/hu/LC_MESSAGES/admin.po | 58 ++++++------------- .../translations/it/LC_MESSAGES/admin.po | 20 ------- .../translations/ja/LC_MESSAGES/admin.po | 20 ------- .../translations/ko/LC_MESSAGES/admin.po | 20 ------- .../translations/nl/LC_MESSAGES/admin.po | 20 ------- .../translations/no/LC_MESSAGES/admin.po | 20 ------- .../translations/pa/LC_MESSAGES/admin.po | 20 ------- .../translations/pl/LC_MESSAGES/admin.po | 20 ------- .../translations/pt/LC_MESSAGES/admin.po | 20 ------- .../translations/pt_BR/LC_MESSAGES/admin.po | 20 ------- .../translations/ro/LC_MESSAGES/admin.po | 20 ------- .../translations/ru/LC_MESSAGES/admin.po | 20 ------- .../translations/sk/LC_MESSAGES/admin.po | 20 ------- .../translations/sr/LC_MESSAGES/admin.po | 20 ------- .../translations/sv/LC_MESSAGES/admin.po | 20 ------- .../translations/tr/LC_MESSAGES/admin.po | 20 ------- .../translations/uk/LC_MESSAGES/admin.po | 20 ------- .../translations/vi/LC_MESSAGES/admin.po | 20 ------- .../zh_Hans_CN/LC_MESSAGES/admin.po | 20 ------- .../zh_Hant_TW/LC_MESSAGES/admin.po | 20 ------- 36 files changed, 19 insertions(+), 738 deletions(-) diff --git a/babel/admin.pot b/babel/admin.pot index 355ea2f97..0233536bb 100644 --- a/babel/admin.pot +++ b/babel/admin.pot @@ -197,7 +197,6 @@ msgid "Editing %(path)s" msgstr "" #: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/mongoengine/view.py:658 #: ../flask_admin/contrib/peewee/view.py:487 #: ../flask_admin/contrib/pymongo/view.py:384 #: ../flask_admin/contrib/sqla/view.py:1149 @@ -224,67 +223,57 @@ msgstr "" msgid "Cannot operate on non empty directories" msgstr "" -#: ../flask_admin/contrib/mongoengine/filters.py:39 #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 #: ../flask_admin/contrib/sqla/filters.py:41 msgid "equals" msgstr "" -#: ../flask_admin/contrib/mongoengine/filters.py:48 #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 #: ../flask_admin/contrib/sqla/filters.py:49 msgid "not equal" msgstr "" -#: ../flask_admin/contrib/mongoengine/filters.py:58 #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 #: ../flask_admin/contrib/sqla/filters.py:58 msgid "contains" msgstr "" -#: ../flask_admin/contrib/mongoengine/filters.py:68 #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 #: ../flask_admin/contrib/sqla/filters.py:67 msgid "not contains" msgstr "" -#: ../flask_admin/contrib/mongoengine/filters.py:77 #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 #: ../flask_admin/contrib/sqla/filters.py:75 msgid "greater than" msgstr "" -#: ../flask_admin/contrib/mongoengine/filters.py:86 #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 #: ../flask_admin/contrib/sqla/filters.py:83 msgid "smaller than" msgstr "" -#: ../flask_admin/contrib/mongoengine/filters.py:98 #: ../flask_admin/contrib/peewee/filters.py:88 #: ../flask_admin/contrib/sqla/filters.py:94 msgid "empty" msgstr "" -#: ../flask_admin/contrib/mongoengine/filters.py:113 #: ../flask_admin/contrib/peewee/filters.py:102 #: ../flask_admin/contrib/sqla/filters.py:108 msgid "in list" msgstr "" -#: ../flask_admin/contrib/mongoengine/filters.py:122 #: ../flask_admin/contrib/peewee/filters.py:111 #: ../flask_admin/contrib/sqla/filters.py:118 msgid "not in list" msgstr "" -#: ../flask_admin/contrib/mongoengine/filters.py:222 #: ../flask_admin/contrib/peewee/filters.py:207 #: ../flask_admin/contrib/peewee/filters.py:244 #: ../flask_admin/contrib/peewee/filters.py:281 @@ -294,16 +283,13 @@ msgstr "" msgid "not between" msgstr "" -#: ../flask_admin/contrib/mongoengine/filters.py:247 msgid "ObjectId equals" msgstr "" -#: ../flask_admin/contrib/mongoengine/view.py:551 #, python-format msgid "Failed to get model. %(error)s" msgstr "" -#: ../flask_admin/contrib/mongoengine/view.py:570 #: ../flask_admin/contrib/peewee/view.py:435 #: ../flask_admin/contrib/pymongo/view.py:316 #: ../flask_admin/contrib/sqla/view.py:1078 @@ -311,7 +297,6 @@ msgstr "" msgid "Failed to create record. %(error)s" msgstr "" -#: ../flask_admin/contrib/mongoengine/view.py:596 #: ../flask_admin/contrib/peewee/view.py:454 #: ../flask_admin/contrib/pymongo/view.py:341 #: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 @@ -320,7 +305,6 @@ msgstr "" msgid "Failed to update record. %(error)s" msgstr "" -#: ../flask_admin/contrib/mongoengine/view.py:619 #: ../flask_admin/contrib/peewee/view.py:469 #: ../flask_admin/contrib/pymongo/view.py:366 #: ../flask_admin/contrib/sqla/view.py:1129 @@ -328,14 +312,12 @@ msgstr "" msgid "Failed to delete record. %(error)s" msgstr "" -#: ../flask_admin/contrib/mongoengine/view.py:659 #: ../flask_admin/contrib/peewee/view.py:488 #: ../flask_admin/contrib/pymongo/view.py:385 #: ../flask_admin/contrib/sqla/view.py:1150 msgid "Are you sure you want to delete selected records?" msgstr "" -#: ../flask_admin/contrib/mongoengine/view.py:668 #: ../flask_admin/contrib/peewee/view.py:505 #: ../flask_admin/contrib/pymongo/view.py:395 #: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 @@ -345,7 +327,6 @@ msgid_plural "%(count)s records were successfully deleted." msgstr[0] "" msgstr[1] "" -#: ../flask_admin/contrib/mongoengine/view.py:674 #: ../flask_admin/contrib/peewee/view.py:511 #: ../flask_admin/contrib/pymongo/view.py:400 #: ../flask_admin/contrib/sqla/view.py:1174 @@ -659,4 +640,3 @@ msgstr "" #: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 msgid "Are you sure you want to delete this record?" msgstr "" - diff --git a/flask_admin/translations/af/LC_MESSAGES/admin.po b/flask_admin/translations/af/LC_MESSAGES/admin.po index 3cf6f5704..db643f262 100644 --- a/flask_admin/translations/af/LC_MESSAGES/admin.po +++ b/flask_admin/translations/af/LC_MESSAGES/admin.po @@ -196,7 +196,6 @@ msgid "Editing %(path)s" msgstr "Redigering %(path)s" #: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/mongoengine/view.py:658 #: ../flask_admin/contrib/peewee/view.py:487 #: ../flask_admin/contrib/pymongo/view.py:384 #: ../flask_admin/contrib/sqla/view.py:1149 @@ -223,67 +222,57 @@ msgstr "Wysig" msgid "Cannot operate on non empty directories" msgstr "" -#: ../flask_admin/contrib/mongoengine/filters.py:39 #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 #: ../flask_admin/contrib/sqla/filters.py:41 msgid "equals" msgstr "gelyk" -#: ../flask_admin/contrib/mongoengine/filters.py:48 #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 #: ../flask_admin/contrib/sqla/filters.py:49 msgid "not equal" msgstr "nie gelyk" -#: ../flask_admin/contrib/mongoengine/filters.py:58 #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 #: ../flask_admin/contrib/sqla/filters.py:58 msgid "contains" msgstr "bevat" -#: ../flask_admin/contrib/mongoengine/filters.py:68 #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 #: ../flask_admin/contrib/sqla/filters.py:67 msgid "not contains" msgstr "nie bevat" -#: ../flask_admin/contrib/mongoengine/filters.py:77 #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 #: ../flask_admin/contrib/sqla/filters.py:75 msgid "greater than" msgstr "groter as" -#: ../flask_admin/contrib/mongoengine/filters.py:86 #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 #: ../flask_admin/contrib/sqla/filters.py:83 msgid "smaller than" msgstr "kleiner as" -#: ../flask_admin/contrib/mongoengine/filters.py:98 #: ../flask_admin/contrib/peewee/filters.py:88 #: ../flask_admin/contrib/sqla/filters.py:94 msgid "empty" msgstr "leë" -#: ../flask_admin/contrib/mongoengine/filters.py:113 #: ../flask_admin/contrib/peewee/filters.py:102 #: ../flask_admin/contrib/sqla/filters.py:108 msgid "in list" msgstr "in lys" -#: ../flask_admin/contrib/mongoengine/filters.py:122 #: ../flask_admin/contrib/peewee/filters.py:111 #: ../flask_admin/contrib/sqla/filters.py:118 msgid "not in list" msgstr "nie in die lys" -#: ../flask_admin/contrib/mongoengine/filters.py:222 #: ../flask_admin/contrib/peewee/filters.py:207 #: ../flask_admin/contrib/peewee/filters.py:244 #: ../flask_admin/contrib/peewee/filters.py:281 @@ -293,16 +282,13 @@ msgstr "nie in die lys" msgid "not between" msgstr "nie tussen" -#: ../flask_admin/contrib/mongoengine/filters.py:247 msgid "ObjectId equals" msgstr "" -#: ../flask_admin/contrib/mongoengine/view.py:551 #, python-format msgid "Failed to get model. %(error)s" msgstr "Kon model kry. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:570 #: ../flask_admin/contrib/peewee/view.py:435 #: ../flask_admin/contrib/pymongo/view.py:316 #: ../flask_admin/contrib/sqla/view.py:1078 @@ -310,7 +296,6 @@ msgstr "Kon model kry. %(error)s" msgid "Failed to create record. %(error)s" msgstr "Kon rekord te skep. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:596 #: ../flask_admin/contrib/peewee/view.py:454 #: ../flask_admin/contrib/pymongo/view.py:341 #: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 @@ -319,7 +304,6 @@ msgstr "Kon rekord te skep. %(error)s" msgid "Failed to update record. %(error)s" msgstr "Kon rekord te werk. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:619 #: ../flask_admin/contrib/peewee/view.py:469 #: ../flask_admin/contrib/pymongo/view.py:366 #: ../flask_admin/contrib/sqla/view.py:1129 @@ -327,14 +311,12 @@ msgstr "Kon rekord te werk. %(error)s" msgid "Failed to delete record. %(error)s" msgstr "Kon rekord verwyder. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:659 #: ../flask_admin/contrib/peewee/view.py:488 #: ../flask_admin/contrib/pymongo/view.py:385 #: ../flask_admin/contrib/sqla/view.py:1150 msgid "Are you sure you want to delete selected records?" msgstr "Is jy seker jy wil gekies rekords skrap?" -#: ../flask_admin/contrib/mongoengine/view.py:668 #: ../flask_admin/contrib/peewee/view.py:505 #: ../flask_admin/contrib/pymongo/view.py:395 #: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 @@ -344,7 +326,6 @@ msgid_plural "%(count)s records were successfully deleted." msgstr[0] "Rekord is suksesvol verwyder." msgstr[1] "%(count)s rekords is suksesvol verwyder." -#: ../flask_admin/contrib/mongoengine/view.py:674 #: ../flask_admin/contrib/peewee/view.py:511 #: ../flask_admin/contrib/pymongo/view.py:400 #: ../flask_admin/contrib/sqla/view.py:1174 @@ -658,4 +639,3 @@ msgstr "Kies ten minste een rekord." #: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 msgid "Are you sure you want to delete this record?" msgstr "Is jy seker jy wil hierdie rekord verwyder?" - diff --git a/flask_admin/translations/ar/LC_MESSAGES/admin.po b/flask_admin/translations/ar/LC_MESSAGES/admin.po index a864e1d11..0012ba85b 100644 --- a/flask_admin/translations/ar/LC_MESSAGES/admin.po +++ b/flask_admin/translations/ar/LC_MESSAGES/admin.po @@ -196,7 +196,6 @@ msgid "Editing %(path)s" msgstr "تحرير %(path)s" #: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/mongoengine/view.py:658 #: ../flask_admin/contrib/peewee/view.py:487 #: ../flask_admin/contrib/pymongo/view.py:384 #: ../flask_admin/contrib/sqla/view.py:1149 @@ -223,67 +222,57 @@ msgstr "عدل" msgid "Cannot operate on non empty directories" msgstr "" -#: ../flask_admin/contrib/mongoengine/filters.py:39 #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 #: ../flask_admin/contrib/sqla/filters.py:41 msgid "equals" msgstr "يساوي" -#: ../flask_admin/contrib/mongoengine/filters.py:48 #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 #: ../flask_admin/contrib/sqla/filters.py:49 msgid "not equal" msgstr "لا تساوي" -#: ../flask_admin/contrib/mongoengine/filters.py:58 #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 #: ../flask_admin/contrib/sqla/filters.py:58 msgid "contains" msgstr "يحتوي على" -#: ../flask_admin/contrib/mongoengine/filters.py:68 #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 #: ../flask_admin/contrib/sqla/filters.py:67 msgid "not contains" msgstr "لا تحتوي علي" -#: ../flask_admin/contrib/mongoengine/filters.py:77 #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 #: ../flask_admin/contrib/sqla/filters.py:75 msgid "greater than" msgstr "اكبر من" -#: ../flask_admin/contrib/mongoengine/filters.py:86 #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 #: ../flask_admin/contrib/sqla/filters.py:83 msgid "smaller than" msgstr "أصغر من" -#: ../flask_admin/contrib/mongoengine/filters.py:98 #: ../flask_admin/contrib/peewee/filters.py:88 #: ../flask_admin/contrib/sqla/filters.py:94 msgid "empty" msgstr "فارغ" -#: ../flask_admin/contrib/mongoengine/filters.py:113 #: ../flask_admin/contrib/peewee/filters.py:102 #: ../flask_admin/contrib/sqla/filters.py:108 msgid "in list" msgstr "في قائمة" -#: ../flask_admin/contrib/mongoengine/filters.py:122 #: ../flask_admin/contrib/peewee/filters.py:111 #: ../flask_admin/contrib/sqla/filters.py:118 msgid "not in list" msgstr "غير موجود في قائمة" -#: ../flask_admin/contrib/mongoengine/filters.py:222 #: ../flask_admin/contrib/peewee/filters.py:207 #: ../flask_admin/contrib/peewee/filters.py:244 #: ../flask_admin/contrib/peewee/filters.py:281 @@ -293,16 +282,13 @@ msgstr "غير موجود في قائمة" msgid "not between" msgstr "ليس بين" -#: ../flask_admin/contrib/mongoengine/filters.py:247 msgid "ObjectId equals" msgstr "" -#: ../flask_admin/contrib/mongoengine/view.py:551 #, python-format msgid "Failed to get model. %(error)s" msgstr "فشل في الحصول على نموذج. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:570 #: ../flask_admin/contrib/peewee/view.py:435 #: ../flask_admin/contrib/pymongo/view.py:316 #: ../flask_admin/contrib/sqla/view.py:1078 @@ -310,7 +296,6 @@ msgstr "فشل في الحصول على نموذج. %(error)s" msgid "Failed to create record. %(error)s" msgstr "فشل في إنشاء سجل. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:596 #: ../flask_admin/contrib/peewee/view.py:454 #: ../flask_admin/contrib/pymongo/view.py:341 #: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 @@ -319,7 +304,6 @@ msgstr "فشل في إنشاء سجل. %(error)s" msgid "Failed to update record. %(error)s" msgstr "فشل في إنشاء سجل. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:619 #: ../flask_admin/contrib/peewee/view.py:469 #: ../flask_admin/contrib/pymongo/view.py:366 #: ../flask_admin/contrib/sqla/view.py:1129 @@ -327,14 +311,12 @@ msgstr "فشل في إنشاء سجل. %(error)s" msgid "Failed to delete record. %(error)s" msgstr "فشل في حذف السجل. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:659 #: ../flask_admin/contrib/peewee/view.py:488 #: ../flask_admin/contrib/pymongo/view.py:385 #: ../flask_admin/contrib/sqla/view.py:1150 msgid "Are you sure you want to delete selected records?" msgstr "هل أنت متأكد من أنك تريد حذف السجلات المحددة؟?" -#: ../flask_admin/contrib/mongoengine/view.py:668 #: ../flask_admin/contrib/peewee/view.py:505 #: ../flask_admin/contrib/pymongo/view.py:395 #: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 @@ -348,7 +330,6 @@ msgstr[3] "تم بنجاح حذف السجلات %(count)s." msgstr[4] "تم بنجاح حذف السجلات %(count)s." msgstr[5] "تم بنجاح حذف السجلات %(count)s." -#: ../flask_admin/contrib/mongoengine/view.py:674 #: ../flask_admin/contrib/peewee/view.py:511 #: ../flask_admin/contrib/pymongo/view.py:400 #: ../flask_admin/contrib/sqla/view.py:1174 @@ -666,4 +647,3 @@ msgstr "الرجاء تحديد سجل واحد على الأقل." #: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 msgid "Are you sure you want to delete this record?" msgstr "هل أنت متأكد من أنك تريد حذف هذا السجل؟" - diff --git a/flask_admin/translations/be/LC_MESSAGES/admin.po b/flask_admin/translations/be/LC_MESSAGES/admin.po index bf81ed082..da1923928 100644 --- a/flask_admin/translations/be/LC_MESSAGES/admin.po +++ b/flask_admin/translations/be/LC_MESSAGES/admin.po @@ -196,7 +196,6 @@ msgid "Editing %(path)s" msgstr "Рэдагаванне %(path)s" #: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/mongoengine/view.py:658 #: ../flask_admin/contrib/peewee/view.py:487 #: ../flask_admin/contrib/pymongo/view.py:384 #: ../flask_admin/contrib/sqla/view.py:1149 @@ -223,67 +222,57 @@ msgstr "Рэдагаваць" msgid "Cannot operate on non empty directories" msgstr "Дзеянне з непустымі тэчкамі немагчымае" -#: ../flask_admin/contrib/mongoengine/filters.py:39 #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 #: ../flask_admin/contrib/sqla/filters.py:41 msgid "equals" msgstr "роўны" -#: ../flask_admin/contrib/mongoengine/filters.py:48 #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 #: ../flask_admin/contrib/sqla/filters.py:49 msgid "not equal" msgstr "няроўны" -#: ../flask_admin/contrib/mongoengine/filters.py:58 #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 #: ../flask_admin/contrib/sqla/filters.py:58 msgid "contains" msgstr "утрымлівае" -#: ../flask_admin/contrib/mongoengine/filters.py:68 #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 #: ../flask_admin/contrib/sqla/filters.py:67 msgid "not contains" msgstr "ня ўтрымлівае" -#: ../flask_admin/contrib/mongoengine/filters.py:77 #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 #: ../flask_admin/contrib/sqla/filters.py:75 msgid "greater than" msgstr "большы за" -#: ../flask_admin/contrib/mongoengine/filters.py:86 #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 #: ../flask_admin/contrib/sqla/filters.py:83 msgid "smaller than" msgstr "меншы за" -#: ../flask_admin/contrib/mongoengine/filters.py:98 #: ../flask_admin/contrib/peewee/filters.py:88 #: ../flask_admin/contrib/sqla/filters.py:94 msgid "empty" msgstr "пусты" -#: ../flask_admin/contrib/mongoengine/filters.py:113 #: ../flask_admin/contrib/peewee/filters.py:102 #: ../flask_admin/contrib/sqla/filters.py:108 msgid "in list" msgstr "у спісе" -#: ../flask_admin/contrib/mongoengine/filters.py:122 #: ../flask_admin/contrib/peewee/filters.py:111 #: ../flask_admin/contrib/sqla/filters.py:118 msgid "not in list" msgstr "ня ў спісе" -#: ../flask_admin/contrib/mongoengine/filters.py:222 #: ../flask_admin/contrib/peewee/filters.py:207 #: ../flask_admin/contrib/peewee/filters.py:244 #: ../flask_admin/contrib/peewee/filters.py:281 @@ -293,16 +282,13 @@ msgstr "ня ў спісе" msgid "not between" msgstr "не паміж" -#: ../flask_admin/contrib/mongoengine/filters.py:247 msgid "ObjectId equals" msgstr "ObjectId роўны" -#: ../flask_admin/contrib/mongoengine/view.py:551 #, python-format msgid "Failed to get model. %(error)s" msgstr "Памылка атрымання мадэлі. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:570 #: ../flask_admin/contrib/peewee/view.py:435 #: ../flask_admin/contrib/pymongo/view.py:316 #: ../flask_admin/contrib/sqla/view.py:1078 @@ -310,7 +296,6 @@ msgstr "Памылка атрымання мадэлі. %(error)s" msgid "Failed to create record. %(error)s" msgstr "Памылка стварэння запісу. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:596 #: ../flask_admin/contrib/peewee/view.py:454 #: ../flask_admin/contrib/pymongo/view.py:341 #: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 @@ -319,7 +304,6 @@ msgstr "Памылка стварэння запісу. %(error)s" msgid "Failed to update record. %(error)s" msgstr "Памылка аднаўлення запісу. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:619 #: ../flask_admin/contrib/peewee/view.py:469 #: ../flask_admin/contrib/pymongo/view.py:366 #: ../flask_admin/contrib/sqla/view.py:1129 @@ -327,14 +311,12 @@ msgstr "Памылка аднаўлення запісу. %(error)s" msgid "Failed to delete record. %(error)s" msgstr "Памылка выдалення запісу. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:659 #: ../flask_admin/contrib/peewee/view.py:488 #: ../flask_admin/contrib/pymongo/view.py:385 #: ../flask_admin/contrib/sqla/view.py:1150 msgid "Are you sure you want to delete selected records?" msgstr "Вы дакладна хочаце выдаліць пазначаныя запісы?" -#: ../flask_admin/contrib/mongoengine/view.py:668 #: ../flask_admin/contrib/peewee/view.py:505 #: ../flask_admin/contrib/pymongo/view.py:395 #: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 @@ -345,7 +327,6 @@ msgstr[0] "Запіс быў паспяхова выдалены." msgstr[1] "%(count)s запісы былі паспяхова выдаленыя." msgstr[2] "%(count)s запісаў было паспяхова выдалена." -#: ../flask_admin/contrib/mongoengine/view.py:674 #: ../flask_admin/contrib/peewee/view.py:511 #: ../flask_admin/contrib/pymongo/view.py:400 #: ../flask_admin/contrib/sqla/view.py:1174 @@ -660,4 +641,3 @@ msgstr "Выберыце, калі ласка, як найменш адзін з #: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 msgid "Are you sure you want to delete this record?" msgstr "Вы дакладна жадаеце выдаліць гэты запіс?" - diff --git a/flask_admin/translations/ca_ES/LC_MESSAGES/admin.po b/flask_admin/translations/ca_ES/LC_MESSAGES/admin.po index eb366d905..7de4fcf09 100644 --- a/flask_admin/translations/ca_ES/LC_MESSAGES/admin.po +++ b/flask_admin/translations/ca_ES/LC_MESSAGES/admin.po @@ -196,7 +196,6 @@ msgid "Editing %(path)s" msgstr "%(path)s d'edició" #: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/mongoengine/view.py:658 #: ../flask_admin/contrib/peewee/view.py:487 #: ../flask_admin/contrib/pymongo/view.py:384 #: ../flask_admin/contrib/sqla/view.py:1149 @@ -223,67 +222,57 @@ msgstr "Editar" msgid "Cannot operate on non empty directories" msgstr "" -#: ../flask_admin/contrib/mongoengine/filters.py:39 #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 #: ../flask_admin/contrib/sqla/filters.py:41 msgid "equals" msgstr "igual" -#: ../flask_admin/contrib/mongoengine/filters.py:48 #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 #: ../flask_admin/contrib/sqla/filters.py:49 msgid "not equal" msgstr "no és igual" -#: ../flask_admin/contrib/mongoengine/filters.py:58 #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 #: ../flask_admin/contrib/sqla/filters.py:58 msgid "contains" msgstr "te" -#: ../flask_admin/contrib/mongoengine/filters.py:68 #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 #: ../flask_admin/contrib/sqla/filters.py:67 msgid "not contains" msgstr "no te" -#: ../flask_admin/contrib/mongoengine/filters.py:77 #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 #: ../flask_admin/contrib/sqla/filters.py:75 msgid "greater than" msgstr "més que" -#: ../flask_admin/contrib/mongoengine/filters.py:86 #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 #: ../flask_admin/contrib/sqla/filters.py:83 msgid "smaller than" msgstr "menor que" -#: ../flask_admin/contrib/mongoengine/filters.py:98 #: ../flask_admin/contrib/peewee/filters.py:88 #: ../flask_admin/contrib/sqla/filters.py:94 msgid "empty" msgstr "buit" -#: ../flask_admin/contrib/mongoengine/filters.py:113 #: ../flask_admin/contrib/peewee/filters.py:102 #: ../flask_admin/contrib/sqla/filters.py:108 msgid "in list" msgstr "en la llista" -#: ../flask_admin/contrib/mongoengine/filters.py:122 #: ../flask_admin/contrib/peewee/filters.py:111 #: ../flask_admin/contrib/sqla/filters.py:118 msgid "not in list" msgstr "no en la llista" -#: ../flask_admin/contrib/mongoengine/filters.py:222 #: ../flask_admin/contrib/peewee/filters.py:207 #: ../flask_admin/contrib/peewee/filters.py:244 #: ../flask_admin/contrib/peewee/filters.py:281 @@ -293,16 +282,13 @@ msgstr "no en la llista" msgid "not between" msgstr "no entre" -#: ../flask_admin/contrib/mongoengine/filters.py:247 msgid "ObjectId equals" msgstr "" -#: ../flask_admin/contrib/mongoengine/view.py:551 #, python-format msgid "Failed to get model. %(error)s" msgstr "No s'ha pogut obtenir el model. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:570 #: ../flask_admin/contrib/peewee/view.py:435 #: ../flask_admin/contrib/pymongo/view.py:316 #: ../flask_admin/contrib/sqla/view.py:1078 @@ -310,7 +296,6 @@ msgstr "No s'ha pogut obtenir el model. %(error)s" msgid "Failed to create record. %(error)s" msgstr "Error en eliminar el registre. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:596 #: ../flask_admin/contrib/peewee/view.py:454 #: ../flask_admin/contrib/pymongo/view.py:341 #: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 @@ -319,7 +304,6 @@ msgstr "Error en eliminar el registre. %(error)s" msgid "Failed to update record. %(error)s" msgstr "Error en actualitzar el registre. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:619 #: ../flask_admin/contrib/peewee/view.py:469 #: ../flask_admin/contrib/pymongo/view.py:366 #: ../flask_admin/contrib/sqla/view.py:1129 @@ -327,14 +311,12 @@ msgstr "Error en actualitzar el registre. %(error)s" msgid "Failed to delete record. %(error)s" msgstr "Error en eliminar el registre. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:659 #: ../flask_admin/contrib/peewee/view.py:488 #: ../flask_admin/contrib/pymongo/view.py:385 #: ../flask_admin/contrib/sqla/view.py:1150 msgid "Are you sure you want to delete selected records?" msgstr "¿Segur que vols esborrar els registres seleccionats?" -#: ../flask_admin/contrib/mongoengine/view.py:668 #: ../flask_admin/contrib/peewee/view.py:505 #: ../flask_admin/contrib/pymongo/view.py:395 #: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 @@ -344,7 +326,6 @@ msgid_plural "%(count)s records were successfully deleted." msgstr[0] "El registre he sigut eliminat correctament." msgstr[1] "%(count)s registres s'han eliminat amb èxit." -#: ../flask_admin/contrib/mongoengine/view.py:674 #: ../flask_admin/contrib/peewee/view.py:511 #: ../flask_admin/contrib/pymongo/view.py:400 #: ../flask_admin/contrib/sqla/view.py:1174 @@ -658,4 +639,3 @@ msgstr "Seleccionar almenys un registre." #: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 msgid "Are you sure you want to delete this record?" msgstr "Esteu segurs que voleu eliminar el registre?" - diff --git a/flask_admin/translations/cs/LC_MESSAGES/admin.po b/flask_admin/translations/cs/LC_MESSAGES/admin.po index 47067b5b5..444812275 100644 --- a/flask_admin/translations/cs/LC_MESSAGES/admin.po +++ b/flask_admin/translations/cs/LC_MESSAGES/admin.po @@ -196,7 +196,6 @@ msgid "Editing %(path)s" msgstr "Editace %(path)s" #: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/mongoengine/view.py:658 #: ../flask_admin/contrib/peewee/view.py:487 #: ../flask_admin/contrib/pymongo/view.py:384 #: ../flask_admin/contrib/sqla/view.py:1149 @@ -223,67 +222,57 @@ msgstr "Úpravy" msgid "Cannot operate on non empty directories" msgstr "" -#: ../flask_admin/contrib/mongoengine/filters.py:39 #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 #: ../flask_admin/contrib/sqla/filters.py:41 msgid "equals" msgstr "rovno" -#: ../flask_admin/contrib/mongoengine/filters.py:48 #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 #: ../flask_admin/contrib/sqla/filters.py:49 msgid "not equal" msgstr "není rovno" -#: ../flask_admin/contrib/mongoengine/filters.py:58 #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 #: ../flask_admin/contrib/sqla/filters.py:58 msgid "contains" msgstr "obsahuje" -#: ../flask_admin/contrib/mongoengine/filters.py:68 #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 #: ../flask_admin/contrib/sqla/filters.py:67 msgid "not contains" msgstr "neobsahuje" -#: ../flask_admin/contrib/mongoengine/filters.py:77 #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 #: ../flask_admin/contrib/sqla/filters.py:75 msgid "greater than" msgstr "větší než" -#: ../flask_admin/contrib/mongoengine/filters.py:86 #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 #: ../flask_admin/contrib/sqla/filters.py:83 msgid "smaller than" msgstr "menší než" -#: ../flask_admin/contrib/mongoengine/filters.py:98 #: ../flask_admin/contrib/peewee/filters.py:88 #: ../flask_admin/contrib/sqla/filters.py:94 msgid "empty" msgstr "prázdné" -#: ../flask_admin/contrib/mongoengine/filters.py:113 #: ../flask_admin/contrib/peewee/filters.py:102 #: ../flask_admin/contrib/sqla/filters.py:108 msgid "in list" msgstr "v seznamu" -#: ../flask_admin/contrib/mongoengine/filters.py:122 #: ../flask_admin/contrib/peewee/filters.py:111 #: ../flask_admin/contrib/sqla/filters.py:118 msgid "not in list" msgstr "není v seznamu" -#: ../flask_admin/contrib/mongoengine/filters.py:222 #: ../flask_admin/contrib/peewee/filters.py:207 #: ../flask_admin/contrib/peewee/filters.py:244 #: ../flask_admin/contrib/peewee/filters.py:281 @@ -293,16 +282,13 @@ msgstr "není v seznamu" msgid "not between" msgstr "není mezi" -#: ../flask_admin/contrib/mongoengine/filters.py:247 msgid "ObjectId equals" msgstr "" -#: ../flask_admin/contrib/mongoengine/view.py:551 #, python-format msgid "Failed to get model. %(error)s" msgstr "Nepodařilo se získat modelu. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:570 #: ../flask_admin/contrib/peewee/view.py:435 #: ../flask_admin/contrib/pymongo/view.py:316 #: ../flask_admin/contrib/sqla/view.py:1078 @@ -310,7 +296,6 @@ msgstr "Nepodařilo se získat modelu. %(error)s" msgid "Failed to create record. %(error)s" msgstr "Chyba při vytváření modelu. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:596 #: ../flask_admin/contrib/peewee/view.py:454 #: ../flask_admin/contrib/pymongo/view.py:341 #: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 @@ -319,7 +304,6 @@ msgstr "Chyba při vytváření modelu. %(error)s" msgid "Failed to update record. %(error)s" msgstr "Chyba při aktualizaci modelu. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:619 #: ../flask_admin/contrib/peewee/view.py:469 #: ../flask_admin/contrib/pymongo/view.py:366 #: ../flask_admin/contrib/sqla/view.py:1129 @@ -327,14 +311,12 @@ msgstr "Chyba při aktualizaci modelu. %(error)s" msgid "Failed to delete record. %(error)s" msgstr "Chyba při mazání modelu. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:659 #: ../flask_admin/contrib/peewee/view.py:488 #: ../flask_admin/contrib/pymongo/view.py:385 #: ../flask_admin/contrib/sqla/view.py:1150 msgid "Are you sure you want to delete selected records?" msgstr "Skutečně chcete vymazat vybrané modely?" -#: ../flask_admin/contrib/mongoengine/view.py:668 #: ../flask_admin/contrib/peewee/view.py:505 #: ../flask_admin/contrib/pymongo/view.py:395 #: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 @@ -345,7 +327,6 @@ msgstr[0] "%(count)s model byl úspěšně smazán." msgstr[1] "%(count)s modely byly úspěšně smazány." msgstr[2] "%(count)s modelů bylo úspěšně smazáno." -#: ../flask_admin/contrib/mongoengine/view.py:674 #: ../flask_admin/contrib/peewee/view.py:511 #: ../flask_admin/contrib/pymongo/view.py:400 #: ../flask_admin/contrib/sqla/view.py:1174 @@ -660,4 +641,3 @@ msgstr "Vyberte prosím alespoň jeden model." #: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 msgid "Are you sure you want to delete this record?" msgstr "Opravdu chcete vymazat tento záznam?" - diff --git a/flask_admin/translations/da/LC_MESSAGES/admin.po b/flask_admin/translations/da/LC_MESSAGES/admin.po index 6dbbaddc4..6e89f14d6 100644 --- a/flask_admin/translations/da/LC_MESSAGES/admin.po +++ b/flask_admin/translations/da/LC_MESSAGES/admin.po @@ -196,7 +196,6 @@ msgid "Editing %(path)s" msgstr "Redigering af %(path)s" #: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/mongoengine/view.py:658 #: ../flask_admin/contrib/peewee/view.py:487 #: ../flask_admin/contrib/pymongo/view.py:384 #: ../flask_admin/contrib/sqla/view.py:1149 @@ -223,67 +222,57 @@ msgstr "Rediger" msgid "Cannot operate on non empty directories" msgstr "" -#: ../flask_admin/contrib/mongoengine/filters.py:39 #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 #: ../flask_admin/contrib/sqla/filters.py:41 msgid "equals" msgstr "er lig med" -#: ../flask_admin/contrib/mongoengine/filters.py:48 #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 #: ../flask_admin/contrib/sqla/filters.py:49 msgid "not equal" msgstr "ikke lige" -#: ../flask_admin/contrib/mongoengine/filters.py:58 #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 #: ../flask_admin/contrib/sqla/filters.py:58 msgid "contains" msgstr "indeholder" -#: ../flask_admin/contrib/mongoengine/filters.py:68 #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 #: ../flask_admin/contrib/sqla/filters.py:67 msgid "not contains" msgstr "ikke indeholder" -#: ../flask_admin/contrib/mongoengine/filters.py:77 #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 #: ../flask_admin/contrib/sqla/filters.py:75 msgid "greater than" msgstr "større end" -#: ../flask_admin/contrib/mongoengine/filters.py:86 #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 #: ../flask_admin/contrib/sqla/filters.py:83 msgid "smaller than" msgstr "mindre end" -#: ../flask_admin/contrib/mongoengine/filters.py:98 #: ../flask_admin/contrib/peewee/filters.py:88 #: ../flask_admin/contrib/sqla/filters.py:94 msgid "empty" msgstr "Tom" -#: ../flask_admin/contrib/mongoengine/filters.py:113 #: ../flask_admin/contrib/peewee/filters.py:102 #: ../flask_admin/contrib/sqla/filters.py:108 msgid "in list" msgstr "i listen" -#: ../flask_admin/contrib/mongoengine/filters.py:122 #: ../flask_admin/contrib/peewee/filters.py:111 #: ../flask_admin/contrib/sqla/filters.py:118 msgid "not in list" msgstr "ikke på listen" -#: ../flask_admin/contrib/mongoengine/filters.py:222 #: ../flask_admin/contrib/peewee/filters.py:207 #: ../flask_admin/contrib/peewee/filters.py:244 #: ../flask_admin/contrib/peewee/filters.py:281 @@ -293,16 +282,13 @@ msgstr "ikke på listen" msgid "not between" msgstr "ikke mellem" -#: ../flask_admin/contrib/mongoengine/filters.py:247 msgid "ObjectId equals" msgstr "" -#: ../flask_admin/contrib/mongoengine/view.py:551 #, python-format msgid "Failed to get model. %(error)s" msgstr "Undladt at få model. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:570 #: ../flask_admin/contrib/peewee/view.py:435 #: ../flask_admin/contrib/pymongo/view.py:316 #: ../flask_admin/contrib/sqla/view.py:1078 @@ -310,7 +296,6 @@ msgstr "Undladt at få model. %(error)s" msgid "Failed to create record. %(error)s" msgstr "Kunne ikke oprette posten. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:596 #: ../flask_admin/contrib/peewee/view.py:454 #: ../flask_admin/contrib/pymongo/view.py:341 #: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 @@ -319,7 +304,6 @@ msgstr "Kunne ikke oprette posten. %(error)s" msgid "Failed to update record. %(error)s" msgstr "Kunne ikke oprette posten. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:619 #: ../flask_admin/contrib/peewee/view.py:469 #: ../flask_admin/contrib/pymongo/view.py:366 #: ../flask_admin/contrib/sqla/view.py:1129 @@ -327,14 +311,12 @@ msgstr "Kunne ikke oprette posten. %(error)s" msgid "Failed to delete record. %(error)s" msgstr "Kunne ikke slette posten. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:659 #: ../flask_admin/contrib/peewee/view.py:488 #: ../flask_admin/contrib/pymongo/view.py:385 #: ../flask_admin/contrib/sqla/view.py:1150 msgid "Are you sure you want to delete selected records?" msgstr "Er du sikker på du vil slette de valgte poster?" -#: ../flask_admin/contrib/mongoengine/view.py:668 #: ../flask_admin/contrib/peewee/view.py:505 #: ../flask_admin/contrib/pymongo/view.py:395 #: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 @@ -344,7 +326,6 @@ msgid_plural "%(count)s records were successfully deleted." msgstr[0] "Posten blev slettet." msgstr[1] "%(count)s poster blev slettet." -#: ../flask_admin/contrib/mongoengine/view.py:674 #: ../flask_admin/contrib/peewee/view.py:511 #: ../flask_admin/contrib/pymongo/view.py:400 #: ../flask_admin/contrib/sqla/view.py:1174 @@ -658,4 +639,3 @@ msgstr "Vælg mindst én post." #: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 msgid "Are you sure you want to delete this record?" msgstr "Er du sikker på du vil slette denne post?" - diff --git a/flask_admin/translations/de/LC_MESSAGES/admin.po b/flask_admin/translations/de/LC_MESSAGES/admin.po index 3b8a1d7f8..f129a83c7 100644 --- a/flask_admin/translations/de/LC_MESSAGES/admin.po +++ b/flask_admin/translations/de/LC_MESSAGES/admin.po @@ -196,7 +196,6 @@ msgid "Editing %(path)s" msgstr "Bearbeiten von %(path)s" #: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/mongoengine/view.py:658 #: ../flask_admin/contrib/peewee/view.py:487 #: ../flask_admin/contrib/pymongo/view.py:384 #: ../flask_admin/contrib/sqla/view.py:1149 @@ -223,67 +222,57 @@ msgstr "Bearbeiten" msgid "Cannot operate on non empty directories" msgstr "Operieren in nicht-leeren Verzeichnissen nicht möglich" -#: ../flask_admin/contrib/mongoengine/filters.py:39 #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 #: ../flask_admin/contrib/sqla/filters.py:41 msgid "equals" msgstr "gleich" -#: ../flask_admin/contrib/mongoengine/filters.py:48 #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 #: ../flask_admin/contrib/sqla/filters.py:49 msgid "not equal" msgstr "ungleich" -#: ../flask_admin/contrib/mongoengine/filters.py:58 #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 #: ../flask_admin/contrib/sqla/filters.py:58 msgid "contains" msgstr "enthält" -#: ../flask_admin/contrib/mongoengine/filters.py:68 #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 #: ../flask_admin/contrib/sqla/filters.py:67 msgid "not contains" msgstr "enthält nicht" -#: ../flask_admin/contrib/mongoengine/filters.py:77 #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 #: ../flask_admin/contrib/sqla/filters.py:75 msgid "greater than" msgstr "größer als" -#: ../flask_admin/contrib/mongoengine/filters.py:86 #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 #: ../flask_admin/contrib/sqla/filters.py:83 msgid "smaller than" msgstr "kleiner als" -#: ../flask_admin/contrib/mongoengine/filters.py:98 #: ../flask_admin/contrib/peewee/filters.py:88 #: ../flask_admin/contrib/sqla/filters.py:94 msgid "empty" msgstr "leer" -#: ../flask_admin/contrib/mongoengine/filters.py:113 #: ../flask_admin/contrib/peewee/filters.py:102 #: ../flask_admin/contrib/sqla/filters.py:108 msgid "in list" msgstr "in Liste" -#: ../flask_admin/contrib/mongoengine/filters.py:122 #: ../flask_admin/contrib/peewee/filters.py:111 #: ../flask_admin/contrib/sqla/filters.py:118 msgid "not in list" msgstr "nicht in Liste" -#: ../flask_admin/contrib/mongoengine/filters.py:222 #: ../flask_admin/contrib/peewee/filters.py:207 #: ../flask_admin/contrib/peewee/filters.py:244 #: ../flask_admin/contrib/peewee/filters.py:281 @@ -293,16 +282,13 @@ msgstr "nicht in Liste" msgid "not between" msgstr "nicht zwischen" -#: ../flask_admin/contrib/mongoengine/filters.py:247 msgid "ObjectId equals" msgstr "ObjectId entspricht" -#: ../flask_admin/contrib/mongoengine/view.py:551 #, python-format msgid "Failed to get model. %(error)s" msgstr "Fehler beim Holen des Modells. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:570 #: ../flask_admin/contrib/peewee/view.py:435 #: ../flask_admin/contrib/pymongo/view.py:316 #: ../flask_admin/contrib/sqla/view.py:1078 @@ -310,7 +296,6 @@ msgstr "Fehler beim Holen des Modells. %(error)s" msgid "Failed to create record. %(error)s" msgstr "Erstellen von Eintrag fehlgeschlagen: %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:596 #: ../flask_admin/contrib/peewee/view.py:454 #: ../flask_admin/contrib/pymongo/view.py:341 #: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 @@ -319,7 +304,6 @@ msgstr "Erstellen von Eintrag fehlgeschlagen: %(error)s" msgid "Failed to update record. %(error)s" msgstr "Aktualisieren von Eintrag fehlgeschlagen: %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:619 #: ../flask_admin/contrib/peewee/view.py:469 #: ../flask_admin/contrib/pymongo/view.py:366 #: ../flask_admin/contrib/sqla/view.py:1129 @@ -327,14 +311,12 @@ msgstr "Aktualisieren von Eintrag fehlgeschlagen: %(error)s" msgid "Failed to delete record. %(error)s" msgstr "Eintrag konnte nicht gelöscht werden: %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:659 #: ../flask_admin/contrib/peewee/view.py:488 #: ../flask_admin/contrib/pymongo/view.py:385 #: ../flask_admin/contrib/sqla/view.py:1150 msgid "Are you sure you want to delete selected records?" msgstr "Sind Sie sicher, dass Sie die ausgewählten Einträge löschen möchten?" -#: ../flask_admin/contrib/mongoengine/view.py:668 #: ../flask_admin/contrib/peewee/view.py:505 #: ../flask_admin/contrib/pymongo/view.py:395 #: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 @@ -344,7 +326,6 @@ msgid_plural "%(count)s records were successfully deleted." msgstr[0] "Eintrag wurde erfolgreich gelöscht." msgstr[1] "%(count)s Einträge wurden erfolgreich gelöscht." -#: ../flask_admin/contrib/mongoengine/view.py:674 #: ../flask_admin/contrib/peewee/view.py:511 #: ../flask_admin/contrib/pymongo/view.py:400 #: ../flask_admin/contrib/sqla/view.py:1174 @@ -658,4 +639,3 @@ msgstr "Bitte wählen Sie mindestens einen Eintrag aus." #: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 msgid "Are you sure you want to delete this record?" msgstr "Sind Sie sicher, dass Sie diesen Eintrag löschen möchten?" - diff --git a/flask_admin/translations/el/LC_MESSAGES/admin.po b/flask_admin/translations/el/LC_MESSAGES/admin.po index 9be4a5aa2..825634517 100644 --- a/flask_admin/translations/el/LC_MESSAGES/admin.po +++ b/flask_admin/translations/el/LC_MESSAGES/admin.po @@ -196,7 +196,6 @@ msgid "Editing %(path)s" msgstr "Επεξεργασία %(path)s" #: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/mongoengine/view.py:658 #: ../flask_admin/contrib/peewee/view.py:487 #: ../flask_admin/contrib/pymongo/view.py:384 #: ../flask_admin/contrib/sqla/view.py:1149 @@ -223,67 +222,57 @@ msgstr "Επεξεργασία" msgid "Cannot operate on non empty directories" msgstr "" -#: ../flask_admin/contrib/mongoengine/filters.py:39 #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 #: ../flask_admin/contrib/sqla/filters.py:41 msgid "equals" msgstr "ισούται με" -#: ../flask_admin/contrib/mongoengine/filters.py:48 #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 #: ../flask_admin/contrib/sqla/filters.py:49 msgid "not equal" msgstr "διάφορο" -#: ../flask_admin/contrib/mongoengine/filters.py:58 #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 #: ../flask_admin/contrib/sqla/filters.py:58 msgid "contains" msgstr "περιέχει" -#: ../flask_admin/contrib/mongoengine/filters.py:68 #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 #: ../flask_admin/contrib/sqla/filters.py:67 msgid "not contains" msgstr "δεν περιέχει" -#: ../flask_admin/contrib/mongoengine/filters.py:77 #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 #: ../flask_admin/contrib/sqla/filters.py:75 msgid "greater than" msgstr "μεγαλύτερο από" -#: ../flask_admin/contrib/mongoengine/filters.py:86 #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 #: ../flask_admin/contrib/sqla/filters.py:83 msgid "smaller than" msgstr "μικρότερο από" -#: ../flask_admin/contrib/mongoengine/filters.py:98 #: ../flask_admin/contrib/peewee/filters.py:88 #: ../flask_admin/contrib/sqla/filters.py:94 msgid "empty" msgstr "κενό" -#: ../flask_admin/contrib/mongoengine/filters.py:113 #: ../flask_admin/contrib/peewee/filters.py:102 #: ../flask_admin/contrib/sqla/filters.py:108 msgid "in list" msgstr "στη λίστα" -#: ../flask_admin/contrib/mongoengine/filters.py:122 #: ../flask_admin/contrib/peewee/filters.py:111 #: ../flask_admin/contrib/sqla/filters.py:118 msgid "not in list" msgstr "εκτός λίστας" -#: ../flask_admin/contrib/mongoengine/filters.py:222 #: ../flask_admin/contrib/peewee/filters.py:207 #: ../flask_admin/contrib/peewee/filters.py:244 #: ../flask_admin/contrib/peewee/filters.py:281 @@ -293,16 +282,13 @@ msgstr "εκτός λίστας" msgid "not between" msgstr "δεν μεταξύ" -#: ../flask_admin/contrib/mongoengine/filters.py:247 msgid "ObjectId equals" msgstr "" -#: ../flask_admin/contrib/mongoengine/view.py:551 #, python-format msgid "Failed to get model. %(error)s" msgstr "Απέτυχε η λήψη του μοντέλου. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:570 #: ../flask_admin/contrib/peewee/view.py:435 #: ../flask_admin/contrib/pymongo/view.py:316 #: ../flask_admin/contrib/sqla/view.py:1078 @@ -310,7 +296,6 @@ msgstr "Απέτυχε η λήψη του μοντέλου. %(error)s" msgid "Failed to create record. %(error)s" msgstr "Απέτυχε η δημιουργία ρεκόρ. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:596 #: ../flask_admin/contrib/peewee/view.py:454 #: ../flask_admin/contrib/pymongo/view.py:341 #: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 @@ -319,7 +304,6 @@ msgstr "Απέτυχε η δημιουργία ρεκόρ. %(error)s" msgid "Failed to update record. %(error)s" msgstr "Απέτυχε η δημιουργία εγγραφής. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:619 #: ../flask_admin/contrib/peewee/view.py:469 #: ../flask_admin/contrib/pymongo/view.py:366 #: ../flask_admin/contrib/sqla/view.py:1129 @@ -327,14 +311,12 @@ msgstr "Απέτυχε η δημιουργία εγγραφής. %(error)s" msgid "Failed to delete record. %(error)s" msgstr "Απέτυχε η διαγραφή της εγγραφής. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:659 #: ../flask_admin/contrib/peewee/view.py:488 #: ../flask_admin/contrib/pymongo/view.py:385 #: ../flask_admin/contrib/sqla/view.py:1150 msgid "Are you sure you want to delete selected records?" msgstr "Είστε βέβαιοι ότι θέλετε να διαγράψετε τις επιλεγμένες εγγραφές;" -#: ../flask_admin/contrib/mongoengine/view.py:668 #: ../flask_admin/contrib/peewee/view.py:505 #: ../flask_admin/contrib/pymongo/view.py:395 #: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 @@ -344,7 +326,6 @@ msgid_plural "%(count)s records were successfully deleted." msgstr[0] "Η εγγραφή διαγράφηκε με επιτυχία." msgstr[1] "%(count)s εγγραφές διαγράφηκαν με επιτυχία." -#: ../flask_admin/contrib/mongoengine/view.py:674 #: ../flask_admin/contrib/peewee/view.py:511 #: ../flask_admin/contrib/pymongo/view.py:400 #: ../flask_admin/contrib/sqla/view.py:1174 @@ -658,4 +639,3 @@ msgstr "Παρακαλώ επιλέξτε τουλάχιστον μία εγγρ #: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 msgid "Are you sure you want to delete this record?" msgstr "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν την εγγραφή;" - diff --git a/flask_admin/translations/en/LC_MESSAGES/admin.po b/flask_admin/translations/en/LC_MESSAGES/admin.po index ff882d61f..4099a1869 100644 --- a/flask_admin/translations/en/LC_MESSAGES/admin.po +++ b/flask_admin/translations/en/LC_MESSAGES/admin.po @@ -154,7 +154,6 @@ msgid "Cannot edit %(name)s." msgstr "Cannot edit %(name)s." #: ../flask_admin/contrib/fileadmin.py:881 -#: ../flask_admin/contrib/mongoengine/view.py:626 #: ../flask_admin/contrib/peewee/view.py:429 #: ../flask_admin/contrib/pymongo/view.py:349 #: ../flask_admin/contrib/sqla/view.py:956 @@ -181,67 +180,57 @@ msgstr "Cli: Invalid command." msgid "Invalid JSON" msgstr "Invalid JSON" -#: ../flask_admin/contrib/mongoengine/filters.py:38 #: ../flask_admin/contrib/peewee/filters.py:38 #: ../flask_admin/contrib/pymongo/filters.py:38 #: ../flask_admin/contrib/sqla/filters.py:38 msgid "equals" msgstr "equals" -#: ../flask_admin/contrib/mongoengine/filters.py:47 #: ../flask_admin/contrib/peewee/filters.py:46 #: ../flask_admin/contrib/pymongo/filters.py:47 #: ../flask_admin/contrib/sqla/filters.py:46 msgid "not equal" msgstr "not equal" -#: ../flask_admin/contrib/mongoengine/filters.py:57 #: ../flask_admin/contrib/peewee/filters.py:55 #: ../flask_admin/contrib/pymongo/filters.py:57 #: ../flask_admin/contrib/sqla/filters.py:55 msgid "contains" msgstr "contains" -#: ../flask_admin/contrib/mongoengine/filters.py:67 #: ../flask_admin/contrib/peewee/filters.py:64 #: ../flask_admin/contrib/pymongo/filters.py:67 #: ../flask_admin/contrib/sqla/filters.py:64 msgid "not contains" msgstr "not contains" -#: ../flask_admin/contrib/mongoengine/filters.py:76 #: ../flask_admin/contrib/peewee/filters.py:72 #: ../flask_admin/contrib/pymongo/filters.py:80 #: ../flask_admin/contrib/sqla/filters.py:72 msgid "greater than" msgstr "greater than" -#: ../flask_admin/contrib/mongoengine/filters.py:85 #: ../flask_admin/contrib/peewee/filters.py:80 #: ../flask_admin/contrib/pymongo/filters.py:93 #: ../flask_admin/contrib/sqla/filters.py:80 msgid "smaller than" msgstr "smaller than" -#: ../flask_admin/contrib/mongoengine/filters.py:97 #: ../flask_admin/contrib/peewee/filters.py:91 #: ../flask_admin/contrib/sqla/filters.py:91 msgid "empty" msgstr "empty" -#: ../flask_admin/contrib/mongoengine/filters.py:112 #: ../flask_admin/contrib/peewee/filters.py:105 #: ../flask_admin/contrib/sqla/filters.py:105 msgid "in list" msgstr "in list" -#: ../flask_admin/contrib/mongoengine/filters.py:121 #: ../flask_admin/contrib/peewee/filters.py:114 #: ../flask_admin/contrib/sqla/filters.py:114 msgid "not in list" msgstr "not in list" -#: ../flask_admin/contrib/mongoengine/filters.py:221 #: ../flask_admin/contrib/peewee/filters.py:208 #: ../flask_admin/contrib/peewee/filters.py:245 #: ../flask_admin/contrib/peewee/filters.py:282 @@ -251,12 +240,10 @@ msgstr "not in list" msgid "not between" msgstr "not between" -#: ../flask_admin/contrib/mongoengine/view.py:520 #, python-format msgid "Failed to get model. %(error)s" msgstr "Failed to get model. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:539 #: ../flask_admin/contrib/peewee/view.py:380 #: ../flask_admin/contrib/pymongo/view.py:284 #: ../flask_admin/contrib/sqla/view.py:888 @@ -264,7 +251,6 @@ msgstr "Failed to get model. %(error)s" msgid "Failed to create record. %(error)s" msgstr "Failed to create record. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:565 #: ../flask_admin/contrib/peewee/view.py:399 #: ../flask_admin/contrib/pymongo/view.py:309 #: ../flask_admin/contrib/sqla/view.py:914 ../flask_admin/model/base.py:1671 @@ -273,7 +259,6 @@ msgstr "Failed to create record. %(error)s" msgid "Failed to update record. %(error)s" msgstr "Failed to update record. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:589 #: ../flask_admin/contrib/peewee/view.py:415 #: ../flask_admin/contrib/pymongo/view.py:335 #: ../flask_admin/contrib/sqla/view.py:940 @@ -281,14 +266,12 @@ msgstr "Failed to update record. %(error)s" msgid "Failed to delete record. %(error)s" msgstr "Failed to delete record. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:627 #: ../flask_admin/contrib/peewee/view.py:430 #: ../flask_admin/contrib/pymongo/view.py:350 #: ../flask_admin/contrib/sqla/view.py:957 msgid "Are you sure you want to delete selected records?" msgstr "Are you sure you want to delete selected records?" -#: ../flask_admin/contrib/mongoengine/view.py:636 #: ../flask_admin/contrib/peewee/view.py:446 #: ../flask_admin/contrib/pymongo/view.py:360 #: ../flask_admin/contrib/sqla/view.py:973 ../flask_admin/model/base.py:1619 @@ -298,7 +281,6 @@ msgid_plural "%(count)s records were successfully deleted." msgstr[0] "Record was successfully deleted." msgstr[1] "%(count)s records were successfully deleted." -#: ../flask_admin/contrib/mongoengine/view.py:642 #: ../flask_admin/contrib/peewee/view.py:452 #: ../flask_admin/contrib/pymongo/view.py:365 #: ../flask_admin/contrib/sqla/view.py:981 @@ -532,4 +514,3 @@ msgstr "Delete record" #: ../flask_admin/templates/bootstrap3/admin/model/list.html:158 msgid "Please select at least one record." msgstr "Please select at least one record." - diff --git a/flask_admin/translations/es/LC_MESSAGES/admin.po b/flask_admin/translations/es/LC_MESSAGES/admin.po index 09ae2cd0e..f3c89ecd0 100644 --- a/flask_admin/translations/es/LC_MESSAGES/admin.po +++ b/flask_admin/translations/es/LC_MESSAGES/admin.po @@ -196,7 +196,6 @@ msgid "Editing %(path)s" msgstr "Edición %(path)s" #: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/mongoengine/view.py:658 #: ../flask_admin/contrib/peewee/view.py:487 #: ../flask_admin/contrib/pymongo/view.py:384 #: ../flask_admin/contrib/sqla/view.py:1149 @@ -223,67 +222,57 @@ msgstr "Editar" msgid "Cannot operate on non empty directories" msgstr "No puede funcionar en directorios no vacíos" -#: ../flask_admin/contrib/mongoengine/filters.py:39 #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 #: ../flask_admin/contrib/sqla/filters.py:41 msgid "equals" msgstr "igual a" -#: ../flask_admin/contrib/mongoengine/filters.py:48 #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 #: ../flask_admin/contrib/sqla/filters.py:49 msgid "not equal" msgstr "no es igual a" -#: ../flask_admin/contrib/mongoengine/filters.py:58 #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 #: ../flask_admin/contrib/sqla/filters.py:58 msgid "contains" msgstr "contiene" -#: ../flask_admin/contrib/mongoengine/filters.py:68 #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 #: ../flask_admin/contrib/sqla/filters.py:67 msgid "not contains" msgstr "no contiene" -#: ../flask_admin/contrib/mongoengine/filters.py:77 #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 #: ../flask_admin/contrib/sqla/filters.py:75 msgid "greater than" msgstr "mayor que" -#: ../flask_admin/contrib/mongoengine/filters.py:86 #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 #: ../flask_admin/contrib/sqla/filters.py:83 msgid "smaller than" msgstr "menor que" -#: ../flask_admin/contrib/mongoengine/filters.py:98 #: ../flask_admin/contrib/peewee/filters.py:88 #: ../flask_admin/contrib/sqla/filters.py:94 msgid "empty" msgstr "vacío" -#: ../flask_admin/contrib/mongoengine/filters.py:113 #: ../flask_admin/contrib/peewee/filters.py:102 #: ../flask_admin/contrib/sqla/filters.py:108 msgid "in list" msgstr "en la lista" -#: ../flask_admin/contrib/mongoengine/filters.py:122 #: ../flask_admin/contrib/peewee/filters.py:111 #: ../flask_admin/contrib/sqla/filters.py:118 msgid "not in list" msgstr "no en la lista" -#: ../flask_admin/contrib/mongoengine/filters.py:222 #: ../flask_admin/contrib/peewee/filters.py:207 #: ../flask_admin/contrib/peewee/filters.py:244 #: ../flask_admin/contrib/peewee/filters.py:281 @@ -293,16 +282,13 @@ msgstr "no en la lista" msgid "not between" msgstr "No entre" -#: ../flask_admin/contrib/mongoengine/filters.py:247 msgid "ObjectId equals" msgstr "ObjectId es igual a" -#: ../flask_admin/contrib/mongoengine/view.py:551 #, python-format msgid "Failed to get model. %(error)s" msgstr "Error al obtener el modelo. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:570 #: ../flask_admin/contrib/peewee/view.py:435 #: ../flask_admin/contrib/pymongo/view.py:316 #: ../flask_admin/contrib/sqla/view.py:1078 @@ -310,7 +296,6 @@ msgstr "Error al obtener el modelo. %(error)s" msgid "Failed to create record. %(error)s" msgstr "Error al crear el registro. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:596 #: ../flask_admin/contrib/peewee/view.py:454 #: ../flask_admin/contrib/pymongo/view.py:341 #: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 @@ -319,7 +304,6 @@ msgstr "Error al crear el registro. %(error)s" msgid "Failed to update record. %(error)s" msgstr "Error al actualizar el registro. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:619 #: ../flask_admin/contrib/peewee/view.py:469 #: ../flask_admin/contrib/pymongo/view.py:366 #: ../flask_admin/contrib/sqla/view.py:1129 @@ -327,14 +311,12 @@ msgstr "Error al actualizar el registro. %(error)s" msgid "Failed to delete record. %(error)s" msgstr "Error al borrar el registro. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:659 #: ../flask_admin/contrib/peewee/view.py:488 #: ../flask_admin/contrib/pymongo/view.py:385 #: ../flask_admin/contrib/sqla/view.py:1150 msgid "Are you sure you want to delete selected records?" msgstr "¿Está seguro de que desea borrar los elementos seleccionados?" -#: ../flask_admin/contrib/mongoengine/view.py:668 #: ../flask_admin/contrib/peewee/view.py:505 #: ../flask_admin/contrib/pymongo/view.py:395 #: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 @@ -344,7 +326,6 @@ msgid_plural "%(count)s records were successfully deleted." msgstr[0] "El elemento se ha borrado correctamente." msgstr[1] "%(count)s elementos se han borrado correctamente." -#: ../flask_admin/contrib/mongoengine/view.py:674 #: ../flask_admin/contrib/peewee/view.py:511 #: ../flask_admin/contrib/pymongo/view.py:400 #: ../flask_admin/contrib/sqla/view.py:1174 @@ -658,4 +639,3 @@ msgstr "Por favor, seleccione al menos un elemento." #: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 msgid "Are you sure you want to delete this record?" msgstr "¿Está seguro de que quiere borrar este elemento?" - diff --git a/flask_admin/translations/et/LC_MESSAGES/admin.po b/flask_admin/translations/et/LC_MESSAGES/admin.po index 050cb4999..705d32f74 100644 --- a/flask_admin/translations/et/LC_MESSAGES/admin.po +++ b/flask_admin/translations/et/LC_MESSAGES/admin.po @@ -196,7 +196,6 @@ msgid "Editing %(path)s" msgstr "%(path)s redigeerimine" #: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/mongoengine/view.py:658 #: ../flask_admin/contrib/peewee/view.py:487 #: ../flask_admin/contrib/pymongo/view.py:384 #: ../flask_admin/contrib/sqla/view.py:1149 @@ -223,67 +222,57 @@ msgstr "Redigeeri" msgid "Cannot operate on non empty directories" msgstr "" -#: ../flask_admin/contrib/mongoengine/filters.py:39 #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 #: ../flask_admin/contrib/sqla/filters.py:41 msgid "equals" msgstr "võrdub" -#: ../flask_admin/contrib/mongoengine/filters.py:48 #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 #: ../flask_admin/contrib/sqla/filters.py:49 msgid "not equal" msgstr "ei võrdu" -#: ../flask_admin/contrib/mongoengine/filters.py:58 #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 #: ../flask_admin/contrib/sqla/filters.py:58 msgid "contains" msgstr "sisaldab" -#: ../flask_admin/contrib/mongoengine/filters.py:68 #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 #: ../flask_admin/contrib/sqla/filters.py:67 msgid "not contains" msgstr "ei sisalda" -#: ../flask_admin/contrib/mongoengine/filters.py:77 #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 #: ../flask_admin/contrib/sqla/filters.py:75 msgid "greater than" msgstr "suurem kui" -#: ../flask_admin/contrib/mongoengine/filters.py:86 #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 #: ../flask_admin/contrib/sqla/filters.py:83 msgid "smaller than" msgstr "väiksem kui" -#: ../flask_admin/contrib/mongoengine/filters.py:98 #: ../flask_admin/contrib/peewee/filters.py:88 #: ../flask_admin/contrib/sqla/filters.py:94 msgid "empty" msgstr "tühi" -#: ../flask_admin/contrib/mongoengine/filters.py:113 #: ../flask_admin/contrib/peewee/filters.py:102 #: ../flask_admin/contrib/sqla/filters.py:108 msgid "in list" msgstr "loendis" -#: ../flask_admin/contrib/mongoengine/filters.py:122 #: ../flask_admin/contrib/peewee/filters.py:111 #: ../flask_admin/contrib/sqla/filters.py:118 msgid "not in list" msgstr "pole loendis" -#: ../flask_admin/contrib/mongoengine/filters.py:222 #: ../flask_admin/contrib/peewee/filters.py:207 #: ../flask_admin/contrib/peewee/filters.py:244 #: ../flask_admin/contrib/peewee/filters.py:281 @@ -293,16 +282,13 @@ msgstr "pole loendis" msgid "not between" msgstr "pole vahemikus" -#: ../flask_admin/contrib/mongoengine/filters.py:247 msgid "ObjectId equals" msgstr "" -#: ../flask_admin/contrib/mongoengine/view.py:551 #, python-format msgid "Failed to get model. %(error)s" msgstr "Mudeli päring ebaõnnestus. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:570 #: ../flask_admin/contrib/peewee/view.py:435 #: ../flask_admin/contrib/pymongo/view.py:316 #: ../flask_admin/contrib/sqla/view.py:1078 @@ -310,7 +296,6 @@ msgstr "Mudeli päring ebaõnnestus. %(error)s" msgid "Failed to create record. %(error)s" msgstr "Kirje loomine nurjus. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:596 #: ../flask_admin/contrib/peewee/view.py:454 #: ../flask_admin/contrib/pymongo/view.py:341 #: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 @@ -319,7 +304,6 @@ msgstr "Kirje loomine nurjus. %(error)s" msgid "Failed to update record. %(error)s" msgstr "Kirje uuendamine nurjus. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:619 #: ../flask_admin/contrib/peewee/view.py:469 #: ../flask_admin/contrib/pymongo/view.py:366 #: ../flask_admin/contrib/sqla/view.py:1129 @@ -327,14 +311,12 @@ msgstr "Kirje uuendamine nurjus. %(error)s" msgid "Failed to delete record. %(error)s" msgstr "Kirje kustutamine nurjus. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:659 #: ../flask_admin/contrib/peewee/view.py:488 #: ../flask_admin/contrib/pymongo/view.py:385 #: ../flask_admin/contrib/sqla/view.py:1150 msgid "Are you sure you want to delete selected records?" msgstr "Kas soovite kindlasti valitud kirjed kustutada?" -#: ../flask_admin/contrib/mongoengine/view.py:668 #: ../flask_admin/contrib/peewee/view.py:505 #: ../flask_admin/contrib/pymongo/view.py:395 #: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 @@ -344,7 +326,6 @@ msgid_plural "%(count)s records were successfully deleted." msgstr[0] "Kirje kustutati edukalt." msgstr[1] "%(count)s kirjet kustutati edukalt." -#: ../flask_admin/contrib/mongoengine/view.py:674 #: ../flask_admin/contrib/peewee/view.py:511 #: ../flask_admin/contrib/pymongo/view.py:400 #: ../flask_admin/contrib/sqla/view.py:1174 @@ -658,4 +639,3 @@ msgstr "Palun valige vähemalt üks kirje." #: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 msgid "Are you sure you want to delete this record?" msgstr "Kas soovite kindlasti selle kirje kustutada?" - diff --git a/flask_admin/translations/fa/LC_MESSAGES/admin.po b/flask_admin/translations/fa/LC_MESSAGES/admin.po index 2faf70771..9dd90ebe3 100644 --- a/flask_admin/translations/fa/LC_MESSAGES/admin.po +++ b/flask_admin/translations/fa/LC_MESSAGES/admin.po @@ -196,7 +196,6 @@ msgid "Editing %(path)s" msgstr "ویرایش %(path)s" #: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/mongoengine/view.py:658 #: ../flask_admin/contrib/peewee/view.py:487 #: ../flask_admin/contrib/pymongo/view.py:384 #: ../flask_admin/contrib/sqla/view.py:1149 @@ -223,67 +222,57 @@ msgstr "ویرایش" msgid "Cannot operate on non empty directories" msgstr "" -#: ../flask_admin/contrib/mongoengine/filters.py:39 #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 #: ../flask_admin/contrib/sqla/filters.py:41 msgid "equals" msgstr "برابر با" -#: ../flask_admin/contrib/mongoengine/filters.py:48 #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 #: ../flask_admin/contrib/sqla/filters.py:49 msgid "not equal" msgstr "برابر نیست با" -#: ../flask_admin/contrib/mongoengine/filters.py:58 #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 #: ../flask_admin/contrib/sqla/filters.py:58 msgid "contains" msgstr "محتوی" -#: ../flask_admin/contrib/mongoengine/filters.py:68 #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 #: ../flask_admin/contrib/sqla/filters.py:67 msgid "not contains" msgstr "محتوی نیست" -#: ../flask_admin/contrib/mongoengine/filters.py:77 #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 #: ../flask_admin/contrib/sqla/filters.py:75 msgid "greater than" msgstr "بزرگتر از" -#: ../flask_admin/contrib/mongoengine/filters.py:86 #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 #: ../flask_admin/contrib/sqla/filters.py:83 msgid "smaller than" msgstr "کوچکتر از" -#: ../flask_admin/contrib/mongoengine/filters.py:98 #: ../flask_admin/contrib/peewee/filters.py:88 #: ../flask_admin/contrib/sqla/filters.py:94 msgid "empty" msgstr "خالی باشد" -#: ../flask_admin/contrib/mongoengine/filters.py:113 #: ../flask_admin/contrib/peewee/filters.py:102 #: ../flask_admin/contrib/sqla/filters.py:108 msgid "in list" msgstr "در این لیست باشد" -#: ../flask_admin/contrib/mongoengine/filters.py:122 #: ../flask_admin/contrib/peewee/filters.py:111 #: ../flask_admin/contrib/sqla/filters.py:118 msgid "not in list" msgstr "در این لیست نباشد" -#: ../flask_admin/contrib/mongoengine/filters.py:222 #: ../flask_admin/contrib/peewee/filters.py:207 #: ../flask_admin/contrib/peewee/filters.py:244 #: ../flask_admin/contrib/peewee/filters.py:281 @@ -293,16 +282,13 @@ msgstr "در این لیست نباشد" msgid "not between" msgstr "بین این دو نباشد" -#: ../flask_admin/contrib/mongoengine/filters.py:247 msgid "ObjectId equals" msgstr "" -#: ../flask_admin/contrib/mongoengine/view.py:551 #, python-format msgid "Failed to get model. %(error)s" msgstr "خواندن مدل با مشکل روبرو شد. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:570 #: ../flask_admin/contrib/peewee/view.py:435 #: ../flask_admin/contrib/pymongo/view.py:316 #: ../flask_admin/contrib/sqla/view.py:1078 @@ -310,7 +296,6 @@ msgstr "خواندن مدل با مشکل روبرو شد. %(error)s" msgid "Failed to create record. %(error)s" msgstr "ساخت مدل با مشکل روبرو شد %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:596 #: ../flask_admin/contrib/peewee/view.py:454 #: ../flask_admin/contrib/pymongo/view.py:341 #: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 @@ -319,7 +304,6 @@ msgstr "ساخت مدل با مشکل روبرو شد %(error)s" msgid "Failed to update record. %(error)s" msgstr "بروزرسانی مدل با مشکل روبرو شد%(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:619 #: ../flask_admin/contrib/peewee/view.py:469 #: ../flask_admin/contrib/pymongo/view.py:366 #: ../flask_admin/contrib/sqla/view.py:1129 @@ -327,14 +311,12 @@ msgstr "بروزرسانی مدل با مشکل روبرو شد%(error)s" msgid "Failed to delete record. %(error)s" msgstr "حذف مدل با مشکل روبرو شد %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:659 #: ../flask_admin/contrib/peewee/view.py:488 #: ../flask_admin/contrib/pymongo/view.py:385 #: ../flask_admin/contrib/sqla/view.py:1150 msgid "Are you sure you want to delete selected records?" msgstr "آیا از حذف مدل ها اطمینان دارید" -#: ../flask_admin/contrib/mongoengine/view.py:668 #: ../flask_admin/contrib/peewee/view.py:505 #: ../flask_admin/contrib/pymongo/view.py:395 #: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 @@ -344,7 +326,6 @@ msgid_plural "%(count)s records were successfully deleted." msgstr[0] "مدل با موفقیت حذف شد" msgstr[1] "%(count)s رکورد با موفقیت حذف شد." -#: ../flask_admin/contrib/mongoengine/view.py:674 #: ../flask_admin/contrib/peewee/view.py:511 #: ../flask_admin/contrib/pymongo/view.py:400 #: ../flask_admin/contrib/sqla/view.py:1174 @@ -658,4 +639,3 @@ msgstr "حداقل یک پوشه انتخاب کنید" #: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 msgid "Are you sure you want to delete this record?" msgstr "آیا از حذف این موارد اطمینان دارید؟" - diff --git a/flask_admin/translations/fi/LC_MESSAGES/admin.po b/flask_admin/translations/fi/LC_MESSAGES/admin.po index 43e9db4ee..837264fc8 100644 --- a/flask_admin/translations/fi/LC_MESSAGES/admin.po +++ b/flask_admin/translations/fi/LC_MESSAGES/admin.po @@ -196,7 +196,6 @@ msgid "Editing %(path)s" msgstr "Muokkaus %(path)s" #: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/mongoengine/view.py:658 #: ../flask_admin/contrib/peewee/view.py:487 #: ../flask_admin/contrib/pymongo/view.py:384 #: ../flask_admin/contrib/sqla/view.py:1149 @@ -223,67 +222,57 @@ msgstr "Muokkaa" msgid "Cannot operate on non empty directories" msgstr "" -#: ../flask_admin/contrib/mongoengine/filters.py:39 #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 #: ../flask_admin/contrib/sqla/filters.py:41 msgid "equals" msgstr "vastaa" -#: ../flask_admin/contrib/mongoengine/filters.py:48 #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 #: ../flask_admin/contrib/sqla/filters.py:49 msgid "not equal" msgstr "eri suuri" -#: ../flask_admin/contrib/mongoengine/filters.py:58 #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 #: ../flask_admin/contrib/sqla/filters.py:58 msgid "contains" msgstr "sisältää" -#: ../flask_admin/contrib/mongoengine/filters.py:68 #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 #: ../flask_admin/contrib/sqla/filters.py:67 msgid "not contains" msgstr "ei sisällä" -#: ../flask_admin/contrib/mongoengine/filters.py:77 #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 #: ../flask_admin/contrib/sqla/filters.py:75 msgid "greater than" msgstr "suurempi kuin" -#: ../flask_admin/contrib/mongoengine/filters.py:86 #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 #: ../flask_admin/contrib/sqla/filters.py:83 msgid "smaller than" msgstr "pienempi kuin" -#: ../flask_admin/contrib/mongoengine/filters.py:98 #: ../flask_admin/contrib/peewee/filters.py:88 #: ../flask_admin/contrib/sqla/filters.py:94 msgid "empty" msgstr "tyhjä" -#: ../flask_admin/contrib/mongoengine/filters.py:113 #: ../flask_admin/contrib/peewee/filters.py:102 #: ../flask_admin/contrib/sqla/filters.py:108 msgid "in list" msgstr "-luettelosta" -#: ../flask_admin/contrib/mongoengine/filters.py:122 #: ../flask_admin/contrib/peewee/filters.py:111 #: ../flask_admin/contrib/sqla/filters.py:118 msgid "not in list" msgstr "ei luettelossa" -#: ../flask_admin/contrib/mongoengine/filters.py:222 #: ../flask_admin/contrib/peewee/filters.py:207 #: ../flask_admin/contrib/peewee/filters.py:244 #: ../flask_admin/contrib/peewee/filters.py:281 @@ -293,16 +282,13 @@ msgstr "ei luettelossa" msgid "not between" msgstr "ei välillä" -#: ../flask_admin/contrib/mongoengine/filters.py:247 msgid "ObjectId equals" msgstr "" -#: ../flask_admin/contrib/mongoengine/view.py:551 #, python-format msgid "Failed to get model. %(error)s" msgstr "Ei saanut malli. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:570 #: ../flask_admin/contrib/peewee/view.py:435 #: ../flask_admin/contrib/pymongo/view.py:316 #: ../flask_admin/contrib/sqla/view.py:1078 @@ -310,7 +296,6 @@ msgstr "Ei saanut malli. %(error)s" msgid "Failed to create record. %(error)s" msgstr "Tietueen luominen epäonnistui. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:596 #: ../flask_admin/contrib/peewee/view.py:454 #: ../flask_admin/contrib/pymongo/view.py:341 #: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 @@ -319,7 +304,6 @@ msgstr "Tietueen luominen epäonnistui. %(error)s" msgid "Failed to update record. %(error)s" msgstr "Tietueen luominen epäonnistui. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:619 #: ../flask_admin/contrib/peewee/view.py:469 #: ../flask_admin/contrib/pymongo/view.py:366 #: ../flask_admin/contrib/sqla/view.py:1129 @@ -327,14 +311,12 @@ msgstr "Tietueen luominen epäonnistui. %(error)s" msgid "Failed to delete record. %(error)s" msgstr "Tietueen poistaminen epäonnistui. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:659 #: ../flask_admin/contrib/peewee/view.py:488 #: ../flask_admin/contrib/pymongo/view.py:385 #: ../flask_admin/contrib/sqla/view.py:1150 msgid "Are you sure you want to delete selected records?" msgstr "Oletko varma, että haluat poistaa valitut tietueet?" -#: ../flask_admin/contrib/mongoengine/view.py:668 #: ../flask_admin/contrib/peewee/view.py:505 #: ../flask_admin/contrib/pymongo/view.py:395 #: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 @@ -344,7 +326,6 @@ msgid_plural "%(count)s records were successfully deleted." msgstr[0] "Tietueen poistaminen onnistui." msgstr[1] "%(count)s tietueet on poistettu." -#: ../flask_admin/contrib/mongoengine/view.py:674 #: ../flask_admin/contrib/peewee/view.py:511 #: ../flask_admin/contrib/pymongo/view.py:400 #: ../flask_admin/contrib/sqla/view.py:1174 @@ -658,4 +639,3 @@ msgstr "Valitse vähintään yksi tietue." #: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 msgid "Are you sure you want to delete this record?" msgstr "Oletko varma, että haluat poistaa tämän tietueen?" - diff --git a/flask_admin/translations/fr/LC_MESSAGES/admin.po b/flask_admin/translations/fr/LC_MESSAGES/admin.po index 0884b6d2b..93258f465 100644 --- a/flask_admin/translations/fr/LC_MESSAGES/admin.po +++ b/flask_admin/translations/fr/LC_MESSAGES/admin.po @@ -196,7 +196,6 @@ msgid "Editing %(path)s" msgstr "Montage %(path)s" #: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/mongoengine/view.py:658 #: ../flask_admin/contrib/peewee/view.py:487 #: ../flask_admin/contrib/pymongo/view.py:384 #: ../flask_admin/contrib/sqla/view.py:1149 @@ -223,67 +222,57 @@ msgstr "Editer" msgid "Cannot operate on non empty directories" msgstr "" -#: ../flask_admin/contrib/mongoengine/filters.py:39 #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 #: ../flask_admin/contrib/sqla/filters.py:41 msgid "equals" msgstr "vaut" -#: ../flask_admin/contrib/mongoengine/filters.py:48 #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 #: ../flask_admin/contrib/sqla/filters.py:49 msgid "not equal" msgstr "est différent de" -#: ../flask_admin/contrib/mongoengine/filters.py:58 #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 #: ../flask_admin/contrib/sqla/filters.py:58 msgid "contains" msgstr "contient" -#: ../flask_admin/contrib/mongoengine/filters.py:68 #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 #: ../flask_admin/contrib/sqla/filters.py:67 msgid "not contains" msgstr "ne contient pas" -#: ../flask_admin/contrib/mongoengine/filters.py:77 #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 #: ../flask_admin/contrib/sqla/filters.py:75 msgid "greater than" msgstr "plus grand que" -#: ../flask_admin/contrib/mongoengine/filters.py:86 #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 #: ../flask_admin/contrib/sqla/filters.py:83 msgid "smaller than" msgstr "plus petit que" -#: ../flask_admin/contrib/mongoengine/filters.py:98 #: ../flask_admin/contrib/peewee/filters.py:88 #: ../flask_admin/contrib/sqla/filters.py:94 msgid "empty" msgstr "vide" -#: ../flask_admin/contrib/mongoengine/filters.py:113 #: ../flask_admin/contrib/peewee/filters.py:102 #: ../flask_admin/contrib/sqla/filters.py:108 msgid "in list" msgstr "dans la liste" -#: ../flask_admin/contrib/mongoengine/filters.py:122 #: ../flask_admin/contrib/peewee/filters.py:111 #: ../flask_admin/contrib/sqla/filters.py:118 msgid "not in list" msgstr "pas dans la liste" -#: ../flask_admin/contrib/mongoengine/filters.py:222 #: ../flask_admin/contrib/peewee/filters.py:207 #: ../flask_admin/contrib/peewee/filters.py:244 #: ../flask_admin/contrib/peewee/filters.py:281 @@ -293,16 +282,13 @@ msgstr "pas dans la liste" msgid "not between" msgstr "pas entre" -#: ../flask_admin/contrib/mongoengine/filters.py:247 msgid "ObjectId equals" msgstr "" -#: ../flask_admin/contrib/mongoengine/view.py:551 #, python-format msgid "Failed to get model. %(error)s" msgstr "Impossible d'obtenir le modèle. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:570 #: ../flask_admin/contrib/peewee/view.py:435 #: ../flask_admin/contrib/pymongo/view.py:316 #: ../flask_admin/contrib/sqla/view.py:1078 @@ -310,7 +296,6 @@ msgstr "Impossible d'obtenir le modèle. %(error)s" msgid "Failed to create record. %(error)s" msgstr "Échec dans la création de l'objet. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:596 #: ../flask_admin/contrib/peewee/view.py:454 #: ../flask_admin/contrib/pymongo/view.py:341 #: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 @@ -319,7 +304,6 @@ msgstr "Échec dans la création de l'objet. %(error)s" msgid "Failed to update record. %(error)s" msgstr "Échec dans la mise à jour de l'objet. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:619 #: ../flask_admin/contrib/peewee/view.py:469 #: ../flask_admin/contrib/pymongo/view.py:366 #: ../flask_admin/contrib/sqla/view.py:1129 @@ -327,14 +311,12 @@ msgstr "Échec dans la mise à jour de l'objet. %(error)s" msgid "Failed to delete record. %(error)s" msgstr "Échec dans la suppression de l'objet: %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:659 #: ../flask_admin/contrib/peewee/view.py:488 #: ../flask_admin/contrib/pymongo/view.py:385 #: ../flask_admin/contrib/sqla/view.py:1150 msgid "Are you sure you want to delete selected records?" msgstr "Êtes-vous bien sûr de vouloir supprimer ces objets?" -#: ../flask_admin/contrib/mongoengine/view.py:668 #: ../flask_admin/contrib/peewee/view.py:505 #: ../flask_admin/contrib/pymongo/view.py:395 #: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 @@ -344,7 +326,6 @@ msgid_plural "%(count)s records were successfully deleted." msgstr[0] "L'objet a bien été détruit." msgstr[1] "Les %(count)s objets ont bien été détruits." -#: ../flask_admin/contrib/mongoengine/view.py:674 #: ../flask_admin/contrib/peewee/view.py:511 #: ../flask_admin/contrib/pymongo/view.py:400 #: ../flask_admin/contrib/sqla/view.py:1174 @@ -658,4 +639,3 @@ msgstr "Veuillez choisir au moins un modèle." #: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 msgid "Are you sure you want to delete this record?" msgstr "Êtes-vous bien sûr de vouloir supprimer cet objet?" - diff --git a/flask_admin/translations/he/LC_MESSAGES/admin.po b/flask_admin/translations/he/LC_MESSAGES/admin.po index fe8beac74..a7a4b1f0b 100644 --- a/flask_admin/translations/he/LC_MESSAGES/admin.po +++ b/flask_admin/translations/he/LC_MESSAGES/admin.po @@ -196,7 +196,6 @@ msgid "Editing %(path)s" msgstr "עריכת %(path)s" #: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/mongoengine/view.py:658 #: ../flask_admin/contrib/peewee/view.py:487 #: ../flask_admin/contrib/pymongo/view.py:384 #: ../flask_admin/contrib/sqla/view.py:1149 @@ -223,67 +222,57 @@ msgstr "עריכה" msgid "Cannot operate on non empty directories" msgstr "" -#: ../flask_admin/contrib/mongoengine/filters.py:39 #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 #: ../flask_admin/contrib/sqla/filters.py:41 msgid "equals" msgstr "שווה ל-" -#: ../flask_admin/contrib/mongoengine/filters.py:48 #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 #: ../flask_admin/contrib/sqla/filters.py:49 msgid "not equal" msgstr "לא שווה" -#: ../flask_admin/contrib/mongoengine/filters.py:58 #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 #: ../flask_admin/contrib/sqla/filters.py:58 msgid "contains" msgstr "מכיל" -#: ../flask_admin/contrib/mongoengine/filters.py:68 #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 #: ../flask_admin/contrib/sqla/filters.py:67 msgid "not contains" msgstr "לא מכיל" -#: ../flask_admin/contrib/mongoengine/filters.py:77 #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 #: ../flask_admin/contrib/sqla/filters.py:75 msgid "greater than" msgstr "גדול מ-" -#: ../flask_admin/contrib/mongoengine/filters.py:86 #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 #: ../flask_admin/contrib/sqla/filters.py:83 msgid "smaller than" msgstr "קטן יותר" -#: ../flask_admin/contrib/mongoengine/filters.py:98 #: ../flask_admin/contrib/peewee/filters.py:88 #: ../flask_admin/contrib/sqla/filters.py:94 msgid "empty" msgstr "ריק" -#: ../flask_admin/contrib/mongoengine/filters.py:113 #: ../flask_admin/contrib/peewee/filters.py:102 #: ../flask_admin/contrib/sqla/filters.py:108 msgid "in list" msgstr "ברשימה" -#: ../flask_admin/contrib/mongoengine/filters.py:122 #: ../flask_admin/contrib/peewee/filters.py:111 #: ../flask_admin/contrib/sqla/filters.py:118 msgid "not in list" msgstr "לא ברשימה" -#: ../flask_admin/contrib/mongoengine/filters.py:222 #: ../flask_admin/contrib/peewee/filters.py:207 #: ../flask_admin/contrib/peewee/filters.py:244 #: ../flask_admin/contrib/peewee/filters.py:281 @@ -293,16 +282,13 @@ msgstr "לא ברשימה" msgid "not between" msgstr "לא בין" -#: ../flask_admin/contrib/mongoengine/filters.py:247 msgid "ObjectId equals" msgstr "" -#: ../flask_admin/contrib/mongoengine/view.py:551 #, python-format msgid "Failed to get model. %(error)s" msgstr "מודל נכשלה. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:570 #: ../flask_admin/contrib/peewee/view.py:435 #: ../flask_admin/contrib/pymongo/view.py:316 #: ../flask_admin/contrib/sqla/view.py:1078 @@ -310,7 +296,6 @@ msgstr "מודל נכשלה. %(error)s" msgid "Failed to create record. %(error)s" msgstr "יצירת רשומה נכשלה. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:596 #: ../flask_admin/contrib/peewee/view.py:454 #: ../flask_admin/contrib/pymongo/view.py:341 #: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 @@ -319,7 +304,6 @@ msgstr "יצירת רשומה נכשלה. %(error)s" msgid "Failed to update record. %(error)s" msgstr "יצירת רשומה נכשלה. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:619 #: ../flask_admin/contrib/peewee/view.py:469 #: ../flask_admin/contrib/pymongo/view.py:366 #: ../flask_admin/contrib/sqla/view.py:1129 @@ -327,14 +311,12 @@ msgstr "יצירת רשומה נכשלה. %(error)s" msgid "Failed to delete record. %(error)s" msgstr "לא ניתן למחוק רשומה. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:659 #: ../flask_admin/contrib/peewee/view.py:488 #: ../flask_admin/contrib/pymongo/view.py:385 #: ../flask_admin/contrib/sqla/view.py:1150 msgid "Are you sure you want to delete selected records?" msgstr "האם אתה בטוח שברצונך למחוק את הרשומות שנבחרו?" -#: ../flask_admin/contrib/mongoengine/view.py:668 #: ../flask_admin/contrib/peewee/view.py:505 #: ../flask_admin/contrib/pymongo/view.py:395 #: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 @@ -346,7 +328,6 @@ msgstr[1] "%(count)s רשומות נמחקו בהצלחה." msgstr[2] "%(count)s רשומות נמחקו בהצלחה." msgstr[3] "%(count)s רשומות נמחקו בהצלחה." -#: ../flask_admin/contrib/mongoengine/view.py:674 #: ../flask_admin/contrib/peewee/view.py:511 #: ../flask_admin/contrib/pymongo/view.py:400 #: ../flask_admin/contrib/sqla/view.py:1174 @@ -662,4 +643,3 @@ msgstr "נא בחר רשומה אחת לפחות." #: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 msgid "Are you sure you want to delete this record?" msgstr "האם אתה בטוח שברצונך למחוק רשומה זו?" - diff --git a/flask_admin/translations/hu/LC_MESSAGES/admin.po b/flask_admin/translations/hu/LC_MESSAGES/admin.po index ba449f48f..037b1c241 100644 --- a/flask_admin/translations/hu/LC_MESSAGES/admin.po +++ b/flask_admin/translations/hu/LC_MESSAGES/admin.po @@ -195,8 +195,7 @@ msgstr "Nem lehet szerkeszteni a %(name)s." msgid "Editing %(path)s" msgstr "%(path)s szerkesztése" -#: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/mongoengine/view.py:658 +#: ../flask_admin/contrib/fileadmin/__init__.py:1163s #: ../flask_admin/contrib/peewee/view.py:487 #: ../flask_admin/contrib/pymongo/view.py:384 #: ../flask_admin/contrib/sqla/view.py:1149 @@ -222,68 +221,58 @@ msgstr "Szerkesztése" #: ../flask_admin/contrib/fileadmin/s3.py:153 msgid "Cannot operate on non empty directories" msgstr "" - -#: ../flask_admin/contrib/mongoengine/filters.py:39 +s #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 #: ../flask_admin/contrib/sqla/filters.py:41 msgid "equals" msgstr "egyenlő" - -#: ../flask_admin/contrib/mongoengine/filters.py:48 +s #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 #: ../flask_admin/contrib/sqla/filters.py:49 msgid "not equal" msgstr "nem egyenlő" - -#: ../flask_admin/contrib/mongoengine/filters.py:58 +s #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 #: ../flask_admin/contrib/sqla/filters.py:58 msgid "contains" msgstr "tartalmaz" - -#: ../flask_admin/contrib/mongoengine/filters.py:68 +s #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 #: ../flask_admin/contrib/sqla/filters.py:67 msgid "not contains" msgstr "nem tartalmaz" - -#: ../flask_admin/contrib/mongoengine/filters.py:77 +s #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 #: ../flask_admin/contrib/sqla/filters.py:75 msgid "greater than" msgstr "nagyobb, mint" - -#: ../flask_admin/contrib/mongoengine/filters.py:86 +s #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 #: ../flask_admin/contrib/sqla/filters.py:83 msgid "smaller than" msgstr "kisebb, mint" - -#: ../flask_admin/contrib/mongoengine/filters.py:98 +s #: ../flask_admin/contrib/peewee/filters.py:88 #: ../flask_admin/contrib/sqla/filters.py:94 msgid "empty" msgstr "üres" - -#: ../flask_admin/contrib/mongoengine/filters.py:113 +s #: ../flask_admin/contrib/peewee/filters.py:102 #: ../flask_admin/contrib/sqla/filters.py:108 msgid "in list" msgstr "a lista" - -#: ../flask_admin/contrib/mongoengine/filters.py:122 +s #: ../flask_admin/contrib/peewee/filters.py:111 #: ../flask_admin/contrib/sqla/filters.py:118 msgid "not in list" msgstr "listán nem szereplő" - -#: ../flask_admin/contrib/mongoengine/filters.py:222 +s #: ../flask_admin/contrib/peewee/filters.py:207 #: ../flask_admin/contrib/peewee/filters.py:244 #: ../flask_admin/contrib/peewee/filters.py:281 @@ -292,25 +281,21 @@ msgstr "listán nem szereplő" #: ../flask_admin/contrib/sqla/filters.py:287 msgid "not between" msgstr "nem között" - -#: ../flask_admin/contrib/mongoengine/filters.py:247 +s msgid "ObjectId equals" msgstr "" - -#: ../flask_admin/contrib/mongoengine/view.py:551 +s #, python-format msgid "Failed to get model. %(error)s" msgstr "Nem sikerült lekérni a modell. %(error)s" - -#: ../flask_admin/contrib/mongoengine/view.py:570 +s #: ../flask_admin/contrib/peewee/view.py:435 #: ../flask_admin/contrib/pymongo/view.py:316 #: ../flask_admin/contrib/sqla/view.py:1078 #, python-format msgid "Failed to create record. %(error)s" msgstr "Nem sikerült létrehozni a rekord. %(error)s" - -#: ../flask_admin/contrib/mongoengine/view.py:596 +s #: ../flask_admin/contrib/peewee/view.py:454 #: ../flask_admin/contrib/pymongo/view.py:341 #: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 @@ -318,23 +303,20 @@ msgstr "Nem sikerült létrehozni a rekord. %(error)s" #, python-format msgid "Failed to update record. %(error)s" msgstr "Nem sikerült létrehozni a rekord. %(error)s" - -#: ../flask_admin/contrib/mongoengine/view.py:619 +s #: ../flask_admin/contrib/peewee/view.py:469 #: ../flask_admin/contrib/pymongo/view.py:366 #: ../flask_admin/contrib/sqla/view.py:1129 #, python-format msgid "Failed to delete record. %(error)s" msgstr "Nem sikerült törölni a rekordot. %(error)s" - -#: ../flask_admin/contrib/mongoengine/view.py:659 +s #: ../flask_admin/contrib/peewee/view.py:488 #: ../flask_admin/contrib/pymongo/view.py:385 #: ../flask_admin/contrib/sqla/view.py:1150 msgid "Are you sure you want to delete selected records?" msgstr "Biztosan törli a kijelölt rekordokat?" - -#: ../flask_admin/contrib/mongoengine/view.py:668 +s #: ../flask_admin/contrib/peewee/view.py:505 #: ../flask_admin/contrib/pymongo/view.py:395 #: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 @@ -343,8 +325,7 @@ msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." msgstr[0] "Rekord törlésének sikerességét." msgstr[1] "%(count)s rekordok törlése sikeres volt." - -#: ../flask_admin/contrib/mongoengine/view.py:674 +s #: ../flask_admin/contrib/peewee/view.py:511 #: ../flask_admin/contrib/pymongo/view.py:400 #: ../flask_admin/contrib/sqla/view.py:1174 @@ -658,4 +639,3 @@ msgstr "Jelöljön ki legalább egy bejegyzést." #: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 msgid "Are you sure you want to delete this record?" msgstr "Biztosan törli ezt a rekordot?" - diff --git a/flask_admin/translations/it/LC_MESSAGES/admin.po b/flask_admin/translations/it/LC_MESSAGES/admin.po index a2cf2cdc5..e17835aaa 100644 --- a/flask_admin/translations/it/LC_MESSAGES/admin.po +++ b/flask_admin/translations/it/LC_MESSAGES/admin.po @@ -196,7 +196,6 @@ msgid "Editing %(path)s" msgstr "Modifica %(path)s" #: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/mongoengine/view.py:658 #: ../flask_admin/contrib/peewee/view.py:487 #: ../flask_admin/contrib/pymongo/view.py:384 #: ../flask_admin/contrib/sqla/view.py:1149 @@ -223,67 +222,57 @@ msgstr "Modifica" msgid "Cannot operate on non empty directories" msgstr "Non può funzionare in directory non vuote" -#: ../flask_admin/contrib/mongoengine/filters.py:39 #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 #: ../flask_admin/contrib/sqla/filters.py:41 msgid "equals" msgstr "uguale" -#: ../flask_admin/contrib/mongoengine/filters.py:48 #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 #: ../flask_admin/contrib/sqla/filters.py:49 msgid "not equal" msgstr "differente" -#: ../flask_admin/contrib/mongoengine/filters.py:58 #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 #: ../flask_admin/contrib/sqla/filters.py:58 msgid "contains" msgstr "contiene" -#: ../flask_admin/contrib/mongoengine/filters.py:68 #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 #: ../flask_admin/contrib/sqla/filters.py:67 msgid "not contains" msgstr "non contiene" -#: ../flask_admin/contrib/mongoengine/filters.py:77 #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 #: ../flask_admin/contrib/sqla/filters.py:75 msgid "greater than" msgstr "piú grande di" -#: ../flask_admin/contrib/mongoengine/filters.py:86 #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 #: ../flask_admin/contrib/sqla/filters.py:83 msgid "smaller than" msgstr "piú piccolo di" -#: ../flask_admin/contrib/mongoengine/filters.py:98 #: ../flask_admin/contrib/peewee/filters.py:88 #: ../flask_admin/contrib/sqla/filters.py:94 msgid "empty" msgstr "vuoto" -#: ../flask_admin/contrib/mongoengine/filters.py:113 #: ../flask_admin/contrib/peewee/filters.py:102 #: ../flask_admin/contrib/sqla/filters.py:108 msgid "in list" msgstr "nell'elenco" -#: ../flask_admin/contrib/mongoengine/filters.py:122 #: ../flask_admin/contrib/peewee/filters.py:111 #: ../flask_admin/contrib/sqla/filters.py:118 msgid "not in list" msgstr "non in elenco" -#: ../flask_admin/contrib/mongoengine/filters.py:222 #: ../flask_admin/contrib/peewee/filters.py:207 #: ../flask_admin/contrib/peewee/filters.py:244 #: ../flask_admin/contrib/peewee/filters.py:281 @@ -293,16 +282,13 @@ msgstr "non in elenco" msgid "not between" msgstr "non tra" -#: ../flask_admin/contrib/mongoengine/filters.py:247 msgid "ObjectId equals" msgstr "ObjectId uguale" -#: ../flask_admin/contrib/mongoengine/view.py:551 #, python-format msgid "Failed to get model. %(error)s" msgstr "Impossibile ottenere il modello. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:570 #: ../flask_admin/contrib/peewee/view.py:435 #: ../flask_admin/contrib/pymongo/view.py:316 #: ../flask_admin/contrib/sqla/view.py:1078 @@ -310,7 +296,6 @@ msgstr "Impossibile ottenere il modello. %(error)s" msgid "Failed to create record. %(error)s" msgstr "Impossibile creare il record. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:596 #: ../flask_admin/contrib/peewee/view.py:454 #: ../flask_admin/contrib/pymongo/view.py:341 #: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 @@ -319,7 +304,6 @@ msgstr "Impossibile creare il record. %(error)s" msgid "Failed to update record. %(error)s" msgstr "Impossibile aggiornare il record. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:619 #: ../flask_admin/contrib/peewee/view.py:469 #: ../flask_admin/contrib/pymongo/view.py:366 #: ../flask_admin/contrib/sqla/view.py:1129 @@ -327,14 +311,12 @@ msgstr "Impossibile aggiornare il record. %(error)s" msgid "Failed to delete record. %(error)s" msgstr "Impossibile eliminare il record: %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:659 #: ../flask_admin/contrib/peewee/view.py:488 #: ../flask_admin/contrib/pymongo/view.py:385 #: ../flask_admin/contrib/sqla/view.py:1150 msgid "Are you sure you want to delete selected records?" msgstr "Sei sicuro di voler eliminare i record selezionati?" -#: ../flask_admin/contrib/mongoengine/view.py:668 #: ../flask_admin/contrib/peewee/view.py:505 #: ../flask_admin/contrib/pymongo/view.py:395 #: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 @@ -344,7 +326,6 @@ msgid_plural "%(count)s records were successfully deleted." msgstr[0] "Il record é stato eliminato con successo." msgstr[1] "%(count)s records eliminati con successo." -#: ../flask_admin/contrib/mongoengine/view.py:674 #: ../flask_admin/contrib/peewee/view.py:511 #: ../flask_admin/contrib/pymongo/view.py:400 #: ../flask_admin/contrib/sqla/view.py:1174 @@ -658,4 +639,3 @@ msgstr "Selezionare almeno un record." #: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 msgid "Are you sure you want to delete this record?" msgstr "Sei sicuro di voler eliminare questo record?" - diff --git a/flask_admin/translations/ja/LC_MESSAGES/admin.po b/flask_admin/translations/ja/LC_MESSAGES/admin.po index 18201bc84..932a747d4 100644 --- a/flask_admin/translations/ja/LC_MESSAGES/admin.po +++ b/flask_admin/translations/ja/LC_MESSAGES/admin.po @@ -196,7 +196,6 @@ msgid "Editing %(path)s" msgstr "%(path)s を編集中" #: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/mongoengine/view.py:658 #: ../flask_admin/contrib/peewee/view.py:487 #: ../flask_admin/contrib/pymongo/view.py:384 #: ../flask_admin/contrib/sqla/view.py:1149 @@ -223,67 +222,57 @@ msgstr "編集" msgid "Cannot operate on non empty directories" msgstr "ディレクトリがからではないため、操作できません" -#: ../flask_admin/contrib/mongoengine/filters.py:39 #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 #: ../flask_admin/contrib/sqla/filters.py:41 msgid "equals" msgstr "等しい" -#: ../flask_admin/contrib/mongoengine/filters.py:48 #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 #: ../flask_admin/contrib/sqla/filters.py:49 msgid "not equal" msgstr "等しくない" -#: ../flask_admin/contrib/mongoengine/filters.py:58 #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 #: ../flask_admin/contrib/sqla/filters.py:58 msgid "contains" msgstr "含む" -#: ../flask_admin/contrib/mongoengine/filters.py:68 #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 #: ../flask_admin/contrib/sqla/filters.py:67 msgid "not contains" msgstr "含まれていません" -#: ../flask_admin/contrib/mongoengine/filters.py:77 #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 #: ../flask_admin/contrib/sqla/filters.py:75 msgid "greater than" msgstr "より大きい" -#: ../flask_admin/contrib/mongoengine/filters.py:86 #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 #: ../flask_admin/contrib/sqla/filters.py:83 msgid "smaller than" msgstr "より小さい" -#: ../flask_admin/contrib/mongoengine/filters.py:98 #: ../flask_admin/contrib/peewee/filters.py:88 #: ../flask_admin/contrib/sqla/filters.py:94 msgid "empty" msgstr "空" -#: ../flask_admin/contrib/mongoengine/filters.py:113 #: ../flask_admin/contrib/peewee/filters.py:102 #: ../flask_admin/contrib/sqla/filters.py:108 msgid "in list" msgstr "一覧にある" -#: ../flask_admin/contrib/mongoengine/filters.py:122 #: ../flask_admin/contrib/peewee/filters.py:111 #: ../flask_admin/contrib/sqla/filters.py:118 msgid "not in list" msgstr "一覧にない" -#: ../flask_admin/contrib/mongoengine/filters.py:222 #: ../flask_admin/contrib/peewee/filters.py:207 #: ../flask_admin/contrib/peewee/filters.py:244 #: ../flask_admin/contrib/peewee/filters.py:281 @@ -293,16 +282,13 @@ msgstr "一覧にない" msgid "not between" msgstr "間ではなく" -#: ../flask_admin/contrib/mongoengine/filters.py:247 msgid "ObjectId equals" msgstr "" -#: ../flask_admin/contrib/mongoengine/view.py:551 #, python-format msgid "Failed to get model. %(error)s" msgstr "モデルを取得できませんでした。%(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:570 #: ../flask_admin/contrib/peewee/view.py:435 #: ../flask_admin/contrib/pymongo/view.py:316 #: ../flask_admin/contrib/sqla/view.py:1078 @@ -310,7 +296,6 @@ msgstr "モデルを取得できませんでした。%(error)s" msgid "Failed to create record. %(error)s" msgstr "レコードの作成に失敗しました。%(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:596 #: ../flask_admin/contrib/peewee/view.py:454 #: ../flask_admin/contrib/pymongo/view.py:341 #: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 @@ -319,7 +304,6 @@ msgstr "レコードの作成に失敗しました。%(error)s" msgid "Failed to update record. %(error)s" msgstr "レコードの更新に失敗しました。%(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:619 #: ../flask_admin/contrib/peewee/view.py:469 #: ../flask_admin/contrib/pymongo/view.py:366 #: ../flask_admin/contrib/sqla/view.py:1129 @@ -327,14 +311,12 @@ msgstr "レコードの更新に失敗しました。%(error)s" msgid "Failed to delete record. %(error)s" msgstr "レコードの削除に失敗しました。%(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:659 #: ../flask_admin/contrib/peewee/view.py:488 #: ../flask_admin/contrib/pymongo/view.py:385 #: ../flask_admin/contrib/sqla/view.py:1150 msgid "Are you sure you want to delete selected records?" msgstr "選択したレコードを削除してもよろしいですか。" -#: ../flask_admin/contrib/mongoengine/view.py:668 #: ../flask_admin/contrib/peewee/view.py:505 #: ../flask_admin/contrib/pymongo/view.py:395 #: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 @@ -343,7 +325,6 @@ msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." msgstr[0] "%(count)s レコードが正常に削除されました。" -#: ../flask_admin/contrib/mongoengine/view.py:674 #: ../flask_admin/contrib/peewee/view.py:511 #: ../flask_admin/contrib/pymongo/view.py:400 #: ../flask_admin/contrib/sqla/view.py:1174 @@ -656,4 +637,3 @@ msgstr "少なくとも1つのレコードを選択してください。" #: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 msgid "Are you sure you want to delete this record?" msgstr "このレコードを削除してもよろしいですか。" - diff --git a/flask_admin/translations/ko/LC_MESSAGES/admin.po b/flask_admin/translations/ko/LC_MESSAGES/admin.po index 6334aa1ca..93182ab97 100644 --- a/flask_admin/translations/ko/LC_MESSAGES/admin.po +++ b/flask_admin/translations/ko/LC_MESSAGES/admin.po @@ -196,7 +196,6 @@ msgid "Editing %(path)s" msgstr "%(path)s 편집 중" #: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/mongoengine/view.py:658 #: ../flask_admin/contrib/peewee/view.py:487 #: ../flask_admin/contrib/pymongo/view.py:384 #: ../flask_admin/contrib/sqla/view.py:1149 @@ -223,67 +222,57 @@ msgstr "편집" msgid "Cannot operate on non empty directories" msgstr "비어 있지 않은 디렉토리에 작업할 수 없습니다." -#: ../flask_admin/contrib/mongoengine/filters.py:39 #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 #: ../flask_admin/contrib/sqla/filters.py:41 msgid "equals" msgstr "같음" -#: ../flask_admin/contrib/mongoengine/filters.py:48 #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 #: ../flask_admin/contrib/sqla/filters.py:49 msgid "not equal" msgstr "같지 않음" -#: ../flask_admin/contrib/mongoengine/filters.py:58 #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 #: ../flask_admin/contrib/sqla/filters.py:58 msgid "contains" msgstr "포함" -#: ../flask_admin/contrib/mongoengine/filters.py:68 #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 #: ../flask_admin/contrib/sqla/filters.py:67 msgid "not contains" msgstr "포함되지않은" -#: ../flask_admin/contrib/mongoengine/filters.py:77 #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 #: ../flask_admin/contrib/sqla/filters.py:75 msgid "greater than" msgstr "보다 큰" -#: ../flask_admin/contrib/mongoengine/filters.py:86 #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 #: ../flask_admin/contrib/sqla/filters.py:83 msgid "smaller than" msgstr "보다 작은" -#: ../flask_admin/contrib/mongoengine/filters.py:98 #: ../flask_admin/contrib/peewee/filters.py:88 #: ../flask_admin/contrib/sqla/filters.py:94 msgid "empty" msgstr "빈" -#: ../flask_admin/contrib/mongoengine/filters.py:113 #: ../flask_admin/contrib/peewee/filters.py:102 #: ../flask_admin/contrib/sqla/filters.py:108 msgid "in list" msgstr "목록에서" -#: ../flask_admin/contrib/mongoengine/filters.py:122 #: ../flask_admin/contrib/peewee/filters.py:111 #: ../flask_admin/contrib/sqla/filters.py:118 msgid "not in list" msgstr "목록에 없는" -#: ../flask_admin/contrib/mongoengine/filters.py:222 #: ../flask_admin/contrib/peewee/filters.py:207 #: ../flask_admin/contrib/peewee/filters.py:244 #: ../flask_admin/contrib/peewee/filters.py:281 @@ -293,16 +282,13 @@ msgstr "목록에 없는" msgid "not between" msgstr "사이에 존재하지않는" -#: ../flask_admin/contrib/mongoengine/filters.py:247 msgid "ObjectId equals" msgstr "ObjectId 같음" -#: ../flask_admin/contrib/mongoengine/view.py:551 #, python-format msgid "Failed to get model. %(error)s" msgstr "모델을 가져오는 데 실패하였습니다. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:570 #: ../flask_admin/contrib/peewee/view.py:435 #: ../flask_admin/contrib/pymongo/view.py:316 #: ../flask_admin/contrib/sqla/view.py:1078 @@ -310,7 +296,6 @@ msgstr "모델을 가져오는 데 실패하였습니다. %(error)s" msgid "Failed to create record. %(error)s" msgstr "레코드를 만들지 못했습니다. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:596 #: ../flask_admin/contrib/peewee/view.py:454 #: ../flask_admin/contrib/pymongo/view.py:341 #: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 @@ -319,7 +304,6 @@ msgstr "레코드를 만들지 못했습니다. %(error)s" msgid "Failed to update record. %(error)s" msgstr "레코드를 업데이트하지 못했습니다. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:619 #: ../flask_admin/contrib/peewee/view.py:469 #: ../flask_admin/contrib/pymongo/view.py:366 #: ../flask_admin/contrib/sqla/view.py:1129 @@ -327,14 +311,12 @@ msgstr "레코드를 업데이트하지 못했습니다. %(error)s" msgid "Failed to delete record. %(error)s" msgstr "레코드를 삭제하지 못했습니다. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:659 #: ../flask_admin/contrib/peewee/view.py:488 #: ../flask_admin/contrib/pymongo/view.py:385 #: ../flask_admin/contrib/sqla/view.py:1150 msgid "Are you sure you want to delete selected records?" msgstr "선택한 레코드를 삭제하시겠습니까?" -#: ../flask_admin/contrib/mongoengine/view.py:668 #: ../flask_admin/contrib/peewee/view.py:505 #: ../flask_admin/contrib/pymongo/view.py:395 #: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 @@ -343,7 +325,6 @@ msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." msgstr[0] "%(count)s 레코드 성공적으로 삭제되었습니다." -#: ../flask_admin/contrib/mongoengine/view.py:674 #: ../flask_admin/contrib/peewee/view.py:511 #: ../flask_admin/contrib/pymongo/view.py:400 #: ../flask_admin/contrib/sqla/view.py:1174 @@ -656,4 +637,3 @@ msgstr "최소한 하나 이상의 레코드를 선택하십시오." #: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 msgid "Are you sure you want to delete this record?" msgstr "이 레코드를 삭제 하시겠습니까?" - diff --git a/flask_admin/translations/nl/LC_MESSAGES/admin.po b/flask_admin/translations/nl/LC_MESSAGES/admin.po index 0dd1ac8de..2b5b76aca 100644 --- a/flask_admin/translations/nl/LC_MESSAGES/admin.po +++ b/flask_admin/translations/nl/LC_MESSAGES/admin.po @@ -196,7 +196,6 @@ msgid "Editing %(path)s" msgstr "%(path)s bewerken" #: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/mongoengine/view.py:658 #: ../flask_admin/contrib/peewee/view.py:487 #: ../flask_admin/contrib/pymongo/view.py:384 #: ../flask_admin/contrib/sqla/view.py:1149 @@ -223,67 +222,57 @@ msgstr "Bewerken" msgid "Cannot operate on non empty directories" msgstr "Operatie kan alleen worden uitgevoerd op lege mappen" -#: ../flask_admin/contrib/mongoengine/filters.py:39 #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 #: ../flask_admin/contrib/sqla/filters.py:41 msgid "equals" msgstr "gelijk" -#: ../flask_admin/contrib/mongoengine/filters.py:48 #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 #: ../flask_admin/contrib/sqla/filters.py:49 msgid "not equal" msgstr "niet gelijk" -#: ../flask_admin/contrib/mongoengine/filters.py:58 #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 #: ../flask_admin/contrib/sqla/filters.py:58 msgid "contains" msgstr "bevat" -#: ../flask_admin/contrib/mongoengine/filters.py:68 #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 #: ../flask_admin/contrib/sqla/filters.py:67 msgid "not contains" msgstr "bevat niet" -#: ../flask_admin/contrib/mongoengine/filters.py:77 #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 #: ../flask_admin/contrib/sqla/filters.py:75 msgid "greater than" msgstr "groter dan" -#: ../flask_admin/contrib/mongoengine/filters.py:86 #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 #: ../flask_admin/contrib/sqla/filters.py:83 msgid "smaller than" msgstr "kleiner dan" -#: ../flask_admin/contrib/mongoengine/filters.py:98 #: ../flask_admin/contrib/peewee/filters.py:88 #: ../flask_admin/contrib/sqla/filters.py:94 msgid "empty" msgstr "leeg" -#: ../flask_admin/contrib/mongoengine/filters.py:113 #: ../flask_admin/contrib/peewee/filters.py:102 #: ../flask_admin/contrib/sqla/filters.py:108 msgid "in list" msgstr "in lijst" -#: ../flask_admin/contrib/mongoengine/filters.py:122 #: ../flask_admin/contrib/peewee/filters.py:111 #: ../flask_admin/contrib/sqla/filters.py:118 msgid "not in list" msgstr "niet in lijst" -#: ../flask_admin/contrib/mongoengine/filters.py:222 #: ../flask_admin/contrib/peewee/filters.py:207 #: ../flask_admin/contrib/peewee/filters.py:244 #: ../flask_admin/contrib/peewee/filters.py:281 @@ -293,16 +282,13 @@ msgstr "niet in lijst" msgid "not between" msgstr "niet tussen" -#: ../flask_admin/contrib/mongoengine/filters.py:247 msgid "ObjectId equals" msgstr "" -#: ../flask_admin/contrib/mongoengine/view.py:551 #, python-format msgid "Failed to get model. %(error)s" msgstr "Fout bij het ophalen van model. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:570 #: ../flask_admin/contrib/peewee/view.py:435 #: ../flask_admin/contrib/pymongo/view.py:316 #: ../flask_admin/contrib/sqla/view.py:1078 @@ -310,7 +296,6 @@ msgstr "Fout bij het ophalen van model. %(error)s" msgid "Failed to create record. %(error)s" msgstr "Is mislukt om record te maken. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:596 #: ../flask_admin/contrib/peewee/view.py:454 #: ../flask_admin/contrib/pymongo/view.py:341 #: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 @@ -319,7 +304,6 @@ msgstr "Is mislukt om record te maken. %(error)s" msgid "Failed to update record. %(error)s" msgstr "Is mislukt om record te maken. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:619 #: ../flask_admin/contrib/peewee/view.py:469 #: ../flask_admin/contrib/pymongo/view.py:366 #: ../flask_admin/contrib/sqla/view.py:1129 @@ -327,14 +311,12 @@ msgstr "Is mislukt om record te maken. %(error)s" msgid "Failed to delete record. %(error)s" msgstr "Fout bij het verwijderen van de record. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:659 #: ../flask_admin/contrib/peewee/view.py:488 #: ../flask_admin/contrib/pymongo/view.py:385 #: ../flask_admin/contrib/sqla/view.py:1150 msgid "Are you sure you want to delete selected records?" msgstr "Weet u zeker dat u wilt verwijderen van geselecteerde records?" -#: ../flask_admin/contrib/mongoengine/view.py:668 #: ../flask_admin/contrib/peewee/view.py:505 #: ../flask_admin/contrib/pymongo/view.py:395 #: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 @@ -344,7 +326,6 @@ msgid_plural "%(count)s records were successfully deleted." msgstr[0] "Record is met succes verwijderd." msgstr[1] "%(count)s records zijn met succes verwijderd." -#: ../flask_admin/contrib/mongoengine/view.py:674 #: ../flask_admin/contrib/peewee/view.py:511 #: ../flask_admin/contrib/pymongo/view.py:400 #: ../flask_admin/contrib/sqla/view.py:1174 @@ -658,4 +639,3 @@ msgstr "Selecteer ten minste één record." #: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 msgid "Are you sure you want to delete this record?" msgstr "Weet u zeker dat u wilt verwijderen van deze record?" - diff --git a/flask_admin/translations/no/LC_MESSAGES/admin.po b/flask_admin/translations/no/LC_MESSAGES/admin.po index fe4763d47..3e83eee35 100644 --- a/flask_admin/translations/no/LC_MESSAGES/admin.po +++ b/flask_admin/translations/no/LC_MESSAGES/admin.po @@ -196,7 +196,6 @@ msgid "Editing %(path)s" msgstr "Redigerer %(path)s" #: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/mongoengine/view.py:658 #: ../flask_admin/contrib/peewee/view.py:487 #: ../flask_admin/contrib/pymongo/view.py:384 #: ../flask_admin/contrib/sqla/view.py:1149 @@ -223,67 +222,57 @@ msgstr "Rediger" msgid "Cannot operate on non empty directories" msgstr "" -#: ../flask_admin/contrib/mongoengine/filters.py:39 #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 #: ../flask_admin/contrib/sqla/filters.py:41 msgid "equals" msgstr "er lik" -#: ../flask_admin/contrib/mongoengine/filters.py:48 #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 #: ../flask_admin/contrib/sqla/filters.py:49 msgid "not equal" msgstr "ikke lik" -#: ../flask_admin/contrib/mongoengine/filters.py:58 #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 #: ../flask_admin/contrib/sqla/filters.py:58 msgid "contains" msgstr "inneholder" -#: ../flask_admin/contrib/mongoengine/filters.py:68 #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 #: ../flask_admin/contrib/sqla/filters.py:67 msgid "not contains" msgstr "inneholder ikke" -#: ../flask_admin/contrib/mongoengine/filters.py:77 #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 #: ../flask_admin/contrib/sqla/filters.py:75 msgid "greater than" msgstr "større enn" -#: ../flask_admin/contrib/mongoengine/filters.py:86 #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 #: ../flask_admin/contrib/sqla/filters.py:83 msgid "smaller than" msgstr "mindre enn" -#: ../flask_admin/contrib/mongoengine/filters.py:98 #: ../flask_admin/contrib/peewee/filters.py:88 #: ../flask_admin/contrib/sqla/filters.py:94 msgid "empty" msgstr "Tom" -#: ../flask_admin/contrib/mongoengine/filters.py:113 #: ../flask_admin/contrib/peewee/filters.py:102 #: ../flask_admin/contrib/sqla/filters.py:108 msgid "in list" msgstr "i listen" -#: ../flask_admin/contrib/mongoengine/filters.py:122 #: ../flask_admin/contrib/peewee/filters.py:111 #: ../flask_admin/contrib/sqla/filters.py:118 msgid "not in list" msgstr "ikke i listen" -#: ../flask_admin/contrib/mongoengine/filters.py:222 #: ../flask_admin/contrib/peewee/filters.py:207 #: ../flask_admin/contrib/peewee/filters.py:244 #: ../flask_admin/contrib/peewee/filters.py:281 @@ -293,16 +282,13 @@ msgstr "ikke i listen" msgid "not between" msgstr "ikke mellom" -#: ../flask_admin/contrib/mongoengine/filters.py:247 msgid "ObjectId equals" msgstr "" -#: ../flask_admin/contrib/mongoengine/view.py:551 #, python-format msgid "Failed to get model. %(error)s" msgstr "Kan ikke hente modell. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:570 #: ../flask_admin/contrib/peewee/view.py:435 #: ../flask_admin/contrib/pymongo/view.py:316 #: ../flask_admin/contrib/sqla/view.py:1078 @@ -310,7 +296,6 @@ msgstr "Kan ikke hente modell. %(error)s" msgid "Failed to create record. %(error)s" msgstr "Kan ikke opprette posten. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:596 #: ../flask_admin/contrib/peewee/view.py:454 #: ../flask_admin/contrib/pymongo/view.py:341 #: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 @@ -319,7 +304,6 @@ msgstr "Kan ikke opprette posten. %(error)s" msgid "Failed to update record. %(error)s" msgstr "Kan ikke opprette posten. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:619 #: ../flask_admin/contrib/peewee/view.py:469 #: ../flask_admin/contrib/pymongo/view.py:366 #: ../flask_admin/contrib/sqla/view.py:1129 @@ -327,14 +311,12 @@ msgstr "Kan ikke opprette posten. %(error)s" msgid "Failed to delete record. %(error)s" msgstr "Kan ikke slette posten. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:659 #: ../flask_admin/contrib/peewee/view.py:488 #: ../flask_admin/contrib/pymongo/view.py:385 #: ../flask_admin/contrib/sqla/view.py:1150 msgid "Are you sure you want to delete selected records?" msgstr "Er du sikker på at du vil slette valgte oppføringer?" -#: ../flask_admin/contrib/mongoengine/view.py:668 #: ../flask_admin/contrib/peewee/view.py:505 #: ../flask_admin/contrib/pymongo/view.py:395 #: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 @@ -344,7 +326,6 @@ msgid_plural "%(count)s records were successfully deleted." msgstr[0] "Posten ble slettet." msgstr[1] "%(count)s poster ble slettet." -#: ../flask_admin/contrib/mongoengine/view.py:674 #: ../flask_admin/contrib/peewee/view.py:511 #: ../flask_admin/contrib/pymongo/view.py:400 #: ../flask_admin/contrib/sqla/view.py:1174 @@ -658,4 +639,3 @@ msgstr "Velg minst én post." #: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 msgid "Are you sure you want to delete this record?" msgstr "Er du sikker på at du vil slette denne posten?" - diff --git a/flask_admin/translations/pa/LC_MESSAGES/admin.po b/flask_admin/translations/pa/LC_MESSAGES/admin.po index 60c0eaa35..b3a367c37 100644 --- a/flask_admin/translations/pa/LC_MESSAGES/admin.po +++ b/flask_admin/translations/pa/LC_MESSAGES/admin.po @@ -196,7 +196,6 @@ msgid "Editing %(path)s" msgstr " %(path)s ਬਦਲਿਆ ਜਾ ਰਿਹਾ " #: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/mongoengine/view.py:658 #: ../flask_admin/contrib/peewee/view.py:487 #: ../flask_admin/contrib/pymongo/view.py:384 #: ../flask_admin/contrib/sqla/view.py:1149 @@ -223,67 +222,57 @@ msgstr "ਬਦਲੋ" msgid "Cannot operate on non empty directories" msgstr "" -#: ../flask_admin/contrib/mongoengine/filters.py:39 #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 #: ../flask_admin/contrib/sqla/filters.py:41 msgid "equals" msgstr "ਬਰਾਬਰ" -#: ../flask_admin/contrib/mongoengine/filters.py:48 #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 #: ../flask_admin/contrib/sqla/filters.py:49 msgid "not equal" msgstr "ਨਾ ਬਰਾਬਰ" -#: ../flask_admin/contrib/mongoengine/filters.py:58 #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 #: ../flask_admin/contrib/sqla/filters.py:58 msgid "contains" msgstr "ਸ਼ਾਮਲ" -#: ../flask_admin/contrib/mongoengine/filters.py:68 #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 #: ../flask_admin/contrib/sqla/filters.py:67 msgid "not contains" msgstr "ਸ਼ਾਮਲ ਨਹੀਂ" -#: ../flask_admin/contrib/mongoengine/filters.py:77 #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 #: ../flask_admin/contrib/sqla/filters.py:75 msgid "greater than" msgstr "ਤੋਂ ਵੱਧ ਹੈ" -#: ../flask_admin/contrib/mongoengine/filters.py:86 #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 #: ../flask_admin/contrib/sqla/filters.py:83 msgid "smaller than" msgstr "ਤੋਂ ਘੱਟ ਹੈ" -#: ../flask_admin/contrib/mongoengine/filters.py:98 #: ../flask_admin/contrib/peewee/filters.py:88 #: ../flask_admin/contrib/sqla/filters.py:94 msgid "empty" msgstr "ਖਾਲੀ" -#: ../flask_admin/contrib/mongoengine/filters.py:113 #: ../flask_admin/contrib/peewee/filters.py:102 #: ../flask_admin/contrib/sqla/filters.py:108 msgid "in list" msgstr "ਸੂਚੀ ਵਿੱਚ ਹੈ" -#: ../flask_admin/contrib/mongoengine/filters.py:122 #: ../flask_admin/contrib/peewee/filters.py:111 #: ../flask_admin/contrib/sqla/filters.py:118 msgid "not in list" msgstr "ਸੂਚੀ ਵਿੱਚ ਨਹੀਂ ਹੈ " -#: ../flask_admin/contrib/mongoengine/filters.py:222 #: ../flask_admin/contrib/peewee/filters.py:207 #: ../flask_admin/contrib/peewee/filters.py:244 #: ../flask_admin/contrib/peewee/filters.py:281 @@ -293,16 +282,13 @@ msgstr "ਸੂਚੀ ਵਿੱਚ ਨਹੀਂ ਹੈ " msgid "not between" msgstr "ਵਿਚਾਲੇ ਨਹੀਂ ਹੈ " -#: ../flask_admin/contrib/mongoengine/filters.py:247 msgid "ObjectId equals" msgstr "" -#: ../flask_admin/contrib/mongoengine/view.py:551 #, python-format msgid "Failed to get model. %(error)s" msgstr "ਮੌਡਲ ਕੱਢਣ ਵਿੱਚ ਨਾਕਾਮਯਾਬੀ | %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:570 #: ../flask_admin/contrib/peewee/view.py:435 #: ../flask_admin/contrib/pymongo/view.py:316 #: ../flask_admin/contrib/sqla/view.py:1078 @@ -310,7 +296,6 @@ msgstr "ਮੌਡਲ ਕੱਢਣ ਵਿੱਚ ਨਾਕਾਮਯਾਬੀ | %( msgid "Failed to create record. %(error)s" msgstr "ਰਿਕਾਰਡ ਬਨਾਉਣ ਵਿੱਚ ਨਾਕਾਮਯਾਬੀ | %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:596 #: ../flask_admin/contrib/peewee/view.py:454 #: ../flask_admin/contrib/pymongo/view.py:341 #: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 @@ -319,7 +304,6 @@ msgstr "ਰਿਕਾਰਡ ਬਨਾਉਣ ਵਿੱਚ ਨਾਕਾਮਯਾਬ msgid "Failed to update record. %(error)s" msgstr "ਰਿਕਾਰਡ ਬਦਲਣ ਵਿੱਚ ਨਾਕਾਮਯਾਬੀ | %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:619 #: ../flask_admin/contrib/peewee/view.py:469 #: ../flask_admin/contrib/pymongo/view.py:366 #: ../flask_admin/contrib/sqla/view.py:1129 @@ -327,14 +311,12 @@ msgstr "ਰਿਕਾਰਡ ਬਦਲਣ ਵਿੱਚ ਨਾਕਾਮਯਾਬੀ msgid "Failed to delete record. %(error)s" msgstr "ਰਿਕਾਰਡ ਮਿਟਾਉਣ ਵਿੱਚ ਨਾਕਾਮਯਾਬੀ | %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:659 #: ../flask_admin/contrib/peewee/view.py:488 #: ../flask_admin/contrib/pymongo/view.py:385 #: ../flask_admin/contrib/sqla/view.py:1150 msgid "Are you sure you want to delete selected records?" msgstr "ਕੀ ਤੁਹਾਨੂੰ ਯਕੀਨ ਹੈ ਕਿ ਤੁਸੀਂ ਚੁਣੇ ਹੋਏ ਰਿਕਾਰਡ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?" -#: ../flask_admin/contrib/mongoengine/view.py:668 #: ../flask_admin/contrib/peewee/view.py:505 #: ../flask_admin/contrib/pymongo/view.py:395 #: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 @@ -344,7 +326,6 @@ msgid_plural "%(count)s records were successfully deleted." msgstr[0] "ਰਿਕਾਰਡ ਕਾਮਯਾਬੀ ਨਾਲ ਮਿਟਾਇਆ ਗਿਆ |" msgstr[1] "%(count)s ਰਿਕਾਰਡ ਕਾਮਯਾਬੀ ਨਾਲ ਮਿਟਾਏ ਗਏ |" -#: ../flask_admin/contrib/mongoengine/view.py:674 #: ../flask_admin/contrib/peewee/view.py:511 #: ../flask_admin/contrib/pymongo/view.py:400 #: ../flask_admin/contrib/sqla/view.py:1174 @@ -658,4 +639,3 @@ msgstr "ਕਿਰਪਾ ਕਰਕੇ ਘੱਟੋ ਘੱਟ ਇੱਕ ਰਿਕ #: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 msgid "Are you sure you want to delete this record?" msgstr "ਕੀ ਤੁਹਾਨੂੰ ਯਕੀਨ ਹੈ ਕਿ ਤੁਸੀਂ ਰਿਕੌਰਡ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?" - diff --git a/flask_admin/translations/pl/LC_MESSAGES/admin.po b/flask_admin/translations/pl/LC_MESSAGES/admin.po index 54bea4759..b01df7afa 100644 --- a/flask_admin/translations/pl/LC_MESSAGES/admin.po +++ b/flask_admin/translations/pl/LC_MESSAGES/admin.po @@ -196,7 +196,6 @@ msgid "Editing %(path)s" msgstr "Edycja %(path)s" #: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/mongoengine/view.py:658 #: ../flask_admin/contrib/peewee/view.py:487 #: ../flask_admin/contrib/pymongo/view.py:384 #: ../flask_admin/contrib/sqla/view.py:1149 @@ -223,67 +222,57 @@ msgstr "Edycja" msgid "Cannot operate on non empty directories" msgstr "Nie może operować na niepustych katalogach" -#: ../flask_admin/contrib/mongoengine/filters.py:39 #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 #: ../flask_admin/contrib/sqla/filters.py:41 msgid "equals" msgstr "jest równe" -#: ../flask_admin/contrib/mongoengine/filters.py:48 #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 #: ../flask_admin/contrib/sqla/filters.py:49 msgid "not equal" msgstr "nie równe" -#: ../flask_admin/contrib/mongoengine/filters.py:58 #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 #: ../flask_admin/contrib/sqla/filters.py:58 msgid "contains" msgstr "zawiera" -#: ../flask_admin/contrib/mongoengine/filters.py:68 #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 #: ../flask_admin/contrib/sqla/filters.py:67 msgid "not contains" msgstr "nie zawiera" -#: ../flask_admin/contrib/mongoengine/filters.py:77 #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 #: ../flask_admin/contrib/sqla/filters.py:75 msgid "greater than" msgstr "większe niż" -#: ../flask_admin/contrib/mongoengine/filters.py:86 #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 #: ../flask_admin/contrib/sqla/filters.py:83 msgid "smaller than" msgstr "mniejsze niż" -#: ../flask_admin/contrib/mongoengine/filters.py:98 #: ../flask_admin/contrib/peewee/filters.py:88 #: ../flask_admin/contrib/sqla/filters.py:94 msgid "empty" msgstr "puste" -#: ../flask_admin/contrib/mongoengine/filters.py:113 #: ../flask_admin/contrib/peewee/filters.py:102 #: ../flask_admin/contrib/sqla/filters.py:108 msgid "in list" msgstr "na liście" -#: ../flask_admin/contrib/mongoengine/filters.py:122 #: ../flask_admin/contrib/peewee/filters.py:111 #: ../flask_admin/contrib/sqla/filters.py:118 msgid "not in list" msgstr "nie na liście" -#: ../flask_admin/contrib/mongoengine/filters.py:222 #: ../flask_admin/contrib/peewee/filters.py:207 #: ../flask_admin/contrib/peewee/filters.py:244 #: ../flask_admin/contrib/peewee/filters.py:281 @@ -293,16 +282,13 @@ msgstr "nie na liście" msgid "not between" msgstr "nie pomiędzy" -#: ../flask_admin/contrib/mongoengine/filters.py:247 msgid "ObjectId equals" msgstr "" -#: ../flask_admin/contrib/mongoengine/view.py:551 #, python-format msgid "Failed to get model. %(error)s" msgstr "Nie udało się uzyskać modelu. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:570 #: ../flask_admin/contrib/peewee/view.py:435 #: ../flask_admin/contrib/pymongo/view.py:316 #: ../flask_admin/contrib/sqla/view.py:1078 @@ -310,7 +296,6 @@ msgstr "Nie udało się uzyskać modelu. %(error)s" msgid "Failed to create record. %(error)s" msgstr "Nie udało się utworzyć rekordu. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:596 #: ../flask_admin/contrib/peewee/view.py:454 #: ../flask_admin/contrib/pymongo/view.py:341 #: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 @@ -319,7 +304,6 @@ msgstr "Nie udało się utworzyć rekordu. %(error)s" msgid "Failed to update record. %(error)s" msgstr "Nie udało się zaktualizować rekordu. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:619 #: ../flask_admin/contrib/peewee/view.py:469 #: ../flask_admin/contrib/pymongo/view.py:366 #: ../flask_admin/contrib/sqla/view.py:1129 @@ -327,14 +311,12 @@ msgstr "Nie udało się zaktualizować rekordu. %(error)s" msgid "Failed to delete record. %(error)s" msgstr "Nie można usunąć rekordu. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:659 #: ../flask_admin/contrib/peewee/view.py:488 #: ../flask_admin/contrib/pymongo/view.py:385 #: ../flask_admin/contrib/sqla/view.py:1150 msgid "Are you sure you want to delete selected records?" msgstr "Czy na pewno chcesz usunąć zaznaczone rekordy?" -#: ../flask_admin/contrib/mongoengine/view.py:668 #: ../flask_admin/contrib/peewee/view.py:505 #: ../flask_admin/contrib/pymongo/view.py:395 #: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 @@ -345,7 +327,6 @@ msgstr[0] "Rekord został pomyślnie usunięty." msgstr[1] "%(count)s rekordy zostały pomyślnie usunięte." msgstr[2] "%(count)s rekordy zostały pomyślnie usunięte." -#: ../flask_admin/contrib/mongoengine/view.py:674 #: ../flask_admin/contrib/peewee/view.py:511 #: ../flask_admin/contrib/pymongo/view.py:400 #: ../flask_admin/contrib/sqla/view.py:1174 @@ -660,4 +641,3 @@ msgstr "Wybierz co najmniej jeden rekord." #: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 msgid "Are you sure you want to delete this record?" msgstr "Czy na pewno chcesz usunąć ten rekord?" - diff --git a/flask_admin/translations/pt/LC_MESSAGES/admin.po b/flask_admin/translations/pt/LC_MESSAGES/admin.po index e1f21d0d6..660748539 100644 --- a/flask_admin/translations/pt/LC_MESSAGES/admin.po +++ b/flask_admin/translations/pt/LC_MESSAGES/admin.po @@ -196,7 +196,6 @@ msgid "Editing %(path)s" msgstr "Edição %(path)s" #: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/mongoengine/view.py:658 #: ../flask_admin/contrib/peewee/view.py:487 #: ../flask_admin/contrib/pymongo/view.py:384 #: ../flask_admin/contrib/sqla/view.py:1149 @@ -223,67 +222,57 @@ msgstr "Editar" msgid "Cannot operate on non empty directories" msgstr "" -#: ../flask_admin/contrib/mongoengine/filters.py:39 #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 #: ../flask_admin/contrib/sqla/filters.py:41 msgid "equals" msgstr "igual" -#: ../flask_admin/contrib/mongoengine/filters.py:48 #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 #: ../flask_admin/contrib/sqla/filters.py:49 msgid "not equal" msgstr "diferente" -#: ../flask_admin/contrib/mongoengine/filters.py:58 #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 #: ../flask_admin/contrib/sqla/filters.py:58 msgid "contains" msgstr "contém" -#: ../flask_admin/contrib/mongoengine/filters.py:68 #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 #: ../flask_admin/contrib/sqla/filters.py:67 msgid "not contains" msgstr "não contém" -#: ../flask_admin/contrib/mongoengine/filters.py:77 #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 #: ../flask_admin/contrib/sqla/filters.py:75 msgid "greater than" msgstr "maior que" -#: ../flask_admin/contrib/mongoengine/filters.py:86 #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 #: ../flask_admin/contrib/sqla/filters.py:83 msgid "smaller than" msgstr "menor que" -#: ../flask_admin/contrib/mongoengine/filters.py:98 #: ../flask_admin/contrib/peewee/filters.py:88 #: ../flask_admin/contrib/sqla/filters.py:94 msgid "empty" msgstr "vazio" -#: ../flask_admin/contrib/mongoengine/filters.py:113 #: ../flask_admin/contrib/peewee/filters.py:102 #: ../flask_admin/contrib/sqla/filters.py:108 msgid "in list" msgstr "na lista" -#: ../flask_admin/contrib/mongoengine/filters.py:122 #: ../flask_admin/contrib/peewee/filters.py:111 #: ../flask_admin/contrib/sqla/filters.py:118 msgid "not in list" msgstr "Não está na lista" -#: ../flask_admin/contrib/mongoengine/filters.py:222 #: ../flask_admin/contrib/peewee/filters.py:207 #: ../flask_admin/contrib/peewee/filters.py:244 #: ../flask_admin/contrib/peewee/filters.py:281 @@ -293,16 +282,13 @@ msgstr "Não está na lista" msgid "not between" msgstr "Não entre" -#: ../flask_admin/contrib/mongoengine/filters.py:247 msgid "ObjectId equals" msgstr "" -#: ../flask_admin/contrib/mongoengine/view.py:551 #, python-format msgid "Failed to get model. %(error)s" msgstr "Falha ao obter model. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:570 #: ../flask_admin/contrib/peewee/view.py:435 #: ../flask_admin/contrib/pymongo/view.py:316 #: ../flask_admin/contrib/sqla/view.py:1078 @@ -310,7 +296,6 @@ msgstr "Falha ao obter model. %(error)s" msgid "Failed to create record. %(error)s" msgstr "Falha ao criar model. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:596 #: ../flask_admin/contrib/peewee/view.py:454 #: ../flask_admin/contrib/pymongo/view.py:341 #: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 @@ -319,7 +304,6 @@ msgstr "Falha ao criar model. %(error)s" msgid "Failed to update record. %(error)s" msgstr "Falha ao atualizar model. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:619 #: ../flask_admin/contrib/peewee/view.py:469 #: ../flask_admin/contrib/pymongo/view.py:366 #: ../flask_admin/contrib/sqla/view.py:1129 @@ -327,14 +311,12 @@ msgstr "Falha ao atualizar model. %(error)s" msgid "Failed to delete record. %(error)s" msgstr "Falha ao excluir model. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:659 #: ../flask_admin/contrib/peewee/view.py:488 #: ../flask_admin/contrib/pymongo/view.py:385 #: ../flask_admin/contrib/sqla/view.py:1150 msgid "Are you sure you want to delete selected records?" msgstr "Você tem certeza que deseja excluir os models selecionados?" -#: ../flask_admin/contrib/mongoengine/view.py:668 #: ../flask_admin/contrib/peewee/view.py:505 #: ../flask_admin/contrib/pymongo/view.py:395 #: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 @@ -344,7 +326,6 @@ msgid_plural "%(count)s records were successfully deleted." msgstr[0] "Registo eliminado com sucesso." msgstr[1] "%(count)s registos foram eliminados com sucesso." -#: ../flask_admin/contrib/mongoengine/view.py:674 #: ../flask_admin/contrib/peewee/view.py:511 #: ../flask_admin/contrib/pymongo/view.py:400 #: ../flask_admin/contrib/sqla/view.py:1174 @@ -658,4 +639,3 @@ msgstr "Por favor, selecione pelo menos um model." #: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 msgid "Are you sure you want to delete this record?" msgstr "Você tem a certeza que deseja excluir este item?" - diff --git a/flask_admin/translations/pt_BR/LC_MESSAGES/admin.po b/flask_admin/translations/pt_BR/LC_MESSAGES/admin.po index 9f8671111..a8a02ae89 100644 --- a/flask_admin/translations/pt_BR/LC_MESSAGES/admin.po +++ b/flask_admin/translations/pt_BR/LC_MESSAGES/admin.po @@ -196,7 +196,6 @@ msgid "Editing %(path)s" msgstr "Edição %(path)s" #: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/mongoengine/view.py:658 #: ../flask_admin/contrib/peewee/view.py:487 #: ../flask_admin/contrib/pymongo/view.py:384 #: ../flask_admin/contrib/sqla/view.py:1149 @@ -223,67 +222,57 @@ msgstr "Editar" msgid "Cannot operate on non empty directories" msgstr "Não é possível operar em diretórios não-vazios" -#: ../flask_admin/contrib/mongoengine/filters.py:39 #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 #: ../flask_admin/contrib/sqla/filters.py:41 msgid "equals" msgstr "igual" -#: ../flask_admin/contrib/mongoengine/filters.py:48 #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 #: ../flask_admin/contrib/sqla/filters.py:49 msgid "not equal" msgstr "diferente" -#: ../flask_admin/contrib/mongoengine/filters.py:58 #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 #: ../flask_admin/contrib/sqla/filters.py:58 msgid "contains" msgstr "contém" -#: ../flask_admin/contrib/mongoengine/filters.py:68 #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 #: ../flask_admin/contrib/sqla/filters.py:67 msgid "not contains" msgstr "não contém" -#: ../flask_admin/contrib/mongoengine/filters.py:77 #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 #: ../flask_admin/contrib/sqla/filters.py:75 msgid "greater than" msgstr "maior que" -#: ../flask_admin/contrib/mongoengine/filters.py:86 #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 #: ../flask_admin/contrib/sqla/filters.py:83 msgid "smaller than" msgstr "menor que" -#: ../flask_admin/contrib/mongoengine/filters.py:98 #: ../flask_admin/contrib/peewee/filters.py:88 #: ../flask_admin/contrib/sqla/filters.py:94 msgid "empty" msgstr "vazio" -#: ../flask_admin/contrib/mongoengine/filters.py:113 #: ../flask_admin/contrib/peewee/filters.py:102 #: ../flask_admin/contrib/sqla/filters.py:108 msgid "in list" msgstr "na lista" -#: ../flask_admin/contrib/mongoengine/filters.py:122 #: ../flask_admin/contrib/peewee/filters.py:111 #: ../flask_admin/contrib/sqla/filters.py:118 msgid "not in list" msgstr "Não está na lista" -#: ../flask_admin/contrib/mongoengine/filters.py:222 #: ../flask_admin/contrib/peewee/filters.py:207 #: ../flask_admin/contrib/peewee/filters.py:244 #: ../flask_admin/contrib/peewee/filters.py:281 @@ -293,16 +282,13 @@ msgstr "Não está na lista" msgid "not between" msgstr "não entre" -#: ../flask_admin/contrib/mongoengine/filters.py:247 msgid "ObjectId equals" msgstr "ObjectId é igual a" -#: ../flask_admin/contrib/mongoengine/view.py:551 #, python-format msgid "Failed to get model. %(error)s" msgstr "Falha ao obter registro. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:570 #: ../flask_admin/contrib/peewee/view.py:435 #: ../flask_admin/contrib/pymongo/view.py:316 #: ../flask_admin/contrib/sqla/view.py:1078 @@ -310,7 +296,6 @@ msgstr "Falha ao obter registro. %(error)s" msgid "Failed to create record. %(error)s" msgstr "Falha ao criar o registro. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:596 #: ../flask_admin/contrib/peewee/view.py:454 #: ../flask_admin/contrib/pymongo/view.py:341 #: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 @@ -319,7 +304,6 @@ msgstr "Falha ao criar o registro. %(error)s" msgid "Failed to update record. %(error)s" msgstr "Falha ao atualizar registro. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:619 #: ../flask_admin/contrib/peewee/view.py:469 #: ../flask_admin/contrib/pymongo/view.py:366 #: ../flask_admin/contrib/sqla/view.py:1129 @@ -327,14 +311,12 @@ msgstr "Falha ao atualizar registro. %(error)s" msgid "Failed to delete record. %(error)s" msgstr "Falha ao excluir o registro. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:659 #: ../flask_admin/contrib/peewee/view.py:488 #: ../flask_admin/contrib/pymongo/view.py:385 #: ../flask_admin/contrib/sqla/view.py:1150 msgid "Are you sure you want to delete selected records?" msgstr "Tem certeza que deseja excluir os registros selecionados?" -#: ../flask_admin/contrib/mongoengine/view.py:668 #: ../flask_admin/contrib/peewee/view.py:505 #: ../flask_admin/contrib/pymongo/view.py:395 #: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 @@ -344,7 +326,6 @@ msgid_plural "%(count)s records were successfully deleted." msgstr[0] "Registro foi excluído com êxito." msgstr[1] "%(count)s registros foram excluídos com êxito." -#: ../flask_admin/contrib/mongoengine/view.py:674 #: ../flask_admin/contrib/peewee/view.py:511 #: ../flask_admin/contrib/pymongo/view.py:400 #: ../flask_admin/contrib/sqla/view.py:1174 @@ -658,4 +639,3 @@ msgstr "Por favor, selecione pelo menos um registro." #: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 msgid "Are you sure you want to delete this record?" msgstr "Você tem certeza que deseja excluir este item?" - diff --git a/flask_admin/translations/ro/LC_MESSAGES/admin.po b/flask_admin/translations/ro/LC_MESSAGES/admin.po index 359a4e87c..4a208eda0 100644 --- a/flask_admin/translations/ro/LC_MESSAGES/admin.po +++ b/flask_admin/translations/ro/LC_MESSAGES/admin.po @@ -196,7 +196,6 @@ msgid "Editing %(path)s" msgstr "Editare %(path)s" #: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/mongoengine/view.py:658 #: ../flask_admin/contrib/peewee/view.py:487 #: ../flask_admin/contrib/pymongo/view.py:384 #: ../flask_admin/contrib/sqla/view.py:1149 @@ -223,67 +222,57 @@ msgstr "Editare" msgid "Cannot operate on non empty directories" msgstr "" -#: ../flask_admin/contrib/mongoengine/filters.py:39 #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 #: ../flask_admin/contrib/sqla/filters.py:41 msgid "equals" msgstr "este egal cu" -#: ../flask_admin/contrib/mongoengine/filters.py:48 #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 #: ../flask_admin/contrib/sqla/filters.py:49 msgid "not equal" msgstr "nu este egal" -#: ../flask_admin/contrib/mongoengine/filters.py:58 #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 #: ../flask_admin/contrib/sqla/filters.py:58 msgid "contains" msgstr "conţine" -#: ../flask_admin/contrib/mongoengine/filters.py:68 #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 #: ../flask_admin/contrib/sqla/filters.py:67 msgid "not contains" msgstr "nu conţine" -#: ../flask_admin/contrib/mongoengine/filters.py:77 #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 #: ../flask_admin/contrib/sqla/filters.py:75 msgid "greater than" msgstr "mai mare decât" -#: ../flask_admin/contrib/mongoengine/filters.py:86 #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 #: ../flask_admin/contrib/sqla/filters.py:83 msgid "smaller than" msgstr "mai mică decât" -#: ../flask_admin/contrib/mongoengine/filters.py:98 #: ../flask_admin/contrib/peewee/filters.py:88 #: ../flask_admin/contrib/sqla/filters.py:94 msgid "empty" msgstr "gol" -#: ../flask_admin/contrib/mongoengine/filters.py:113 #: ../flask_admin/contrib/peewee/filters.py:102 #: ../flask_admin/contrib/sqla/filters.py:108 msgid "in list" msgstr "în lista" -#: ../flask_admin/contrib/mongoengine/filters.py:122 #: ../flask_admin/contrib/peewee/filters.py:111 #: ../flask_admin/contrib/sqla/filters.py:118 msgid "not in list" msgstr "nu în lista" -#: ../flask_admin/contrib/mongoengine/filters.py:222 #: ../flask_admin/contrib/peewee/filters.py:207 #: ../flask_admin/contrib/peewee/filters.py:244 #: ../flask_admin/contrib/peewee/filters.py:281 @@ -293,16 +282,13 @@ msgstr "nu în lista" msgid "not between" msgstr "nu între" -#: ../flask_admin/contrib/mongoengine/filters.py:247 msgid "ObjectId equals" msgstr "" -#: ../flask_admin/contrib/mongoengine/view.py:551 #, python-format msgid "Failed to get model. %(error)s" msgstr "Nu pentru a obţine model. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:570 #: ../flask_admin/contrib/peewee/view.py:435 #: ../flask_admin/contrib/pymongo/view.py:316 #: ../flask_admin/contrib/sqla/view.py:1078 @@ -310,7 +296,6 @@ msgstr "Nu pentru a obţine model. %(error)s" msgid "Failed to create record. %(error)s" msgstr "Nu a reuşit să creaţi înregistrarea. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:596 #: ../flask_admin/contrib/peewee/view.py:454 #: ../flask_admin/contrib/pymongo/view.py:341 #: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 @@ -319,7 +304,6 @@ msgstr "Nu a reuşit să creaţi înregistrarea. %(error)s" msgid "Failed to update record. %(error)s" msgstr "Nu a reuşit să creaţi înregistrarea. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:619 #: ../flask_admin/contrib/peewee/view.py:469 #: ../flask_admin/contrib/pymongo/view.py:366 #: ../flask_admin/contrib/sqla/view.py:1129 @@ -327,14 +311,12 @@ msgstr "Nu a reuşit să creaţi înregistrarea. %(error)s" msgid "Failed to delete record. %(error)s" msgstr "Imposibil de șters înregistrări. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:659 #: ../flask_admin/contrib/peewee/view.py:488 #: ../flask_admin/contrib/pymongo/view.py:385 #: ../flask_admin/contrib/sqla/view.py:1150 msgid "Are you sure you want to delete selected records?" msgstr "Sigur ștergeți înregistrările selectate?" -#: ../flask_admin/contrib/mongoengine/view.py:668 #: ../flask_admin/contrib/peewee/view.py:505 #: ../flask_admin/contrib/pymongo/view.py:395 #: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 @@ -345,7 +327,6 @@ msgstr[0] "Recordul a fost şters cu succes." msgstr[1] "%(count)s înregistrări au fost şters cu succes." msgstr[2] "%(count)s înregistrări au fost şters cu succes." -#: ../flask_admin/contrib/mongoengine/view.py:674 #: ../flask_admin/contrib/peewee/view.py:511 #: ../flask_admin/contrib/pymongo/view.py:400 #: ../flask_admin/contrib/sqla/view.py:1174 @@ -660,4 +641,3 @@ msgstr "Vă rugăm să selectaţi cel puţin o înregistrare." #: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 msgid "Are you sure you want to delete this record?" msgstr "Sigur ștergeți această înregistrare?" - diff --git a/flask_admin/translations/ru/LC_MESSAGES/admin.po b/flask_admin/translations/ru/LC_MESSAGES/admin.po index e288a57b8..9e5d2024b 100644 --- a/flask_admin/translations/ru/LC_MESSAGES/admin.po +++ b/flask_admin/translations/ru/LC_MESSAGES/admin.po @@ -196,7 +196,6 @@ msgid "Editing %(path)s" msgstr "Редактирование %(path)s" #: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/mongoengine/view.py:658 #: ../flask_admin/contrib/peewee/view.py:487 #: ../flask_admin/contrib/pymongo/view.py:384 #: ../flask_admin/contrib/sqla/view.py:1149 @@ -223,67 +222,57 @@ msgstr "Изменить" msgid "Cannot operate on non empty directories" msgstr "Невозможно редактировать непустые директории" -#: ../flask_admin/contrib/mongoengine/filters.py:39 #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 #: ../flask_admin/contrib/sqla/filters.py:41 msgid "equals" msgstr "равно" -#: ../flask_admin/contrib/mongoengine/filters.py:48 #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 #: ../flask_admin/contrib/sqla/filters.py:49 msgid "not equal" msgstr "не равно" -#: ../flask_admin/contrib/mongoengine/filters.py:58 #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 #: ../flask_admin/contrib/sqla/filters.py:58 msgid "contains" msgstr "содержит" -#: ../flask_admin/contrib/mongoengine/filters.py:68 #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 #: ../flask_admin/contrib/sqla/filters.py:67 msgid "not contains" msgstr "не содержит" -#: ../flask_admin/contrib/mongoengine/filters.py:77 #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 #: ../flask_admin/contrib/sqla/filters.py:75 msgid "greater than" msgstr "больше чем" -#: ../flask_admin/contrib/mongoengine/filters.py:86 #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 #: ../flask_admin/contrib/sqla/filters.py:83 msgid "smaller than" msgstr "меньше чем" -#: ../flask_admin/contrib/mongoengine/filters.py:98 #: ../flask_admin/contrib/peewee/filters.py:88 #: ../flask_admin/contrib/sqla/filters.py:94 msgid "empty" msgstr "пусто" -#: ../flask_admin/contrib/mongoengine/filters.py:113 #: ../flask_admin/contrib/peewee/filters.py:102 #: ../flask_admin/contrib/sqla/filters.py:108 msgid "in list" msgstr "в списке" -#: ../flask_admin/contrib/mongoengine/filters.py:122 #: ../flask_admin/contrib/peewee/filters.py:111 #: ../flask_admin/contrib/sqla/filters.py:118 msgid "not in list" msgstr "нет в списке" -#: ../flask_admin/contrib/mongoengine/filters.py:222 #: ../flask_admin/contrib/peewee/filters.py:207 #: ../flask_admin/contrib/peewee/filters.py:244 #: ../flask_admin/contrib/peewee/filters.py:281 @@ -293,16 +282,13 @@ msgstr "нет в списке" msgid "not between" msgstr "не между" -#: ../flask_admin/contrib/mongoengine/filters.py:247 msgid "ObjectId equals" msgstr "Id объекта равно" -#: ../flask_admin/contrib/mongoengine/view.py:551 #, python-format msgid "Failed to get model. %(error)s" msgstr "Не удалось получить модель. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:570 #: ../flask_admin/contrib/peewee/view.py:435 #: ../flask_admin/contrib/pymongo/view.py:316 #: ../flask_admin/contrib/sqla/view.py:1078 @@ -310,7 +296,6 @@ msgstr "Не удалось получить модель. %(error)s" msgid "Failed to create record. %(error)s" msgstr "Ошибка создания записи: %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:596 #: ../flask_admin/contrib/peewee/view.py:454 #: ../flask_admin/contrib/pymongo/view.py:341 #: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 @@ -319,7 +304,6 @@ msgstr "Ошибка создания записи: %(error)s" msgid "Failed to update record. %(error)s" msgstr "Ошибка обновления записи: %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:619 #: ../flask_admin/contrib/peewee/view.py:469 #: ../flask_admin/contrib/pymongo/view.py:366 #: ../flask_admin/contrib/sqla/view.py:1129 @@ -327,14 +311,12 @@ msgstr "Ошибка обновления записи: %(error)s" msgid "Failed to delete record. %(error)s" msgstr "Ошибка удаления записи: %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:659 #: ../flask_admin/contrib/peewee/view.py:488 #: ../flask_admin/contrib/pymongo/view.py:385 #: ../flask_admin/contrib/sqla/view.py:1150 msgid "Are you sure you want to delete selected records?" msgstr "Вы уверены что хотите удалить ?" -#: ../flask_admin/contrib/mongoengine/view.py:668 #: ../flask_admin/contrib/peewee/view.py:505 #: ../flask_admin/contrib/pymongo/view.py:395 #: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 @@ -345,7 +327,6 @@ msgstr[0] "Запись успешно удалена." msgstr[1] "Было удалено %(count)s записей." msgstr[2] "Было удалено %(count)s записей." -#: ../flask_admin/contrib/mongoengine/view.py:674 #: ../flask_admin/contrib/peewee/view.py:511 #: ../flask_admin/contrib/pymongo/view.py:400 #: ../flask_admin/contrib/sqla/view.py:1174 @@ -660,4 +641,3 @@ msgstr "Выберите по крайней мере одну запись." #: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 msgid "Are you sure you want to delete this record?" msgstr "Вы уверены что хотите удалить эту запись?" - diff --git a/flask_admin/translations/sk/LC_MESSAGES/admin.po b/flask_admin/translations/sk/LC_MESSAGES/admin.po index 2396f78a0..b0e0c25e4 100644 --- a/flask_admin/translations/sk/LC_MESSAGES/admin.po +++ b/flask_admin/translations/sk/LC_MESSAGES/admin.po @@ -196,7 +196,6 @@ msgid "Editing %(path)s" msgstr "Editovať %(path)s" #: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/mongoengine/view.py:658 #: ../flask_admin/contrib/peewee/view.py:487 #: ../flask_admin/contrib/pymongo/view.py:384 #: ../flask_admin/contrib/sqla/view.py:1149 @@ -223,67 +222,57 @@ msgstr "Upraviť" msgid "Cannot operate on non empty directories" msgstr "Nedá sa pracovať s prázdnymi adresármi" -#: ../flask_admin/contrib/mongoengine/filters.py:39 #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 #: ../flask_admin/contrib/sqla/filters.py:41 msgid "equals" msgstr "rovná sa" -#: ../flask_admin/contrib/mongoengine/filters.py:48 #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 #: ../flask_admin/contrib/sqla/filters.py:49 msgid "not equal" msgstr "nerovná sa" -#: ../flask_admin/contrib/mongoengine/filters.py:58 #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 #: ../flask_admin/contrib/sqla/filters.py:58 msgid "contains" msgstr "obsahuje" -#: ../flask_admin/contrib/mongoengine/filters.py:68 #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 #: ../flask_admin/contrib/sqla/filters.py:67 msgid "not contains" msgstr "neobsahuje" -#: ../flask_admin/contrib/mongoengine/filters.py:77 #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 #: ../flask_admin/contrib/sqla/filters.py:75 msgid "greater than" msgstr "viac než" -#: ../flask_admin/contrib/mongoengine/filters.py:86 #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 #: ../flask_admin/contrib/sqla/filters.py:83 msgid "smaller than" msgstr "menej než" -#: ../flask_admin/contrib/mongoengine/filters.py:98 #: ../flask_admin/contrib/peewee/filters.py:88 #: ../flask_admin/contrib/sqla/filters.py:94 msgid "empty" msgstr "prázdne" -#: ../flask_admin/contrib/mongoengine/filters.py:113 #: ../flask_admin/contrib/peewee/filters.py:102 #: ../flask_admin/contrib/sqla/filters.py:108 msgid "in list" msgstr "v zozname" -#: ../flask_admin/contrib/mongoengine/filters.py:122 #: ../flask_admin/contrib/peewee/filters.py:111 #: ../flask_admin/contrib/sqla/filters.py:118 msgid "not in list" msgstr "nie je v zozname" -#: ../flask_admin/contrib/mongoengine/filters.py:222 #: ../flask_admin/contrib/peewee/filters.py:207 #: ../flask_admin/contrib/peewee/filters.py:244 #: ../flask_admin/contrib/peewee/filters.py:281 @@ -293,16 +282,13 @@ msgstr "nie je v zozname" msgid "not between" msgstr "nie je medzi" -#: ../flask_admin/contrib/mongoengine/filters.py:247 msgid "ObjectId equals" msgstr "" -#: ../flask_admin/contrib/mongoengine/view.py:551 #, python-format msgid "Failed to get model. %(error)s" msgstr "Nepodarilo sa získať model. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:570 #: ../flask_admin/contrib/peewee/view.py:435 #: ../flask_admin/contrib/pymongo/view.py:316 #: ../flask_admin/contrib/sqla/view.py:1078 @@ -310,7 +296,6 @@ msgstr "Nepodarilo sa získať model. %(error)s" msgid "Failed to create record. %(error)s" msgstr "Nepodarilo sa vytvoriť záznam. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:596 #: ../flask_admin/contrib/peewee/view.py:454 #: ../flask_admin/contrib/pymongo/view.py:341 #: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 @@ -319,7 +304,6 @@ msgstr "Nepodarilo sa vytvoriť záznam. %(error)s" msgid "Failed to update record. %(error)s" msgstr "Nepodarilo sa aktualizovať záznam. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:619 #: ../flask_admin/contrib/peewee/view.py:469 #: ../flask_admin/contrib/pymongo/view.py:366 #: ../flask_admin/contrib/sqla/view.py:1129 @@ -327,14 +311,12 @@ msgstr "Nepodarilo sa aktualizovať záznam. %(error)s" msgid "Failed to delete record. %(error)s" msgstr "Nepodarilo sa odstrániť záznam. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:659 #: ../flask_admin/contrib/peewee/view.py:488 #: ../flask_admin/contrib/pymongo/view.py:385 #: ../flask_admin/contrib/sqla/view.py:1150 msgid "Are you sure you want to delete selected records?" msgstr "Naozaj chcete odstrániť vybrané záznamy?" -#: ../flask_admin/contrib/mongoengine/view.py:668 #: ../flask_admin/contrib/peewee/view.py:505 #: ../flask_admin/contrib/pymongo/view.py:395 #: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 @@ -345,7 +327,6 @@ msgstr[0] "Záznam bol úspešne odstránený." msgstr[1] "%(count)s záznamy boli úspešne odstránené." msgstr[2] "%(count)s záznamov bolo úspešne odstránených." -#: ../flask_admin/contrib/mongoengine/view.py:674 #: ../flask_admin/contrib/peewee/view.py:511 #: ../flask_admin/contrib/pymongo/view.py:400 #: ../flask_admin/contrib/sqla/view.py:1174 @@ -660,4 +641,3 @@ msgstr "Prosím, vyberte aspoň jeden záznam." #: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 msgid "Are you sure you want to delete this record?" msgstr "Ste si istý, že chcete odstrániť tento záznam?" - diff --git a/flask_admin/translations/sr/LC_MESSAGES/admin.po b/flask_admin/translations/sr/LC_MESSAGES/admin.po index e5e215dfa..26908d7c5 100644 --- a/flask_admin/translations/sr/LC_MESSAGES/admin.po +++ b/flask_admin/translations/sr/LC_MESSAGES/admin.po @@ -196,7 +196,6 @@ msgid "Editing %(path)s" msgstr "Uređivanje %(path)s" #: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/mongoengine/view.py:658 #: ../flask_admin/contrib/peewee/view.py:487 #: ../flask_admin/contrib/pymongo/view.py:384 #: ../flask_admin/contrib/sqla/view.py:1149 @@ -223,67 +222,57 @@ msgstr "Snimanje" msgid "Cannot operate on non empty directories" msgstr "" -#: ../flask_admin/contrib/mongoengine/filters.py:39 #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 #: ../flask_admin/contrib/sqla/filters.py:41 msgid "equals" msgstr "jednaki" -#: ../flask_admin/contrib/mongoengine/filters.py:48 #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 #: ../flask_admin/contrib/sqla/filters.py:49 msgid "not equal" msgstr "Ne ravnopravan" -#: ../flask_admin/contrib/mongoengine/filters.py:58 #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 #: ../flask_admin/contrib/sqla/filters.py:58 msgid "contains" msgstr "sadrži" -#: ../flask_admin/contrib/mongoengine/filters.py:68 #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 #: ../flask_admin/contrib/sqla/filters.py:67 msgid "not contains" msgstr "ne sadrži" -#: ../flask_admin/contrib/mongoengine/filters.py:77 #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 #: ../flask_admin/contrib/sqla/filters.py:75 msgid "greater than" msgstr "veći od" -#: ../flask_admin/contrib/mongoengine/filters.py:86 #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 #: ../flask_admin/contrib/sqla/filters.py:83 msgid "smaller than" msgstr "manji nego" -#: ../flask_admin/contrib/mongoengine/filters.py:98 #: ../flask_admin/contrib/peewee/filters.py:88 #: ../flask_admin/contrib/sqla/filters.py:94 msgid "empty" msgstr "prazan" -#: ../flask_admin/contrib/mongoengine/filters.py:113 #: ../flask_admin/contrib/peewee/filters.py:102 #: ../flask_admin/contrib/sqla/filters.py:108 msgid "in list" msgstr "na listi" -#: ../flask_admin/contrib/mongoengine/filters.py:122 #: ../flask_admin/contrib/peewee/filters.py:111 #: ../flask_admin/contrib/sqla/filters.py:118 msgid "not in list" msgstr "nije na listi" -#: ../flask_admin/contrib/mongoengine/filters.py:222 #: ../flask_admin/contrib/peewee/filters.py:207 #: ../flask_admin/contrib/peewee/filters.py:244 #: ../flask_admin/contrib/peewee/filters.py:281 @@ -293,16 +282,13 @@ msgstr "nije na listi" msgid "not between" msgstr "Ne između" -#: ../flask_admin/contrib/mongoengine/filters.py:247 msgid "ObjectId equals" msgstr "" -#: ../flask_admin/contrib/mongoengine/view.py:551 #, python-format msgid "Failed to get model. %(error)s" msgstr "Nije uspeo da dobije model. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:570 #: ../flask_admin/contrib/peewee/view.py:435 #: ../flask_admin/contrib/pymongo/view.py:316 #: ../flask_admin/contrib/sqla/view.py:1078 @@ -310,7 +296,6 @@ msgstr "Nije uspeo da dobije model. %(error)s" msgid "Failed to create record. %(error)s" msgstr "Nije uspeo da se stvori rekord. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:596 #: ../flask_admin/contrib/peewee/view.py:454 #: ../flask_admin/contrib/pymongo/view.py:341 #: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 @@ -319,7 +304,6 @@ msgstr "Nije uspeo da se stvori rekord. %(error)s" msgid "Failed to update record. %(error)s" msgstr "Nije uspeo da se stvori rekord. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:619 #: ../flask_admin/contrib/peewee/view.py:469 #: ../flask_admin/contrib/pymongo/view.py:366 #: ../flask_admin/contrib/sqla/view.py:1129 @@ -327,14 +311,12 @@ msgstr "Nije uspeo da se stvori rekord. %(error)s" msgid "Failed to delete record. %(error)s" msgstr "Nije uspeo da obrišem rekord. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:659 #: ../flask_admin/contrib/peewee/view.py:488 #: ../flask_admin/contrib/pymongo/view.py:385 #: ../flask_admin/contrib/sqla/view.py:1150 msgid "Are you sure you want to delete selected records?" msgstr "Da li si siguran da želiš da obrišem odabrani ploče?" -#: ../flask_admin/contrib/mongoengine/view.py:668 #: ../flask_admin/contrib/peewee/view.py:505 #: ../flask_admin/contrib/pymongo/view.py:395 #: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 @@ -345,7 +327,6 @@ msgstr[0] "Rekord uspešno izbriše." msgstr[1] "%(count)s ploče su uspešno izbriše." msgstr[2] "%(count)s ploče su uspešno izbriše." -#: ../flask_admin/contrib/mongoengine/view.py:674 #: ../flask_admin/contrib/peewee/view.py:511 #: ../flask_admin/contrib/pymongo/view.py:400 #: ../flask_admin/contrib/sqla/view.py:1174 @@ -660,4 +641,3 @@ msgstr "Molimo odaberite najmanje jedan zapis." #: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 msgid "Are you sure you want to delete this record?" msgstr "Da li ste sigurani da želite obrisati ovaj zapis?" - diff --git a/flask_admin/translations/sv/LC_MESSAGES/admin.po b/flask_admin/translations/sv/LC_MESSAGES/admin.po index 312974e1c..8982f84d8 100644 --- a/flask_admin/translations/sv/LC_MESSAGES/admin.po +++ b/flask_admin/translations/sv/LC_MESSAGES/admin.po @@ -196,7 +196,6 @@ msgid "Editing %(path)s" msgstr "Redigera %(path)s" #: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/mongoengine/view.py:658 #: ../flask_admin/contrib/peewee/view.py:487 #: ../flask_admin/contrib/pymongo/view.py:384 #: ../flask_admin/contrib/sqla/view.py:1149 @@ -223,67 +222,57 @@ msgstr "Ändra" msgid "Cannot operate on non empty directories" msgstr "" -#: ../flask_admin/contrib/mongoengine/filters.py:39 #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 #: ../flask_admin/contrib/sqla/filters.py:41 msgid "equals" msgstr "motsvarar" -#: ../flask_admin/contrib/mongoengine/filters.py:48 #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 #: ../flask_admin/contrib/sqla/filters.py:49 msgid "not equal" msgstr "inte jämnlikt" -#: ../flask_admin/contrib/mongoengine/filters.py:58 #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 #: ../flask_admin/contrib/sqla/filters.py:58 msgid "contains" msgstr "innehåller" -#: ../flask_admin/contrib/mongoengine/filters.py:68 #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 #: ../flask_admin/contrib/sqla/filters.py:67 msgid "not contains" msgstr "innehåller inte" -#: ../flask_admin/contrib/mongoengine/filters.py:77 #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 #: ../flask_admin/contrib/sqla/filters.py:75 msgid "greater than" msgstr "större än" -#: ../flask_admin/contrib/mongoengine/filters.py:86 #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 #: ../flask_admin/contrib/sqla/filters.py:83 msgid "smaller than" msgstr "mindre än" -#: ../flask_admin/contrib/mongoengine/filters.py:98 #: ../flask_admin/contrib/peewee/filters.py:88 #: ../flask_admin/contrib/sqla/filters.py:94 msgid "empty" msgstr "tom" -#: ../flask_admin/contrib/mongoengine/filters.py:113 #: ../flask_admin/contrib/peewee/filters.py:102 #: ../flask_admin/contrib/sqla/filters.py:108 msgid "in list" msgstr "i listan" -#: ../flask_admin/contrib/mongoengine/filters.py:122 #: ../flask_admin/contrib/peewee/filters.py:111 #: ../flask_admin/contrib/sqla/filters.py:118 msgid "not in list" msgstr "inte i listan" -#: ../flask_admin/contrib/mongoengine/filters.py:222 #: ../flask_admin/contrib/peewee/filters.py:207 #: ../flask_admin/contrib/peewee/filters.py:244 #: ../flask_admin/contrib/peewee/filters.py:281 @@ -293,16 +282,13 @@ msgstr "inte i listan" msgid "not between" msgstr "inte mellan" -#: ../flask_admin/contrib/mongoengine/filters.py:247 msgid "ObjectId equals" msgstr "" -#: ../flask_admin/contrib/mongoengine/view.py:551 #, python-format msgid "Failed to get model. %(error)s" msgstr "Det gick inte att få modell. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:570 #: ../flask_admin/contrib/peewee/view.py:435 #: ../flask_admin/contrib/pymongo/view.py:316 #: ../flask_admin/contrib/sqla/view.py:1078 @@ -310,7 +296,6 @@ msgstr "Det gick inte att få modell. %(error)s" msgid "Failed to create record. %(error)s" msgstr "Det gick inte att skapa post. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:596 #: ../flask_admin/contrib/peewee/view.py:454 #: ../flask_admin/contrib/pymongo/view.py:341 #: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 @@ -319,7 +304,6 @@ msgstr "Det gick inte att skapa post. %(error)s" msgid "Failed to update record. %(error)s" msgstr "Det gick inte att skapa post. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:619 #: ../flask_admin/contrib/peewee/view.py:469 #: ../flask_admin/contrib/pymongo/view.py:366 #: ../flask_admin/contrib/sqla/view.py:1129 @@ -327,14 +311,12 @@ msgstr "Det gick inte att skapa post. %(error)s" msgid "Failed to delete record. %(error)s" msgstr "Det gick inte att ta bort posten. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:659 #: ../flask_admin/contrib/peewee/view.py:488 #: ../flask_admin/contrib/pymongo/view.py:385 #: ../flask_admin/contrib/sqla/view.py:1150 msgid "Are you sure you want to delete selected records?" msgstr "Är du säker du vill ta bort markerade poster?" -#: ../flask_admin/contrib/mongoengine/view.py:668 #: ../flask_admin/contrib/peewee/view.py:505 #: ../flask_admin/contrib/pymongo/view.py:395 #: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 @@ -344,7 +326,6 @@ msgid_plural "%(count)s records were successfully deleted." msgstr[0] "Posten har tagits bort." msgstr[1] "%(count)s poster togs framgångsrikt bort." -#: ../flask_admin/contrib/mongoengine/view.py:674 #: ../flask_admin/contrib/peewee/view.py:511 #: ../flask_admin/contrib/pymongo/view.py:400 #: ../flask_admin/contrib/sqla/view.py:1174 @@ -658,4 +639,3 @@ msgstr "Välj minst en post." #: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 msgid "Are you sure you want to delete this record?" msgstr "Är du säker du vill ta bort denna post?" - diff --git a/flask_admin/translations/tr/LC_MESSAGES/admin.po b/flask_admin/translations/tr/LC_MESSAGES/admin.po index e484d35a1..74ed83710 100644 --- a/flask_admin/translations/tr/LC_MESSAGES/admin.po +++ b/flask_admin/translations/tr/LC_MESSAGES/admin.po @@ -196,7 +196,6 @@ msgid "Editing %(path)s" msgstr "%(path)s düzenleme" #: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/mongoengine/view.py:658 #: ../flask_admin/contrib/peewee/view.py:487 #: ../flask_admin/contrib/pymongo/view.py:384 #: ../flask_admin/contrib/sqla/view.py:1149 @@ -223,67 +222,57 @@ msgstr "Düzenle" msgid "Cannot operate on non empty directories" msgstr "Boş olmayan dizinler üzerinde çalışamaz" -#: ../flask_admin/contrib/mongoengine/filters.py:39 #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 #: ../flask_admin/contrib/sqla/filters.py:41 msgid "equals" msgstr "eşittir" -#: ../flask_admin/contrib/mongoengine/filters.py:48 #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 #: ../flask_admin/contrib/sqla/filters.py:49 msgid "not equal" msgstr "eşit değil" -#: ../flask_admin/contrib/mongoengine/filters.py:58 #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 #: ../flask_admin/contrib/sqla/filters.py:58 msgid "contains" msgstr "içerir" -#: ../flask_admin/contrib/mongoengine/filters.py:68 #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 #: ../flask_admin/contrib/sqla/filters.py:67 msgid "not contains" msgstr "değil içerir" -#: ../flask_admin/contrib/mongoengine/filters.py:77 #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 #: ../flask_admin/contrib/sqla/filters.py:75 msgid "greater than" msgstr "daha büyük" -#: ../flask_admin/contrib/mongoengine/filters.py:86 #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 #: ../flask_admin/contrib/sqla/filters.py:83 msgid "smaller than" msgstr "daha küçük" -#: ../flask_admin/contrib/mongoengine/filters.py:98 #: ../flask_admin/contrib/peewee/filters.py:88 #: ../flask_admin/contrib/sqla/filters.py:94 msgid "empty" msgstr "boş" -#: ../flask_admin/contrib/mongoengine/filters.py:113 #: ../flask_admin/contrib/peewee/filters.py:102 #: ../flask_admin/contrib/sqla/filters.py:108 msgid "in list" msgstr "listede" -#: ../flask_admin/contrib/mongoengine/filters.py:122 #: ../flask_admin/contrib/peewee/filters.py:111 #: ../flask_admin/contrib/sqla/filters.py:118 msgid "not in list" msgstr "liste değildir" -#: ../flask_admin/contrib/mongoengine/filters.py:222 #: ../flask_admin/contrib/peewee/filters.py:207 #: ../flask_admin/contrib/peewee/filters.py:244 #: ../flask_admin/contrib/peewee/filters.py:281 @@ -293,16 +282,13 @@ msgstr "liste değildir" msgid "not between" msgstr "arasında değil" -#: ../flask_admin/contrib/mongoengine/filters.py:247 msgid "ObjectId equals" msgstr "ObjectId eşittir" -#: ../flask_admin/contrib/mongoengine/view.py:551 #, python-format msgid "Failed to get model. %(error)s" msgstr "Model alma başarısız oldu. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:570 #: ../flask_admin/contrib/peewee/view.py:435 #: ../flask_admin/contrib/pymongo/view.py:316 #: ../flask_admin/contrib/sqla/view.py:1078 @@ -310,7 +296,6 @@ msgstr "Model alma başarısız oldu. %(error)s" msgid "Failed to create record. %(error)s" msgstr "Kayıt oluşturulamadı. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:596 #: ../flask_admin/contrib/peewee/view.py:454 #: ../flask_admin/contrib/pymongo/view.py:341 #: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 @@ -319,7 +304,6 @@ msgstr "Kayıt oluşturulamadı. %(error)s" msgid "Failed to update record. %(error)s" msgstr "Kaydı oluşturulamadı. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:619 #: ../flask_admin/contrib/peewee/view.py:469 #: ../flask_admin/contrib/pymongo/view.py:366 #: ../flask_admin/contrib/sqla/view.py:1129 @@ -327,14 +311,12 @@ msgstr "Kaydı oluşturulamadı. %(error)s" msgid "Failed to delete record. %(error)s" msgstr "Kaydı silinemedi. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:659 #: ../flask_admin/contrib/peewee/view.py:488 #: ../flask_admin/contrib/pymongo/view.py:385 #: ../flask_admin/contrib/sqla/view.py:1150 msgid "Are you sure you want to delete selected records?" msgstr "Seçili kayıtları silmek istediğinizden emin misiniz?" -#: ../flask_admin/contrib/mongoengine/view.py:668 #: ../flask_admin/contrib/peewee/view.py:505 #: ../flask_admin/contrib/pymongo/view.py:395 #: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 @@ -344,7 +326,6 @@ msgid_plural "%(count)s records were successfully deleted." msgstr[0] "Kaydı başarıyla silindi." msgstr[1] "%(count)s kayıtlarını başarıyla silindi." -#: ../flask_admin/contrib/mongoengine/view.py:674 #: ../flask_admin/contrib/peewee/view.py:511 #: ../flask_admin/contrib/pymongo/view.py:400 #: ../flask_admin/contrib/sqla/view.py:1174 @@ -658,4 +639,3 @@ msgstr "Lütfen en az bir kayıt seçin." #: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 msgid "Are you sure you want to delete this record?" msgstr "Bu kaydı silmek istediğinizden emin misiniz?" - diff --git a/flask_admin/translations/uk/LC_MESSAGES/admin.po b/flask_admin/translations/uk/LC_MESSAGES/admin.po index 138b1431f..948ce3802 100644 --- a/flask_admin/translations/uk/LC_MESSAGES/admin.po +++ b/flask_admin/translations/uk/LC_MESSAGES/admin.po @@ -196,7 +196,6 @@ msgid "Editing %(path)s" msgstr "Редагування %(path)s" #: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/mongoengine/view.py:658 #: ../flask_admin/contrib/peewee/view.py:487 #: ../flask_admin/contrib/pymongo/view.py:384 #: ../flask_admin/contrib/sqla/view.py:1149 @@ -223,67 +222,57 @@ msgstr "Редагувати" msgid "Cannot operate on non empty directories" msgstr "Не можу працювати с непорожніми директоріями" -#: ../flask_admin/contrib/mongoengine/filters.py:39 #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 #: ../flask_admin/contrib/sqla/filters.py:41 msgid "equals" msgstr "дорівнює" -#: ../flask_admin/contrib/mongoengine/filters.py:48 #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 #: ../flask_admin/contrib/sqla/filters.py:49 msgid "not equal" msgstr "не дорівнює" -#: ../flask_admin/contrib/mongoengine/filters.py:58 #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 #: ../flask_admin/contrib/sqla/filters.py:58 msgid "contains" msgstr "містить" -#: ../flask_admin/contrib/mongoengine/filters.py:68 #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 #: ../flask_admin/contrib/sqla/filters.py:67 msgid "not contains" msgstr "не містить" -#: ../flask_admin/contrib/mongoengine/filters.py:77 #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 #: ../flask_admin/contrib/sqla/filters.py:75 msgid "greater than" msgstr "більше, ніж" -#: ../flask_admin/contrib/mongoengine/filters.py:86 #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 #: ../flask_admin/contrib/sqla/filters.py:83 msgid "smaller than" msgstr "менше, ніж" -#: ../flask_admin/contrib/mongoengine/filters.py:98 #: ../flask_admin/contrib/peewee/filters.py:88 #: ../flask_admin/contrib/sqla/filters.py:94 msgid "empty" msgstr "порожній" -#: ../flask_admin/contrib/mongoengine/filters.py:113 #: ../flask_admin/contrib/peewee/filters.py:102 #: ../flask_admin/contrib/sqla/filters.py:108 msgid "in list" msgstr "у списку" -#: ../flask_admin/contrib/mongoengine/filters.py:122 #: ../flask_admin/contrib/peewee/filters.py:111 #: ../flask_admin/contrib/sqla/filters.py:118 msgid "not in list" msgstr "немає у списку" -#: ../flask_admin/contrib/mongoengine/filters.py:222 #: ../flask_admin/contrib/peewee/filters.py:207 #: ../flask_admin/contrib/peewee/filters.py:244 #: ../flask_admin/contrib/peewee/filters.py:281 @@ -293,16 +282,13 @@ msgstr "немає у списку" msgid "not between" msgstr "не між" -#: ../flask_admin/contrib/mongoengine/filters.py:247 msgid "ObjectId equals" msgstr "" -#: ../flask_admin/contrib/mongoengine/view.py:551 #, python-format msgid "Failed to get model. %(error)s" msgstr "Не вдалося отримати моделі. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:570 #: ../flask_admin/contrib/peewee/view.py:435 #: ../flask_admin/contrib/pymongo/view.py:316 #: ../flask_admin/contrib/sqla/view.py:1078 @@ -310,7 +296,6 @@ msgstr "Не вдалося отримати моделі. %(error)s" msgid "Failed to create record. %(error)s" msgstr "Не вдалося створити запис. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:596 #: ../flask_admin/contrib/peewee/view.py:454 #: ../flask_admin/contrib/pymongo/view.py:341 #: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 @@ -319,7 +304,6 @@ msgstr "Не вдалося створити запис. %(error)s" msgid "Failed to update record. %(error)s" msgstr "Не вдалося створити запис. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:619 #: ../flask_admin/contrib/peewee/view.py:469 #: ../flask_admin/contrib/pymongo/view.py:366 #: ../flask_admin/contrib/sqla/view.py:1129 @@ -327,14 +311,12 @@ msgstr "Не вдалося створити запис. %(error)s" msgid "Failed to delete record. %(error)s" msgstr "Не вдалося видалити запис. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:659 #: ../flask_admin/contrib/peewee/view.py:488 #: ../flask_admin/contrib/pymongo/view.py:385 #: ../flask_admin/contrib/sqla/view.py:1150 msgid "Are you sure you want to delete selected records?" msgstr "Ви дійсно бажаєте видалити вибрані записи?" -#: ../flask_admin/contrib/mongoengine/view.py:668 #: ../flask_admin/contrib/peewee/view.py:505 #: ../flask_admin/contrib/pymongo/view.py:395 #: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 @@ -345,7 +327,6 @@ msgstr[0] "Запис успішно вилучено." msgstr[1] "%(count)s records були успішно вилучено." msgstr[2] "%(count)s records були успішно вилучено." -#: ../flask_admin/contrib/mongoengine/view.py:674 #: ../flask_admin/contrib/peewee/view.py:511 #: ../flask_admin/contrib/pymongo/view.py:400 #: ../flask_admin/contrib/sqla/view.py:1174 @@ -660,4 +641,3 @@ msgstr "Будь ласка, оберіть хоча б один запис." #: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 msgid "Are you sure you want to delete this record?" msgstr "Ви дійсно бажаєте видалити цей запис?" - diff --git a/flask_admin/translations/vi/LC_MESSAGES/admin.po b/flask_admin/translations/vi/LC_MESSAGES/admin.po index 1fe50798d..bc361494b 100644 --- a/flask_admin/translations/vi/LC_MESSAGES/admin.po +++ b/flask_admin/translations/vi/LC_MESSAGES/admin.po @@ -196,7 +196,6 @@ msgid "Editing %(path)s" msgstr "Chỉnh sửa %(path)s" #: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/mongoengine/view.py:658 #: ../flask_admin/contrib/peewee/view.py:487 #: ../flask_admin/contrib/pymongo/view.py:384 #: ../flask_admin/contrib/sqla/view.py:1149 @@ -223,67 +222,57 @@ msgstr "Chỉnh sửa" msgid "Cannot operate on non empty directories" msgstr "Không thể hoạt động trên thư mục không trống" -#: ../flask_admin/contrib/mongoengine/filters.py:39 #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 #: ../flask_admin/contrib/sqla/filters.py:41 msgid "equals" msgstr "bằng" -#: ../flask_admin/contrib/mongoengine/filters.py:48 #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 #: ../flask_admin/contrib/sqla/filters.py:49 msgid "not equal" msgstr "không bằng" -#: ../flask_admin/contrib/mongoengine/filters.py:58 #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 #: ../flask_admin/contrib/sqla/filters.py:58 msgid "contains" msgstr "chứa" -#: ../flask_admin/contrib/mongoengine/filters.py:68 #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 #: ../flask_admin/contrib/sqla/filters.py:67 msgid "not contains" msgstr "không có" -#: ../flask_admin/contrib/mongoengine/filters.py:77 #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 #: ../flask_admin/contrib/sqla/filters.py:75 msgid "greater than" msgstr "lớn hơn" -#: ../flask_admin/contrib/mongoengine/filters.py:86 #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 #: ../flask_admin/contrib/sqla/filters.py:83 msgid "smaller than" msgstr "nhỏ hơn" -#: ../flask_admin/contrib/mongoengine/filters.py:98 #: ../flask_admin/contrib/peewee/filters.py:88 #: ../flask_admin/contrib/sqla/filters.py:94 msgid "empty" msgstr "sản phẩm nào" -#: ../flask_admin/contrib/mongoengine/filters.py:113 #: ../flask_admin/contrib/peewee/filters.py:102 #: ../flask_admin/contrib/sqla/filters.py:108 msgid "in list" msgstr "trong danh sách" -#: ../flask_admin/contrib/mongoengine/filters.py:122 #: ../flask_admin/contrib/peewee/filters.py:111 #: ../flask_admin/contrib/sqla/filters.py:118 msgid "not in list" msgstr "không có trong danh sách" -#: ../flask_admin/contrib/mongoengine/filters.py:222 #: ../flask_admin/contrib/peewee/filters.py:207 #: ../flask_admin/contrib/peewee/filters.py:244 #: ../flask_admin/contrib/peewee/filters.py:281 @@ -293,16 +282,13 @@ msgstr "không có trong danh sách" msgid "not between" msgstr "không giữa" -#: ../flask_admin/contrib/mongoengine/filters.py:247 msgid "ObjectId equals" msgstr "" -#: ../flask_admin/contrib/mongoengine/view.py:551 #, python-format msgid "Failed to get model. %(error)s" msgstr "Không thể có được mô hình. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:570 #: ../flask_admin/contrib/peewee/view.py:435 #: ../flask_admin/contrib/pymongo/view.py:316 #: ../flask_admin/contrib/sqla/view.py:1078 @@ -310,7 +296,6 @@ msgstr "Không thể có được mô hình. %(error)s" msgid "Failed to create record. %(error)s" msgstr "Hỏng khi tạo hồ sơ. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:596 #: ../flask_admin/contrib/peewee/view.py:454 #: ../flask_admin/contrib/pymongo/view.py:341 #: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 @@ -319,7 +304,6 @@ msgstr "Hỏng khi tạo hồ sơ. %(error)s" msgid "Failed to update record. %(error)s" msgstr "Hỏng khi tạo hồ sơ. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:619 #: ../flask_admin/contrib/peewee/view.py:469 #: ../flask_admin/contrib/pymongo/view.py:366 #: ../flask_admin/contrib/sqla/view.py:1129 @@ -327,14 +311,12 @@ msgstr "Hỏng khi tạo hồ sơ. %(error)s" msgid "Failed to delete record. %(error)s" msgstr "Không xóa hồ sơ. %(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:659 #: ../flask_admin/contrib/peewee/view.py:488 #: ../flask_admin/contrib/pymongo/view.py:385 #: ../flask_admin/contrib/sqla/view.py:1150 msgid "Are you sure you want to delete selected records?" msgstr "Bạn có chắc bạn muốn xóa hồ sơ đã chọn không?" -#: ../flask_admin/contrib/mongoengine/view.py:668 #: ../flask_admin/contrib/peewee/view.py:505 #: ../flask_admin/contrib/pymongo/view.py:395 #: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 @@ -343,7 +325,6 @@ msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." msgstr[0] "%(count)s hồ sơ đã được xóa thành công." -#: ../flask_admin/contrib/mongoengine/view.py:674 #: ../flask_admin/contrib/peewee/view.py:511 #: ../flask_admin/contrib/pymongo/view.py:400 #: ../flask_admin/contrib/sqla/view.py:1174 @@ -656,4 +637,3 @@ msgstr "Vui lòng chọn ít nhất một kỷ lục." #: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 msgid "Are you sure you want to delete this record?" msgstr "Bạn có chắc bạn muốn xóa hồ sơ này không?" - diff --git a/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/admin.po b/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/admin.po index edbc113d3..6d35fa3b9 100644 --- a/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/admin.po +++ b/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/admin.po @@ -196,7 +196,6 @@ msgid "Editing %(path)s" msgstr "编辑 %(path)s" #: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/mongoengine/view.py:658 #: ../flask_admin/contrib/peewee/view.py:487 #: ../flask_admin/contrib/pymongo/view.py:384 #: ../flask_admin/contrib/sqla/view.py:1149 @@ -223,67 +222,57 @@ msgstr "编辑" msgid "Cannot operate on non empty directories" msgstr "无法对非空的目录操作" -#: ../flask_admin/contrib/mongoengine/filters.py:39 #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 #: ../flask_admin/contrib/sqla/filters.py:41 msgid "equals" msgstr "等于" -#: ../flask_admin/contrib/mongoengine/filters.py:48 #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 #: ../flask_admin/contrib/sqla/filters.py:49 msgid "not equal" msgstr "不等于" -#: ../flask_admin/contrib/mongoengine/filters.py:58 #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 #: ../flask_admin/contrib/sqla/filters.py:58 msgid "contains" msgstr "包含" -#: ../flask_admin/contrib/mongoengine/filters.py:68 #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 #: ../flask_admin/contrib/sqla/filters.py:67 msgid "not contains" msgstr "不包含" -#: ../flask_admin/contrib/mongoengine/filters.py:77 #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 #: ../flask_admin/contrib/sqla/filters.py:75 msgid "greater than" msgstr "大于" -#: ../flask_admin/contrib/mongoengine/filters.py:86 #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 #: ../flask_admin/contrib/sqla/filters.py:83 msgid "smaller than" msgstr "小于" -#: ../flask_admin/contrib/mongoengine/filters.py:98 #: ../flask_admin/contrib/peewee/filters.py:88 #: ../flask_admin/contrib/sqla/filters.py:94 msgid "empty" msgstr "空" -#: ../flask_admin/contrib/mongoengine/filters.py:113 #: ../flask_admin/contrib/peewee/filters.py:102 #: ../flask_admin/contrib/sqla/filters.py:108 msgid "in list" msgstr "在列表中" -#: ../flask_admin/contrib/mongoengine/filters.py:122 #: ../flask_admin/contrib/peewee/filters.py:111 #: ../flask_admin/contrib/sqla/filters.py:118 msgid "not in list" msgstr "不在列表中" -#: ../flask_admin/contrib/mongoengine/filters.py:222 #: ../flask_admin/contrib/peewee/filters.py:207 #: ../flask_admin/contrib/peewee/filters.py:244 #: ../flask_admin/contrib/peewee/filters.py:281 @@ -293,16 +282,13 @@ msgstr "不在列表中" msgid "not between" msgstr "不是之间" -#: ../flask_admin/contrib/mongoengine/filters.py:247 msgid "ObjectId equals" msgstr "ObjectId 等于" -#: ../flask_admin/contrib/mongoengine/view.py:551 #, python-format msgid "Failed to get model. %(error)s" msgstr "获取 model 失败。%(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:570 #: ../flask_admin/contrib/peewee/view.py:435 #: ../flask_admin/contrib/pymongo/view.py:316 #: ../flask_admin/contrib/sqla/view.py:1078 @@ -310,7 +296,6 @@ msgstr "获取 model 失败。%(error)s" msgid "Failed to create record. %(error)s" msgstr "创建 model 失败。%(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:596 #: ../flask_admin/contrib/peewee/view.py:454 #: ../flask_admin/contrib/pymongo/view.py:341 #: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 @@ -319,7 +304,6 @@ msgstr "创建 model 失败。%(error)s" msgid "Failed to update record. %(error)s" msgstr "更新记录失败。%(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:619 #: ../flask_admin/contrib/peewee/view.py:469 #: ../flask_admin/contrib/pymongo/view.py:366 #: ../flask_admin/contrib/sqla/view.py:1129 @@ -327,14 +311,12 @@ msgstr "更新记录失败。%(error)s" msgid "Failed to delete record. %(error)s" msgstr "删除记录失败。%(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:659 #: ../flask_admin/contrib/peewee/view.py:488 #: ../flask_admin/contrib/pymongo/view.py:385 #: ../flask_admin/contrib/sqla/view.py:1150 msgid "Are you sure you want to delete selected records?" msgstr "你打算要删除这些选中的记录吗?" -#: ../flask_admin/contrib/mongoengine/view.py:668 #: ../flask_admin/contrib/peewee/view.py:505 #: ../flask_admin/contrib/pymongo/view.py:395 #: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 @@ -343,7 +325,6 @@ msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." msgstr[0] "%(count)s 记录被成功删除。" -#: ../flask_admin/contrib/mongoengine/view.py:674 #: ../flask_admin/contrib/peewee/view.py:511 #: ../flask_admin/contrib/pymongo/view.py:400 #: ../flask_admin/contrib/sqla/view.py:1174 @@ -656,4 +637,3 @@ msgstr "请至少选择一个 model。" #: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 msgid "Are you sure you want to delete this record?" msgstr "你打算删除这条记录?" - diff --git a/flask_admin/translations/zh_Hant_TW/LC_MESSAGES/admin.po b/flask_admin/translations/zh_Hant_TW/LC_MESSAGES/admin.po index 35291d093..ba876be3f 100644 --- a/flask_admin/translations/zh_Hant_TW/LC_MESSAGES/admin.po +++ b/flask_admin/translations/zh_Hant_TW/LC_MESSAGES/admin.po @@ -198,7 +198,6 @@ msgid "Editing %(path)s" msgstr "編輯 %(path)s" #: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/mongoengine/view.py:658 #: ../flask_admin/contrib/peewee/view.py:487 #: ../flask_admin/contrib/pymongo/view.py:384 #: ../flask_admin/contrib/sqla/view.py:1149 @@ -225,67 +224,57 @@ msgstr "編輯" msgid "Cannot operate on non empty directories" msgstr "" -#: ../flask_admin/contrib/mongoengine/filters.py:39 #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 #: ../flask_admin/contrib/sqla/filters.py:41 msgid "equals" msgstr "等於" -#: ../flask_admin/contrib/mongoengine/filters.py:48 #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 #: ../flask_admin/contrib/sqla/filters.py:49 msgid "not equal" msgstr "不等於" -#: ../flask_admin/contrib/mongoengine/filters.py:58 #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 #: ../flask_admin/contrib/sqla/filters.py:58 msgid "contains" msgstr "包含" -#: ../flask_admin/contrib/mongoengine/filters.py:68 #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 #: ../flask_admin/contrib/sqla/filters.py:67 msgid "not contains" msgstr "不包含" -#: ../flask_admin/contrib/mongoengine/filters.py:77 #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 #: ../flask_admin/contrib/sqla/filters.py:75 msgid "greater than" msgstr "大於" -#: ../flask_admin/contrib/mongoengine/filters.py:86 #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 #: ../flask_admin/contrib/sqla/filters.py:83 msgid "smaller than" msgstr "小於" -#: ../flask_admin/contrib/mongoengine/filters.py:98 #: ../flask_admin/contrib/peewee/filters.py:88 #: ../flask_admin/contrib/sqla/filters.py:94 msgid "empty" msgstr "空" -#: ../flask_admin/contrib/mongoengine/filters.py:113 #: ../flask_admin/contrib/peewee/filters.py:102 #: ../flask_admin/contrib/sqla/filters.py:108 msgid "in list" msgstr "在清單中" -#: ../flask_admin/contrib/mongoengine/filters.py:122 #: ../flask_admin/contrib/peewee/filters.py:111 #: ../flask_admin/contrib/sqla/filters.py:118 msgid "not in list" msgstr "不在清單中" -#: ../flask_admin/contrib/mongoengine/filters.py:222 #: ../flask_admin/contrib/peewee/filters.py:207 #: ../flask_admin/contrib/peewee/filters.py:244 #: ../flask_admin/contrib/peewee/filters.py:281 @@ -295,16 +284,13 @@ msgstr "不在清單中" msgid "not between" msgstr "不是之間" -#: ../flask_admin/contrib/mongoengine/filters.py:247 msgid "ObjectId equals" msgstr "" -#: ../flask_admin/contrib/mongoengine/view.py:551 #, python-format msgid "Failed to get model. %(error)s" msgstr "未能獲取資料。%(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:570 #: ../flask_admin/contrib/peewee/view.py:435 #: ../flask_admin/contrib/pymongo/view.py:316 #: ../flask_admin/contrib/sqla/view.py:1078 @@ -312,7 +298,6 @@ msgstr "未能獲取資料。%(error)s" msgid "Failed to create record. %(error)s" msgstr "建立紀錄的時候發生異常:%(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:596 #: ../flask_admin/contrib/peewee/view.py:454 #: ../flask_admin/contrib/pymongo/view.py:341 #: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 @@ -321,7 +306,6 @@ msgstr "建立紀錄的時候發生異常:%(error)s" msgid "Failed to update record. %(error)s" msgstr "更新紀錄的時候發生異常:%(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:619 #: ../flask_admin/contrib/peewee/view.py:469 #: ../flask_admin/contrib/pymongo/view.py:366 #: ../flask_admin/contrib/sqla/view.py:1129 @@ -329,14 +313,12 @@ msgstr "更新紀錄的時候發生異常:%(error)s" msgid "Failed to delete record. %(error)s" msgstr "刪除紀錄的時候發生異常:%(error)s" -#: ../flask_admin/contrib/mongoengine/view.py:659 #: ../flask_admin/contrib/peewee/view.py:488 #: ../flask_admin/contrib/pymongo/view.py:385 #: ../flask_admin/contrib/sqla/view.py:1150 msgid "Are you sure you want to delete selected records?" msgstr "您確定要刪除這些紀錄嗎?" -#: ../flask_admin/contrib/mongoengine/view.py:668 #: ../flask_admin/contrib/peewee/view.py:505 #: ../flask_admin/contrib/pymongo/view.py:395 #: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 @@ -344,7 +326,6 @@ msgstr "您確定要刪除這些紀錄嗎?" msgid "Record was successfully deleted." msgstr "紀錄刪除成功。" -#: ../flask_admin/contrib/mongoengine/view.py:674 #: ../flask_admin/contrib/peewee/view.py:511 #: ../flask_admin/contrib/pymongo/view.py:400 #: ../flask_admin/contrib/sqla/view.py:1174 @@ -657,4 +638,3 @@ msgstr "請至少選擇一筆資料。" #: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 msgid "Are you sure you want to delete this record?" msgstr "您確定要刪除這筆記錄嗎?" - From ef0cd5847e806659c08b2c931cc7730d66229b6e Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Thu, 1 Aug 2024 21:32:23 +0100 Subject: [PATCH 100/156] Remove (flask-)mongoengine support Support for `mongoengine` relies heavily on `flask-mongoengine` to provide wtforms integration. Unfortunately, `flask-mongoengine` has not seen much activity of support over the last two years, and is no longer compatible with recent versions of our core dependencies (eg flask). Given this, it feels inappropriate and undesirable for us to try to continue to support the functionality that project brings, as it will increasingly apply a higher maintenance burden on us and eventually likely cause compatibility issues for Flask-Admin users generally (if someone wants to use both sqlalchemy and mongoengine views in Flask-Admin, they'd be forced onto the lowest common denominator dependency versions). --- .github/workflows/tests.yaml | 2 - README.md | 5 +- doc/advanced.rst | 34 +- doc/api/index.rst | 2 - doc/api/mod_contrib_mongoengine.rst | 22 - doc/api/mod_contrib_mongoengine_fields.rst | 13 - doc/introduction.rst | 1 - examples/auth-mongoengine/README.rst | 23 - examples/auth-mongoengine/app.py | 151 -- examples/auth-mongoengine/requirements.txt | 4 - examples/auth-mongoengine/templates/form.html | 21 - .../auth-mongoengine/templates/index.html | 15 - examples/mongoengine/README.rst | 22 - examples/mongoengine/app.py | 133 -- examples/mongoengine/requirements.txt | 3 - flask_admin/contrib/mongoengine/__init__.py | 11 - flask_admin/contrib/mongoengine/ajax.py | 143 -- flask_admin/contrib/mongoengine/fields.py | 88 -- flask_admin/contrib/mongoengine/filters.py | 297 ---- flask_admin/contrib/mongoengine/form.py | 259 ---- flask_admin/contrib/mongoengine/helpers.py | 40 - flask_admin/contrib/mongoengine/subdoc.py | 24 - flask_admin/contrib/mongoengine/tools.py | 28 - flask_admin/contrib/mongoengine/typefmt.py | 50 - flask_admin/contrib/mongoengine/view.py | 680 --------- flask_admin/contrib/mongoengine/widgets.py | 63 - flask_admin/tests/mongoengine/__init__.py | 0 flask_admin/tests/mongoengine/conftest.py | 20 - flask_admin/tests/mongoengine/test_basic.py | 1242 ----------------- pyproject.toml | 17 - .../constraints-flaskmongoengine.txt | 3 - tox.ini | 12 +- 32 files changed, 6 insertions(+), 3422 deletions(-) delete mode 100644 doc/api/mod_contrib_mongoengine.rst delete mode 100644 doc/api/mod_contrib_mongoengine_fields.rst delete mode 100644 examples/auth-mongoengine/README.rst delete mode 100644 examples/auth-mongoengine/app.py delete mode 100644 examples/auth-mongoengine/requirements.txt delete mode 100644 examples/auth-mongoengine/templates/form.html delete mode 100644 examples/auth-mongoengine/templates/index.html delete mode 100644 examples/mongoengine/README.rst delete mode 100644 examples/mongoengine/app.py delete mode 100644 examples/mongoengine/requirements.txt delete mode 100644 flask_admin/contrib/mongoengine/__init__.py delete mode 100644 flask_admin/contrib/mongoengine/ajax.py delete mode 100644 flask_admin/contrib/mongoengine/fields.py delete mode 100644 flask_admin/contrib/mongoengine/filters.py delete mode 100644 flask_admin/contrib/mongoengine/form.py delete mode 100644 flask_admin/contrib/mongoengine/helpers.py delete mode 100644 flask_admin/contrib/mongoengine/subdoc.py delete mode 100644 flask_admin/contrib/mongoengine/tools.py delete mode 100644 flask_admin/contrib/mongoengine/typefmt.py delete mode 100644 flask_admin/contrib/mongoengine/view.py delete mode 100644 flask_admin/contrib/mongoengine/widgets.py delete mode 100644 flask_admin/tests/mongoengine/__init__.py delete mode 100644 flask_admin/tests/mongoengine/conftest.py delete mode 100644 flask_admin/tests/mongoengine/test_basic.py delete mode 100644 requirements-skip/constraints-flaskmongoengine.txt diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 93142195f..9a2c4ce52 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -29,8 +29,6 @@ jobs: tox: 'py38-min' - python: '3.12' tox: 'py312-noflaskbabel' - - python: '3.12' - tox: 'py312-flaskmongoengine-sqlalchemy1' - python: '3.8' tox: 'py38-sqlalchemy1' - python: '3.12' diff --git a/README.md b/README.md index 5f43d6f7c..0c0db81c0 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,6 @@ application. Out-of-the-box, Flask-Admin plays nicely with various ORM\'s, including - [SQLAlchemy](http://www.sqlalchemy.org/) -- [MongoEngine](http://mongoengine.org/) - [pymongo](http://api.mongodb.org/python/current/) - and [Peewee](https://github.com/coleifer/peewee). @@ -51,7 +50,7 @@ add your own, or improve on the existing examples, and submit a To run the examples in your local environment: 1. Clone the repository: - + ```bash git clone https://github.com/pallets-eco/flask-admin.git cd flask-admin @@ -62,7 +61,7 @@ To run the examples in your local environment: # Windows: python -m venv .venv .venv\Scripts\activate - + # Linux: python3 -m venv .venv source .venv/bin/activate diff --git a/doc/advanced.rst b/doc/advanced.rst index ac05eaea1..006487bd9 100644 --- a/doc/advanced.rst +++ b/doc/advanced.rst @@ -259,8 +259,6 @@ installed if you need to do any processing on the image files. Have a look at the example at https://github.com/flask-admin/Flask-Admin/tree/master/examples/forms-files-images. -If you are using the MongoEngine backend, Flask-Admin supports GridFS-backed image and file uploads through WTForms fields. Documentation can be found at :mod:`flask_admin.contrib.mongoengine.fields`. - If you just want to manage static files in a directory, without tying them to a database model, then use the :ref:`File-Admin<file-admin>` plug-in. @@ -469,36 +467,6 @@ a model that violates a unique-constraint leads to an Sqlalchemy-Integrity-Error a proper error message and you can change the data in the form. When the application has been started with ``debug=True`` the ``werkzeug`` debugger will catch the exception and will display the stacktrace. -MongoEngine -*********** - -If you're looking for something simpler than SQLAlchemy, and your data models -are reasonably self-contained, then `MongoDB <https://www.mongodb.org/>`_, a popular *NoSQL* database, -could be a better option. - -`MongoEngine <http://mongoengine.org/>`_ is a python wrapper for MongoDB. -For an example of using MongoEngine with Flask-Admin, see -https://github.com/flask-admin/flask-admin/tree/master/examples/mongoengine. - - -Features: - - - MongoEngine 0.7+ support - - Paging, sorting, filters, etc - - Supports complex document structure (lists, subdocuments and so on) - - GridFS support for file and image uploads - -In order to use MongoEngine integration, install the -`Flask-MongoEngine <https://flask-mongoengine.readthedocs.io>`_ package. -Flask-Admin uses form scaffolding from it. - -Known issues: - - - Search functionality can't split query into multiple terms due to - MongoEngine query language limitations - -For more, check the :class:`~flask_admin.contrib.mongoengine` API documentation. - Peewee ****** @@ -577,7 +545,7 @@ though it is easy to get started with a simple `CRUD <http://en.wikipedia.org/wi interface for each model in your application, Flask-Admin doesn't fix you to this approach, and you are free to define other ways of interacting with some, or all, of your models. -Due to Flask-Admin supporting more than one ORM (SQLAlchemy, MongoEngine, Peewee, raw pymongo), the developer is even +Due to Flask-Admin supporting more than one ORM (SQLAlchemy, Peewee, raw pymongo), the developer is even free to mix different model types into one application by instantiating appropriate CRUD classes. Here is a list of some of the configuration properties that are made available by Flask-Admin and the diff --git a/doc/api/index.rst b/doc/api/index.rst index dfe0577f8..1a059eb37 100644 --- a/doc/api/index.rst +++ b/doc/api/index.rst @@ -16,8 +16,6 @@ API mod_contrib_sqla mod_contrib_sqla_fields - mod_contrib_mongoengine - mod_contrib_mongoengine_fields mod_contrib_peewee mod_contrib_pymongo mod_contrib_fileadmin diff --git a/doc/api/mod_contrib_mongoengine.rst b/doc/api/mod_contrib_mongoengine.rst deleted file mode 100644 index 347bde8b8..000000000 --- a/doc/api/mod_contrib_mongoengine.rst +++ /dev/null @@ -1,22 +0,0 @@ -``flask_admin.contrib.mongoengine`` -=================================== - -MongoEngine model backend implementation. - -.. automodule:: flask_admin.contrib.mongoengine - - .. autoclass:: ModelView - :members: - :inherited-members: - :exclude-members: column_filters, column_type_formatters, - filter_converter, model_form_converter - allowed_search_types, form_subdocuments - - Class inherits configuration options from :class:`~flask_admin.model.BaseModelView` and they're not displayed here. - - .. autoattribute:: column_filters - .. autoattribute:: column_type_formatters - .. autoattribute:: filter_converter - .. autoattribute:: model_form_converter - .. autoattribute:: allowed_search_types - .. autoattribute:: form_subdocuments diff --git a/doc/api/mod_contrib_mongoengine_fields.rst b/doc/api/mod_contrib_mongoengine_fields.rst deleted file mode 100644 index f4af06e6f..000000000 --- a/doc/api/mod_contrib_mongoengine_fields.rst +++ /dev/null @@ -1,13 +0,0 @@ -``flask_admin.contrib.mongoengine.fields`` -========================================== - -.. automodule:: flask_admin.contrib.mongoengine.fields - - .. autoclass:: ModelFormField - :members: - - .. autoclass:: MongoFileField - :members: - - .. autoclass:: MongoImageField - :members: diff --git a/doc/introduction.rst b/doc/introduction.rst index b651d8376..ee161c552 100644 --- a/doc/introduction.rst +++ b/doc/introduction.rst @@ -24,7 +24,6 @@ Extra name What functionality does this add to Flask-Admin? sqlalchemy SQLAlchemy, for accessing many database engines sqlalchemy-with-utils As above, with some additional utilities for different data types geoalchemy As with SQLAlchemy, but adding support for geographic data and maps -mongoengine Supports the Flask-Mongoengine library pymongo Supports the PyMongo library peewee Supports the peewee library s3 Supports file admin using AWS S3 diff --git a/examples/auth-mongoengine/README.rst b/examples/auth-mongoengine/README.rst deleted file mode 100644 index b7c341af5..000000000 --- a/examples/auth-mongoengine/README.rst +++ /dev/null @@ -1,23 +0,0 @@ -This example shows how to integrate Flask-Login authentication with Flask-Admin using the MongoEngine backend. - -To run this example: - -1. Clone the repository:: - - git clone https://github.com/flask-admin/flask-admin.git - cd flask-admin - -2. Create and activate a virtual environment:: - - virtualenv env - source env/bin/activate - -3. Install requirements:: - - pip install -r 'examples/auth-mongoengine/requirements.txt' - -4. Run the application:: - - python examples/auth-mongoengine/app.py - - diff --git a/examples/auth-mongoengine/app.py b/examples/auth-mongoengine/app.py deleted file mode 100644 index 854474aa6..000000000 --- a/examples/auth-mongoengine/app.py +++ /dev/null @@ -1,151 +0,0 @@ -from flask import Flask, url_for, redirect, render_template, request -from flask_mongoengine import MongoEngine - -from wtforms import form, fields, validators - -import flask_admin as admin -import flask_login as login -from flask_admin.contrib.mongoengine import ModelView - -# Create application -app = Flask(__name__) - -# Create dummy secrey key so we can use sessions -app.config['SECRET_KEY'] = '123456790' - -# MongoDB settings -app.config['MONGODB_SETTINGS'] = {'DB': 'test'} -db = MongoEngine() -db.init_app(app) - - -# Create user model. For simplicity, it will store passwords in plain text. -# Obviously that's not right thing to do in real world application. -class User(db.Document): - login = db.StringField(max_length=80, unique=True) - email = db.StringField(max_length=120) - password = db.StringField(max_length=64) - - # Flask-Login integration - # NOTE: is_authenticated, is_active, and is_anonymous - # are methods in Flask-Login < 0.3.0 - @property - def is_authenticated(self): - return True - - @property - def is_active(self): - return True - - @property - def is_anonymous(self): - return False - - def get_id(self): - return str(self.id) - - # Required for administrative interface - def __unicode__(self): - return self.login - - -# Define login and registration forms (for flask-login) -class LoginForm(form.Form): - login = fields.StringField(validators=[validators.InputRequired()]) - password = fields.PasswordField(validators=[validators.InputRequired()]) - - def validate_login(self, field): - user = self.get_user() - - if user is None: - raise validators.ValidationError('Invalid user') - - if user.password != self.password.data: - raise validators.ValidationError('Invalid password') - - def get_user(self): - return User.objects(login=self.login.data).first() - - -class RegistrationForm(form.Form): - login = fields.StringField(validators=[validators.InputRequired()]) - email = fields.StringField() - password = fields.PasswordField(validators=[validators.InputRequired()]) - - def validate_login(self, field): - if User.objects(login=self.login.data): - raise validators.ValidationError('Duplicate username') - - -# Initialize flask-login -def init_login(): - login_manager = login.LoginManager() - login_manager.setup_app(app) - - # Create user loader function - @login_manager.user_loader - def load_user(user_id): - return User.objects(id=user_id).first() - - -# Create customized model view class -class MyModelView(ModelView): - def is_accessible(self): - return login.current_user.is_authenticated - - -# Create customized index view class -class MyAdminIndexView(admin.AdminIndexView): - def is_accessible(self): - return login.current_user.is_authenticated - - -# Flask views -@app.route('/') -def index(): - return render_template('index.html', user=login.current_user) - - -@app.route('/login/', methods=('GET', 'POST')) -def login_view(): - form = LoginForm(request.form) - if request.method == 'POST' and form.validate(): - user = form.get_user() - login.login_user(user) - return redirect(url_for('index')) - - return render_template('form.html', form=form) - - -@app.route('/register/', methods=('GET', 'POST')) -def register_view(): - form = RegistrationForm(request.form) - if request.method == 'POST' and form.validate(): - user = User() - - form.populate_obj(user) - user.save() - - login.login_user(user) - return redirect(url_for('index')) - - return render_template('form.html', form=form) - - -@app.route('/logout/') -def logout_view(): - login.logout_user() - return redirect(url_for('index')) - -if __name__ == '__main__': - # Initialize flask-login - init_login() - - # Create admin - admin = admin.Admin(app, 'Example: Auth-Mongo', index_view=MyAdminIndexView()) - - # Add view - admin.add_view(MyModelView(User)) - - # Start app - app.run(debug=True) diff --git a/examples/auth-mongoengine/requirements.txt b/examples/auth-mongoengine/requirements.txt deleted file mode 100644 index 5ac5edc81..000000000 --- a/examples/auth-mongoengine/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -# Install Flask-Admin with required extras from the root of the repository -../..[mongoengine] - -Flask-Login>=0.3.0 diff --git a/examples/auth-mongoengine/templates/form.html b/examples/auth-mongoengine/templates/form.html deleted file mode 100644 index 5a7bbd4be..000000000 --- a/examples/auth-mongoengine/templates/form.html +++ /dev/null @@ -1,21 +0,0 @@ -<html> - <body> - <form method="POST" action=""> - {{ form.hidden_tag() if form.hidden_tag }} - {% for f in form if f.type != 'CSRFTokenField' %} - <div> - {{ f.label }} - {{ f }} - {% if f.errors %} - <ul> - {% for e in f.errors %} - <li>{{ e }}</li> - {% endfor %} - </ul> - {% endif %} - </div> - {% endfor %} - <input type="submit" /> - </form> - </body> -</html> diff --git a/examples/auth-mongoengine/templates/index.html b/examples/auth-mongoengine/templates/index.html deleted file mode 100644 index 9c87bc141..000000000 --- a/examples/auth-mongoengine/templates/index.html +++ /dev/null @@ -1,15 +0,0 @@ -<html> - <body> - <div> - {% if user and user.is_authenticated %} - Hello {{ user.login }}! <a href="{{ url_for('logout_view') }}">Logout</a> - {% else %} - Welcome anonymous user! - <a href="{{ url_for('login_view') }}">Login</a> <a href="{{ url_for('register_view') }}">Register</a> - {% endif %} - </div> - <div> - <a href="{{ url_for('admin.index') }}">Go to admin!</a> - </div> - </body> -</html> diff --git a/examples/mongoengine/README.rst b/examples/mongoengine/README.rst deleted file mode 100644 index c81873095..000000000 --- a/examples/mongoengine/README.rst +++ /dev/null @@ -1,22 +0,0 @@ -MongoEngine model backend integration. - -To run this example: - -1. Clone the repository:: - - git clone https://github.com/flask-admin/flask-admin.git - cd flask-admin - -2. Create and activate a virtual environment:: - - virtualenv env - source env/bin/activate - -3. Install requirements:: - - pip install -r 'examples/mongoengine/requirements.txt' - -4. Run the application:: - - python examples/mongoengine/app.py - diff --git a/examples/mongoengine/app.py b/examples/mongoengine/app.py deleted file mode 100644 index ec4c5ae71..000000000 --- a/examples/mongoengine/app.py +++ /dev/null @@ -1,133 +0,0 @@ -import datetime - -from flask import Flask - -import flask_admin as admin -from flask_mongoengine import MongoEngine -from flask_admin.form import rules -from flask_admin.contrib.mongoengine import ModelView - -# Create application -app = Flask(__name__) - -# Create dummy secrey key so we can use sessions -app.config['SECRET_KEY'] = '123456790' -app.config['MONGODB_SETTINGS'] = {'DB': 'testing'} - -# Create models -db = MongoEngine() -db.init_app(app) - - -# Define mongoengine documents -class User(db.Document): - name = db.StringField(max_length=40) - tags = db.ListField(db.ReferenceField('Tag')) - password = db.StringField(max_length=40) - - def __unicode__(self): - return self.name - - -class Todo(db.Document): - title = db.StringField(max_length=60) - text = db.StringField() - done = db.BooleanField(default=False) - pub_date = db.DateTimeField(default=datetime.datetime.now) - user = db.ReferenceField(User, required=False) - - # Required for administrative interface - def __unicode__(self): - return self.title - - -class Tag(db.Document): - name = db.StringField(max_length=10) - - def __unicode__(self): - return self.name - - -class Comment(db.EmbeddedDocument): - name = db.StringField(max_length=20, required=True) - value = db.StringField(max_length=20) - tag = db.ReferenceField(Tag) - - -class Post(db.Document): - name = db.StringField(max_length=20, required=True) - value = db.StringField(max_length=20) - inner = db.ListField(db.EmbeddedDocumentField(Comment)) - lols = db.ListField(db.StringField(max_length=20)) - - -class File(db.Document): - name = db.StringField(max_length=20) - data = db.FileField() - - -class Image(db.Document): - name = db.StringField(max_length=20) - image = db.ImageField(thumbnail_size=(100, 100, True)) - - -# Customized admin views -class UserView(ModelView): - column_filters = ['name'] - - column_searchable_list = ('name', 'password') - - form_ajax_refs = { - 'tags': { - 'fields': ('name',) - } - } - - -class TodoView(ModelView): - column_filters = ['done'] - - form_ajax_refs = { - 'user': { - 'fields': ['name'] - } - } - - -class PostView(ModelView): - form_subdocuments = { - 'inner': { - 'form_subdocuments': { - None: { - # Add <hr> at the end of the form - 'form_rules': ('name', 'tag', 'value', rules.HTML('<hr>')), - 'form_widget_args': { - 'name': { - 'style': 'color: red' - } - } - } - } - } - } - -# Flask views -@app.route('/') -def index(): - return '<a href="/admin/">Click me to get to Admin!</a>' - - -if __name__ == '__main__': - # Create admin - admin = admin.Admin(app, 'Example: MongoEngine') - - # Add views - admin.add_view(UserView(User)) - admin.add_view(TodoView(Todo)) - admin.add_view(ModelView(Tag)) - admin.add_view(PostView(Post)) - admin.add_view(ModelView(File)) - admin.add_view(ModelView(Image)) - - # Start app - app.run(debug=True) diff --git a/examples/mongoengine/requirements.txt b/examples/mongoengine/requirements.txt deleted file mode 100644 index b92cbe6f8..000000000 --- a/examples/mongoengine/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -../..[mongoengine,images] - -Flask-Login>=0.3.0 diff --git a/flask_admin/contrib/mongoengine/__init__.py b/flask_admin/contrib/mongoengine/__init__.py deleted file mode 100644 index 6559404c6..000000000 --- a/flask_admin/contrib/mongoengine/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -# flake8: noqa -try: - import flask_mongoengine -except ImportError: - raise Exception( - 'Could not import `flask-mongoengine`. ' - 'Enable `mongoengine` integration by installing `flask-admin[mongoengine]`' - ) - -from .view import ModelView -from .form import EmbeddedForm diff --git a/flask_admin/contrib/mongoengine/ajax.py b/flask_admin/contrib/mongoengine/ajax.py deleted file mode 100644 index 470911fbc..000000000 --- a/flask_admin/contrib/mongoengine/ajax.py +++ /dev/null @@ -1,143 +0,0 @@ -import mongoengine - -from flask_admin._compat import string_types, as_unicode, iteritems -from flask_admin.model.ajax import AjaxModelLoader, DEFAULT_PAGE_SIZE - - -class QueryAjaxModelLoader(AjaxModelLoader): - def __init__(self, name, model, **options): - """ - Constructor. - - :param fields: - Fields to run query against - """ - super(QueryAjaxModelLoader, self).__init__(name, options) - - self.model = model - self.fields = options.get('fields') - - self._cached_fields = self._process_fields() - - if not self.fields: - raise ValueError('AJAX loading requires `fields` to be specified for %s.%s' % (model, self.name)) - - def _process_fields(self): - remote_fields = [] - - for field in self.fields: - if isinstance(field, string_types): - attr = getattr(self.model, field, None) - - if not attr: - raise ValueError('%s.%s does not exist.' % (self.model, field)) - - remote_fields.append(attr) - else: - remote_fields.append(field) - - return remote_fields - - def format(self, model): - if not model: - return None - - return (as_unicode(model.pk), as_unicode(model)) - - def get_one(self, pk): - return self.model.objects.filter(pk=pk).first() - - def get_list(self, term, offset=0, limit=DEFAULT_PAGE_SIZE): - query = self.model.objects - - if len(term) > 0: - criteria = None - - for field in self._cached_fields: - flt = {u'%s__icontains' % field.name: term} - - if not criteria: - criteria = mongoengine.Q(**flt) - else: - criteria |= mongoengine.Q(**flt) - - query = query.filter(criteria) - - if offset: - query = query.skip(offset) - - return query.limit(limit).all() - - -def create_ajax_loader(model, name, field_name, opts): - prop = getattr(model, field_name, None) - - if prop is None: - raise ValueError('Model %s does not have field %s.' % (model, field_name)) - - ftype = type(prop).__name__ - - if ftype == 'ListField' or ftype == 'SortedListField': - prop = prop.field - ftype = type(prop).__name__ - - if ftype != 'ReferenceField': - raise ValueError('Dont know how to convert %s type for AJAX loader' % ftype) - - remote_model = prop.document_type - return QueryAjaxModelLoader(name, remote_model, **opts) - - -def process_ajax_references(references, view): - def make_name(base, name): - if base: - return ('%s-%s' % (base, name)).lower() - else: - return as_unicode(name).lower() - - def handle_field(field, subdoc, base): - ftype = type(field).__name__ - - if ftype == 'ListField' or ftype == 'SortedListField': - child_doc = getattr(subdoc, '_form_subdocuments', {}).get(None) - - if child_doc: - handle_field(field.field, child_doc, base) - elif ftype == 'EmbeddedDocumentField': - result = {} - - ajax_refs = getattr(subdoc, 'form_ajax_refs', {}) - - for field_name, opts in iteritems(ajax_refs): - child_name = make_name(base, field_name) - - if isinstance(opts, dict): - loader = create_ajax_loader(field.document_type_obj, child_name, field_name, opts) - else: - loader = opts - - result[field_name] = loader - references[child_name] = loader - - subdoc._form_ajax_refs = result - - child_doc = getattr(subdoc, '_form_subdocuments', None) - if child_doc: - handle_subdoc(field.document_type_obj, subdoc, base) - else: - raise ValueError('Failed to process subdocument field %s' % (field,)) - - def handle_subdoc(model, subdoc, base): - documents = getattr(subdoc, '_form_subdocuments', {}) - - for name, doc in iteritems(documents): - field = getattr(model, name, None) - - if not field: - raise ValueError('Invalid subdocument field %s.%s' % (model, name)) - - handle_field(field, doc, make_name(base, name)) - - handle_subdoc(view.model, view, '') - - return references diff --git a/flask_admin/contrib/mongoengine/fields.py b/flask_admin/contrib/mongoengine/fields.py deleted file mode 100644 index 23a0287fe..000000000 --- a/flask_admin/contrib/mongoengine/fields.py +++ /dev/null @@ -1,88 +0,0 @@ -from mongoengine.base import get_document - -from werkzeug.datastructures import FileStorage - -from wtforms import fields -from wtforms.utils import unset_value - -from . import widgets -from flask_admin.model.fields import InlineFormField - - -def is_empty(file_object): - file_object.seek(0) - first_char = file_object.read(1) - file_object.seek(0) - return not bool(first_char) - - -class ModelFormField(InlineFormField): - """ - Customized ModelFormField for MongoEngine EmbeddedDocuments. - """ - def __init__(self, model, view, form_class, form_opts=None, **kwargs): - super(ModelFormField, self).__init__(form_class, **kwargs) - - self.model = model - if isinstance(self.model, str): - self.model = get_document(self.model) - - self.view = view - self.form_opts = form_opts - - def populate_obj(self, obj, name): - candidate = getattr(obj, name, None) - is_created = candidate is None - if is_created: - candidate = self.model() - setattr(obj, name, candidate) - - self.form.populate_obj(candidate) - - self.view._on_model_change(self.form, candidate, is_created) - - -class MongoFileField(fields.FileField): - """ - GridFS file field. - """ - widget = widgets.MongoFileInput() - - def __init__(self, label=None, validators=None, **kwargs): - super(MongoFileField, self).__init__(label, validators, **kwargs) - - self._should_delete = False - - def process(self, formdata, data=unset_value, extra_filters=None): - if formdata: - marker = '_%s-delete' % self.name - if marker in formdata: - self._should_delete = True - - return super(MongoFileField, self).process(formdata, data, extra_filters) - - def populate_obj(self, obj, name): - field = getattr(obj, name, None) - if field is not None: - # If field should be deleted, clean it up - if self._should_delete: - field.delete() - return - - if isinstance(self.data, FileStorage) and not is_empty(self.data.stream): - if not field.grid_id: - func = field.put - else: - func = field.replace - - func(self.data.stream, - filename=self.data.filename, - content_type=self.data.content_type) - - -class MongoImageField(MongoFileField): - """ - GridFS image field. - """ - - widget = widgets.MongoImageInput() # type: ignore[assignment] diff --git a/flask_admin/contrib/mongoengine/filters.py b/flask_admin/contrib/mongoengine/filters.py deleted file mode 100644 index ccbe30368..000000000 --- a/flask_admin/contrib/mongoengine/filters.py +++ /dev/null @@ -1,297 +0,0 @@ -from flask_admin.babel import lazy_gettext -from flask_admin.model import filters - -from .tools import parse_like_term -from mongoengine.queryset import Q -from bson.errors import InvalidId -from bson.objectid import ObjectId - - -class BaseMongoEngineFilter(filters.BaseFilter): - """ - Base MongoEngine filter. - """ - def __init__(self, column, name, options=None, data_type=None): - """ - Constructor. - - :param column: - Model field - :param name: - Display name - :param options: - Fixed set of options. If provided, will use drop down instead of textbox. - :param data_type: - Client data type - """ - super(BaseMongoEngineFilter, self).__init__(name, options, data_type) - - self.column = column - - -# Common filters -class FilterEqual(BaseMongoEngineFilter): - def apply(self, query, value): - flt = {'%s' % self.column.name: value} - return query.filter(**flt) - - def operation(self): - return lazy_gettext('equals') - - -class FilterNotEqual(BaseMongoEngineFilter): - def apply(self, query, value): - flt = {'%s__ne' % self.column.name: value} - return query.filter(**flt) - - def operation(self): - return lazy_gettext('not equal') - - -class FilterLike(BaseMongoEngineFilter): - def apply(self, query, value): - term, data = parse_like_term(value) - flt = {'%s__%s' % (self.column.name, term): data} - return query.filter(**flt) - - def operation(self): - return lazy_gettext('contains') - - -class FilterNotLike(BaseMongoEngineFilter): - def apply(self, query, value): - term, data = parse_like_term(value) - flt = {'%s__not__%s' % (self.column.name, term): data} - return query.filter(**flt) - - def operation(self): - return lazy_gettext('not contains') - - -class FilterGreater(BaseMongoEngineFilter): - def apply(self, query, value): - flt = {'%s__gt' % self.column.name: value} - return query.filter(**flt) - - def operation(self): - return lazy_gettext('greater than') - - -class FilterSmaller(BaseMongoEngineFilter): - def apply(self, query, value): - flt = {'%s__lt' % self.column.name: value} - return query.filter(**flt) - - def operation(self): - return lazy_gettext('smaller than') - - -class FilterEmpty(BaseMongoEngineFilter, filters.BaseBooleanFilter): - def apply(self, query, value): - if value == '1': - flt = {'%s' % self.column.name: None} - else: - flt = {'%s__ne' % self.column.name: None} - return query.filter(**flt) - - def operation(self): - return lazy_gettext('empty') - - -class FilterInList(BaseMongoEngineFilter): - def __init__(self, column, name, options=None, data_type=None): - super(FilterInList, self).__init__(column, name, options, data_type='select2-tags') - - def clean(self, value): - return [v.strip() for v in value.split(',') if v.strip()] - - def apply(self, query, value): - flt = {'%s__in' % self.column.name: value} - return query.filter(**flt) - - def operation(self): - return lazy_gettext('in list') - - -class FilterNotInList(FilterInList): - def apply(self, query, value): - flt = {'%s__nin' % self.column.name: value} - return query.filter(**flt) - - def operation(self): - return lazy_gettext('not in list') - - -# Customized type filters -class BooleanEqualFilter(FilterEqual, filters.BaseBooleanFilter): - def apply(self, query, value): - flt = {'%s' % self.column.name: value == '1'} - return query.filter(**flt) - - -class BooleanNotEqualFilter(FilterNotEqual, filters.BaseBooleanFilter): - def apply(self, query, value): - flt = {'%s' % self.column.name: value != '1'} - return query.filter(**flt) - - -class IntEqualFilter(FilterEqual, filters.BaseIntFilter): - pass - - -class IntNotEqualFilter(FilterNotEqual, filters.BaseIntFilter): - pass - - -class IntGreaterFilter(FilterGreater, filters.BaseIntFilter): - pass - - -class IntSmallerFilter(FilterSmaller, filters.BaseIntFilter): - pass - - -class IntInListFilter(filters.BaseIntListFilter, FilterInList): - pass - - -class IntNotInListFilter(filters.BaseIntListFilter, FilterNotInList): - pass - - -class FloatEqualFilter(FilterEqual, filters.BaseFloatFilter): - pass - - -class FloatNotEqualFilter(FilterNotEqual, filters.BaseFloatFilter): - pass - - -class FloatGreaterFilter(FilterGreater, filters.BaseFloatFilter): - pass - - -class FloatSmallerFilter(FilterSmaller, filters.BaseFloatFilter): - pass - - -class FloatInListFilter(filters.BaseFloatListFilter, FilterInList): - pass - - -class FloatNotInListFilter(filters.BaseFloatListFilter, FilterNotInList): - pass - - -class DateTimeEqualFilter(FilterEqual, filters.BaseDateTimeFilter): - pass - - -class DateTimeNotEqualFilter(FilterNotEqual, filters.BaseDateTimeFilter): - pass - - -class DateTimeGreaterFilter(FilterGreater, filters.BaseDateTimeFilter): - pass - - -class DateTimeSmallerFilter(FilterSmaller, filters.BaseDateTimeFilter): - pass - - -class DateTimeBetweenFilter(BaseMongoEngineFilter, filters.BaseDateTimeBetweenFilter): - def __init__(self, column, name, options=None, data_type=None): - super(DateTimeBetweenFilter, self).__init__(column, - name, - options, - data_type='datetimerangepicker') - - def apply(self, query, value): - start, end = value - flt = {'%s__gte' % self.column.name: start, '%s__lte' % self.column.name: end} - return query.filter(**flt) - - -class DateTimeNotBetweenFilter(DateTimeBetweenFilter): - def apply(self, query, value): - start, end = value - return query.filter(Q(**{'%s__not__gte' % self.column.name: start}) | - Q(**{'%s__not__lte' % self.column.name: end})) - - def operation(self): - return lazy_gettext('not between') - - -class ReferenceObjectIdFilter(BaseMongoEngineFilter): - def validate(self, value): - """ - Validate value. - If value is valid, returns `True` and `False` otherwise. - :param value: - Value to validate - """ - try: - self.clean(value) - return True - except InvalidId: - return False - - def clean(self, value): - return ObjectId(value.strip()) - - def apply(self, query, value): - flt = {'%s' % self.column.name: value} - return query.filter(**flt) - - def operation(self): - return lazy_gettext('ObjectId equals') - - -# Base MongoEngine filter field converter -class FilterConverter(filters.BaseFilterConverter): - strings = (FilterLike, FilterNotLike, FilterEqual, FilterNotEqual, - FilterEmpty, FilterInList, FilterNotInList) - int_filters = (IntEqualFilter, IntNotEqualFilter, IntGreaterFilter, - IntSmallerFilter, FilterEmpty, IntInListFilter, - IntNotInListFilter) - float_filters = (FloatEqualFilter, FloatNotEqualFilter, FloatGreaterFilter, - FloatSmallerFilter, FilterEmpty, FloatInListFilter, - FloatNotInListFilter) - bool_filters = (BooleanEqualFilter, BooleanNotEqualFilter) - datetime_filters = (DateTimeEqualFilter, DateTimeNotEqualFilter, - DateTimeGreaterFilter, DateTimeSmallerFilter, - DateTimeBetweenFilter, DateTimeNotBetweenFilter, - FilterEmpty) - reference_filters = (ReferenceObjectIdFilter,) - - def convert(self, type_name, column, name): - filter_name = type_name.lower() - - if filter_name in self.converters: - return self.converters[filter_name](column, name) - - return None - - @filters.convert('StringField', 'EmailField', 'URLField') - def conv_string(self, column, name): - return [f(column, name) for f in self.strings] - - @filters.convert('BooleanField') - def conv_bool(self, column, name): - return [f(column, name) for f in self.bool_filters] - - @filters.convert('IntField', 'LongField') - def conv_int(self, column, name): - return [f(column, name) for f in self.int_filters] - - @filters.convert('DecimalField', 'FloatField') - def conv_float(self, column, name): - return [f(column, name) for f in self.float_filters] - - @filters.convert('DateTimeField', 'ComplexDateTimeField') - def conv_datetime(self, column, name): - return [f(column, name) for f in self.datetime_filters] - - @filters.convert('ReferenceField') - def conv_reference(self, column, name): - return [f(column, name) for f in self.reference_filters] diff --git a/flask_admin/contrib/mongoengine/form.py b/flask_admin/contrib/mongoengine/form.py deleted file mode 100644 index 1934f2bc3..000000000 --- a/flask_admin/contrib/mongoengine/form.py +++ /dev/null @@ -1,259 +0,0 @@ -from mongoengine import ReferenceField, ListField -from mongoengine.base import BaseDocument, DocumentMetaclass, get_document - -from wtforms import fields, validators -from flask_mongoengine.wtf import orm, fields as mongo_fields - -from flask_admin import form -from flask_admin.model.form import FieldPlaceholder -from flask_admin.model.fields import InlineFieldList, AjaxSelectField, AjaxSelectMultipleField -from flask_admin.form.validators import FieldListInputRequired -from flask_admin._compat import iteritems - -from .fields import ModelFormField, MongoFileField, MongoImageField -from .subdoc import EmbeddedForm - - -class CustomModelConverter(orm.ModelConverter): - """ - Customized MongoEngine form conversion class. - - Injects various Flask-Admin widgets and handles lists with - customized InlineFieldList field. - """ - - def __init__(self, view): - super(CustomModelConverter, self).__init__() - - self.view = view - - def _get_field_override(self, name): - form_overrides = getattr(self.view, 'form_overrides', None) - - if form_overrides: - return form_overrides.get(name) - - return None - - def _get_subdocument_config(self, name): - config = getattr(self.view, '_form_subdocuments', {}) - - p = config.get(name) - if not p: - return EmbeddedForm() - - return p - - def _convert_choices(self, choices): - for c in choices: - if isinstance(c, tuple): - yield c - else: - yield (c, c) - - def clone_converter(self, view): - return self.__class__(view) - - def convert(self, model, field, field_args): - # Check if it is overridden field - if isinstance(field, FieldPlaceholder): - return form.recreate_field(field.field) - - kwargs = { - 'label': getattr(field, 'verbose_name', None), - 'description': getattr(field, 'help_text', ''), - 'validators': [], - 'filters': [], - 'default': field.default - } - - if field_args: - kwargs.update(field_args) - - if kwargs['validators']: - # Create a copy of the list since we will be modifying it. - kwargs['validators'] = list(kwargs['validators']) - - if field.required: - if isinstance(field, ListField): - kwargs['validators'].append(FieldListInputRequired()) - else: - kwargs['validators'].append(validators.InputRequired()) - elif not isinstance(field, ListField): - kwargs['validators'].append(validators.Optional()) - - ftype = type(field).__name__ - - if field.choices: - kwargs['choices'] = list(self._convert_choices(field.choices)) - - if ftype in self.converters: - kwargs["coerce"] = self.coerce(ftype) - if kwargs.pop('multiple', False): - return fields.SelectMultipleField(**kwargs) - return fields.SelectField(**kwargs) - - ftype = type(field).__name__ - - if hasattr(field, 'to_form_field'): - return field.to_form_field(model, kwargs) - - override = self._get_field_override(field.name) - if override: - return override(**kwargs) - - if ftype in self.converters: - return self.converters[ftype](model, field, kwargs) - - @orm.converts('DateTimeField') - def conv_DateTime(self, model, field, kwargs): - kwargs['widget'] = form.DateTimePickerWidget() - return orm.ModelConverter.conv_DateTime(self, model, field, kwargs) - - @orm.converts('ListField') - def conv_List(self, model, field, kwargs): - if field.field is None: - raise ValueError('ListField "%s" must have field specified for model %s' % (field.name, model)) - - if isinstance(field.field, ReferenceField): - loader = getattr(self.view, '_form_ajax_refs', {}).get(field.name) - if loader: - return AjaxSelectMultipleField(loader, **kwargs) - - kwargs['widget'] = form.Select2Widget(multiple=True) - kwargs.setdefault('validators', []).append(validators.Optional()) - - # TODO: Support AJAX multi-select - doc_type = field.field.document_type - return mongo_fields.ModelSelectMultipleField(model=doc_type, **kwargs) - - # Create converter - view = self._get_subdocument_config(field.name) - converter = self.clone_converter(view) - - if field.field.choices: - kwargs['multiple'] = True - return converter.convert(model, field.field, kwargs) - - unbound_field = converter.convert(model, field.field, {}) - return InlineFieldList(unbound_field, min_entries=0, **kwargs) - - @orm.converts('EmbeddedDocumentField') - def conv_EmbeddedDocument(self, model, field, kwargs): - # FormField does not support validators - kwargs['validators'] = [] - - view = self._get_subdocument_config(field.name) - - form_opts = form.FormOpts(widget_args=getattr(view, 'form_widget_args', None), - form_rules=view._form_rules) - - form_class = view.get_form() - if form_class is None: - converter = self.clone_converter(view) - form_class = get_form(field.document_type_obj, converter, - base_class=view.form_base_class or form.BaseForm, - only=view.form_columns, - exclude=view.form_excluded_columns, - field_args=view.form_args, - extra_fields=view.form_extra_fields) - - form_class = view.postprocess_form(form_class) - - return ModelFormField(field.document_type_obj, view, form_class, form_opts=form_opts, **kwargs) - - @orm.converts('ReferenceField') - def conv_Reference(self, model, field, kwargs): - kwargs['allow_blank'] = not field.required - - loader = getattr(self.view, '_form_ajax_refs', {}).get(field.name) - if loader: - return AjaxSelectField(loader, **kwargs) - - kwargs['widget'] = form.Select2Widget() - - return orm.ModelConverter.conv_Reference(self, model, field, kwargs) - - @orm.converts('FileField') - def conv_File(self, model, field, kwargs): - return MongoFileField(**kwargs) - - @orm.converts('ImageField') - def conv_image(self, model, field, kwargs): - return MongoImageField(**kwargs) - - -def get_form(model, converter, - base_class=form.BaseForm, - only=None, - exclude=None, - field_args=None, - extra_fields=None): - """ - Create a wtforms Form for a given mongoengine Document schema:: - - from flask_mongoengine.wtf import model_form - from myproject.myapp.schemas import Article - ArticleForm = model_form(Article) - - :param model: - A mongoengine Document schema class - :param base_class: - Base form class to extend from. Must be a ``wtforms.Form`` subclass. - :param only: - An optional iterable with the property names that should be included in - the form. Only these properties will have fields. - :param exclude: - An optional iterable with the property names that should be excluded - from the form. All other properties will have fields. - :param field_args: - An optional dictionary of field names mapping to keyword arguments used - to construct each field object. - :param converter: - A converter to generate the fields based on the model properties. If - not set, ``ModelConverter`` is used. - """ - - if isinstance(model, str): - model = get_document(model) - - if not isinstance(model, (BaseDocument, DocumentMetaclass)): - raise TypeError('Model must be a mongoengine Document schema') - - field_args = field_args or {} - - # Find properties - properties = sorted(((k, v) for k, v in iteritems(model._fields)), - key=lambda v: v[1].creation_counter) - - if only: - props = dict(properties) - - def find(name): - if extra_fields and name in extra_fields: - return FieldPlaceholder(extra_fields[name]) - - p = props.get(name) - if p is not None: - return p - - raise ValueError('Invalid model property name %s.%s' % (model, name)) - - properties = ((p, find(p)) for p in only) - elif exclude: - properties = (p for p in properties if p[0] not in exclude) - - # Create fields - field_dict = {} - for name, p in properties: - field = converter.convert(model, p, field_args.get(name)) - if field is not None: - field_dict[name] = field - - # Contribute extra fields - if not only and extra_fields: - for name, field in iteritems(extra_fields): - field_dict[name] = form.recreate_field(field) - - field_dict['model_class'] = model - return type(model.__name__ + 'Form', (base_class,), field_dict) diff --git a/flask_admin/contrib/mongoengine/helpers.py b/flask_admin/contrib/mongoengine/helpers.py deleted file mode 100644 index 48ee9f77c..000000000 --- a/flask_admin/contrib/mongoengine/helpers.py +++ /dev/null @@ -1,40 +0,0 @@ -from mongoengine import ValidationError -from wtforms.validators import ValidationError as wtfValidationError -from flask_admin._compat import itervalues, as_unicode - - -def make_gridfs_args(value): - args = { - 'id': value.grid_id, - 'coll': value.collection_name - } - - if value.db_alias != 'default': - args['db'] = value.db_alias - - return args - - -def make_thumb_args(value): - if getattr(value, 'thumbnail', None): - args = { - 'id': value.thumbnail._id, - 'coll': value.collection_name - } - - if value.db_alias != 'default': - args['db'] = value.db_alias - - return args - else: - return make_gridfs_args(value) - - -def format_error(error): - if isinstance(error, ValidationError): - return as_unicode(error) - - if isinstance(error, wtfValidationError): - return '. '.join(itervalues(error.to_dict())) - - return as_unicode(error) diff --git a/flask_admin/contrib/mongoengine/subdoc.py b/flask_admin/contrib/mongoengine/subdoc.py deleted file mode 100644 index fde8e98f2..000000000 --- a/flask_admin/contrib/mongoengine/subdoc.py +++ /dev/null @@ -1,24 +0,0 @@ -from flask_admin._compat import iteritems -from flask_admin.model.form import InlineBaseFormAdmin - - -class EmbeddedForm(InlineBaseFormAdmin): - def __init__(self, **kwargs): - super(EmbeddedForm, self).__init__(**kwargs) - - self._form_subdocuments = convert_subdocuments(getattr(self, 'form_subdocuments', {})) - - -def convert_subdocuments(values): - result = {} - - for name, p in iteritems(values): - if isinstance(p, dict): - result[name] = EmbeddedForm(**p) - elif isinstance(p, EmbeddedForm): - result[name] = p - else: - raise ValueError('Invalid subdocument type: expecting dict or ' - 'instance of flask_admin.contrib.mongoengine.EmbeddedForm, got %s' % type(p)) - - return result diff --git a/flask_admin/contrib/mongoengine/tools.py b/flask_admin/contrib/mongoengine/tools.py deleted file mode 100644 index 4d52671ce..000000000 --- a/flask_admin/contrib/mongoengine/tools.py +++ /dev/null @@ -1,28 +0,0 @@ -def parse_like_term(term): - """ - Parse search term into (operation, term) tuple. Recognizes operators - in the beginning of the search term. Case insensitive is the default. - - * = case sensitive (can precede other operators) - ^ = starts with - = = exact - - :param term: - Search term - """ - case_sensitive = term.startswith('*') - if case_sensitive: - term = term[1:] - # apply operators - if term.startswith('^'): - oper = 'startswith' - term = term[1:] - elif term.startswith('='): - oper = 'exact' - term = term[1:] - else: - oper = 'contains' - # add case insensitive flag - if not case_sensitive: - oper = 'i' + oper - return oper, term diff --git a/flask_admin/contrib/mongoengine/typefmt.py b/flask_admin/contrib/mongoengine/typefmt.py deleted file mode 100644 index a6b597329..000000000 --- a/flask_admin/contrib/mongoengine/typefmt.py +++ /dev/null @@ -1,50 +0,0 @@ -from typing import Union - -from markupsafe import Markup, escape - -from mongoengine.base import BaseList -from mongoengine.fields import GridFSProxy, ImageGridFsProxy - -from flask_admin.model.typefmt import BASE_FORMATTERS, list_formatter - -from . import helpers - - -def grid_formatter(view, value, name) -> Union[str, Markup]: - if not value.grid_id: - return '' - - args = helpers.make_gridfs_args(value) - - return Markup( - ('<a href="%(url)s" target="_blank">' + - '<i class="icon-file"></i>%(name)s' + - '</a> %(size)dk (%(content_type)s)') % - { - 'url': view.get_url('.api_file_view', **args), - 'name': escape(value.name), - 'size': value.length // 1024, - 'content_type': escape(value.content_type) - }) - - -def grid_image_formatter(view, value, name) -> Union[str, Markup]: - if not value.grid_id: - return '' - - return Markup( - ('<div class="image-thumbnail">' + - '<a href="%(url)s" target="_blank"><img src="%(thumb)s"/></a>' + - '</div>') % - { - 'url': view.get_url('.api_file_view', **helpers.make_gridfs_args(value)), - 'thumb': view.get_url('.api_file_view', **helpers.make_thumb_args(value)), - }) - - -DEFAULT_FORMATTERS = BASE_FORMATTERS.copy() -DEFAULT_FORMATTERS.update({ - BaseList: list_formatter, - GridFSProxy: grid_formatter, - ImageGridFsProxy: grid_image_formatter -}) diff --git a/flask_admin/contrib/mongoengine/view.py b/flask_admin/contrib/mongoengine/view.py deleted file mode 100644 index fc984182b..000000000 --- a/flask_admin/contrib/mongoengine/view.py +++ /dev/null @@ -1,680 +0,0 @@ -import logging - -from flask import request, flash, abort, Response - -from flask_admin import expose -from flask_admin.babel import gettext, ngettext, lazy_gettext -from flask_admin.model import BaseModelView -from flask_admin.model.form import create_editable_list_form -from flask_admin._compat import iteritems, string_types - -import mongoengine -import gridfs -from mongoengine.connection import get_db -from bson.objectid import ObjectId - -from flask_admin.actions import action -from .filters import FilterConverter, BaseMongoEngineFilter -from .form import get_form, CustomModelConverter -from .typefmt import DEFAULT_FORMATTERS -from .tools import parse_like_term -from .helpers import format_error -from .ajax import process_ajax_references, create_ajax_loader -from .subdoc import convert_subdocuments - -# Set up logger -log = logging.getLogger("flask-admin.mongo") - - -SORTABLE_FIELDS = set(( - mongoengine.StringField, - mongoengine.IntField, - mongoengine.FloatField, - mongoengine.BooleanField, - mongoengine.DateField, - mongoengine.DateTimeField, - mongoengine.ComplexDateTimeField, - mongoengine.ObjectIdField, - mongoengine.DecimalField, - mongoengine.ReferenceField, - mongoengine.EmailField, - mongoengine.UUIDField, - mongoengine.URLField -)) - - -class ModelView(BaseModelView): - """ - MongoEngine model scaffolding. - """ - - column_filters = None - """ - Collection of the column filters. - - Can contain either field names or instances of - :class:`flask_admin.contrib.mongoengine.filters.BaseMongoEngineFilter` - classes. - - Filters will be grouped by name when displayed in the drop-down. - - For example:: - - class MyModelView(BaseModelView): - column_filters = ('user', 'email') - - or:: - - from flask_admin.contrib.mongoengine.filters import BooleanEqualFilter - - class MyModelView(BaseModelView): - column_filters = (BooleanEqualFilter(column=User.name, name='Name'),) - - or:: - - from flask_admin.contrib.mongoengine.filters import BaseMongoEngineFilter - - class FilterLastNameBrown(BaseMongoEngineFilter): - def apply(self, query, value): - if value == '1': - return query.filter(self.column == "Brown") - else: - return query.filter(self.column != "Brown") - - def operation(self): - return 'is Brown' - - class MyModelView(BaseModelView): - column_filters = [ - FilterLastNameBrown( - column=User.last_name, name='Last Name', - options=(('1', 'Yes'), ('0', 'No')) - ) - ] - """ - - model_form_converter = CustomModelConverter - """ - Model form conversion class. Use this to implement custom - field conversion logic. - - Custom class should be derived from the - `flask_admin.contrib.mongoengine.form.CustomModelConverter`. - - For example:: - - class MyModelConverter(AdminModelConverter): - pass - - - class MyAdminView(ModelView): - model_form_converter = MyModelConverter - """ - - object_id_converter = ObjectId - """ - Mongodb ``_id`` value conversion function. Default is `bson.ObjectId`. - Use this if you are using String, Binary and etc. - - For example:: - - class MyModelView(BaseModelView): - object_id_converter = int - - or:: - - class MyModelView(BaseModelView): - object_id_converter = str - """ - - filter_converter = FilterConverter() - """ - Field to filter converter. - - Override this attribute to use a non-default converter. - """ - - column_type_formatters = DEFAULT_FORMATTERS - """ - Customized type formatters for MongoEngine backend - """ - - allowed_search_types = (mongoengine.StringField, - mongoengine.URLField, - mongoengine.EmailField, - mongoengine.ReferenceField) - """ - List of allowed search field types. - """ - - form_subdocuments = None - """ - Subdocument configuration options. - - This field accepts dictionary, where key is field name and value is either dictionary or instance of the - `flask_admin.contrib.mongoengine.EmbeddedForm`. - - Consider following example:: - - class Comment(db.EmbeddedDocument): - name = db.StringField(max_length=20, required=True) - value = db.StringField(max_length=20) - - class Post(db.Document): - text = db.StringField(max_length=30) - data = db.EmbeddedDocumentField(Comment) - - class MyAdmin(ModelView): - form_subdocuments = { - 'data': { - 'form_columns': ('name',) - } - } - - In this example, `Post` model has child `Comment` subdocument. When generating form for `Comment` embedded - document, Flask-Admin will only create `name` field. - - It is also possible to use class-based embedded document configuration:: - - class CommentEmbed(EmbeddedForm): - form_columns = ('name',) - - class MyAdmin(ModelView): - form_subdocuments = { - 'data': CommentEmbed() - } - - Arbitrary depth nesting is supported:: - - class SomeEmbed(EmbeddedForm): - form_excluded_columns = ('test',) - - class CommentEmbed(EmbeddedForm): - form_columns = ('name',) - form_subdocuments = { - 'inner': SomeEmbed() - } - - class MyAdmin(ModelView): - form_subdocuments = { - 'data': CommentEmbed() - } - - There's also support for forms embedded into `ListField`. All you have - to do is to create nested rule with `None` as a name. Even though it - is slightly confusing, but that's how Flask-MongoEngine creates - form fields embedded into ListField:: - - class Comment(db.EmbeddedDocument): - name = db.StringField(max_length=20, required=True) - value = db.StringField(max_length=20) - - class Post(db.Document): - text = db.StringField(max_length=30) - data = db.ListField(db.EmbeddedDocumentField(Comment)) - - class MyAdmin(ModelView): - form_subdocuments = { - 'data': { - 'form_subdocuments': { - None: { - 'form_columns': ('name',) - } - } - - } - } - """ - - def __init__(self, model, name=None, - category=None, endpoint=None, url=None, static_folder=None, - menu_class_name=None, menu_icon_type=None, menu_icon_value=None): - """ - Constructor - - :param model: - Model class - :param name: - Display name - :param category: - Display category - :param endpoint: - Endpoint - :param url: - Custom URL - :param menu_class_name: - Optional class name for the menu item. - :param menu_icon_type: - Optional icon. Possible icon types: - - - `flask_admin.consts.ICON_TYPE_GLYPH` - Bootstrap glyph icon - - `flask_admin.consts.ICON_TYPE_FONT_AWESOME` - Font Awesome icon - - `flask_admin.consts.ICON_TYPE_IMAGE` - Image relative to Flask static directory - - `flask_admin.consts.ICON_TYPE_IMAGE_URL` - Image with full URL - - :param menu_icon_value: - Icon glyph name or URL, depending on `menu_icon_type` setting - """ - self._search_fields = [] - - super(ModelView, self).__init__(model, name, category, endpoint, url, static_folder, - menu_class_name=menu_class_name, - menu_icon_type=menu_icon_type, - menu_icon_value=menu_icon_value) - - self._primary_key = self.scaffold_pk() - - def _refresh_cache(self): - """ - Refresh cache. - """ - # Process subdocuments - if self.form_subdocuments is None: - self.form_subdocuments = {} - - self._form_subdocuments = convert_subdocuments(self.form_subdocuments) - - # Cache other properties - super(ModelView, self)._refresh_cache() - - def _process_ajax_references(self): - """ - AJAX endpoint is exposed by top-level admin view class, but - subdocuments might have AJAX references too. - - This method will recursively go over subdocument configuration - and will precompute AJAX references for them ensuring that - subdocuments can also use AJAX to populate their ReferenceFields. - """ - references = super(ModelView, self)._process_ajax_references() - return process_ajax_references(references, self) - - def _get_model_fields(self, model=None): - """ - Inspect model and return list of model fields - - :param model: - Model to inspect - """ - if model is None: - model = self.model - - return sorted(iteritems(model._fields), key=lambda n: n[1].creation_counter) - - def scaffold_pk(self): - # MongoEngine models have predefined 'id' as a key - return 'id' - - def get_pk_value(self, model): - """ - Return the primary key value from the model instance - - :param model: - Model instance - """ - return model.pk - - def scaffold_list_columns(self): - """ - Scaffold list columns - """ - columns = [] - - for n, f in self._get_model_fields(): - if isinstance(f, mongoengine.ListField) and isinstance(f.field, mongoengine.EmbeddedDocumentField): - continue - - if isinstance(f, mongoengine.EmbeddedDocumentField): - continue - - if self.column_display_pk or not isinstance(f, mongoengine.ObjectIdField): - columns.append(n) - - return columns - - def scaffold_sortable_columns(self): - """ - Return a dictionary of sortable columns (name, field) - """ - columns = {} - - for n, f in self._get_model_fields(): - if type(f) in SORTABLE_FIELDS: - if self.column_display_pk or not isinstance(f, mongoengine.ObjectIdField): - columns[n] = f - - return columns - - def init_search(self): - """ - Init search - """ - if self.column_searchable_list: - for p in self.column_searchable_list: - if isinstance(p, string_types): - p = self.model._fields.get(p) - - if p is None: - raise Exception('Invalid search field') - - field_type = type(p) - - # Check type - if (field_type not in self.allowed_search_types): - raise Exception('Can only search on text columns. ' + - 'Failed to setup search for "%s"' % p) - - self._search_fields.append(p) - - return bool(self._search_fields) - - def scaffold_filters(self, name): - """ - Return filter object(s) for the field - - :param name: - Either field name or field instance - """ - if isinstance(name, string_types): - attr = self.model._fields.get(name) - else: - attr = name - - if attr is None: - raise Exception('Failed to find field for filter: %s' % name) - - # Find name - visible_name = None - - if not isinstance(name, string_types): - visible_name = self.get_column_name(attr.name) - - if not visible_name: - visible_name = self.get_column_name(name) - - # Convert filter - type_name = type(attr).__name__ - flt = self.filter_converter.convert(type_name, - attr, - visible_name) - - return flt - - def is_valid_filter(self, filter): - """ - Validate if the provided filter is a valid MongoEngine filter - - :param filter: - Filter object - """ - return isinstance(filter, BaseMongoEngineFilter) - - def scaffold_form(self): - """ - Create form from the model. - """ - form_class = get_form(self.model, - self.model_form_converter(self), - base_class=self.form_base_class, - only=self.form_columns, - exclude=self.form_excluded_columns, - field_args=self.form_args, - extra_fields=self.form_extra_fields) - - return form_class - - def scaffold_list_form(self, widget=None, validators=None): - """ - Create form for the `index_view` using only the columns from - `self.column_editable_list`. - - :param widget: - WTForms widget class. Defaults to `XEditableWidget`. - :param validators: - `form_args` dict with only validators - {'name': {'validators': [required()]}} - """ - form_class = get_form(self.model, - self.model_form_converter(self), - base_class=self.form_base_class, - only=self.column_editable_list, - field_args=validators) - - return create_editable_list_form(self.form_base_class, form_class, - widget) - - # AJAX foreignkey support - def _create_ajax_loader(self, name, opts): - return create_ajax_loader(self.model, name, name, opts) - - def get_query(self): - """ - Returns the QuerySet for this view. By default, it returns all the - objects for the current model. - """ - return self.model.objects - - def _search(self, query, search_term): - # TODO: Unfortunately, MongoEngine contains bug which - # prevents running complex Q queries and, as a result, - # Flask-Admin does not support per-word searching like - # in other backends - op, term = parse_like_term(search_term) - - criteria = None - - for field in self._search_fields: - if isinstance(field, mongoengine.ReferenceField): - import re - regex = re.compile('.*%s.*' % term) - else: - regex = term - flt = {'%s__%s' % (field.name, op): regex} - q = mongoengine.Q(**flt) - - if criteria is None: - criteria = q - else: - criteria |= q - - return query.filter(criteria) - - def get_list(self, page, sort_column, sort_desc, search, filters, - execute=True, page_size=None): - """ - Get list of objects from MongoEngine - - :param page: - Page number - :param sort_column: - Sort column - :param sort_desc: - Sort descending - :param search: - Search criteria - :param filters: - List of applied filters - :param execute: - Run query immediately or not - :param page_size: - Number of results. Defaults to ModelView's page_size. Can be - overriden to change the page_size limit. Removing the page_size - limit requires setting page_size to 0 or False. - """ - query = self.get_query() - - # Filters - if self._filters: - for flt, flt_name, value in filters: - f = self._filters[flt] - query = f.apply(query, f.clean(value)) - - # Search - if self._search_supported and search: - query = self._search(query, search) - - # Get count - count = query.count() if not self.simple_list_pager else None - - # Sorting - if sort_column: - query = query.order_by('%s%s' % ('-' if sort_desc else '', sort_column)) - else: - order = self._get_default_order() - - if order: - keys = ['%s%s' % ('-' if desc else '', col) - for (col, desc) in order] - query = query.order_by(*keys) - - # Pagination - if page_size is None: - page_size = self.page_size - - if page_size: - query = query.limit(page_size) - - if page and page_size: - query = query.skip(page * page_size) - - if execute: - query = query.all() - - return count, query - - def get_one(self, id): - """ - Return a single model instance by its ID - - :param id: - Model ID - """ - try: - return self.get_query().filter(pk=id).first() - except mongoengine.ValidationError as ex: - flash(gettext('Failed to get model. %(error)s', - error=format_error(ex)), - 'error') - return None - - def create_model(self, form): - """ - Create model helper - - :param form: - Form instance - """ - try: - model = self.model() - form.populate_obj(model) - self._on_model_change(form, model, True) - model.save() - except Exception as ex: - if not self.handle_view_exception(ex): - flash(gettext('Failed to create record. %(error)s', - error=format_error(ex)), - 'error') - log.exception('Failed to create record.') - - return False - else: - self.after_model_change(form, model, True) - - return model - - def update_model(self, form, model): - """ - Update model helper - - :param form: - Form instance - :param model: - Model instance to update - """ - try: - form.populate_obj(model) - self._on_model_change(form, model, False) - model.save() - except Exception as ex: - if not self.handle_view_exception(ex): - flash(gettext('Failed to update record. %(error)s', - error=format_error(ex)), - 'error') - log.exception('Failed to update record.') - - return False - else: - self.after_model_change(form, model, False) - - return True - - def delete_model(self, model): - """ - Delete model helper - - :param model: - Model instance - """ - try: - self.on_model_delete(model) - model.delete() - except Exception as ex: - if not self.handle_view_exception(ex): - flash(gettext('Failed to delete record. %(error)s', - error=format_error(ex)), - 'error') - log.exception('Failed to delete record.') - - return False - else: - self.after_model_delete(model) - - return True - - # FileField access API - @expose('/api/file/') - def api_file_view(self): - pk = request.args.get('id') - coll = request.args.get('coll') - db = request.args.get('db', 'default') - - if not pk or not coll or not db: - abort(404) - - fs = gridfs.GridFS(get_db(db), coll) - - data = fs.get(self.object_id_converter(pk)) - if not data: - abort(404) - - return Response(data.read(), - content_type=data.content_type, - headers={'Content-Length': data.length}) - - # Default model actions - def is_action_allowed(self, name): - # Check delete action permission - if name == 'delete' and not self.can_delete: - return False - - return super(ModelView, self).is_action_allowed(name) - - @action('delete', - lazy_gettext('Delete'), - lazy_gettext('Are you sure you want to delete selected records?')) - def action_delete(self, ids): - try: - count = 0 - - all_ids = [self.object_id_converter(pk) for pk in ids] - for obj in self.get_query().in_bulk(all_ids).values(): - count += self.delete_model(obj) - - flash(ngettext('Record was successfully deleted.', - '%(count)s records were successfully deleted.', - count, - count=count), 'success') - except Exception as ex: - if not self.handle_view_exception(ex): - flash(gettext('Failed to delete records. %(error)s', error=str(ex)), - 'error') diff --git a/flask_admin/contrib/mongoengine/widgets.py b/flask_admin/contrib/mongoengine/widgets.py deleted file mode 100644 index 55a503c81..000000000 --- a/flask_admin/contrib/mongoengine/widgets.py +++ /dev/null @@ -1,63 +0,0 @@ -from wtforms.widgets import html_params - -from markupsafe import escape - -from mongoengine.fields import GridFSProxy, ImageGridFsProxy - -from flask_admin._backwards import Markup -from flask_admin.helpers import get_url -from . import helpers - - -class MongoFileInput(object): - """ - Renders a file input chooser field. - """ - template = ('<div>' - ' <i class="icon-file"></i>%(name)s %(size)dk (%(content_type)s)' - ' <input type="checkbox" name="%(marker)s">Delete</input>' - '</div>') - - def __call__(self, field, **kwargs): - kwargs.setdefault('id', field.id) - - placeholder = '' - if field.data and isinstance(field.data, GridFSProxy): - data = field.data - - placeholder = self.template % { - 'name': escape(data.name), - 'content_type': escape(data.content_type), - 'size': data.length // 1024, - 'marker': '_%s-delete' % field.name - } - - return Markup('%s<input %s>' % (placeholder, - html_params(name=field.name, - type='file', - **kwargs))) - - -class MongoImageInput(object): - """ - Renders a file input chooser field. - """ - template = ('<div class="image-thumbnail">' - ' <img src="%(thumb)s"/>' - ' <input type="checkbox" name="%(marker)s">Delete</input>' - '</div>') - - def __call__(self, field, **kwargs): - kwargs.setdefault('id', field.id) - placeholder = '' - if field.data and isinstance(field.data, ImageGridFsProxy): - args = helpers.make_thumb_args(field.data) - placeholder = self.template % { - 'thumb': get_url('.api_file_view', **args), - 'marker': '_%s-delete' % field.name - } - - return Markup('%s<input %s>' % (placeholder, - html_params(name=field.name, - type='file', - **kwargs))) diff --git a/flask_admin/tests/mongoengine/__init__.py b/flask_admin/tests/mongoengine/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/flask_admin/tests/mongoengine/conftest.py b/flask_admin/tests/mongoengine/conftest.py deleted file mode 100644 index 5a504e7f8..000000000 --- a/flask_admin/tests/mongoengine/conftest.py +++ /dev/null @@ -1,20 +0,0 @@ -import pytest - -from flask_admin import Admin -from flask_mongoengine import MongoEngine - - -@pytest.fixture -def db(): - db = MongoEngine() - yield db - - -@pytest.fixture -def admin(app, babel, db): - app.config['MONGODB_SETTINGS'] = {'DB': 'tests'} - - db.init_app(app) - - admin = Admin(app) - yield admin diff --git a/flask_admin/tests/mongoengine/test_basic.py b/flask_admin/tests/mongoengine/test_basic.py deleted file mode 100644 index aca1ac8ef..000000000 --- a/flask_admin/tests/mongoengine/test_basic.py +++ /dev/null @@ -1,1242 +0,0 @@ -from wtforms import fields, validators - -from flask_admin import form -from flask_admin._compat import as_unicode -from flask_admin.contrib.mongoengine import ModelView - -from datetime import datetime - - -class CustomModelView(ModelView): - def __init__(self, model, - name=None, category=None, endpoint=None, url=None, - **kwargs): - for k, v in kwargs.items(): - setattr(self, k, v) - - super(CustomModelView, self).__init__(model, - name, category, - endpoint, url) - - -def create_models(db): - class Model1(db.Document): - test1 = db.StringField(max_length=20) - test2 = db.StringField(max_length=20) - test3 = db.StringField() - test4 = db.StringField() - date_field = db.DateField() - datetime_field = db.DateTimeField() - - def __str__(self): - return self.test1 - - class Model2(db.Document): - string_field = db.StringField() - int_field = db.IntField() - float_field = db.FloatField() - bool_field = db.BooleanField() - - model1 = db.ReferenceField(Model1) - - Model1.objects.delete() - Model2.objects.delete() - - return Model1, Model2 - - -def fill_db(Model1, Model2): - Model1(test1='test1_val_1', test2='test2_val_1').save() - Model1(test1='test1_val_2', test2='test2_val_2').save() - Model1(test1='test1_val_3', test2='test2_val_3').save() - Model1(test1='test1_val_4', test2='test2_val_4').save() - Model1(test1=None, test2='empty_obj').save() - - Model2(string_field='string_field_val_1', int_field=None, - float_field=None, bool_field=True).save() - Model2(string_field='string_field_val_2', int_field=None, - float_field=None, bool_field=False).save() - Model2(string_field='string_field_val_3', int_field=5000, - float_field=25.9).save() - Model2(string_field='string_field_val_4', int_field=9000, - float_field=75.5).save() - Model2(string_field='string_field_val_5', - int_field=6169453081680413441).save() - - Model1(test1='datetime_obj1', - datetime_field=datetime(2014, 4, 3, 1, 9, 0)).save() - Model1(test1='datetime_obj2', - datetime_field=datetime(2013, 3, 2, 0, 8, 0)).save() - - -def test_model(app, db, admin): - Model1, Model2 = create_models(db) - - view = CustomModelView(Model1) - admin.add_view(view) - - assert view.model == Model1 - assert view.name == 'Model1' - assert view.endpoint == 'model1' - - assert view._primary_key == 'id' - - assert 'test1' in view._sortable_columns - assert 'test2' in view._sortable_columns - assert 'test3' in view._sortable_columns - assert 'test4' in view._sortable_columns - assert 'date_field' in view._sortable_columns - - assert view._create_form_class is not None - assert view._edit_form_class is not None - assert not view._search_supported - assert view._filters is None - - assert view._create_form_class.test1.field_class == fields.StringField - assert view._create_form_class.test2.field_class == fields.StringField - - assert view._create_form_class.test3.field_class == fields.TextAreaField - assert view._create_form_class.test4.field_class == fields.TextAreaField - - # Make some test clients - client = app.test_client() - - rv = client.get('/admin/model1/') - assert rv.status_code == 200 - - rv = client.get('/admin/model1/new/') - assert rv.status_code == 200 - - rv = client.post('/admin/model1/new/', - data=dict(test1='test1large', test2='test2')) - assert rv.status_code == 302 - - model = Model1.objects.first() - assert model.test1 == 'test1large' - assert model.test2 == 'test2' - assert model.test3 == '' - assert model.test4 == '' - - rv = client.get('/admin/model1/') - assert rv.status_code == 200 - assert b'test1large' in rv.data - - url = '/admin/model1/edit/?id=%s' % model.id - rv = client.get(url) - assert rv.status_code == 200 - - rv = client.post(url, - data=dict(test1='test1small', test2='test2large')) - assert rv.status_code == 302 - - model = Model1.objects.first() - assert model.test1 == 'test1small' - assert model.test2 == 'test2large' - assert model.test3 == '' - assert model.test4 == '' - - url = '/admin/model1/delete/?id=%s' % model.id - rv = client.post(url) - assert rv.status_code == 302 - assert Model1.objects.count() == 0 - - -def test_column_editable_list(app, db, admin): - Model1, Model2 = create_models(db) - - view = CustomModelView(Model1, - column_editable_list=['test1', 'datetime_field']) - admin.add_view(view) - - # Test in-line editing for relations - view = CustomModelView(Model2, column_editable_list=['model1']) - admin.add_view(view) - - fill_db(Model1, Model2) - - client = app.test_client() - - # Test in-line edit field rendering - rv = client.get('/admin/model1/') - data = rv.data.decode('utf-8') - assert 'data-role="x-editable"' in data - - # Form - Test basic in-line edit functionality - obj1 = Model1.objects.get(test1='test1_val_3') - rv = client.post('/admin/model1/ajax/update/', data={ - 'list_form_pk': str(obj1.id), - 'test1': 'change-success-1', - }) - data = rv.data.decode('utf-8') - assert 'Record was successfully saved.' == data - - # confirm the value has changed - rv = client.get('/admin/model1/') - data = rv.data.decode('utf-8') - assert 'change-success-1' in data - - # Test validation error - obj2 = Model1.objects.get(test1='datetime_obj1') - rv = client.post('/admin/model1/ajax/update/', data={ - 'list_form_pk': str(obj2.id), - 'datetime_field': 'problematic-input', - }) - assert rv.status_code == 500 - - # Test invalid primary key - rv = client.post('/admin/model1/ajax/update/', data={ - 'list_form_pk': '1000', - 'test1': 'problematic-input', - }) - data = rv.data.decode('utf-8') - assert rv.status_code == 500 - - # Test editing column not in column_editable_list - rv = client.post('/admin/model1/ajax/update/', data={ - 'list_form_pk': '1', - 'test2': 'problematic-input', - }) - data = rv.data.decode('utf-8') - assert 'problematic-input' not in data - - obj3 = Model2.objects.get(string_field='string_field_val_1') - rv = client.post('/admin/model2/ajax/update/', data={ - 'list_form_pk': str(obj3.id), - 'model1': str(obj1.id), - }) - data = rv.data.decode('utf-8') - assert 'Record was successfully saved.' == data - - # confirm the value has changed - rv = client.get('/admin/model2/') - data = rv.data.decode('utf-8') - assert 'test1_val_1' in data - - -def test_details_view(app, db, admin): - Model1, Model2 = create_models(db) - - view_no_details = CustomModelView(Model1) - admin.add_view(view_no_details) - - # fields are scaffolded - view_w_details = CustomModelView(Model2, can_view_details=True) - admin.add_view(view_w_details) - - # show only specific fields in details w/ column_details_list - string_field_view = CustomModelView(Model2, can_view_details=True, - column_details_list=["string_field"], - endpoint="sf_view") - admin.add_view(string_field_view) - - fill_db(Model1, Model2) - - client = app.test_client() - - m1_id = Model1.objects.first().id - m2_id = Model2.objects.first().id - - # ensure link to details is hidden when can_view_details is disabled - rv = client.get('/admin/model1/') - data = rv.data.decode('utf-8') - assert '/admin/model1/details/' not in data - - # ensure link to details view appears - rv = client.get('/admin/model2/') - data = rv.data.decode('utf-8') - assert '/admin/model2/details/' in data - - # test redirection when details are disabled - url = '/admin/model1/details/?url=%2Fadmin%2Fmodel1%2F&id=' + str(m1_id) - rv = client.get(url) - assert rv.status_code == 302 - - # test if correct data appears in details view when enabled - url = '/admin/model2/details/?url=%2Fadmin%2Fmodel2%2F&id=' + str(m2_id) - rv = client.get(url) - data = rv.data.decode('utf-8') - assert 'String Field' in data - assert 'string_field_val_1' in data - assert 'Int Field' in data - - # test column_details_list - url = '/admin/sf_view/details/?url=%2Fadmin%2Fsf_view%2F&id=' + str(m2_id) - rv = client.get(url) - data = rv.data.decode('utf-8') - assert 'String Field' in data - assert 'string_field_val_1' in data - assert 'Int Field' not in data - - -def test_column_filters(app, db, admin): - Model1, Model2 = create_models(db) - - # fill DB with values - fill_db(Model1, Model2) - - # Test string filter - view1 = CustomModelView(Model1, column_filters=['test1']) - admin.add_view(view1) - - assert len(view1._filters) == 7 - - assert \ - [(f['index'], f['operation']) for f in view1._filter_groups[u'Test1']] == \ - [ - (0, 'contains'), - (1, 'not contains'), - (2, 'equals'), - (3, 'not equal'), - (4, 'empty'), - (5, 'in list'), - (6, 'not in list'), - ] - - # Test numeric filter - view2 = CustomModelView(Model2, column_filters=['int_field']) - admin.add_view(view2) - - assert \ - [(f['index'], f['operation']) for f in view2._filter_groups[u'Int Field']] == \ - [ - (0, 'equals'), - (1, 'not equal'), - (2, 'greater than'), - (3, 'smaller than'), - (4, 'empty'), - (5, 'in list'), - (6, 'not in list'), - ] - - # Test boolean filter - view3 = CustomModelView(Model2, column_filters=['bool_field'], - endpoint="_bools") - admin.add_view(view3) - - assert \ - [(f['index'], f['operation']) for f in view3._filter_groups[u'Bool Field']] == \ - [ - (0, 'equals'), - (1, 'not equal'), - ] - - # Test float filter - view4 = CustomModelView(Model2, column_filters=['float_field'], - endpoint="_float") - admin.add_view(view4) - - assert \ - [(f['index'], f['operation']) for f in view4._filter_groups[u'Float Field']] == \ - [ - (0, 'equals'), - (1, 'not equal'), - (2, 'greater than'), - (3, 'smaller than'), - (4, 'empty'), - (5, 'in list'), - (6, 'not in list'), - ] - - # Test datetime filter - view5 = CustomModelView(Model1, - column_filters=['datetime_field'], - endpoint="_datetime") - admin.add_view(view5) - - assert \ - [(f['index'], f['operation']) for f in view5._filter_groups[u'Datetime Field']] == \ - [ - (0, 'equals'), - (1, 'not equal'), - (2, 'greater than'), - (3, 'smaller than'), - (4, 'between'), - (5, 'not between'), - (6, 'empty'), - ] - - # Make some test clients - client = app.test_client() - - # string - equals - rv = client.get('/admin/model1/?flt0_0=test1_val_1') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_1' in data - assert 'test1_val_2' not in data - - # string - not equal - rv = client.get('/admin/model1/?flt0_1=test1_val_1') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_1' not in data - assert 'test1_val_2' in data - - # string - contains - rv = client.get('/admin/model1/?flt0_2=test1_val_1') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_1' in data - assert 'test1_val_2' not in data - - # string - not contains - rv = client.get('/admin/model1/?flt0_3=test1_val_1') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_1' not in data - assert 'test1_val_2' in data - - # string - empty - rv = client.get('/admin/model1/?flt0_4=1') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'empty_obj' in data - assert 'test1_val_1' not in data - assert 'test1_val_2' not in data - - # string - not empty - rv = client.get('/admin/model1/?flt0_4=0') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'empty_obj' not in data - assert 'test1_val_1' in data - assert 'test1_val_2' in data - - # string - in list - rv = client.get('/admin/model1/?flt0_5=test1_val_1%2Ctest1_val_2') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_1' in data - assert 'test2_val_2' in data - assert 'test1_val_3' not in data - assert 'test1_val_4' not in data - - # string - not in list - rv = client.get('/admin/model1/?flt0_6=test1_val_1%2Ctest1_val_2') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_1' not in data - assert 'test2_val_2' not in data - assert 'test1_val_3' in data - assert 'test1_val_4' in data - - # integer - equals - rv = client.get('/admin/model2/?flt0_0=5000') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'string_field_val_3' in data - assert 'string_field_val_4' not in data - - # integer - equals (huge number) - rv = client.get('/admin/model2/?flt0_0=6169453081680413441') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'string_field_val_5' in data - assert 'string_field_val_4' not in data - - # integer - equals - test validation - rv = client.get('/admin/model2/?flt0_0=badval') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'Invalid Filter Value' in data - - # integer - not equal - rv = client.get('/admin/model2/?flt0_1=5000') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'string_field_val_3' not in data - assert 'string_field_val_4' in data - - # integer - greater - rv = client.get('/admin/model2/?flt0_2=6000') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'string_field_val_3' not in data - assert 'string_field_val_4' in data - - # integer - smaller - rv = client.get('/admin/model2/?flt0_3=6000') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'string_field_val_3' in data - assert 'string_field_val_4' not in data - - # integer - empty - rv = client.get('/admin/model2/?flt0_4=1') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'string_field_val_1' in data - assert 'string_field_val_2' in data - assert 'string_field_val_3' not in data - assert 'string_field_val_4' not in data - - # integer - not empty - rv = client.get('/admin/model2/?flt0_4=0') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'string_field_val_1' not in data - assert 'string_field_val_2' not in data - assert 'string_field_val_3' in data - assert 'string_field_val_4' in data - - # integer - in list - rv = client.get('/admin/model2/?flt0_5=5000%2C9000') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'string_field_val_1' not in data - assert 'string_field_val_2' not in data - assert 'string_field_val_3' in data - assert 'string_field_val_4' in data - - # integer - in list (huge number) - rv = client.get('/admin/model2/?flt0_5=6169453081680413441') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'string_field_val_1' not in data - assert 'string_field_val_5' in data - - # integer - in list - test validation - rv = client.get('/admin/model2/?flt0_5=5000%2Cbadval') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'Invalid Filter Value' in data - - # integer - not in list - rv = client.get('/admin/model2/?flt0_6=5000%2C9000') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'string_field_val_1' in data - assert 'string_field_val_2' in data - assert 'string_field_val_3' not in data - assert 'string_field_val_4' not in data - - # boolean - equals - Yes - rv = client.get('/admin/_bools/?flt0_0=1') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'string_field_val_1' in data - assert 'string_field_val_2' not in data - - # boolean - equals - No - rv = client.get('/admin/_bools/?flt0_0=0') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'string_field_val_1' not in data - assert 'string_field_val_2' in data - - # boolean - not equals - Yes - rv = client.get('/admin/_bools/?flt0_1=1') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'string_field_val_1' not in data - assert 'string_field_val_2' in data - - # boolean - not equals - No - rv = client.get('/admin/_bools/?flt0_1=0') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'string_field_val_1' in data - assert 'string_field_val_2' not in data - - # float - equals - rv = client.get('/admin/_float/?flt0_0=25.9') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'string_field_val_3' in data - assert 'string_field_val_4' not in data - - # float - equals - test validation - rv = client.get('/admin/_float/?flt0_0=badval') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'Invalid Filter Value' in data - - # float - not equal - rv = client.get('/admin/_float/?flt0_1=25.9') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'string_field_val_3' not in data - assert 'string_field_val_4' in data - - # float - greater - rv = client.get('/admin/_float/?flt0_2=60.5') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'string_field_val_3' not in data - assert 'string_field_val_4' in data - - # float - smaller - rv = client.get('/admin/_float/?flt0_3=60.5') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'string_field_val_3' in data - assert 'string_field_val_4' not in data - - # float - empty - rv = client.get('/admin/_float/?flt0_4=1') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'string_field_val_1' in data - assert 'string_field_val_2' in data - assert 'string_field_val_3' not in data - assert 'string_field_val_4' not in data - - # float - not empty - rv = client.get('/admin/_float/?flt0_4=0') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'string_field_val_1' not in data - assert 'string_field_val_2' not in data - assert 'string_field_val_3' in data - assert 'string_field_val_4' in data - - # float - in list - rv = client.get('/admin/_float/?flt0_5=25.9%2C75.5') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'string_field_val_1' not in data - assert 'string_field_val_2' not in data - assert 'string_field_val_3' in data - assert 'string_field_val_4' in data - - # float - in list - test validation - rv = client.get('/admin/_float/?flt0_5=25.9%2Cbadval') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'Invalid Filter Value' in data - - # float - not in list - rv = client.get('/admin/_float/?flt0_6=25.9%2C75.5') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'string_field_val_1' in data - assert 'string_field_val_2' in data - assert 'string_field_val_3' not in data - assert 'string_field_val_4' not in data - - # datetime - equals - rv = client.get('/admin/_datetime/?flt0_0=2014-04-03+01%3A09%3A00') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'datetime_obj1' in data - assert 'datetime_obj2' not in data - - # datetime - not equal - rv = client.get('/admin/_datetime/?flt0_1=2014-04-03+01%3A09%3A00') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'datetime_obj1' not in data - assert 'datetime_obj2' in data - - # datetime - greater - rv = client.get('/admin/_datetime/?flt0_2=2014-04-03+01%3A08%3A00') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'datetime_obj1' in data - assert 'datetime_obj2' not in data - - # datetime - smaller - rv = client.get('/admin/_datetime/?flt0_3=2014-04-03+01%3A08%3A00') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'datetime_obj1' not in data - assert 'datetime_obj2' in data - - # datetime - between - rv = client.get('/admin/_datetime/?flt0_4=2014-04-02+00%3A00%3A00+to+2014-11-20+23%3A59%3A59') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'datetime_obj1' in data - assert 'datetime_obj2' not in data - - # datetime - not between - rv = client.get('/admin/_datetime/?flt0_5=2014-04-02+00%3A00%3A00+to+2014-11-20+23%3A59%3A59') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'datetime_obj1' not in data - assert 'datetime_obj2' in data - - # datetime - empty - rv = client.get('/admin/_datetime/?flt0_6=1') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test1_val_1' in data - assert 'datetime_obj1' not in data - assert 'datetime_obj2' not in data - - # datetime - not empty - rv = client.get('/admin/_datetime/?flt0_6=0') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test1_val_1' not in data - assert 'datetime_obj1' in data - assert 'datetime_obj2' in data - - -def test_default_sort(app, db, admin): - M1, _ = create_models(db) - - M1(test1='c', test2='x').save() - M1(test1='b', test2='x').save() - M1(test1='a', test2='y').save() - - assert M1.objects.count() == 3 - - view = CustomModelView(M1, column_default_sort='test1') - admin.add_view(view) - - _, data = view.get_list(0, None, None, None, None) - - assert data[0].test1 == 'a' - assert data[1].test1 == 'b' - assert data[2].test1 == 'c' - - # test default sort with multiple columns - order = [('test2', False), ('test1', False)] - view2 = CustomModelView(M1, column_default_sort=order, endpoint='m1_2') - admin.add_view(view2) - - _, data = view2.get_list(0, None, None, None, None) - - assert len(data) == 3 - assert data[0].test1 == 'b' - assert data[1].test1 == 'c' - assert data[2].test1 == 'a' - - -def test_extra_fields(app, db, admin): - Model1, _ = create_models(db) - - view = CustomModelView( - Model1, - form_extra_fields={ - 'extra_field': fields.StringField('Extra Field') - } - ) - admin.add_view(view) - - client = app.test_client() - - rv = client.get('/admin/model1/new/') - assert rv.status_code == 200 - - # Check presence and order - data = rv.data.decode('utf-8') - assert 'Extra Field' in data - pos1 = data.find('Extra Field') - pos2 = data.find('Test1') - assert pos2 < pos1 - - -def test_extra_field_order(app, db, admin): - Model1, _ = create_models(db) - - view = CustomModelView( - Model1, - form_extra_fields={ - 'extra_field': fields.StringField('Extra Field') - } - ) - admin.add_view(view) - - client = app.test_client() - - rv = client.get('/admin/model1/new/') - assert rv.status_code == 200 - - # Check presence and order - data = rv.data.decode('utf-8') - assert 'Extra Field' in data - pos1 = data.find('Extra Field') - pos2 = data.find('Test1') - assert pos2 < pos1 - - -def test_custom_form_base(app, db, admin): - class TestForm(form.BaseForm): - pass - - Model1, _ = create_models(db) - - view = CustomModelView( - Model1, - form_base_class=TestForm - ) - admin.add_view(view) - - assert hasattr(view._create_form_class, 'test1') - - create_form = view.create_form() - assert isinstance(create_form, TestForm) - - -def test_subdocument_config(app, db, admin): - class Comment(db.EmbeddedDocument): - name = db.StringField(max_length=20, required=True) - value = db.StringField(max_length=20) - - class Model1(db.Document): - test1 = db.StringField(max_length=20) - subdoc = db.EmbeddedDocumentField(Comment) - - # Check only - view1 = CustomModelView( - Model1, - form_subdocuments={ - 'subdoc': { - 'form_columns': ('name',) - } - } - ) - - assert hasattr(view1._create_form_class, 'subdoc') - - form = view1.create_form() - assert 'name' in dir(form.subdoc.form) - assert 'value' not in dir(form.subdoc.form) - - # Check exclude - view2 = CustomModelView( - Model1, - form_subdocuments={ - 'subdoc': { - 'form_excluded_columns': ('value',) - } - } - ) - - form = view2.create_form() - assert 'name' in dir(form.subdoc.form) - assert 'value' not in dir(form.subdoc.form) - - -def test_subdocument_class_config(app, db, admin): - from flask_admin.contrib.mongoengine import EmbeddedForm - - class Comment(db.EmbeddedDocument): - name = db.StringField(max_length=20, required=True) - value = db.StringField(max_length=20) - - class Model1(db.Document): - test1 = db.StringField(max_length=20) - subdoc = db.EmbeddedDocumentField(Comment) - - class EmbeddedConfig(EmbeddedForm): - form_columns = ('name',) - - # Check only - view1 = CustomModelView( - Model1, - form_subdocuments={ - 'subdoc': EmbeddedConfig() - } - ) - - form = view1.create_form() - assert 'name' in dir(form.subdoc.form) - assert 'value' not in dir(form.subdoc.form) - - -def test_nested_subdocument_config(app, db, admin): - # Check recursive - class Comment(db.EmbeddedDocument): - name = db.StringField(max_length=20, required=True) - value = db.StringField(max_length=20) - - class Nested(db.EmbeddedDocument): - name = db.StringField(max_length=20, required=True) - comment = db.EmbeddedDocumentField(Comment) - - class Model1(db.Document): - test1 = db.StringField(max_length=20) - nested = db.EmbeddedDocumentField(Nested) - - view1 = CustomModelView( - Model1, - form_subdocuments={ - 'nested': { - 'form_subdocuments': { - 'comment': { - 'form_columns': ('name',) - } - } - } - } - ) - - form = view1.create_form() - assert 'name' in dir(form.nested.form.comment.form) - assert 'value' not in dir(form.nested.form.comment.form) - - -def test_nested_list_subdocument(app, db, admin): - class Comment(db.EmbeddedDocument): - name = db.StringField(max_length=20, required=True) - value = db.StringField(max_length=20) - - class Model1(db.Document): - test1 = db.StringField(max_length=20) - subdoc = db.ListField(db.EmbeddedDocumentField(Comment)) - - # Check only - view1 = CustomModelView( - Model1, - form_subdocuments={ - 'subdoc': { - 'form_subdocuments': { - None: { - 'form_columns': ('name',) - } - } - - } - } - ) - - form = view1.create_form() - inline_form = form.subdoc.unbound_field.args[2] - - assert 'name' in dir(inline_form) - assert 'value' not in dir(inline_form) - - -def test_nested_sortedlist_subdocument(app, db, admin): - class Comment(db.EmbeddedDocument): - name = db.StringField(max_length=20, required=True) - value = db.StringField(max_length=20) - - class Model1(db.Document): - test1 = db.StringField(max_length=20) - subdoc = db.SortedListField(db.EmbeddedDocumentField(Comment)) - - # Check only - view1 = CustomModelView( - Model1, - form_subdocuments={ - 'subdoc': { - 'form_subdocuments': { - None: { - 'form_columns': ('name',) - } - } - } - } - ) - - form = view1.create_form() - inline_form = form.subdoc.unbound_field.args[2] - - assert 'name' in dir(inline_form) - assert 'value' not in dir(inline_form) - - -def test_sortedlist_subdocument_validation(app, db, admin): - class Comment(db.EmbeddedDocument): - name = db.StringField(max_length=20, required=True) - value = db.StringField(max_length=20) - - class Model1(db.Document): - test1 = db.StringField(max_length=20) - subdoc = db.SortedListField(db.EmbeddedDocumentField(Comment)) - - view = CustomModelView(Model1) - admin.add_view(view) - client = app.test_client() - - rv = client.post('/admin/model1/new/', - data={'test1': 'test1large', 'subdoc-0-name': 'comment', 'subdoc-0-value': 'test'}) - assert rv.status_code == 302 - - rv = client.post('/admin/model1/new/', - data={'test1': 'test1large', 'subdoc-0-name': '', 'subdoc-0-value': 'test'}) - assert rv.status_code == 200 - assert b'This field is required' in rv.data - - -def test_list_subdocument_validation(app, db, admin): - class Comment(db.EmbeddedDocument): - name = db.StringField(max_length=20, required=True) - value = db.StringField(max_length=20) - - class Model1(db.Document): - test1 = db.StringField(max_length=20) - subdoc = db.ListField(db.EmbeddedDocumentField(Comment)) - - view = CustomModelView(Model1) - admin.add_view(view) - client = app.test_client() - - rv = client.post('/admin/model1/new/', - data={'test1': 'test1large', 'subdoc-0-name': 'comment', 'subdoc-0-value': 'test'}) - assert rv.status_code == 302 - - rv = client.post('/admin/model1/new/', - data={'test1': 'test1large', 'subdoc-0-name': '', 'subdoc-0-value': 'test'}) - assert rv.status_code == 200 - assert b'This field is required' in rv.data - - -def test_ajax_fk(app, db, admin): - Model1, Model2 = create_models(db) - - view = CustomModelView( - Model2, - url='view', - form_ajax_refs={ - 'model1': { - 'fields': ('test1', 'test2') - } - } - ) - admin.add_view(view) - - assert u'model1' in view._form_ajax_refs - - model = Model1(test1=u'first') - model.save() - model2 = Model1(test1=u'foo', test2=u'bar').save() - - # Check loader - loader = view._form_ajax_refs[u'model1'] - mdl = loader.get_one(model.id) - assert mdl.test1 == model.test1 - - items = loader.get_list(u'fir') - assert len(items) == 1 - assert items[0].id == model.id - - items = loader.get_list(u'bar') - assert len(items) == 1 - assert items[0].test1 == u'foo' - - # Check form generation - form = view.create_form() - assert form.model1.__class__.__name__ == u'AjaxSelectField' - - with app.test_request_context('/admin/view/'): - assert u'value=""' not in form.model1() - - form.model1.data = model - assert (u'data-json="["%s", "first"]"' % as_unicode(model.id) in form.model1() or - u'data-json="["%s", "first"]"' % as_unicode(model.id) in form.model1()) - assert u'value="%s"' % as_unicode(model.id) in form.model1() - - # Check querying - client = app.test_client() - - req = client.get(u'/admin/view/ajax/lookup/?name=model1&query=foo') - assert req.data.decode('utf-8') == u'[["%s", "foo"]]' % model2.id - - # Check submitting - client.post('/admin/view/new/', data={u'model1': as_unicode(model.id)}) - mdl = Model2.objects.first() - - assert mdl is not None - assert mdl.model1 is not None - assert mdl.model1.id == model.id - assert mdl.model1.test1 == u'first' - - -def test_nested_ajax_refs(app, db, admin): - # Check recursive - class Comment(db.Document): - name = db.StringField(max_length=20, required=True) - value = db.StringField(max_length=20) - - class Nested(db.EmbeddedDocument): - name = db.StringField(max_length=20, required=True) - comment = db.ReferenceField(Comment) - - class Model1(db.Document): - test1 = db.StringField(max_length=20) - nested = db.EmbeddedDocumentField(Nested) - - view1 = CustomModelView( - Model1, - form_subdocuments={ - 'nested': { - 'form_ajax_refs': { - 'comment': { - 'fields': ['name'] - } - } - } - } - ) - - form = view1.create_form() - assert type(form.nested.form.comment).__name__ == 'AjaxSelectField' - assert 'nested-comment' in view1._form_ajax_refs - - -def test_form_flat_choices(app, db, admin): - class Model(db.Document): - name = db.StringField(max_length=20, choices=('a', 'b', 'c')) - - view = CustomModelView(Model) - admin.add_view(view) - - form = view.create_form() - assert form.name.choices == [('a', 'a'), ('b', 'b'), ('c', 'c')] - - -def test_form_args(app, db, admin): - class Model(db.Document): - test = db.StringField(required=True) - - shared_form_args = {'test': {'validators': [validators.Regexp('test')]}} - - view = CustomModelView(Model, form_args=shared_form_args) - admin.add_view(view) - - # ensure shared field_args don't create duplicate validators - create_form = view.create_form() - assert len(create_form.test.validators) == 2 - - edit_form = view.edit_form() - assert len(edit_form.test.validators) == 2 - - -def test_form_args_embeddeddoc(app, db, admin): - class Info(db.EmbeddedDocument): - name = db.StringField() - age = db.StringField() - - class Model(db.Document): - info = db.EmbeddedDocumentField('Info') - timestamp = db.DateTimeField() - - view = CustomModelView( - Model, - form_args={ - 'info': {'label': 'Information'}, - 'timestamp': {'label': 'Last Updated Time'} - } - ) - admin.add_view(view) - form = view.create_form() - assert form.timestamp.label.text == 'Last Updated Time' - # This is the failure - assert form.info.label.text == 'Information' - - -def test_simple_list_pager(app, db, admin): - Model1, _ = create_models(db) - - class TestModelView(CustomModelView): - simple_list_pager = True - - def get_count_query(self): - assert False - - view = TestModelView(Model1) - admin.add_view(view) - - count, data = view.get_list(0, None, None, None, None) - assert count is None - - -def test_customising_page_size(app, db, admin): - with app.app_context(): - M1, _ = create_models(db) - - instances = [M1(test1=f'instance-{x+1:03d}') for x in range(101)] - for instance in instances: - instance.save() - - view1 = CustomModelView(M1, endpoint='view1', page_size=20, can_set_page_size=False) - admin.add_view(view1) - - view2 = CustomModelView(M1, db, endpoint='view2', page_size=5, can_set_page_size=False) - admin.add_view(view2) - - view3 = CustomModelView(M1, db, endpoint='view3', page_size=20, can_set_page_size=True) - admin.add_view(view3) - - view4 = CustomModelView(M1, db, endpoint='view4', page_size=5, page_size_options=(5, 10, 15), can_set_page_size=True) - admin.add_view(view4) - - client = app.test_client() - - rv = client.get('/admin/view1/') - assert 'instance-020' in rv.text - assert 'instance-021' not in rv.text - - # `can_set_page_size=False`, so only the default of 20 is available. - rv = client.get('/admin/view1/?page_size=50') - assert 'instance-020' in rv.text - assert 'instance-021' not in rv.text - - # Check view2, which has `page_size=5` to change the default page size - rv = client.get('/admin/view2/') - assert 'instance-005' in rv.text - assert 'instance-006' not in rv.text - - # Check view3, which has `can_set_page_size=True` - rv = client.get('/admin/view3/') - assert 'instance-020' in rv.text - assert 'instance-021' not in rv.text - - rv = client.get('/admin/view3/?page_size=50') - assert 'instance-050' in rv.text - assert 'instance-051' not in rv.text - - rv = client.get('/admin/view3/?page_size=100') - assert 'instance-100' in rv.text - assert 'instance-101' not in rv.text - - # Invalid page sizes are reset to the default - rv = client.get('/admin/view3/?page_size=1') - assert 'instance-020' in rv.text - assert 'instance-021' not in rv.text - - # Check view4, which has custom `page_size_options` - rv = client.get('/admin/view4/') - assert 'instance-005' in rv.text - assert 'instance-006' not in rv.text - - # Invalid page sizes are reset to the default - rv = client.get('/admin/view4/?page_size=1') - assert 'instance-005' in rv.text - assert 'instance-006' not in rv.text - - rv = client.get('/admin/view4/?page_size=10') - assert 'instance-010' in rv.text - assert 'instance-011' not in rv.text - - rv = client.get('/admin/view4/?page_size=15') - assert 'instance-015' in rv.text - assert 'instance-016' not in rv.text - - -def test_export_csv(app, db, admin): - Model1, Model2 = create_models(db) - - view1 = CustomModelView(Model1, can_export=True, - column_list=['test1', 'test2'], export_max_rows=2, - endpoint='row_limit_2') - admin.add_view(view1) - - view2 = CustomModelView(Model1, can_export=True, - column_list=['test1', 'test2'], - endpoint='no_row_limit') - admin.add_view(view2) - - for x in range(5): - fill_db(Model1, Model2) - - client = app.test_client() - - # test export_max_rows - rv = client.get('/admin/row_limit_2/export/csv/') - data = rv.data.decode('utf-8') - assert rv.status_code == 200 - assert "Test1,Test2\r\n" + \ - "test1_val_1,test2_val_1\r\n" + \ - "test1_val_2,test2_val_2\r\n" == data - - # test row limit without export_max_rows - rv = client.get('/admin/no_row_limit/export/csv/') - data = rv.data.decode('utf-8') - assert rv.status_code == 200 - assert len(data.splitlines()) > 21 diff --git a/pyproject.toml b/pyproject.toml index af2c37065..f02d13737 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,13 +44,6 @@ geoalchemy = [ "geoalchemy2>=0.14.0", "shapely>=2", ] -mongoengine = [ # TODO: seems out-of-date/unmaintained; replace or deprecate? - "Flask-Admin[sqlalchemy]", - "flask-mongoengine<1", - "Flask<2.3.0", # flask-mongoengine tries to access `flask.json`, - "sqlalchemy>=1.4,<2", - "wtforms>=2,<3", -] pymongo = ["pymongo>=3.7.0"] peewee = [ "peewee>=3.14.0", @@ -66,11 +59,6 @@ all = [ "Flask-Admin[sqlalchemy]", "Flask-Admin[sqlalchemy-with-utils]", "Flask-Admin[geoalchemy]", - -# FIXME: disabling mongoengine as flask-mongoengine is now out-of-date and is -# incompatible with newer versions of flask that we want to test. -# "Flask-Admin[mongoengine]", - "Flask-Admin[pymongo]", "Flask-Admin[peewee]", "Flask-Admin[s3]", @@ -105,9 +93,6 @@ filterwarnings = [ "ignore:Flags should be stored in dicts and not in tuples. The next version of WTForms will abandon support for flags in tuples.:DeprecationWarning", "ignore:'HTMLString' will be removed in WTForms 3.0. Use 'markupsafe.Markup' instead.:DeprecationWarning", - # flask-mongoengine is responsible for the below deprecation warning, and hasn't been updated recently - "default:No uuidRepresentation is specified:DeprecationWarning", - # Werkzeug is responsible for the below deprecation warning; remove when they have updated their code. "default:ast\\.Str is deprecated and will be removed in Python 3\\.14:DeprecationWarning", "default:Attribute s is deprecated and will be removed in Python 3\\.14:DeprecationWarning", @@ -173,11 +158,9 @@ module = [ "citext", "colour", "flask_babel", - "flask_mongoengine.*", "flask_wtf", "gridfs", "marker", - "mongoengine.*", "playhouse.*", "pymongo", "sqlalchemy.*", diff --git a/requirements-skip/constraints-flaskmongoengine.txt b/requirements-skip/constraints-flaskmongoengine.txt deleted file mode 100644 index bfa9e9639..000000000 --- a/requirements-skip/constraints-flaskmongoengine.txt +++ /dev/null @@ -1,3 +0,0 @@ -Flask==2.1.3 -Werkzeug==2.3.8 -flask-sqlalchemy<3 diff --git a/tox.ini b/tox.ini index 3b60eec87..658cc1fb5 100644 --- a/tox.ini +++ b/tox.ini @@ -4,7 +4,6 @@ envlist = py3{8,12}-sqlalchemy1 py312-noflaskbabel # only tested against latest of all configurations, sans flask-babel py38-min - py312-flaskmongoengine-sqlalchemy1 # style typing docs @@ -13,9 +12,7 @@ skip_missing_interpreters = true [testenv] package = wheel wheel_build_env = .pkg -extras = - flaskmongoengine: all,mongoengine - !flaskmongoengine: all +extras = all constrain_package_deps = true use_frozen_constraints = true # TODO: Remove SQLALCHEMY_SILENCE_UBER_WARNING when Flask-Admin is compatible with SQLAlchemy>=2.0.0 @@ -24,17 +21,14 @@ setenv = AZURE_STORAGE_CONNECTION_STRING = DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1; deps = sqlalchemy1: -c requirements-skip/constraints-sqlalchemy1.txt - flaskmongoengine: -c requirements-skip/constraints-flaskmongoengine.txt -r requirements/tests.txt commands_pre = noflaskbabel: pip uninstall -y flask-babel -commands = - flaskmongoengine: pytest -v --tb=short --basetemp={envtmpdir} flask_admin/tests -W 'default::DeprecationWarning' {posargs} - !flaskmongoengine: pytest -v --tb=short --basetemp={envtmpdir} flask_admin/tests --ignore flask_admin/tests/mongoengine {posargs} +commands = pytest -v --tb=short --basetemp={envtmpdir} flask_admin/tests {posargs} [testenv:py38-min] deps = -r requirements-skip/tests-min.txt -commands = pytest -v --tb=short --basetemp={envtmpdir} flask_admin/tests -W 'default::DeprecationWarning' --ignore flask_admin/tests/mongoengine {posargs} +commands = pytest -v --tb=short --basetemp={envtmpdir} flask_admin/tests -W 'default::DeprecationWarning' {posargs} [testenv:style] deps = pre-commit From 8f4f3524f16d216ed28ac2b96f3cac604fa42378 Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Wed, 7 Aug 2024 19:23:27 +0100 Subject: [PATCH 101/156] Add jinja2 to dependencies --- flask_admin/_compat.py | 7 ------- flask_admin/helpers.py | 3 ++- flask_admin/model/base.py | 3 ++- flask_admin/model/template.py | 4 +++- pyproject.toml | 1 + 5 files changed, 8 insertions(+), 10 deletions(-) diff --git a/flask_admin/_compat.py b/flask_admin/_compat.py index 934ace4f9..71c95a9a0 100644 --- a/flask_admin/_compat.py +++ b/flask_admin/_compat.py @@ -37,10 +37,3 @@ def as_unicode(s): def csv_encode(s): ''' Returns unicode string expected by Python 3's csv module ''' return as_unicode(s) - - -try: - # jinja2 3.0.0 - from jinja2 import pass_context # type: ignore[attr-defined] -except ImportError: - from jinja2 import contextfunction as pass_context diff --git a/flask_admin/helpers.py b/flask_admin/helpers.py index 08d364a3b..7c4efd6da 100644 --- a/flask_admin/helpers.py +++ b/flask_admin/helpers.py @@ -3,10 +3,11 @@ from urllib.parse import urljoin, urlparse from flask import g, request, url_for, flash +from jinja2 import pass_context # type: ignore[attr-defined] from markupsafe import Markup from wtforms.validators import DataRequired, InputRequired -from flask_admin._compat import iteritems, pass_context +from flask_admin._compat import iteritems from ._compat import string_types diff --git a/flask_admin/model/base.py b/flask_admin/model/base.py index 77013a567..b4ea7630b 100755 --- a/flask_admin/model/base.py +++ b/flask_admin/model/base.py @@ -9,6 +9,7 @@ import inspect from collections import OrderedDict +from jinja2 import pass_context # type: ignore[attr-defined] from werkzeug.utils import secure_filename from flask import (current_app, request, redirect, flash, abort, json, @@ -36,7 +37,7 @@ from flask_admin.tools import rec_getattr from flask_admin._backwards import ObsoleteAttr from flask_admin._compat import (iteritems, itervalues, - as_unicode, csv_encode, text_type, pass_context) + as_unicode, csv_encode, text_type) from .helpers import prettify_name, get_mdict_item_or_list from .ajax import AjaxModelLoader diff --git a/flask_admin/model/template.py b/flask_admin/model/template.py index 05132576f..f4acbd0e2 100644 --- a/flask_admin/model/template.py +++ b/flask_admin/model/template.py @@ -1,6 +1,8 @@ from functools import reduce -from flask_admin._compat import pass_context, string_types +from jinja2 import pass_context # type: ignore[attr-defined] + +from flask_admin._compat import string_types from flask_admin.babel import gettext diff --git a/pyproject.toml b/pyproject.toml index f02d13737..9a88d2cee 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ requires-python = ">=3.8" dependencies = [ "flask>=2.0", + "jinja2>=3.0", "wtforms>=2", ] From a5c3baaa2b59d9face72ebd033f7562aebc7033c Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Wed, 7 Aug 2024 19:23:27 +0100 Subject: [PATCH 102/156] Add markupsafe to dependencies "from markupsafe import Markup" already used in a number of files. --- flask_admin/_backwards.py | 6 ------ flask_admin/contrib/sqla/widgets.py | 3 +-- flask_admin/form/upload.py | 3 ++- flask_admin/model/widgets.py | 3 +-- pyproject.toml | 4 ++-- 5 files changed, 6 insertions(+), 13 deletions(-) diff --git a/flask_admin/_backwards.py b/flask_admin/_backwards.py index 03929e02e..ce9abe5e6 100644 --- a/flask_admin/_backwards.py +++ b/flask_admin/_backwards.py @@ -8,12 +8,6 @@ import sys import warnings -try: - from wtforms.widgets import HTMLString as Markup # type: ignore[attr-defined] -except ImportError: - # WTForms 2.3.0 - from markupsafe import Markup # noqa: F401 - def get_property(obj, name, old_name, default=None): """ diff --git a/flask_admin/contrib/sqla/widgets.py b/flask_admin/contrib/sqla/widgets.py index 3c901c77c..55d6a3a1d 100644 --- a/flask_admin/contrib/sqla/widgets.py +++ b/flask_admin/contrib/sqla/widgets.py @@ -1,7 +1,6 @@ +from markupsafe import Markup from wtforms.widgets.core import escape # type: ignore[attr-defined] -from flask_admin._backwards import Markup - class CheckboxListInput: """ diff --git a/flask_admin/form/upload.py b/flask_admin/form/upload.py index 646419c4d..72307a182 100644 --- a/flask_admin/form/upload.py +++ b/flask_admin/form/upload.py @@ -4,6 +4,8 @@ from typing import Optional from urllib.parse import urljoin +from markupsafe import Markup + from werkzeug.utils import secure_filename from werkzeug.datastructures import FileStorage @@ -14,7 +16,6 @@ from flask_admin.babel import gettext from flask_admin.helpers import get_url -from flask_admin._backwards import Markup from flask_admin._compat import string_types Image: Optional[ModuleType] diff --git a/flask_admin/model/widgets.py b/flask_admin/model/widgets.py index c00347fa4..400476db9 100644 --- a/flask_admin/model/widgets.py +++ b/flask_admin/model/widgets.py @@ -1,8 +1,7 @@ from flask import json -from markupsafe import escape +from markupsafe import escape, Markup from wtforms.widgets import html_params -from flask_admin._backwards import Markup from flask_admin._compat import as_unicode, text_type from flask_admin.babel import gettext from flask_admin.helpers import get_url diff --git a/pyproject.toml b/pyproject.toml index 9a88d2cee..bdd37a5b0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,7 +24,8 @@ requires-python = ">=3.8" dependencies = [ "flask>=2.0", "jinja2>=3.0", - "wtforms>=2", + "markupsafe>=2.0", + "wtforms>=2.3", ] [project.optional-dependencies] @@ -92,7 +93,6 @@ filterwarnings = [ "error", # TODO: remove the ignored deprecation warning when support for WTForms 3 has been added. "ignore:Flags should be stored in dicts and not in tuples. The next version of WTForms will abandon support for flags in tuples.:DeprecationWarning", - "ignore:'HTMLString' will be removed in WTForms 3.0. Use 'markupsafe.Markup' instead.:DeprecationWarning", # Werkzeug is responsible for the below deprecation warning; remove when they have updated their code. "default:ast\\.Str is deprecated and will be removed in Python 3\\.14:DeprecationWarning", From 005fe6346f6858b6a0569216e0c2e231766d97aa Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Wed, 7 Aug 2024 19:23:27 +0100 Subject: [PATCH 103/156] Add werkzeug to dependencies --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index bdd37a5b0..aea40d992 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,6 +25,7 @@ dependencies = [ "flask>=2.0", "jinja2>=3.0", "markupsafe>=2.0", + "werkzeug>=2.0", "wtforms>=2.3", ] From 1b2fd5b2b3a793ef9cd7285bd350bb0b2223c68a Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Wed, 7 Aug 2024 19:27:05 +0100 Subject: [PATCH 104/156] Fix doc build errors --- .readthedocs.yaml | 2 +- doc/advanced.rst | 36 ++----------------- doc/index.rst | 4 --- doc/introduction.rst | 14 +++----- flask_admin/form/fields.py | 2 +- flask_admin/form/widgets.py | 2 +- .../zh_Hans_CN/LC_MESSAGES/api.po | 3 +- 7 files changed, 12 insertions(+), 51 deletions(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 49c6e5e2f..e282d1464 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -7,7 +7,7 @@ python: install: - requirements: requirements/docs.txt - method: pip - path: . + path: .[all] sphinx: builder: dirhtml fail_on_warning: true diff --git a/doc/advanced.rst b/doc/advanced.rst index 006487bd9..8e2b66b20 100644 --- a/doc/advanced.rst +++ b/doc/advanced.rst @@ -6,8 +6,6 @@ Advanced Functionality Enabling CSRF Protection ------------------------ -**** - To add CSRF protection to the forms that are generated by *ModelView* instances, use the SecureForm class in your *ModelView* subclass by specifying the *form_base_class* parameter:: @@ -23,8 +21,6 @@ to generate and validate the tokens for you when the forms are submitted. CSP support ----------- -**** - To support `CSP <https://cheatsheetseries.owasp.org/cheatsheets/Content_Security_Policy_Cheat_Sheet.html>`_ in Flask-Admin, you can pass a `csp_nonce_generator` function through to Flask-Admin on initialisation. This function should return a CSP nonce that will be attached to all @@ -56,8 +52,6 @@ If you create any of your own templates for Flask-Admin pages, you will need to Adding Custom Javascript and CSS -------------------------------- -**** - To add custom JavaScript or CSS in your *ModelView* use *extra_js* or *extra_css* parameters:: class MyModelView(ModelView): @@ -65,9 +59,7 @@ To add custom JavaScript or CSS in your *ModelView* use *extra_js* or *extra_css extra_css = ['https://example.com/custom.css'] Localization With Flask-Babel -------------------------------- - -**** +----------------------------- Flask-Admin comes with translations for several languages. Enabling localization is simple: @@ -104,8 +96,6 @@ to see how you can add your own. Using with Flask in `host_matching` mode ---------------------------------------- -**** - If Flask is configured with `host_matching` enabled, then all routes registered on the app need to know which host(s) they should be served for. This requires some additional explicit configuration for Flask-Admin by passing the `host` argument to `Admin()` calls. @@ -155,8 +145,6 @@ If you need to generate URLs for a wildcard admin instance, you will need to pas Managing Files & Folders ------------------------ -**** - To manage static files instead of database records, Flask-Admin comes with the FileAdmin plug-in. It gives you the ability to upload, delete, rename, etc. You can use it by adding a FileAdmin view to your app:: @@ -196,8 +184,6 @@ API documentation for details on the methods. Adding A Redis Console ---------------------- -**** - Another plug-in that's available is the Redis Console. If you have a Redis instance running on the same machine as your app, you can:: @@ -214,8 +200,6 @@ instance running on the same machine as your app, you can:: Replacing Individual Form Fields -------------------------------- -**** - The `form_overrides` attribute allows you to replace individual fields within a form. A common use-case for this would be to add a *What-You-See-Is-What-You-Get* (WYSIWIG) editor, or to handle file / image uploads that need to be tied to a field in your model. @@ -265,8 +249,6 @@ use the :ref:`File-Admin<file-admin>` plug-in. Managing Geographical Models ---------------------------- -**** - If you want to store spatial information in a GIS database, Flask-Admin has you covered. The GeoAlchemy backend extends the SQLAlchemy backend (just as `GeoAlchemy <https://geoalchemy-2.readthedocs.io/>`_ extends SQLAlchemy) to give you a pretty and functional map-based @@ -274,8 +256,8 @@ editor for your admin pages. Some notable features include: - - Maps are displayed using the amazing `Leaflet <http://leafletjs.com/>`_ Javascript library, - with map data from `Mapbox <https://www.mapbox.com/>`_. + - Maps are displayed using the amazing `Leaflet <https://leafletjs.com/>`_ Javascript library, + with map data from `Mapbox <https://www.mapbox.com>`_. - Geographic information, including points, lines and polygons, can be edited interactively using `Leaflet.Draw <https://github.com/Leaflet/Leaflet.draw>`_. - Graceful fallback: `GeoJSON <http://geojson.org/>`_ data can be edited in a ``<textarea>``, if the @@ -348,8 +330,6 @@ If you have any ideas or suggestions, make a pull request! Customising Builtin Forms Via Rendering Rules --------------------------------------------- -**** - Before version 1.0.7, all model backends were rendering the *create* and *edit* forms using a special Jinja2 macro, which was looping over the fields of a WTForms form object and displaying them one by one. This works well, but it is difficult to customize. @@ -407,8 +387,6 @@ Form Rendering Rule Description Using Different Database Backends --------------------------------- -**** - Other than SQLAlchemy... There are five different backends for you to choose from, depending on which database you would like to use for your application. If, however, you need to implement your own database backend, have a look at :ref:`adding-model-backend`. @@ -519,8 +497,6 @@ the pymongo example at https://github.com/flask-admin/flask-admin/tree/master/ex Migrating From Django --------------------- -**** - If you are used to `Django <https://www.djangoproject.com/>`_ and the *django-admin* package, you will find Flask-Admin to work slightly different from what you would expect. @@ -576,8 +552,6 @@ than what is displayed in this table. Overriding the Form Scaffolding ------------------------------- -**** - If you don't want to the use the built-in Flask-Admin form scaffolding logic, you are free to roll your own by simply overriding :meth:`~flask_admin.model.base.scaffold_form`. For example, if you use `WTForms-Alchemy <https://github.com/kvesteri/wtforms-alchemy>`_, you could put your form generation code @@ -595,8 +569,6 @@ do with it, so it won't generate a form field. In this case, you would need to m Customizing Batch Actions ------------------------- -**** - If you want to add other batch actions to the list view, besides the default delete action, then you can define a function that implements the desired logic and wrap it with the `@action` decorator. @@ -630,8 +602,6 @@ While the wrapped function should accept only one parameter - `ids`:: Raise exceptions instead of flash error messages ------------------------------------------------ -**** - By default, Flask-Admin will capture most exceptions related to reading/writing models and display a flash message instead of raising an exception. If your Flask app is running in debug mode (ie under local development), exceptions will not be suppressed. diff --git a/doc/index.rst b/doc/index.rst index f0178eda7..013ab1ec7 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -39,15 +39,11 @@ in the `examples` directory. Support ------- -**** - Python 3.6 or higher. Indices And Tables ------------------ -**** - * :ref:`genindex` * :ref:`modindex` * :ref:`search` diff --git a/doc/introduction.rst b/doc/introduction.rst index ee161c552..9fe3dbc1d 100644 --- a/doc/introduction.rst +++ b/doc/introduction.rst @@ -182,9 +182,7 @@ approach for including the other views, like `forgot_password`, `send_confirmati .. _customizing-builtin-views: Customizing Built-in Views -========================= - -**** +========================== When inheriting from `ModelView`, values can be specified for numerous configuration parameters. Use these to customize the views to suit your @@ -373,7 +371,7 @@ By extending the *admin/master.html* template, you can maintain a consistent use even while having tight control over your page's content. Overriding the Built-in Views ----------------------------- +----------------------------- There may be some scenarios where you want most of the built-in ModelView functionality, but you want to replace one of the default `create`, `edit`, or `list` views. For this you could override only the view in question, and all the links to it will still function as you would expect:: @@ -392,16 +390,14 @@ For this you could override only the view in question, and all the links to it w return self.render('create_user.html') Working With the Built-in Templates -================================== - -**** +=================================== Flask-Admin uses the `Jinja2 <http://jinja.pocoo.org/docs/>`_ templating engine. .. _extending-builtin-templates: Extending the Built-in Templates -------------------------------- +-------------------------------- Rather than overriding the built-in templates completely, it's best to extend them. This will make it simpler for you to upgrade to new Flask-Admin versions in future. @@ -440,7 +436,7 @@ the admin theme during initialization:: admin = Admin(app, Bootstrap4Theme(base_template='microblog_master.html')) Overriding the Built-in Templates --------------------------------- +--------------------------------- To take full control over the style and layout of the admin interface, you can override all of the built-in templates. Just keep in mind that the templates will change slightly diff --git a/flask_admin/form/fields.py b/flask_admin/form/fields.py index 70e869910..edbffea12 100644 --- a/flask_admin/form/fields.py +++ b/flask_admin/form/fields.py @@ -154,7 +154,7 @@ def pre_validate(self, form): class Select2TagsField(fields.StringField): - """`Select2 <http://ivaynberg.github.com/select2/#tags>`_ styled text field. + """`Select2Tags <http://ivaynberg.github.com/select2/#tags>`_ styled text field. You must include select2.js, form-x.x.x.js and select2 stylesheet for it to work. """ widget = admin_widgets.Select2TagsWidget() diff --git a/flask_admin/form/widgets.py b/flask_admin/form/widgets.py index 4ea72dd07..e1ef745a5 100644 --- a/flask_admin/form/widgets.py +++ b/flask_admin/form/widgets.py @@ -24,7 +24,7 @@ def __call__(self, field, **kwargs): class Select2TagsWidget(widgets.TextInput): - """`Select2 <http://ivaynberg.github.com/select2/#tags>`_ styled text widget. + """`Select2Tags <http://ivaynberg.github.com/select2/#tags>`_ styled text widget. You must include select2.js, form-x.x.x.js and select2 stylesheet for it to work. """ def __call__(self, field, **kwargs): diff --git a/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/api.po b/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/api.po index aa5baf3e8..018bf4684 100644 --- a/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/api.po +++ b/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/api.po @@ -1628,7 +1628,7 @@ msgstr "" #: flask_admin.form.fields.Select2TagsField:1 msgid "" -"`Select2 <http://ivaynberg.github.com/select2/#tags>`_ styled text field." +"`Select2Tags <http://ivaynberg.github.com/select2/#tags>`_ styled text field." " You must include select2.js, form-x.x.x.js and select2 stylesheet for it" " to work." msgstr "" @@ -3033,4 +3033,3 @@ msgstr "" #~ "https://github.com/kennethreitz/tablib/blob/master/README.rst " #~ "for supported types." #~ msgstr "" - From f0e959a6681936d899a0d283370f249544e6fadd Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Tue, 6 Aug 2024 23:35:30 +0100 Subject: [PATCH 105/156] Add changelog entry for v2 alpha release --- doc/changelog.rst | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/doc/changelog.rst b/doc/changelog.rst index 66b2d8e66..b234b9522 100644 --- a/doc/changelog.rst +++ b/doc/changelog.rst @@ -1,6 +1,28 @@ Changelog ========= +2.0.0a0 +------- + +Breaking changes: +* Added support for Python 3.12 +* Dropped support for Python 3.7 +* Flask-BabelEx is no longer supported; the package is no longer maintained and Flask-Babel is recommended/active instead. +* Flask-Mongoengine is no longer supported due to that package being unmaintained. +* Bootstrap2 and Bootstrap3 themes are no longer available. +* All Flask-Admin config has been namespaced under `FLASK_ADMIN_`. + * `FLASK_ADMIN_SWATCH` has been removed; see `theme` parameter below. +* `Admin()` now takes a `theme` parameter that encapsulates all of the configuration options for theming the admin instance. This replaces the `template_mode` parameter. + +New features: +* Flask-Admin now supports the `host_matching` mode of Flask apps. See documentation for how to configure this where needed. +* Flask-Admin is now compatible with SQLAlchemy v2+, Flask v3+, WTForms v3+, and Pillow v10+. +* Flask-Admin now declares its dependencies and supported dependency versions more cleanly, including using pip extras. If you use Flask-Admin with SQLAlchemy, for example, you should use `pip install flask-admin[sqlalchemy]` or list `flask-admin[sqlalchemy]` in your requirements.txt or pyproject.toml files. +* Apps using content security policies to restrict the assets that can be loaded can now whitelist Flask-Admin's assets by passing a `csp_nonce_generator` function to the Admin instance. See examples or documentation for how to configure this where needed. +* `page_size_options` can now be configured on Admin models, to restrict the page sizes that users can select. These are now enforced properly and cannot be bypassed by URL hacking. + +And various smaller bug fixes and documentation updates. + 1.6.1 ----- From 5c9d1642a1243ed35284609841058343783f1897 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Wed, 7 Aug 2024 15:59:58 +0100 Subject: [PATCH 106/156] fix bullet stying --- doc/changelog.rst | 4 +++- .../translations/en/LC_MESSAGES/admin.mo | Bin 6258 -> 6263 bytes 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/changelog.rst b/doc/changelog.rst index b234b9522..aad72f8f4 100644 --- a/doc/changelog.rst +++ b/doc/changelog.rst @@ -5,16 +5,18 @@ Changelog ------- Breaking changes: + * Added support for Python 3.12 * Dropped support for Python 3.7 * Flask-BabelEx is no longer supported; the package is no longer maintained and Flask-Babel is recommended/active instead. * Flask-Mongoengine is no longer supported due to that package being unmaintained. * Bootstrap2 and Bootstrap3 themes are no longer available. * All Flask-Admin config has been namespaced under `FLASK_ADMIN_`. - * `FLASK_ADMIN_SWATCH` has been removed; see `theme` parameter below. + * `FLASK_ADMIN_SWATCH` has been removed; see `theme` parameter below. * `Admin()` now takes a `theme` parameter that encapsulates all of the configuration options for theming the admin instance. This replaces the `template_mode` parameter. New features: + * Flask-Admin now supports the `host_matching` mode of Flask apps. See documentation for how to configure this where needed. * Flask-Admin is now compatible with SQLAlchemy v2+, Flask v3+, WTForms v3+, and Pillow v10+. * Flask-Admin now declares its dependencies and supported dependency versions more cleanly, including using pip extras. If you use Flask-Admin with SQLAlchemy, for example, you should use `pip install flask-admin[sqlalchemy]` or list `flask-admin[sqlalchemy]` in your requirements.txt or pyproject.toml files. diff --git a/flask_admin/translations/en/LC_MESSAGES/admin.mo b/flask_admin/translations/en/LC_MESSAGES/admin.mo index 0e4180a2cfaffa7a08f892f97f97e76ded1838f1..94b61f16bfdc72324d7c8ddd085ba79d05ca0b6d 100644 GIT binary patch delta 809 zcmXZaODIH99LMqh7{-j(%wRA~T<<&^O_WB81uI!F$;Rv`5f&B}x{F!cj69l!l~_nA zWvSRH3zV!Bwie#0Ddqd0Ii>mB-{1M4bM8IoGyEGq2|4Wzhe)DC#3>?vpGW})(2Ex4 zVHo?d54&&~dvFgs@y7UvQF6Oq#D%jMz(s7ugvm#kPrmSrof&vVfnK>m{^Xe-o!|?L zF^$^bF3nEp!)|g5)?v)Jin-)1EW{L6;sMs<IX2@HHlVA_&KBCrvJ;J?{$mLnF^RQ! zhBbI^@(1cTUwO7Kf^Fmptj2ZZqsp%F5Vijdb%S>p!UvlNi-&L2Hwo~)im(?ea2VOF zOq==wvbL<DPPAc6Vh(u+b$kk$QjSfu4RT9`(C0lS7(v@nQc7)O2MV`Pk6qaMKv z>VogaAJmPeQI9O2@2p1_MBRXe+806X8$vze5$wPzv{+vfJm@9bM?JG!)W%2DOZkdb z_=cG~KyZ_NsFyQ{x^NxphFVa^MNsF9n))bu$djf%lc}@9{AtiN;Bm%d6Pq#bkR!Ue R?On<1>Fo{|oQ7O;?tdgBOnm?V delta 808 zcmXZaO(?^07{Kvo=4EWQKbx1f#pWdm|0Ytxfur)09B^~c#D#Kj@;~gdi;}ei7jcjy z?WDLV2b7!?t_}#P#nJcKezpFe-}CJE{N8^PKZ(<*+ey1bQhpJ)i1;j#Dzq?w5iG+l z9K>Gi!By<VJ?zFC;~x$Yx7Uc2<097KGIrpWiI1^@_@YLfLdPo-)XEL=lV?6Uz$aE? z9<{(-TO81fHgO!AaoV_srNlev#Vj`9A;$3>+wloo&=quwiMC*IpmEecR<ISfu?f#G zg7+r=K<(!Z73*y5B%Z`DZX$;&8RHRZ{Tb>4?=XrF4viR%FVvk_oR<$1SdSyfVrACk zlgQk%fjUsyxQ!*myQuxM$dGbk;!A8JzQ-8mQ8(b!Gm9n$aRL`mcYK2Mk!#c|ctM@; z-S~~V&^+pum2l2_Wg*lBL{RH&)Vg8RD;~uzoWU6L%N7lNL<gvMc8gm0i25jBu@T>} z@CFDx#9q|L8A6>njJlvWYCjuwyaAIR!%E^Qlb<i-sa&Fwv#g{ilkz`g<^rRc{lL1r L&+g9!tYyzX*|tkv From 3d07377bd1bd80837c849c85fa9bbe5dddbc51b8 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Wed, 7 Aug 2024 20:02:32 +0100 Subject: [PATCH 107/156] Add config name lookup table --- doc/changelog.rst | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/doc/changelog.rst b/doc/changelog.rst index aad72f8f4..84236013b 100644 --- a/doc/changelog.rst +++ b/doc/changelog.rst @@ -11,9 +11,35 @@ Breaking changes: * Flask-BabelEx is no longer supported; the package is no longer maintained and Flask-Babel is recommended/active instead. * Flask-Mongoengine is no longer supported due to that package being unmaintained. * Bootstrap2 and Bootstrap3 themes are no longer available. -* All Flask-Admin config has been namespaced under `FLASK_ADMIN_`. - * `FLASK_ADMIN_SWATCH` has been removed; see `theme` parameter below. * `Admin()` now takes a `theme` parameter that encapsulates all of the configuration options for theming the admin instance. This replaces the `template_mode` parameter. +* All remaining Flask-Admin config has been namespaced under `FLASK_ADMIN_`. + +.. list-table:: Title + :widths: 50 50 + :header-rows: 1 + + * - Config variable name + - What's changed + * - FLASK_ADMIN_SWATCH + - Removed; use `Theme(swatch=...)` instead + * - FLASK_ADMIN_FLUID_LAYOUT + - Removed; use `Theme(fluid=...)` instead + * - MAPBOX_MAP_ID + - Renamed to FLASK_ADMIN_MAPBOX_MAP_ID + * - MAPBOX_SEARCH + - Renamed to FLASK_ADMIN_MAPBOX_SEARCH + * - MAPBOX_ACCESS_TOKEN + - Renamed to FLASK_ADMIN_MAPBOX_ACCESS_TOKEN + * - GOOGLE_MAPS_API_KEY + - Renamed to FLASK_ADMIN_GOOGLE_MAPS_API_KEY + * - DEFAULT_CENTER_LAT + - Renamed to FLASK_ADMIN_DEFAULT_CENTER_LAT + * - DEFAULT_CENTER_LONG + - Renamed to FLASK_ADMIN_DEFAULT_CENTER_LONG + * - ADMIN_RAISE_ON_INTEGRITY_ERROR + - Renamed to FLASK_ADMIN_RAISE_ON_INTEGRITY_ERROR + * - ADMIN_RAISE_ON_VIEW_EXCEPTION + - Renamed to FLASK_ADMIN_RAISE_ON_VIEW_EXCEPTION New features: From 5d07c88eb953ebc801106b184bc8de4f3726919a Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Wed, 7 Aug 2024 22:19:10 +0100 Subject: [PATCH 108/156] Fix styling when CSP is enabled `style` attributes don't work with CSP, so this removes any style attributes and replaces them with Bootstrap classes that provide the same styles. --- flask_admin/templates/bootstrap4/admin/actions.html | 6 +++--- flask_admin/templates/bootstrap4/admin/base.html | 5 ----- flask_admin/templates/bootstrap4/admin/lib.html | 8 ++++---- .../bootstrap4/admin/model/inline_list_base.html | 4 ++-- flask_admin/templates/bootstrap4/admin/model/layout.html | 2 +- flask_admin/templates/bootstrap4/admin/model/list.html | 4 ++-- .../templates/bootstrap4/admin/rediscli/console.html | 2 +- flask_admin/tests/test_csp.py | 2 +- 8 files changed, 14 insertions(+), 19 deletions(-) diff --git a/flask_admin/templates/bootstrap4/admin/actions.html b/flask_admin/templates/bootstrap4/admin/actions.html index 81e177085..8e61c20ee 100644 --- a/flask_admin/templates/bootstrap4/admin/actions.html +++ b/flask_admin/templates/bootstrap4/admin/actions.html @@ -13,7 +13,7 @@ {% macro form(actions, url) %} {% if actions %} - <form id="action_form" action="{{ url }}" method="POST" style="display: none"> + <form id="action_form" action="{{ url }}" method="POST" class="d-none"> {% if action_form.csrf_token %} {{ action_form.csrf_token }} {% elif csrf_token %} @@ -27,8 +27,8 @@ {% macro script(message, actions, actions_confirmation) %} {% if actions %} - <div id="actions-confirmation-data" style="display:none;">{{ actions_confirmation|tojson|safe }}</div> - <div id="message-data" style="display:none;">{{ message|tojson|safe }}</div> + <div id="actions-confirmation-data" class="d-none">{{ actions_confirmation|tojson|safe }}</div> + <div id="message-data" class="d-none">{{ message|tojson|safe }}</div> <script {{ admin_csp_nonce_attribute }} src="{{ admin_static.url(filename='admin/js/actions.js', v='1.0.0') }}"></script> {% endif %} {% endmacro %} diff --git a/flask_admin/templates/bootstrap4/admin/base.html b/flask_admin/templates/bootstrap4/admin/base.html index 039f3470e..923512c4e 100644 --- a/flask_admin/templates/bootstrap4/admin/base.html +++ b/flask_admin/templates/bootstrap4/admin/base.html @@ -24,11 +24,6 @@ <link href="{{ css_url }}" rel="stylesheet" {{ admin_csp_nonce_attribute }}> {% endfor %} {% endif %} - <style {{ admin_csp_nonce_attribute }}> - .hide { - display: none; - } - </style> {% endblock %} {% block head %} {% endblock %} diff --git a/flask_admin/templates/bootstrap4/admin/lib.html b/flask_admin/templates/bootstrap4/admin/lib.html index c040bd504..5dfe0b084 100644 --- a/flask_admin/templates/bootstrap4/admin/lib.html +++ b/flask_admin/templates/bootstrap4/admin/lib.html @@ -120,9 +120,9 @@ {% set prepend = kwargs.pop('prepend', None) %} {% set append = kwargs.pop('append', None) %} <div class="form-group {{ kwargs.get('column_class', '') }}"> - <label for="{{ field.id }}" class="control-label" {% if field.widget.input_type == 'checkbox' %}style="display: block; margin-bottom: 0"{% endif %}>{{ field.label.text }} + <label for="{{ field.id }}" class="control-label {% if field.widget.input_type == 'checkbox' %}d-block mb-0{% endif %}">{{ field.label.text }} {% if h.is_required_form_field(field) %} - <strong style="color: red">*</strong> + <strong class="text-danger"">*</strong> {%- else -%} {%- endif %} @@ -151,14 +151,14 @@ {%- endif -%} {% if direct_error %} <div class="invalid-feedback"> - <ul class="form-text text-muted" {% if field.widget.input_type == 'checkbox' %}style="margin-top: 0"{% endif %}> + <ul class="form-text text-muted {% if field.widget.input_type == 'checkbox' %}mt-0{% endif %}"> {% for e in field.errors if e is string %} <li>{{ e }}</li> {% endfor %} </ul> </div> {% elif field.description %} - <small class="form-text text-muted" {% if field.widget.input_type == 'checkbox' %}style="margin-top: 0"{% endif %}> + <small class="form-text text-muted {% if field.widget.input_type == 'checkbox' %}mt-0{% endif %}"> {{ field.description|safe }} </small> {% endif %} diff --git a/flask_admin/templates/bootstrap4/admin/model/inline_list_base.html b/flask_admin/templates/bootstrap4/admin/model/inline_list_base.html index ed0ee88fd..d8ed6ecd9 100644 --- a/flask_admin/templates/bootstrap4/admin/model/inline_list_base.html +++ b/flask_admin/templates/bootstrap4/admin/model/inline_list_base.html @@ -11,7 +11,7 @@ <div class="pull-right"> {% if subfield.get_pk and subfield.get_pk() %} <input type="checkbox" name="del-{{ subfield.id }}" id="del-{{ subfield.id }}" /> - <label for="del-{{ subfield.id }}" style="display: inline">{{ _gettext('Delete?') }}</label> + <label for="del-{{ subfield.id }}" class="d-inline">{{ _gettext('Delete?') }}</label> {% else %} <a href="javascript:void(0)" value="{{ _gettext('Are you sure you want to delete this record?') }}" class="inline-remove-field"><i class="fa fa-times glyphicon glyphicon-remove"></i></a> {% endif %} @@ -26,7 +26,7 @@ </div> {# template for new inline form fields #} - <div class="inline-field-template hide"> + <div class="inline-field-template d-none"> {% filter forceescape %} <div class="inline-field card card-body bg-light mb-3"> <legend> diff --git a/flask_admin/templates/bootstrap4/admin/model/layout.html b/flask_admin/templates/bootstrap4/admin/model/layout.html index 972b27a2e..6bd192f65 100644 --- a/flask_admin/templates/bootstrap4/admin/model/layout.html +++ b/flask_admin/templates/bootstrap4/admin/model/layout.html @@ -46,7 +46,7 @@ <input type="hidden" name="page_size" value="{{ page_size }}"> {% endif %} <div class="pull-right"> - <button type="submit" class="btn btn-primary" style="display: none">{{ _gettext('Apply') }}</button> + <button type="submit" class="btn btn-primary" class="d-none">{{ _gettext('Apply') }}</button> {% if active_filters %} <a href="{{ clear_search_url }}" class="btn btn-secondary">{{ _gettext('Reset Filters') }}</a> {% endif %} diff --git a/flask_admin/templates/bootstrap4/admin/model/list.html b/flask_admin/templates/bootstrap4/admin/model/list.html index d8d65c95b..7609075bc 100755 --- a/flask_admin/templates/bootstrap4/admin/model/list.html +++ b/flask_admin/templates/bootstrap4/admin/model/list.html @@ -184,8 +184,8 @@ {{ super() }} {% if filter_groups %} - <div id="filter-groups-data" style="display:none;">{{ filter_groups|tojson|safe }}</div> - <div id="active-filters-data" style="display:none;">{{ active_filters|tojson|safe }}</div> + <div id="filter-groups-data" class="d-none">{{ filter_groups|tojson|safe }}</div> + <div id="active-filters-data" class="d-none">{{ active_filters|tojson|safe }}</div> {% endif %} {{ lib.form_js() }} <script {{ admin_csp_nonce_attribute }} src="{{ admin_static.url(filename='admin/js/bs4_modal.js', v='1.0.0') }}"></script> diff --git a/flask_admin/templates/bootstrap4/admin/rediscli/console.html b/flask_admin/templates/bootstrap4/admin/rediscli/console.html index 6fa3179e3..f101ad923 100644 --- a/flask_admin/templates/bootstrap4/admin/rediscli/console.html +++ b/flask_admin/templates/bootstrap4/admin/rediscli/console.html @@ -22,6 +22,6 @@ {% block tail %} {{ super() }} - <div id="execute-view-data" style="display:none;">{{ admin_view.get_url('.execute_view')|tojson|safe }}</div> + <div id="execute-view-data" class="d-none">{{ admin_view.get_url('.execute_view')|tojson|safe }}</div> <script {{ admin_csp_nonce_attribute }} src="{{ admin_static.url(filename='admin/js/rediscli.js', v='1.0.0') }}"></script> {% endblock %} diff --git a/flask_admin/tests/test_csp.py b/flask_admin/tests/test_csp.py index 5df30c536..88562e994 100644 --- a/flask_admin/tests/test_csp.py +++ b/flask_admin/tests/test_csp.py @@ -32,6 +32,6 @@ def test_csp_nonces_injected(app, admin, nonce): assert tag.attrs['nonce'] == nonce styles = soup.select('style') - assert len(styles) == 1 + assert len(styles) == 0 for tag in styles: assert tag.attrs['nonce'] == nonce From b9c476e9c9a0ff43136f7dce750bf2e45ac3b053 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Thu, 8 Aug 2024 20:21:02 +0100 Subject: [PATCH 109/156] Fix pymongo example --- examples/pymongo/app.py | 6 +++--- examples/pymongo/requirements.txt | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/examples/pymongo/app.py b/examples/pymongo/app.py index 6dabe5f55..cdcc72393 100644 --- a/examples/pymongo/app.py +++ b/examples/pymongo/app.py @@ -74,7 +74,7 @@ def get_list(self, *args, **kwargs): # Grab user names query = {'_id': {'$in': [x['user_id'] for x in data]}} - users = db.user.find(query, fields=('name',)) + users = db.user.find(query, projection=('name',)) # Contribute user names to the models users_map = dict((x['_id'], x['name']) for x in users) @@ -86,7 +86,7 @@ def get_list(self, *args, **kwargs): # Contribute list of user choices to the forms def _feed_user_choices(self, form): - users = db.user.find(fields=('name',)) + users = db.user.find(projection=('name',)) form.user_id.choices = [(str(x['_id']), x['name']) for x in users] return form @@ -99,7 +99,7 @@ def edit_form(self, obj): return self._feed_user_choices(form) # Correct user_id reference before saving - def on_model_change(self, form, model): + def on_model_change(self, form, model, is_created): user_id = model.get('user_id') model['user_id'] = ObjectId(user_id) diff --git a/examples/pymongo/requirements.txt b/examples/pymongo/requirements.txt index 1185e3662..02f7c2be6 100644 --- a/examples/pymongo/requirements.txt +++ b/examples/pymongo/requirements.txt @@ -1 +1,3 @@ ../..[pymongo] + +pymongo>=4,<5 From c9867542e13262489aedb3b70d9f50046bc2fc14 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Thu, 8 Aug 2024 20:32:57 +0100 Subject: [PATCH 110/156] Add pointer to full changelog v2.0.0a0 --- doc/changelog.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/changelog.rst b/doc/changelog.rst index 84236013b..576bfd525 100644 --- a/doc/changelog.rst +++ b/doc/changelog.rst @@ -51,6 +51,8 @@ New features: And various smaller bug fixes and documentation updates. +For the full changelog, see https://github.com/pallets-eco/flask-admin/releases/tag/v2.0.0a0 + 1.6.1 ----- From c2357343e4f4f476cc10984477ca2b62c166b4b8 Mon Sep 17 00:00:00 2001 From: Lorenzo <lorenzo.cerreta@libero.it> Date: Sun, 11 Aug 2024 20:12:29 +0200 Subject: [PATCH 111/156] Example: display datetime fields in client's timezone and save user's input in UTC (#2502) This example shows how to make Flask-Admin display all datetime fields in client's timezone. Timezone conversion is handled by the frontend in /static/js/timezone.js, but an automatic post request to /set_timezone is done so that flask session can store the client's timezone and save datetime inputs in the correct timezone. --------- Co-authored-by: ElLorans <lorenzo.cerreta@gmail.com> --- examples/datetime-timezone/README.rst | 25 ++++ examples/datetime-timezone/__init__.py | 0 examples/datetime-timezone/app.py | 126 ++++++++++++++++++ examples/datetime-timezone/requirements.txt | 2 + .../datetime-timezone/static/js/timezone.js | 38 ++++++ 5 files changed, 191 insertions(+) create mode 100644 examples/datetime-timezone/README.rst create mode 100644 examples/datetime-timezone/__init__.py create mode 100644 examples/datetime-timezone/app.py create mode 100644 examples/datetime-timezone/requirements.txt create mode 100644 examples/datetime-timezone/static/js/timezone.js diff --git a/examples/datetime-timezone/README.rst b/examples/datetime-timezone/README.rst new file mode 100644 index 000000000..c570419fd --- /dev/null +++ b/examples/datetime-timezone/README.rst @@ -0,0 +1,25 @@ +This example shows how to make Flask-Admin display all datetime fields in client's +timezone. +Timezone conversion is handled by the frontend in /static/js/timezone.js, but an +automatic post request to /set_timezone is done so that flask session can store the +client's timezone and save datetime inputs in the correct timezone. + +To run this example: + +1. Clone the repository:: + + git clone https://github.com/pallets-eco/flask-admin.git + cd flask-admin + +2. Create and activate a virtual environment:: + + virtualenv env + source env/bin/activate + +3. Install requirements:: + + pip install -r 'examples/datetime-timezone/requirements.txt' + +4. Run the application:: + + python examples/datetime-timezone/app.py diff --git a/examples/datetime-timezone/__init__.py b/examples/datetime-timezone/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/examples/datetime-timezone/app.py b/examples/datetime-timezone/app.py new file mode 100644 index 000000000..0d113ab73 --- /dev/null +++ b/examples/datetime-timezone/app.py @@ -0,0 +1,126 @@ +from datetime import datetime +from zoneinfo import ZoneInfo + +from flask import Flask, request, session, jsonify +from flask_sqlalchemy import SQLAlchemy +from markupsafe import Markup +from sqlalchemy import DateTime, String +from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column + +from flask_admin import Admin +from flask_admin.contrib.sqla import ModelView +from flask_admin.model import typefmt + + +# model +class Base(DeclarativeBase): + pass + + +# app +app = Flask(__name__) +app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///default.sqlite" +# Create dummy secret key so we can use sessions +app.config['SECRET_KEY'] = '123456789' +db = SQLAlchemy(model_class=Base) +db.init_app(app) + + +class Article(db.Model): + id: Mapped[int] = mapped_column(primary_key=True) + text: Mapped[str] = mapped_column(String(30)) + last_edit: Mapped[datetime] = mapped_column(DateTime(timezone=True)) + + +# admin +def date_format(view, value): + """ + Ensure consistent date format and inject class for timezone.js parser. + """ + if value is None: + return '' + return Markup( + f'<span class="timezone-aware">{value.strftime("%Y-%m-%d %H:%M:%S")}</span>' + ) + + +MY_DEFAULT_FORMATTERS = dict(typefmt.BASE_FORMATTERS) +MY_DEFAULT_FORMATTERS.update({ + datetime: date_format, +}) + + +class TimezoneAwareModelView(ModelView): + column_type_formatters = MY_DEFAULT_FORMATTERS + extra_js = ['/static/js/timezone.js'] + + def on_model_change(self, form, model, is_created): + """ + Save datetime fields after converting from session['timezone'] to UTC. + """ + user_timezone = session["timezone"] + + for field_name, field_value in form.data.items(): + if isinstance(field_value, datetime): + # Convert naive datetime to timezone-aware datetime + aware_time = field_value.replace(tzinfo=ZoneInfo(user_timezone)) + + # Convert the time to UTC + utc_time = aware_time.astimezone(ZoneInfo('UTC')) + + # Assign the UTC time to the model + setattr(model, field_name, utc_time) + + super(TimezoneAwareModelView, self).on_model_change(form, model, is_created) + + +# inherit TimeZoneAwareModelView to make any admin page timezone-aware +class TimezoneAwareBlogModelView(TimezoneAwareModelView): + column_labels = { + "last_edit": "Last Edit (local time)", + } + + +# compare with regular ModelView to display data as saved on db +class BlogModelView(ModelView): + column_labels = { + "last_edit": "Last Edit (UTC)", + } + + +# Flask views +@app.route('/') +def index(): + return '<a href="/admin/timezone_aware_article">Click me to get to Admin!</a>' + + +@app.route('/set_timezone', methods=['POST']) +def set_timezone(): + """ + Save timezone to session so that datetime inputs can be correctly converted to UTC. + """ + session.permanent = True + timezone = request.get_json() + if timezone: + session['timezone'] = timezone + return jsonify({'message': 'Timezone set successfully'}), 200 + else: + return jsonify({'error': 'Invalid timezone'}), 400 + + +# create db on the fly +with app.app_context(): + Base.metadata.drop_all(db.engine) + Base.metadata.create_all(db.engine) + db.session.add(Article(text="Written at 9:00 UTC", + last_edit=datetime(2024, 8, 8, 9, 0, 0))) + db.session.commit() + admin = Admin(app, name='microblog') + admin.add_view( + BlogModelView(Article, db.session, name="Article", endpoint="article")) + admin.add_view( + TimezoneAwareBlogModelView(Article, db.session, name="Timezone Aware Article", + endpoint="timezone_aware_article")) + +if __name__ == '__main__': + app.run(debug=True) diff --git a/examples/datetime-timezone/requirements.txt b/examples/datetime-timezone/requirements.txt new file mode 100644 index 000000000..f248b7ae2 --- /dev/null +++ b/examples/datetime-timezone/requirements.txt @@ -0,0 +1,2 @@ +Flask-Admin +flask-sqlalchemy diff --git a/examples/datetime-timezone/static/js/timezone.js b/examples/datetime-timezone/static/js/timezone.js new file mode 100644 index 000000000..2054cb763 --- /dev/null +++ b/examples/datetime-timezone/static/js/timezone.js @@ -0,0 +1,38 @@ +// post client's timezone so that backend can correctly convert datetime inputs to UTC +fetch('/set_timezone', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(Intl.DateTimeFormat().resolvedOptions().timeZone) +}) + + +// convert all datetime fields to client timezone +function localizeDateTimes() { + const inputsOrSpans = document.querySelectorAll('input[data-date-format], span.timezone-aware'); + + inputsOrSpans.forEach(element => { + let localizedTime; + + const isInput = element.tagName.toLowerCase() === 'input' + // Check if the element is an input or a span + if (isInput) { + // For input elements, use the value attribute + localizedTime = new Date(element.getAttribute("value") + "Z"); + } else { + // For span elements, use the text content + localizedTime = new Date(element.textContent.trim() + "Z"); + } + + const formattedTime = moment(localizedTime).format('YYYY-MM-DD HH:mm:ss'); + + if (isInput) { + element.setAttribute("value", formattedTime); + } else { + element.textContent = formattedTime; + } + }); +} + +localizeDateTimes(); From 7239c1aeff9d1c4a805bdf4ac99d4b556209dda3 Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Mon, 26 Aug 2024 19:21:57 +0100 Subject: [PATCH 112/156] Remove unnecessary execute bits --- doc/_themes/LICENSE | 0 doc/_themes/README | 0 doc/_themes/flask/layout.html | 0 doc/_themes/flask/relations.html | 0 doc/_themes/flask/static/flasky.css_t | 0 doc/_themes/flask/theme.conf | 0 doc/_themes/flask_small/layout.html | 0 doc/_themes/flask_small/static/flasky.css_t | 0 doc/_themes/flask_small/theme.conf | 0 doc/_themes/flask_theme_support.py | 0 flask_admin/contrib/sqla/view.py | 0 flask_admin/model/base.py | 0 flask_admin/model/typefmt.py | 0 flask_admin/static/admin/js/details_filter.js | 0 .../static/vendor/leaflet/images/layers-2x.png | Bin flask_admin/static/vendor/leaflet/images/layers.png | Bin .../static/vendor/leaflet/images/marker-icon-2x.png | Bin .../static/vendor/leaflet/images/marker-icon.png | Bin .../static/vendor/leaflet/images/marker-shadow.png | Bin .../static/vendor/leaflet/images/spritesheet-2x.png | Bin .../static/vendor/leaflet/images/spritesheet.png | Bin .../static/vendor/leaflet/images/spritesheet.svg | 0 flask_admin/static/vendor/leaflet/leaflet.draw.css | 0 flask_admin/static/vendor/leaflet/leaflet.draw.js | 0 flask_admin/static/vendor/select2/LICENSE | 0 flask_admin/static/vendor/select2/select2.css | 0 flask_admin/static/vendor/select2/select2.min.js | 0 .../templates/bootstrap4/admin/model/list.html | 0 .../bootstrap4/admin/model/modals/details.html | 0 29 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 doc/_themes/LICENSE mode change 100755 => 100644 doc/_themes/README mode change 100755 => 100644 doc/_themes/flask/layout.html mode change 100755 => 100644 doc/_themes/flask/relations.html mode change 100755 => 100644 doc/_themes/flask/static/flasky.css_t mode change 100755 => 100644 doc/_themes/flask/theme.conf mode change 100755 => 100644 doc/_themes/flask_small/layout.html mode change 100755 => 100644 doc/_themes/flask_small/static/flasky.css_t mode change 100755 => 100644 doc/_themes/flask_small/theme.conf mode change 100755 => 100644 doc/_themes/flask_theme_support.py mode change 100755 => 100644 flask_admin/contrib/sqla/view.py mode change 100755 => 100644 flask_admin/model/base.py mode change 100755 => 100644 flask_admin/model/typefmt.py mode change 100755 => 100644 flask_admin/static/admin/js/details_filter.js mode change 100755 => 100644 flask_admin/static/vendor/leaflet/images/layers-2x.png mode change 100755 => 100644 flask_admin/static/vendor/leaflet/images/layers.png mode change 100755 => 100644 flask_admin/static/vendor/leaflet/images/marker-icon-2x.png mode change 100755 => 100644 flask_admin/static/vendor/leaflet/images/marker-icon.png mode change 100755 => 100644 flask_admin/static/vendor/leaflet/images/marker-shadow.png mode change 100755 => 100644 flask_admin/static/vendor/leaflet/images/spritesheet-2x.png mode change 100755 => 100644 flask_admin/static/vendor/leaflet/images/spritesheet.png mode change 100755 => 100644 flask_admin/static/vendor/leaflet/images/spritesheet.svg mode change 100755 => 100644 flask_admin/static/vendor/leaflet/leaflet.draw.css mode change 100755 => 100644 flask_admin/static/vendor/leaflet/leaflet.draw.js mode change 100755 => 100644 flask_admin/static/vendor/select2/LICENSE mode change 100755 => 100644 flask_admin/static/vendor/select2/select2.css mode change 100755 => 100644 flask_admin/static/vendor/select2/select2.min.js mode change 100755 => 100644 flask_admin/templates/bootstrap4/admin/model/list.html mode change 100755 => 100644 flask_admin/templates/bootstrap4/admin/model/modals/details.html diff --git a/doc/_themes/LICENSE b/doc/_themes/LICENSE old mode 100755 new mode 100644 diff --git a/doc/_themes/README b/doc/_themes/README old mode 100755 new mode 100644 diff --git a/doc/_themes/flask/layout.html b/doc/_themes/flask/layout.html old mode 100755 new mode 100644 diff --git a/doc/_themes/flask/relations.html b/doc/_themes/flask/relations.html old mode 100755 new mode 100644 diff --git a/doc/_themes/flask/static/flasky.css_t b/doc/_themes/flask/static/flasky.css_t old mode 100755 new mode 100644 diff --git a/doc/_themes/flask/theme.conf b/doc/_themes/flask/theme.conf old mode 100755 new mode 100644 diff --git a/doc/_themes/flask_small/layout.html b/doc/_themes/flask_small/layout.html old mode 100755 new mode 100644 diff --git a/doc/_themes/flask_small/static/flasky.css_t b/doc/_themes/flask_small/static/flasky.css_t old mode 100755 new mode 100644 diff --git a/doc/_themes/flask_small/theme.conf b/doc/_themes/flask_small/theme.conf old mode 100755 new mode 100644 diff --git a/doc/_themes/flask_theme_support.py b/doc/_themes/flask_theme_support.py old mode 100755 new mode 100644 diff --git a/flask_admin/contrib/sqla/view.py b/flask_admin/contrib/sqla/view.py old mode 100755 new mode 100644 diff --git a/flask_admin/model/base.py b/flask_admin/model/base.py old mode 100755 new mode 100644 diff --git a/flask_admin/model/typefmt.py b/flask_admin/model/typefmt.py old mode 100755 new mode 100644 diff --git a/flask_admin/static/admin/js/details_filter.js b/flask_admin/static/admin/js/details_filter.js old mode 100755 new mode 100644 diff --git a/flask_admin/static/vendor/leaflet/images/layers-2x.png b/flask_admin/static/vendor/leaflet/images/layers-2x.png old mode 100755 new mode 100644 diff --git a/flask_admin/static/vendor/leaflet/images/layers.png b/flask_admin/static/vendor/leaflet/images/layers.png old mode 100755 new mode 100644 diff --git a/flask_admin/static/vendor/leaflet/images/marker-icon-2x.png b/flask_admin/static/vendor/leaflet/images/marker-icon-2x.png old mode 100755 new mode 100644 diff --git a/flask_admin/static/vendor/leaflet/images/marker-icon.png b/flask_admin/static/vendor/leaflet/images/marker-icon.png old mode 100755 new mode 100644 diff --git a/flask_admin/static/vendor/leaflet/images/marker-shadow.png b/flask_admin/static/vendor/leaflet/images/marker-shadow.png old mode 100755 new mode 100644 diff --git a/flask_admin/static/vendor/leaflet/images/spritesheet-2x.png b/flask_admin/static/vendor/leaflet/images/spritesheet-2x.png old mode 100755 new mode 100644 diff --git a/flask_admin/static/vendor/leaflet/images/spritesheet.png b/flask_admin/static/vendor/leaflet/images/spritesheet.png old mode 100755 new mode 100644 diff --git a/flask_admin/static/vendor/leaflet/images/spritesheet.svg b/flask_admin/static/vendor/leaflet/images/spritesheet.svg old mode 100755 new mode 100644 diff --git a/flask_admin/static/vendor/leaflet/leaflet.draw.css b/flask_admin/static/vendor/leaflet/leaflet.draw.css old mode 100755 new mode 100644 diff --git a/flask_admin/static/vendor/leaflet/leaflet.draw.js b/flask_admin/static/vendor/leaflet/leaflet.draw.js old mode 100755 new mode 100644 diff --git a/flask_admin/static/vendor/select2/LICENSE b/flask_admin/static/vendor/select2/LICENSE old mode 100755 new mode 100644 diff --git a/flask_admin/static/vendor/select2/select2.css b/flask_admin/static/vendor/select2/select2.css old mode 100755 new mode 100644 diff --git a/flask_admin/static/vendor/select2/select2.min.js b/flask_admin/static/vendor/select2/select2.min.js old mode 100755 new mode 100644 diff --git a/flask_admin/templates/bootstrap4/admin/model/list.html b/flask_admin/templates/bootstrap4/admin/model/list.html old mode 100755 new mode 100644 diff --git a/flask_admin/templates/bootstrap4/admin/model/modals/details.html b/flask_admin/templates/bootstrap4/admin/model/modals/details.html old mode 100755 new mode 100644 From 5855069df27b2bb9c785fe53cbb4d4bf45bbdca3 Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Mon, 26 Aug 2024 19:25:07 +0100 Subject: [PATCH 113/156] Clarify BootSwatch themes are included --- doc/introduction.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/introduction.rst b/doc/introduction.rst index 9fe3dbc1d..274b1427e 100644 --- a/doc/introduction.rst +++ b/doc/introduction.rst @@ -59,7 +59,7 @@ you could use the :meth:`~flask_admin.base.Admin.init_app` method. If you start this application and navigate to `http://localhost:5000/admin/ <http://localhost:5000/admin/>`_, you should see an empty page with a navigation bar on top. Customize the look by -specifying a Bootswatch theme that suits your needs (see http://bootswatch.com/4/ for available swatches). +specifying one of the included Bootswatch themes (see https://bootswatch.com/4/ for a preview of the swatches). Adding Model Views ------------------ From 2c137182e2709e9788eecc052fbcacd6545c18c0 Mon Sep 17 00:00:00 2001 From: LeXofLeviafan <lexofleviafan@gmail.com> Date: Tue, 27 Aug 2024 18:57:57 +0200 Subject: [PATCH 114/156] [pallets-eco#2505] fixing inconsistent modal headers --- .../templates/bootstrap4/admin/model/modals/details.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flask_admin/templates/bootstrap4/admin/model/modals/details.html b/flask_admin/templates/bootstrap4/admin/model/modals/details.html index 3aba4703a..846da9923 100755 --- a/flask_admin/templates/bootstrap4/admin/model/modals/details.html +++ b/flask_admin/templates/bootstrap4/admin/model/modals/details.html @@ -4,7 +4,7 @@ {% block body %} <div class="modal-header"> {% block header_text %} - <h3>{{ _gettext('View Record') + ' #' + request.args.get('id') }}</h3> + <h5 class="modal-title">{{ _gettext('View Record') + ' #' + request.args.get('id') }}</h5> {% endblock %} <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> </div> From 08b2deb5a3fb6b1e6d738439cde866e7ff413a6d Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Fri, 30 Aug 2024 21:05:38 +0100 Subject: [PATCH 115/156] Update example readme instructions The examples now suggest making venvs inside each example directory rather than using the top-level one. Also update the sqlalchemy example to have the consistent app.py entrypoint rather than run_server.py --- examples/auth-flask-login/README.rst | 8 ++++---- examples/auth/README.rst | 8 ++++---- examples/babel/README.rst | 8 ++++---- examples/bootstrap4/README.rst | 8 ++++---- examples/csp-nonce/README.rst | 8 ++++---- examples/custom-layout/README.rst | 8 ++++---- examples/datetime-timezone/README.rst | 8 ++++---- examples/forms-files-images/README.rst | 8 ++++---- examples/geo_alchemy/README.rst | 8 ++++---- examples/host-matching/README.rst | 8 ++++---- examples/methodview/README.rst | 8 ++++---- examples/multiple-admin-instances/README.rst | 8 ++++---- examples/peewee/README.rst | 9 ++++----- examples/pymongo/README.rst | 9 ++++----- examples/simple/README.rst | 8 ++++---- examples/sqla-association_proxy/README.rst | 8 ++++---- examples/sqla-custom-inline-forms/README.rst | 8 ++++---- examples/sqla/README.rst | 8 ++++---- examples/sqla/{run_server.py => app.py} | 0 examples/tinymongo/README.rst | 9 ++++----- 20 files changed, 76 insertions(+), 79 deletions(-) rename examples/sqla/{run_server.py => app.py} (100%) diff --git a/examples/auth-flask-login/README.rst b/examples/auth-flask-login/README.rst index bf2c87a1a..cadbea212 100644 --- a/examples/auth-flask-login/README.rst +++ b/examples/auth-flask-login/README.rst @@ -2,10 +2,10 @@ This example shows how to integrate Flask-Login authentication with Flask-Admin To run this example: -1. Clone the repository:: +1. Clone the repository and navigate to this example:: git clone https://github.com/flask-admin/flask-admin.git - cd flask-admin + cd flask-admin/examples/auth-flask-login 2. Create and activate a virtual environment:: @@ -14,11 +14,11 @@ To run this example: 3. Install requirements:: - pip install -r 'examples/auth-flask-login/requirements.txt' + pip install -r requirements.txt 4. Run the application:: - python examples/auth-flask-login/app.py + python app.py The first time you run this example, a sample sqlite database gets populated automatically. To suppress this behaviour, comment the following lines in app.py::: diff --git a/examples/auth/README.rst b/examples/auth/README.rst index 7f6e2a700..66dae690d 100644 --- a/examples/auth/README.rst +++ b/examples/auth/README.rst @@ -3,10 +3,10 @@ the 'login' & 'register' views, but you could follow the same approach for using To run this example: -1. Clone the repository:: +1. Clone the repository and navigate to this example:: git clone https://github.com/flask-admin/flask-admin.git - cd flask-admin + cd flask-admin/examples/auth 2. Create and activate a virtual environment:: @@ -15,11 +15,11 @@ To run this example: 3. Install requirements:: - pip install -r 'examples/auth/requirements.txt' + pip install -r requirements.txt 4. Run the application:: - python examples/auth/app.py + python app.py The first time you run this example, a sample sqlite database gets populated automatically. To suppress this behaviour, comment the following lines in app.py::: diff --git a/examples/babel/README.rst b/examples/babel/README.rst index 5d4c9c791..98075a54c 100644 --- a/examples/babel/README.rst +++ b/examples/babel/README.rst @@ -2,10 +2,10 @@ This example show how to translate Flask-Admin into different language using cus To run this example: -1. Clone the repository:: +1. Clone the repository and navigate to this example:: git clone https://github.com/flask-admin/flask-admin.git - cd flask-admin + cd flask-admin/examples/babel 2. Create and activate a virtual environment:: @@ -14,8 +14,8 @@ To run this example: 3. Install requirements:: - pip install -r 'examples/babel/requirements.txt' + pip install -r requirements.txt 4. Run the application:: - python examples/babel/app.py + python app.py diff --git a/examples/bootstrap4/README.rst b/examples/bootstrap4/README.rst index f4b3e7396..7ba69c5d2 100644 --- a/examples/bootstrap4/README.rst +++ b/examples/bootstrap4/README.rst @@ -2,10 +2,10 @@ This example shows how you can customize the look & feel of the admin interface. To run this example: -1. Clone the repository:: +1. Clone the repository and navigate to this example:: git clone https://github.com/flask-admin/flask-admin.git - cd flask-admin + cd flask-admin/examples/bootstrap4 2. Create and activate a virtual environment:: @@ -14,11 +14,11 @@ To run this example: 3. Install requirements:: - pip install -r examples/bootstrap4/requirements.txt + pip install -r requirements.txt 4. Run the application:: - python examples/bootstrap4/app.py + python app.py The first time you run this example, a sample sqlite database gets populated automatically. To suppress this behaviour, comment the following lines in app.py::: diff --git a/examples/csp-nonce/README.rst b/examples/csp-nonce/README.rst index f25d8e21e..da1dc791f 100644 --- a/examples/csp-nonce/README.rst +++ b/examples/csp-nonce/README.rst @@ -3,10 +3,10 @@ a nonce into HTML tags. To run this example: -1. Clone the repository:: +1. Clone the repository and navigate to this example:: git clone https://github.com/flask-admin/flask-admin.git - cd flask-admin + cd flask-admin/examples/csp-nonce 2. Create and activate a virtual environment:: @@ -15,8 +15,8 @@ To run this example: 3. Install requirements:: - pip install -r 'examples/csp-nonce/requirements.txt' + pip install -r requirements.txt 4. Run the application:: - python examples/csp-nonce/app.py + python app.py diff --git a/examples/custom-layout/README.rst b/examples/custom-layout/README.rst index aede7d1df..505925533 100644 --- a/examples/custom-layout/README.rst +++ b/examples/custom-layout/README.rst @@ -2,10 +2,10 @@ This example shows how you can customize the look & feel of the admin interface. To run this example: -1. Clone the repository:: +1. Clone the repository and navigate to this example:: git clone https://github.com/flask-admin/flask-admin.git - cd flask-admin + cd flask-admin/examples/custom-layout 2. Create and activate a virtual environment:: @@ -14,11 +14,11 @@ To run this example: 3. Install requirements:: - pip install -r 'examples/custom-layout/requirements.txt' + pip install -r requirements.txt 4. Run the application:: - python examples/custom-layout/app.py + python app.py The first time you run this example, a sample sqlite database gets populated automatically. To suppress this behaviour, comment the following lines in app.py::: diff --git a/examples/datetime-timezone/README.rst b/examples/datetime-timezone/README.rst index c570419fd..6d9f52754 100644 --- a/examples/datetime-timezone/README.rst +++ b/examples/datetime-timezone/README.rst @@ -6,10 +6,10 @@ client's timezone and save datetime inputs in the correct timezone. To run this example: -1. Clone the repository:: +1. Clone the repository and navigate to this example:: git clone https://github.com/pallets-eco/flask-admin.git - cd flask-admin + cd flask-admin/examples/datetime-timezone 2. Create and activate a virtual environment:: @@ -18,8 +18,8 @@ To run this example: 3. Install requirements:: - pip install -r 'examples/datetime-timezone/requirements.txt' + pip install -r requirements.txt 4. Run the application:: - python examples/datetime-timezone/app.py + python app.py diff --git a/examples/forms-files-images/README.rst b/examples/forms-files-images/README.rst index 9b4038d27..010f77169 100644 --- a/examples/forms-files-images/README.rst +++ b/examples/forms-files-images/README.rst @@ -9,10 +9,10 @@ This example shows how you can:: To run this example: -1. Clone the repository:: +1. Clone the repository and navigate to this example:: git clone https://github.com/flask-admin/flask-admin.git - cd flask-admin + cd flask-admin/examples/forms-files-images 2. Create and activate a virtual environment:: @@ -21,11 +21,11 @@ To run this example: 3. Install requirements:: - pip install -r 'examples/forms-files-images/requirements.txt' + pip install -r requirements.txt 4. Run the application:: - python examples/forms-files-images/app.py + python app.py The first time you run this example, a sample sqlite database gets populated automatically. To suppress this behaviour, comment the following lines in app.py::: diff --git a/examples/geo_alchemy/README.rst b/examples/geo_alchemy/README.rst index 1b9361b82..4167e9bd7 100644 --- a/examples/geo_alchemy/README.rst +++ b/examples/geo_alchemy/README.rst @@ -2,10 +2,10 @@ SQLAlchemy model backend integration examples. To run this example: -1. Clone the repository:: +1. Clone the repository and navigate to this example:: git clone https://github.com/flask-admin/flask-admin.git - cd flask-admin + cd flask-admin/examples/geo_alchemy 2. Create and activate a virtual environment:: @@ -14,7 +14,7 @@ To run this example: 3. Install requirements:: - pip install -r 'examples/geo_alchemy/requirements.txt' + pip install -r requirements.txt 4. Setup the database:: @@ -32,7 +32,7 @@ To run this example: 5. Run the application:: - python examples/geo_alchemy/app.py + python app.py 6. You will notice that the maps are not rendered. By default, Flask-Admin expects an integration with `Mapbox <https://www.mapbox.com/>`_. To see them, you will have diff --git a/examples/host-matching/README.rst b/examples/host-matching/README.rst index 0dea7fbe6..3dd93d0bf 100644 --- a/examples/host-matching/README.rst +++ b/examples/host-matching/README.rst @@ -2,10 +2,10 @@ This example shows how to configure Flask-Admin when you're using Flask's `host_ To run this example: -1. Clone the repository:: +1. Clone the repository and navigate to this example:: git clone https://github.com/flask-admin/flask-admin.git - cd flask-admin + cd flask-admin/examples/host-matching 2. Create and activate a virtual environment:: @@ -14,8 +14,8 @@ To run this example: 3. Install requirements:: - pip install -r 'examples/host-matching/requirements.txt' + pip install -r requirements.txt 4. Run the application:: - python examples/host-matching/app.py + python app.py diff --git a/examples/methodview/README.rst b/examples/methodview/README.rst index 03c6c0fd1..2d50ae27a 100644 --- a/examples/methodview/README.rst +++ b/examples/methodview/README.rst @@ -2,10 +2,10 @@ Example which shows how to integrate Flask `MethodView` with Flask-Admin. To run this example: -1. Clone the repository:: +1. Clone the repository and navigate to this example:: git clone https://github.com/flask-admin/flask-admin.git - cd flask-admin + cd flask-admin/examples/methodview 2. Create and activate a virtual environment:: @@ -14,8 +14,8 @@ To run this example: 3. Install requirements:: - pip install -r 'examples/methodview/requirements.txt' + pip install -r requirements.txt 4. Run the application:: - python examples/methodview/app.py + python app.py diff --git a/examples/multiple-admin-instances/README.rst b/examples/multiple-admin-instances/README.rst index e46a97152..ed8d3dbc1 100644 --- a/examples/multiple-admin-instances/README.rst +++ b/examples/multiple-admin-instances/README.rst @@ -2,10 +2,10 @@ This example shows how to create two separate instances of Flask-Admin for one F To run this example: -1. Clone the repository:: +1. Clone the repository and navigate to this example:: git clone https://github.com/flask-admin/flask-admin.git - cd flask-admin + cd flask-admin/examples/multiple-admin-instances 2. Create and activate a virtual environment:: @@ -14,8 +14,8 @@ To run this example: 3. Install requirements:: - pip install -r 'examples/multiple-admin-instances/requirements.txt' + pip install -r requirements.txt 4. Run the application:: - python examples/multiple-admin-instances/app.py + python app.py diff --git a/examples/peewee/README.rst b/examples/peewee/README.rst index 0c0bc5f13..f47cae5b8 100644 --- a/examples/peewee/README.rst +++ b/examples/peewee/README.rst @@ -2,10 +2,10 @@ Peewee model backend integration example. To run this example: -1. Clone the repository:: +1. Clone the repository and navigate to this example:: git clone https://github.com/flask-admin/flask-admin.git - cd flask-admin + cd flask-admin/examples/peewee 2. Create and activate a virtual environment:: @@ -14,9 +14,8 @@ To run this example: 3. Install requirements:: - pip install -r 'examples/peewee/requirements.txt' + pip install -r requirements.txt 4. Run the application:: - python examples/peewee/app.py - + python app.py diff --git a/examples/pymongo/README.rst b/examples/pymongo/README.rst index 9cf6dbd0a..f54f9f732 100644 --- a/examples/pymongo/README.rst +++ b/examples/pymongo/README.rst @@ -2,10 +2,10 @@ PyMongo model backend integration example. To run this example: -1. Clone the repository:: +1. Clone the repository and navigate to this example:: git clone https://github.com/flask-admin/flask-admin.git - cd flask-admin + cd flask-admin/examples/pymongo 2. Create and activate a virtual environment:: @@ -14,9 +14,8 @@ To run this example: 3. Install requirements:: - pip install -r 'examples/pymongo/requirements.txt' + pip install -r requirements.txt 4. Run the application:: - python examples/pymongo/app.py - + python app.py diff --git a/examples/simple/README.rst b/examples/simple/README.rst index 2889a22c4..37af56b75 100644 --- a/examples/simple/README.rst +++ b/examples/simple/README.rst @@ -3,10 +3,10 @@ The views do not have to be associated to any of your models, and you can fill t To run this example: -1. Clone the repository:: +1. Clone the repository and navigate to this example:: git clone https://github.com/flask-admin/flask-admin.git - cd flask-admin + cd flask-admin/examples/simple 2. Create and activate a virtual environment:: @@ -15,8 +15,8 @@ To run this example: 3. Install requirements:: - pip install -r 'examples/simple/requirements.txt' + pip install -r requirements.txt 4. Run the application:: - python examples/simple/app.py + python app.py diff --git a/examples/sqla-association_proxy/README.rst b/examples/sqla-association_proxy/README.rst index 6b27d65ec..aa6adcdf2 100644 --- a/examples/sqla-association_proxy/README.rst +++ b/examples/sqla-association_proxy/README.rst @@ -5,10 +5,10 @@ http://docs.sqlalchemy.org/en/latest/orm/extensions/associationproxy.html To run this example: -1. Clone the repository:: +1. Clone the repository and navigate to this example:: git clone https://github.com/flask-admin/flask-admin.git - cd flask-admin + cd flask-admin/examples/sqla-association_proxy 2. Create and activate a virtual environment:: @@ -17,8 +17,8 @@ To run this example: 3. Install requirements:: - pip install -r 'examples/sqla-association_proxy/requirements.txt' + pip install -r requirements.txt 4. Run the application:: - python examples/sqla-association_proxy/app.py + python app.py diff --git a/examples/sqla-custom-inline-forms/README.rst b/examples/sqla-custom-inline-forms/README.rst index 1da76474e..ba17e7641 100644 --- a/examples/sqla-custom-inline-forms/README.rst +++ b/examples/sqla-custom-inline-forms/README.rst @@ -2,10 +2,10 @@ This example shows how to use inline forms when working with related models. To run this example: -1. Clone the repository:: +1. Clone the repository and navigate to this example:: git clone https://github.com/flask-admin/flask-admin.git - cd flask-admin + cd flask-admin/examples/sqla-custom-inline-forms 2. Create and activate a virtual environment:: @@ -14,8 +14,8 @@ To run this example: 3. Install requirements:: - pip install -r 'examples/sqla-custom-inline-forms/requirements.txt' + pip install -r requirements.txt 4. Run the application:: - python examples/sqla-custom-inline-forms/app.py + python app.py diff --git a/examples/sqla/README.rst b/examples/sqla/README.rst index 797a4820a..890b3e8ac 100644 --- a/examples/sqla/README.rst +++ b/examples/sqla/README.rst @@ -2,10 +2,10 @@ SQLAlchemy model backend integration examples. To run this example: -1. Clone the repository:: +1. Clone the repository and navigate to this example:: git clone https://github.com/flask-admin/flask-admin.git - cd flask-admin + cd flask-admin/examples/sqla 2. Create and activate a virtual environment:: @@ -14,11 +14,11 @@ To run this example: 3. Install requirements:: - pip install -r 'examples/sqla/requirements.txt' + pip install -r requirements.txt 4. Run the application:: - python examples/sqla/run_server.py + python app.py The first time you run this example, a sample sqlite database gets populated automatically. To start with a fresh database: `rm examples/sqla/admin/sample_db.sqlite`, and then restart the application. diff --git a/examples/sqla/run_server.py b/examples/sqla/app.py similarity index 100% rename from examples/sqla/run_server.py rename to examples/sqla/app.py diff --git a/examples/tinymongo/README.rst b/examples/tinymongo/README.rst index 8d6af7b8e..90ca5b13e 100644 --- a/examples/tinymongo/README.rst +++ b/examples/tinymongo/README.rst @@ -4,10 +4,10 @@ TinyMongo is the Pymongo for TinyDB and it stores data in JSON files. To run this example: -1. Clone the repository:: +1. Clone the repository and navigate to this example:: git clone https://github.com/flask-admin/flask-admin.git - cd flask-admin + cd flask-admin/examples/tinymongo 2. Create and activate a virtual environment:: @@ -16,9 +16,8 @@ To run this example: 3. Install requirements:: - pip install -r 'examples/tinymongo/requirements.txt' + pip install -r requirements.txt 4. Run the application:: - python examples/tinymongo/app.py - + python app.py From 8f2764e11b90635a432b2ba44f8d487840162f84 Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Sat, 31 Aug 2024 21:19:06 +0100 Subject: [PATCH 116/156] Update references to the project URL (#2507) --- doc/_templates/sidebarintro.html | 4 +-- doc/_themes/flask/theme.conf | 2 +- doc/advanced.rst | 8 +++--- doc/index.rst | 2 +- doc/introduction.rst | 6 ++--- examples/auth-flask-login/README.rst | 2 +- examples/auth/README.rst | 2 +- examples/babel/README.rst | 2 +- examples/bootstrap4/README.rst | 2 +- examples/csp-nonce/README.rst | 2 +- examples/custom-layout/README.rst | 2 +- examples/forms-files-images/README.rst | 2 +- examples/geo_alchemy/README.rst | 2 +- examples/host-matching/README.rst | 2 +- examples/methodview/README.rst | 2 +- examples/multiple-admin-instances/README.rst | 2 +- examples/peewee/README.rst | 2 +- examples/pymongo/README.rst | 2 +- examples/simple/README.rst | 2 +- examples/sqla-association_proxy/README.rst | 2 +- examples/sqla-custom-inline-forms/README.rst | 2 +- examples/sqla/README.rst | 2 +- examples/tinymongo/README.rst | 2 +- flask_admin/contrib/peewee/form.py | 4 +-- flask_admin/static/admin/js/form.js | 2 +- .../zh_Hans_CN/LC_MESSAGES/advanced.po | 26 +++++++++---------- .../zh_Hans_CN/LC_MESSAGES/index.po | 4 +-- .../zh_Hans_CN/LC_MESSAGES/introduction.po | 16 ++++++------ 28 files changed, 55 insertions(+), 55 deletions(-) diff --git a/doc/_templates/sidebarintro.html b/doc/_templates/sidebarintro.html index af7e3203f..d5119fee5 100644 --- a/doc/_templates/sidebarintro.html +++ b/doc/_templates/sidebarintro.html @@ -1,8 +1,8 @@ <h3>Useful Links</h3> <ul> <li><a href="http://flask.pocoo.org/" target="_blank">Flask</a></li> - <li><a href="http://github.com/flask-admin/flask-admin" target="_blank">Flask-Admin @ github</a></li> + <li><a href="http://github.com/pallets-eco/flask-admin" target="_blank">Flask-Admin @ github</a></li> </ul> -<a class="github" href="http://github.com/flask-admin/flask-admin" target="_blank"><img style="position: fixed; top: 0; right: 0; border: 0;" +<a class="github" href="http://github.com/pallets-eco/flask-admin" target="_blank"><img style="position: fixed; top: 0; right: 0; border: 0;" src="//s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub" /></a> diff --git a/doc/_themes/flask/theme.conf b/doc/_themes/flask/theme.conf index 16c5f8fbb..397a9c6e1 100644 --- a/doc/_themes/flask/theme.conf +++ b/doc/_themes/flask/theme.conf @@ -7,4 +7,4 @@ pygments_style = flask_theme_support.FlaskyStyle index_logo = 'flask-admin.png' index_logo_height = 140px touch_icon = -github_fork = 'flask-admin/flask-admin' \ No newline at end of file +github_fork = 'pallets-eco/flask-admin' \ No newline at end of file diff --git a/doc/advanced.rst b/doc/advanced.rst index 8e2b66b20..1f7c8ab20 100644 --- a/doc/advanced.rst +++ b/doc/advanced.rst @@ -241,7 +241,7 @@ Image handling also requires you to have `Pillow <https://pypi.python.org/pypi/P installed if you need to do any processing on the image files. Have a look at the example at -https://github.com/flask-admin/Flask-Admin/tree/master/examples/forms-files-images. +https://github.com/pallets-eco/flask-admin/tree/master/examples/forms-files-images. If you just want to manage static files in a directory, without tying them to a database model, then use the :ref:`File-Admin<file-admin>` plug-in. @@ -283,7 +283,7 @@ from the GeoAlchemy backend, rather than the usual SQLAlchemy backend:: Some of the Geometry field types that are available include: "POINT", "MULTIPOINT", "POLYGON", "MULTIPOLYGON", "LINESTRING" and "MULTILINESTRING". -Have a look at https://github.com/flask-admin/flask-admin/tree/master/examples/geo_alchemy +Have a look at https://github.com/pallets-eco/flask-admin/tree/master/examples/geo_alchemy to get started. Display map widgets @@ -462,7 +462,7 @@ Known issues: - Many-to-Many model relations are not supported: there's no built-in way to express M2M relation in Peewee For more, check the :class:`~flask_admin.contrib.peewee` API documentation. Or look at -the Peewee example at https://github.com/flask-admin/flask-admin/tree/master/examples/peewee. +the Peewee example at https://github.com/pallets-eco/flask-admin/tree/master/examples/peewee. PyMongo ******* @@ -492,7 +492,7 @@ This is minimal PyMongo view:: On top of that you can add sortable columns, filters, text search, etc. For more, check the :class:`~flask_admin.contrib.pymongo` API documentation. Or look at -the pymongo example at https://github.com/flask-admin/flask-admin/tree/master/examples/pymongo. +the pymongo example at https://github.com/pallets-eco/flask-admin/tree/master/examples/pymongo. Migrating From Django --------------------- diff --git a/doc/index.rst b/doc/index.rst index 013ab1ec7..886f51dcf 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -23,7 +23,7 @@ because they let you group together all of the usual *Create, Read, Update, Delete* (CRUD) view logic into a single, self-contained class for each of your models. -**What does it look like?** Clone the `GitHub repository <https://github.com/flask-admin/flask-admin>`_ +**What does it look like?** Clone the `GitHub repository <https://github.com/pallets-eco/flask-admin>`_ and run the provided examples locally to get a feel for Flask-Admin. There are several to choose from in the `examples` directory. diff --git a/doc/introduction.rst b/doc/introduction.rst index 274b1427e..a350fe4ef 100644 --- a/doc/introduction.rst +++ b/doc/introduction.rst @@ -140,7 +140,7 @@ could be as simple as:: In the navigation menu, components that are not accessible to a particular user will not be displayed for that user. For an example of using Flask-Login with Flask-Admin, have a look -at https://github.com/flask-admin/Flask-Admin/tree/master/examples/auth-flask-login. +at https://github.com/pallets-eco/flask-admin/tree/master/examples/auth-flask-login. The main drawback is that you still need to implement all of the relevant login, registration, and account management views yourself. @@ -174,7 +174,7 @@ Defining a `security_context_processor` function will take care of this for you: ) For a working example of using Flask-Security with Flask-Admin, have a look at -https://github.com/flask-admin/Flask-Admin/tree/master/examples/auth. +https://github.com/pallets-eco/flask-admin/tree/master/examples/auth. The example only uses the built-in `register` and `login` views, but you could follow the same approach for including the other views, like `forgot_password`, `send_confirmation`, etc. @@ -487,7 +487,7 @@ list_row_actions Row action cell with edit/remove/etc buttons empty_list_message Message that will be displayed if there are no models found ======================= ============================================ -Have a look at the `layout` example at https://github.com/flask-admin/flask-admin/tree/master/examples/custom-layout +Have a look at the `layout` example at https://github.com/pallets-eco/flask-admin/tree/master/examples/custom-layout to see how you can take full stylistic control over the admin interface. Template Context Variables diff --git a/examples/auth-flask-login/README.rst b/examples/auth-flask-login/README.rst index cadbea212..b395fafb8 100644 --- a/examples/auth-flask-login/README.rst +++ b/examples/auth-flask-login/README.rst @@ -4,7 +4,7 @@ To run this example: 1. Clone the repository and navigate to this example:: - git clone https://github.com/flask-admin/flask-admin.git + git clone https://github.com/pallets-eco/flask-admin.git cd flask-admin/examples/auth-flask-login 2. Create and activate a virtual environment:: diff --git a/examples/auth/README.rst b/examples/auth/README.rst index 66dae690d..55a9c31b1 100644 --- a/examples/auth/README.rst +++ b/examples/auth/README.rst @@ -5,7 +5,7 @@ To run this example: 1. Clone the repository and navigate to this example:: - git clone https://github.com/flask-admin/flask-admin.git + git clone https://github.com/pallets-eco/flask-admin.git cd flask-admin/examples/auth 2. Create and activate a virtual environment:: diff --git a/examples/babel/README.rst b/examples/babel/README.rst index 98075a54c..b0126e0e8 100644 --- a/examples/babel/README.rst +++ b/examples/babel/README.rst @@ -4,7 +4,7 @@ To run this example: 1. Clone the repository and navigate to this example:: - git clone https://github.com/flask-admin/flask-admin.git + git clone https://github.com/pallets-eco/flask-admin.git cd flask-admin/examples/babel 2. Create and activate a virtual environment:: diff --git a/examples/bootstrap4/README.rst b/examples/bootstrap4/README.rst index 7ba69c5d2..09eba324d 100644 --- a/examples/bootstrap4/README.rst +++ b/examples/bootstrap4/README.rst @@ -4,7 +4,7 @@ To run this example: 1. Clone the repository and navigate to this example:: - git clone https://github.com/flask-admin/flask-admin.git + git clone https://github.com/pallets-eco/flask-admin.git cd flask-admin/examples/bootstrap4 2. Create and activate a virtual environment:: diff --git a/examples/csp-nonce/README.rst b/examples/csp-nonce/README.rst index da1dc791f..fefc87101 100644 --- a/examples/csp-nonce/README.rst +++ b/examples/csp-nonce/README.rst @@ -5,7 +5,7 @@ To run this example: 1. Clone the repository and navigate to this example:: - git clone https://github.com/flask-admin/flask-admin.git + git clone https://github.com/pallets-eco/flask-admin.git cd flask-admin/examples/csp-nonce 2. Create and activate a virtual environment:: diff --git a/examples/custom-layout/README.rst b/examples/custom-layout/README.rst index 505925533..455125bab 100644 --- a/examples/custom-layout/README.rst +++ b/examples/custom-layout/README.rst @@ -4,7 +4,7 @@ To run this example: 1. Clone the repository and navigate to this example:: - git clone https://github.com/flask-admin/flask-admin.git + git clone https://github.com/pallets-eco/flask-admin.git cd flask-admin/examples/custom-layout 2. Create and activate a virtual environment:: diff --git a/examples/forms-files-images/README.rst b/examples/forms-files-images/README.rst index 010f77169..3680dc9e7 100644 --- a/examples/forms-files-images/README.rst +++ b/examples/forms-files-images/README.rst @@ -11,7 +11,7 @@ To run this example: 1. Clone the repository and navigate to this example:: - git clone https://github.com/flask-admin/flask-admin.git + git clone https://github.com/pallets-eco/flask-admin.git cd flask-admin/examples/forms-files-images 2. Create and activate a virtual environment:: diff --git a/examples/geo_alchemy/README.rst b/examples/geo_alchemy/README.rst index 4167e9bd7..cfda1ce2e 100644 --- a/examples/geo_alchemy/README.rst +++ b/examples/geo_alchemy/README.rst @@ -4,7 +4,7 @@ To run this example: 1. Clone the repository and navigate to this example:: - git clone https://github.com/flask-admin/flask-admin.git + git clone https://github.com/pallets-eco/flask-admin.git cd flask-admin/examples/geo_alchemy 2. Create and activate a virtual environment:: diff --git a/examples/host-matching/README.rst b/examples/host-matching/README.rst index 3dd93d0bf..94fe37f94 100644 --- a/examples/host-matching/README.rst +++ b/examples/host-matching/README.rst @@ -4,7 +4,7 @@ To run this example: 1. Clone the repository and navigate to this example:: - git clone https://github.com/flask-admin/flask-admin.git + git clone https://github.com/pallets-eco/flask-admin.git cd flask-admin/examples/host-matching 2. Create and activate a virtual environment:: diff --git a/examples/methodview/README.rst b/examples/methodview/README.rst index 2d50ae27a..f579a0608 100644 --- a/examples/methodview/README.rst +++ b/examples/methodview/README.rst @@ -4,7 +4,7 @@ To run this example: 1. Clone the repository and navigate to this example:: - git clone https://github.com/flask-admin/flask-admin.git + git clone https://github.com/pallets-eco/flask-admin.git cd flask-admin/examples/methodview 2. Create and activate a virtual environment:: diff --git a/examples/multiple-admin-instances/README.rst b/examples/multiple-admin-instances/README.rst index ed8d3dbc1..8806b9428 100644 --- a/examples/multiple-admin-instances/README.rst +++ b/examples/multiple-admin-instances/README.rst @@ -4,7 +4,7 @@ To run this example: 1. Clone the repository and navigate to this example:: - git clone https://github.com/flask-admin/flask-admin.git + git clone https://github.com/pallets-eco/flask-admin.git cd flask-admin/examples/multiple-admin-instances 2. Create and activate a virtual environment:: diff --git a/examples/peewee/README.rst b/examples/peewee/README.rst index f47cae5b8..99b6c1bb7 100644 --- a/examples/peewee/README.rst +++ b/examples/peewee/README.rst @@ -4,7 +4,7 @@ To run this example: 1. Clone the repository and navigate to this example:: - git clone https://github.com/flask-admin/flask-admin.git + git clone https://github.com/pallets-eco/flask-admin.git cd flask-admin/examples/peewee 2. Create and activate a virtual environment:: diff --git a/examples/pymongo/README.rst b/examples/pymongo/README.rst index f54f9f732..086123018 100644 --- a/examples/pymongo/README.rst +++ b/examples/pymongo/README.rst @@ -4,7 +4,7 @@ To run this example: 1. Clone the repository and navigate to this example:: - git clone https://github.com/flask-admin/flask-admin.git + git clone https://github.com/pallets-eco/flask-admin.git cd flask-admin/examples/pymongo 2. Create and activate a virtual environment:: diff --git a/examples/simple/README.rst b/examples/simple/README.rst index 37af56b75..c49ad8301 100644 --- a/examples/simple/README.rst +++ b/examples/simple/README.rst @@ -5,7 +5,7 @@ To run this example: 1. Clone the repository and navigate to this example:: - git clone https://github.com/flask-admin/flask-admin.git + git clone https://github.com/pallets-eco/flask-admin.git cd flask-admin/examples/simple 2. Create and activate a virtual environment:: diff --git a/examples/sqla-association_proxy/README.rst b/examples/sqla-association_proxy/README.rst index aa6adcdf2..dc57d3ee7 100644 --- a/examples/sqla-association_proxy/README.rst +++ b/examples/sqla-association_proxy/README.rst @@ -7,7 +7,7 @@ To run this example: 1. Clone the repository and navigate to this example:: - git clone https://github.com/flask-admin/flask-admin.git + git clone https://github.com/pallets-eco/flask-admin.git cd flask-admin/examples/sqla-association_proxy 2. Create and activate a virtual environment:: diff --git a/examples/sqla-custom-inline-forms/README.rst b/examples/sqla-custom-inline-forms/README.rst index ba17e7641..2eb848569 100644 --- a/examples/sqla-custom-inline-forms/README.rst +++ b/examples/sqla-custom-inline-forms/README.rst @@ -4,7 +4,7 @@ To run this example: 1. Clone the repository and navigate to this example:: - git clone https://github.com/flask-admin/flask-admin.git + git clone https://github.com/pallets-eco/flask-admin.git cd flask-admin/examples/sqla-custom-inline-forms 2. Create and activate a virtual environment:: diff --git a/examples/sqla/README.rst b/examples/sqla/README.rst index 890b3e8ac..cdee39e82 100644 --- a/examples/sqla/README.rst +++ b/examples/sqla/README.rst @@ -4,7 +4,7 @@ To run this example: 1. Clone the repository and navigate to this example:: - git clone https://github.com/flask-admin/flask-admin.git + git clone https://github.com/pallets-eco/flask-admin.git cd flask-admin/examples/sqla 2. Create and activate a virtual environment:: diff --git a/examples/tinymongo/README.rst b/examples/tinymongo/README.rst index 90ca5b13e..de33b1725 100644 --- a/examples/tinymongo/README.rst +++ b/examples/tinymongo/README.rst @@ -6,7 +6,7 @@ To run this example: 1. Clone the repository and navigate to this example:: - git clone https://github.com/flask-admin/flask-admin.git + git clone https://github.com/pallets-eco/flask-admin.git cd flask-admin/examples/tinymongo 2. Create and activate a virtual environment:: diff --git a/flask_admin/contrib/peewee/form.py b/flask_admin/contrib/peewee/form.py index be27e9a4b..7c022778d 100644 --- a/flask_admin/contrib/peewee/form.py +++ b/flask_admin/contrib/peewee/form.py @@ -57,10 +57,10 @@ def display_row_controls(self, field): in in .contribute() below For reference, .process() introduced in: - https://github.com/flask-admin/flask-admin/commit/2845e4b28cb40b25e2bf544b327f6202dc7e5709 + https://github.com/pallets-eco/flask-admin/commit/2845e4b28cb40b25e2bf544b327f6202dc7e5709 Fixed, brokenly I think, in: - https://github.com/flask-admin/flask-admin/commit/4383eef3ce7eb01878f086928f8773adb9de79f8#diff-f87e7cd76fb9bc48c8681b24f238fb13R30 + https://github.com/pallets-eco/flask-admin/commit/4383eef3ce7eb01878f086928f8773adb9de79f8#diff-f87e7cd76fb9bc48c8681b24f238fb13R30 """ def populate_obj(self, obj, name): diff --git a/flask_admin/static/admin/js/form.js b/flask_admin/static/admin/js/form.js index d16f8accd..e475b3442 100644 --- a/flask_admin/static/admin/js/form.js +++ b/flask_admin/static/admin/js/form.js @@ -486,7 +486,7 @@ return true; case 'x-editable-combodate': // Fixes bootstrap4 issue where data-template breaks bs4 popover. - // https://github.com/flask-admin/flask-admin/issues/2022 + // https://github.com/pallets-eco/flask-admin/issues/2022 let template = $el.data('template'); $el.removeAttr('data-template'); $el.editable({ diff --git a/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/advanced.po b/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/advanced.po index f34b45fe9..c41324b28 100644 --- a/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/advanced.po +++ b/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/advanced.po @@ -195,10 +195,10 @@ msgstr "" #: ../../doc/advanced.rst:166 msgid "" -"Have a look at the example at https://github.com/flask-admin/Flask-" -"Admin/tree/master/examples/forms." +"Have a look at the example at https://github.com/pallets-eco/flask-" +"admin/tree/master/examples/forms." msgstr "" -"请查看 https://github.com/flask-admin/Flask-Admin/tree/master/examples/forms" +"请查看 https://github.com/pallets-eco/flask-admin/tree/master/examples/forms" " 示例。" #: ../../doc/advanced.rst:169 @@ -295,10 +295,10 @@ msgstr "" #: ../../doc/advanced.rst:212 msgid "" -"Have a look at https://github.com/flask-admin/flask-" +"Have a look at https://github.com/pallets-eco/flask-" "admin/tree/master/examples/geo_alchemy to get started." msgstr "" -"请查看 https://github.com/flask-admin/flask-" +"请查看 https://github.com/pallets-eco/flask-" "admin/tree/master/examples/geo_alchemy 示例以开始使用。" #: ../../doc/advanced.rst:216 @@ -612,11 +612,11 @@ msgstr "" msgid "" "`MongoEngine <http://mongoengine.org/>`_ is a python wrapper for MongoDB." " For an example of using MongoEngine with Flask-Admin, see " -"https://github.com/flask-admin/flask-" +"https://github.com/pallets-eco/flask-" "admin/tree/master/examples/mongoengine." msgstr "" "`MongoEngine <http://mongoengine.org/>`_ 是 MongoDB 的 Python 封装。在 Flask-" -"Admin 中使用 MongoEngine 的示例,请参阅 https://github.com/flask-admin/flask-" +"Admin 中使用 MongoEngine 的示例,请参阅 https://github.com/pallets-eco/flask-" "admin/tree/master/examples/mongoengine。" #: ../../doc/advanced.rst:371 ../../doc/advanced.rst:392 @@ -698,11 +698,11 @@ msgstr "不支持多对多模型关系:在 Peewee 中没有内置的方式来 #: ../../doc/advanced.rst:405 msgid "" "For more, check the :class:`~flask_admin.contrib.peewee` API " -"documentation. Or look at the Peewee example at https://github.com/flask-" -"admin/flask-admin/tree/master/examples/peewee." +"documentation. Or look at the Peewee example at https://github.com/pallets-" +"eco/flask-admin/tree/master/examples/peewee." msgstr "" "更多信息,请参阅 :class:`~flask_admin.contrib.peewee` API 文档。或查看 Peewee 使用示例 " -"https://github.com/flask-admin/flask-admin/tree/master/examples/peewee。" +"https://github.com/pallets-eco/flask-admin/tree/master/examples/peewee。" #: ../../doc/advanced.rst:409 msgid "PyMongo" @@ -737,11 +737,11 @@ msgstr "除此之外,您还可以添加可排序的列,过滤器,文本搜 #: ../../doc/advanced.rst:435 msgid "" "For more, check the :class:`~flask_admin.contrib.pymongoe` API " -"documentation. Or look at the Peewee example at https://github.com/flask-" -"admin/flask-admin/tree/master/examples/pymongo." +"documentation. Or look at the Peewee example at https://github.com/pallets-" +"eco/flask-admin/tree/master/examples/pymongo." msgstr "" "更多信息,请参阅 :class:`~flask_admin.contrib.pymongoe` API 文档。或查看 PyMongo 使用示例 " -"https://github.com/flask-admin/flask-admin/tree/master/examples/pymongo。" +"https://github.com/pallets-eco/flask-admin/tree/master/examples/pymongo。" #: ../../doc/advanced.rst:439 msgid "Migrating From Django" diff --git a/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/index.po b/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/index.po index 3cc2075cc..e3a09f213 100644 --- a/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/index.po +++ b/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/index.po @@ -70,11 +70,11 @@ msgid "" "**What does it look like?** At http://examples.flask-admin.org/ you can " "see some examples of Flask-Admin in action, or browse through the " "`examples/` directory in the `GitHub repository <https://github.com" -"/flask-admin/flask-admin>`_." +"/pallets-eco/flask-admin>`_." msgstr "" "**它是什么样子的?** 在 http://examples.flask-admin.org/,你可以看到 " "Flask-Admin 的一些示例,也可以直接浏览 `GitHub 存储库 <https://github.com" -"/flask-admin/flask-admin>`_ 中的 `examples/` 目录。" +"/pallets-eco/flask-admin>`_ 中的 `examples/` 目录。" #: ../../index.rst:40 msgid "Support" diff --git a/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/introduction.po b/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/introduction.po index 8122893ef..dfea35963 100644 --- a/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/introduction.po +++ b/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/introduction.po @@ -189,10 +189,10 @@ msgid "" "In the navigation menu, components that are not accessible to a " "particular user will not be displayed for that user. For an example of " "using Flask-Login with Flask-Admin, have a look at https://github.com" -"/flask-admin/Flask-Admin/tree/master/examples/auth-flask-login." +"/pallets-eco/flask-admin/tree/master/examples/auth-flask-login." msgstr "" "在导航菜单中,不会显示该用户无法访问的组件。有关使用 Flask-Login 与 Flask-Admin 的示例,请参考 " -"https://github.com/flask-admin/Flask-Admin/tree/master/examples/auth-" +"https://github.com/pallets-eco/flask-admin/tree/master/examples/auth-" "flask-login。" #: ../../doc/introduction.rst:115 @@ -240,11 +240,11 @@ msgstr "" #: ../../doc/introduction.rst:146 msgid "" "For a working example of using Flask-Security with Flask-Admin, have a " -"look at https://github.com/flask-admin/Flask-" -"Admin/tree/master/examples/auth." +"look at https://github.com/pallets-eco/flask-" +"admin/tree/master/examples/auth." msgstr "" -"有关使用 Flask-Security 和 Flask-Admin 集成的示例,请查看 https://github.com/flask-" -"admin/Flask-Admin/tree/master/examples/auth。" +"有关使用 Flask-Security 和 Flask-Admin 集成的示例,请查看 https://github.com/pallets-" +"eco/flask-admin/tree/master/examples/auth。" #: ../../doc/introduction.rst:149 msgid "" @@ -714,11 +714,11 @@ msgstr "如果未找到模型,将显示该消息" #: ../../doc/introduction.rst:443 msgid "" -"Have a look at the `layout` example at https://github.com/flask-admin" +"Have a look at the `layout` example at https://github.com/pallets-eco" "/flask-admin/tree/master/examples/layout to see how you can take full " "stylistic control over the admin interface." msgstr "" -"请查看 https://github.com/flask-admin/flask-" +"请查看 https://github.com/pallets-eco/flask-" "admin/tree/master/examples/layout 上的 *布局* 示例,了解如何对管理界面进行全面的风格控制。" #: ../../doc/introduction.rst:447 From 314eb02c6904bee2886fadd983a5a8216b9132de Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Mon, 2 Sep 2024 19:31:50 +0100 Subject: [PATCH 117/156] Update documentation copyright year --- doc/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/conf.py b/doc/conf.py index e9cf1f4a8..016c2715f 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -43,7 +43,7 @@ # General information about the project. project = u'flask-admin' -copyright = u'2012-2019, Flask-Admin Team' +copyright = u'2012-2024, Flask-Admin Team' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the From 30da0a28b36ab4b347704a7aeda4e1177e2c237c Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Mon, 2 Sep 2024 19:31:50 +0100 Subject: [PATCH 118/156] Update documented minimum Python version to 3.8 --- doc/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/index.rst b/doc/index.rst index 886f51dcf..4e9e17379 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -39,7 +39,7 @@ in the `examples` directory. Support ------- -Python 3.6 or higher. +Python 3.8 or higher. Indices And Tables ------------------ From 12a46bc8f840f54d4356230e3d5ef258e72ff4af Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Mon, 2 Sep 2024 19:31:50 +0100 Subject: [PATCH 119/156] rst.ninjs.org is no longer available --- README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/README.md b/README.md index 0c0db81c0..ed267e922 100644 --- a/README.md +++ b/README.md @@ -91,9 +91,6 @@ To build the docs in your local environment, from the project directory: tox -e docs-html -And if you want to preview any *.rst* snippets that you may want to -contribute, please go to <http://rst.ninjs.org/>. - ## Installation To install Flask-Admin, simply: From 01ff8f8f201ce294938de980c5da591078bf5c6f Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Mon, 2 Sep 2024 19:31:50 +0100 Subject: [PATCH 120/156] Always recommend cloning using https --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ed267e922..196fba836 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Flask-Admin The project was recently moved into its own organization. Please update -your references to `git@github.com:pallets-eco/flask-admin.git`. +your references to `https://github.com/pallets-eco/flask-admin.git`. [![image](https://d322cqt584bo4o.cloudfront.net/flask-admin/localized.svg)](https://crowdin.com/project/flask-admin) [![image](https://github.com/pallets-eco/flask-admin/actions/workflows/test.yaml/badge.svg)](https://github.com/pallets-eco/flask-admin/actions/workflows/test.yaml) @@ -100,7 +100,7 @@ To install Flask-Admin, simply: Or alternatively, you can download the repository and install manually by doing: - git clone git@github.com:pallets-eco/flask-admin.git + git clone https://github.com/pallets-eco/flask-admin.git cd flask-admin pip install . From d356109f73cf3567f44642b12b753d649d740ed1 Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Mon, 2 Sep 2024 19:31:50 +0100 Subject: [PATCH 121/156] Update links to external resources --- NOTICE | 6 ++--- README.md | 14 +++++----- doc/_templates/sidebarintro.html | 8 +++--- doc/_themes/flask/layout.html | 2 +- doc/_themes/flask_small/layout.html | 4 +-- doc/advanced.rst | 10 +++---- doc/index.rst | 2 +- doc/introduction.rst | 2 +- examples/sqla-association_proxy/README.rst | 2 +- flask_admin/contrib/geoa/widgets.py | 2 +- flask_admin/form/fields.py | 2 +- .../LC_MESSAGES/adding_a_new_model_backend.po | 2 +- .../zh_Hans_CN/LC_MESSAGES/advanced.po | 26 +++++++++---------- .../zh_Hans_CN/LC_MESSAGES/api.po | 2 +- .../zh_Hans_CN/LC_MESSAGES/changelog.po | 2 +- .../zh_Hans_CN/LC_MESSAGES/index.po | 6 ++--- .../zh_Hans_CN/LC_MESSAGES/introduction.po | 6 ++--- 17 files changed, 49 insertions(+), 49 deletions(-) diff --git a/NOTICE b/NOTICE index 8c2eecf8a..1440bd1a8 100644 --- a/NOTICE +++ b/NOTICE @@ -3,10 +3,10 @@ Flask-Admin includes some bundled software to ease installation. Select2 ======= -Distributed under `APLv2 <http://www.apache.org/licenses/LICENSE-2.0>`_. +Distributed under `APLv2 <https://www.apache.org/licenses/LICENSE-2.0>`_. Bootstrap ================= -v3.1.0 and subsequent versions distributed under `MIT <http://opensource.org/licenses/MIT>`_. -Versions prior to v3.1.0 distributed under `APLv2 <http://www.apache.org/licenses/LICENSE-2.0>`_. +v3.1.0 and subsequent versions distributed under `MIT <https://opensource.org/license/MIT>`_. +Versions prior to v3.1.0 distributed under `APLv2 <https://www.apache.org/licenses/LICENSE-2.0>`_. diff --git a/README.md b/README.md index 196fba836..c2ca9f1eb 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ The project was recently moved into its own organization. Please update your references to `https://github.com/pallets-eco/flask-admin.git`. -[![image](https://d322cqt584bo4o.cloudfront.net/flask-admin/localized.svg)](https://crowdin.com/project/flask-admin) [![image](https://github.com/pallets-eco/flask-admin/actions/workflows/test.yaml/badge.svg)](https://github.com/pallets-eco/flask-admin/actions/workflows/test.yaml) +[![image](https://d322cqt584bo4o.cloudfront.net/flask-admin/localized.svg)](https://crowdin.com/project/flask-admin) [![image](https://github.com/pallets-eco/flask-admin/actions/workflows/tests.yaml/badge.svg?branch=master)](https://github.com/pallets-eco/flask-admin/actions/workflows/test.yaml) ## Pallets Community Ecosystem @@ -18,7 +18,7 @@ your references to `https://github.com/pallets-eco/flask-admin.git`. ## Introduction Flask-Admin is a batteries-included, simple-to-use -[Flask](http://flask.pocoo.org/) extension that lets you add admin +[Flask](https://flask.palletsprojects.com/) extension that lets you add admin interfaces to Flask applications. It is inspired by the *django-admin* package, but implemented in such a way that the developer has total control over the look, feel, functionality and user experience of the resulting @@ -26,12 +26,12 @@ application. Out-of-the-box, Flask-Admin plays nicely with various ORM\'s, including -- [SQLAlchemy](http://www.sqlalchemy.org/) -- [pymongo](http://api.mongodb.org/python/current/) +- [SQLAlchemy](https://www.sqlalchemy.org/) +- [pymongo](https://pymongo.readthedocs.io/) - and [Peewee](https://github.com/coleifer/peewee). It also boasts a simple file management interface and a [Redis -client](http://redis.io/) console. +client](https://redis.io/) console. The biggest feature of Flask-Admin is its flexibility. It aims to provide a set of simple tools that can be used to build admin interfaces of @@ -151,9 +151,9 @@ You can also run the tests on multiple environments using *tox*. ## 3rd Party Stuff Flask-Admin is built with the help of -[Bootstrap](http://getbootstrap.com/), +[Bootstrap](https://getbootstrap.com/), [Select2](https://github.com/ivaynberg/select2) and -[Bootswatch](http://bootswatch.com/). +[Bootswatch](https://bootswatch.com/). If you want to localize your application, install the [Flask-Babel](https://pypi.python.org/pypi/Flask-Babel) package. diff --git a/doc/_templates/sidebarintro.html b/doc/_templates/sidebarintro.html index d5119fee5..63a16d388 100644 --- a/doc/_templates/sidebarintro.html +++ b/doc/_templates/sidebarintro.html @@ -1,8 +1,8 @@ <h3>Useful Links</h3> <ul> - <li><a href="http://flask.pocoo.org/" target="_blank">Flask</a></li> - <li><a href="http://github.com/pallets-eco/flask-admin" target="_blank">Flask-Admin @ github</a></li> + <li><a href="https://flask.palletsprojects.com/" target="_blank">Flask</a></li> + <li><a href="https://github.com/pallets-eco/flask-admin" target="_blank">Flask-Admin @ github</a></li> </ul> -<a class="github" href="http://github.com/pallets-eco/flask-admin" target="_blank"><img style="position: fixed; top: 0; right: 0; border: 0;" - src="//s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub" /></a> +<a class="github" href="https://github.com/pallets-eco/flask-admin" target="_blank"><img style="position: fixed; top: 0; right: 0; border: 0;" + src="https://github.blog/wp-content/uploads/2008/12/forkme_right_darkblue_121621.png" alt="Fork me on GitHub" /></a> diff --git a/doc/_themes/flask/layout.html b/doc/_themes/flask/layout.html index 19c43fbbe..ddf4f70b9 100644 --- a/doc/_themes/flask/layout.html +++ b/doc/_themes/flask/layout.html @@ -16,7 +16,7 @@ {%- block footer %} <div class="footer"> © Copyright {{ copyright }}. - Created using <a href="http://sphinx.pocoo.org/">Sphinx</a>. + Created using <a href="https://www.sphinx-doc.org/">Sphinx</a>. </div> {% if pagename == 'index' %} </div> diff --git a/doc/_themes/flask_small/layout.html b/doc/_themes/flask_small/layout.html index aa1716aaf..8c1dd9efd 100644 --- a/doc/_themes/flask_small/layout.html +++ b/doc/_themes/flask_small/layout.html @@ -14,8 +14,8 @@ {% block relbar1 %}{% endblock %} {% block relbar2 %} {% if theme_github_fork %} - <a href="http://github.com/{{ theme_github_fork }}"><img style="position: fixed; top: 0; right: 0; border: 0;" - src="http://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub" /></a> + <a href="https://github.com/{{ theme_github_fork }}"><img style="position: fixed; top: 0; right: 0; border: 0;" + src="https://github.blog/wp-content/uploads/2008/12/forkme_right_darkblue_121621.png" alt="Fork me on GitHub" /></a> {% endif %} {% endblock %} {% block sidebar1 %}{% endblock %} diff --git a/doc/advanced.rst b/doc/advanced.rst index 1f7c8ab20..89a5a5e89 100644 --- a/doc/advanced.rst +++ b/doc/advanced.rst @@ -207,7 +207,7 @@ file / image uploads that need to be tied to a field in your model. WYSIWIG Text Fields ******************* To handle complicated text content, you can use -`CKEditor <http://ckeditor.com/>`_ by subclassing some of the built-in WTForms +`CKEditor <https://ckeditor.com/>`_ by subclassing some of the built-in WTForms classes as follows:: from wtforms import TextAreaField @@ -260,9 +260,9 @@ Some notable features include: with map data from `Mapbox <https://www.mapbox.com>`_. - Geographic information, including points, lines and polygons, can be edited interactively using `Leaflet.Draw <https://github.com/Leaflet/Leaflet.draw>`_. - - Graceful fallback: `GeoJSON <http://geojson.org/>`_ data can be edited in a ``<textarea>``, if the + - Graceful fallback: `GeoJSON <https://geojson.org/>`_ data can be edited in a ``<textarea>``, if the user has turned off Javascript. - - Works with a `Geometry <https://geoalchemy-2.readthedocs.io/en/latest/types.html#geoalchemy2.types.Geometry>`_ SQL field that is integrated with `Shapely <http://toblerity.org/shapely/>`_ objects. + - Works with a `Geometry <https://geoalchemy-2.readthedocs.io/en/latest/types.html#geoalchemy2.types.Geometry>`_ SQL field that is integrated with `Shapely <https://shapely.readthedocs.io/>`_ objects. To get started, define some fields on your model using GeoAlchemy's *Geometry* field. Next, add model views to your interface using the ModelView class @@ -455,7 +455,7 @@ Features: - Inline editing of related models; In order to use peewee integration, you need to install two additional Python -packages: `peewee <http://docs.peewee-orm.com/>`_ and `wtf-peewee <https://github.com/coleifer/wtf-peewee/>`_. +packages: `peewee <https://docs.peewee-orm.com/>`_ and `wtf-peewee <https://github.com/coleifer/wtf-peewee/>`_. Known issues: @@ -517,7 +517,7 @@ applications out there on the web. Flask-Admin follows this same design philosophy. So even though it provides you with several tools for getting up & running quickly, it will be up to you, as a developer, to tell Flask-Admin what should be displayed and how. Even -though it is easy to get started with a simple `CRUD <http://en.wikipedia.org/wiki/Create,_read,_update_and_delete>`_ +though it is easy to get started with a simple `CRUD <https://en.wikipedia.org/wiki/Create,_read,_update_and_delete>`_ interface for each model in your application, Flask-Admin doesn't fix you to this approach, and you are free to define other ways of interacting with some, or all, of your models. diff --git a/doc/index.rst b/doc/index.rst index 4e9e17379..da3a37b98 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -3,7 +3,7 @@ Flask-Admin ########### -**Why Flask?** As a micro-framework, `Flask <http://flask.pocoo.org/>`_ lets you build web services with very little overhead. +**Why Flask?** As a micro-framework, `Flask <https://flask.palletsprojects.com/>`_ lets you build web services with very little overhead. It offers freedom for you, the designer, to implement your project in a way that suits your particular application. diff --git a/doc/introduction.rst b/doc/introduction.rst index a350fe4ef..7aa1510c6 100644 --- a/doc/introduction.rst +++ b/doc/introduction.rst @@ -392,7 +392,7 @@ For this you could override only the view in question, and all the links to it w Working With the Built-in Templates =================================== -Flask-Admin uses the `Jinja2 <http://jinja.pocoo.org/docs/>`_ templating engine. +Flask-Admin uses the `Jinja2 <https://jinja.palletsprojects.com/>`_ templating engine. .. _extending-builtin-templates: diff --git a/examples/sqla-association_proxy/README.rst b/examples/sqla-association_proxy/README.rst index dc57d3ee7..92c5d0004 100644 --- a/examples/sqla-association_proxy/README.rst +++ b/examples/sqla-association_proxy/README.rst @@ -1,7 +1,7 @@ Example of how to use (and filter on) an association proxy with the SQLAlchemy backend. For information about association proxies and how to use them, please visit: -http://docs.sqlalchemy.org/en/latest/orm/extensions/associationproxy.html +https://docs.sqlalchemy.org/en/latest/orm/extensions/associationproxy.html To run this example: diff --git a/flask_admin/contrib/geoa/widgets.py b/flask_admin/contrib/geoa/widgets.py index 6e83f25aa..896c2b607 100644 --- a/flask_admin/contrib/geoa/widgets.py +++ b/flask_admin/contrib/geoa/widgets.py @@ -13,7 +13,7 @@ class LeafletWidget(TextArea): data_role = 'leaflet' """ - `Leaflet <http://leafletjs.com/>`_ styled map widget. Inherits from + `Leaflet <https://leafletjs.com>`_ styled map widget. Inherits from `TextArea` so that geographic data can be stored via the <textarea> (and edited there if the user's browser does not have Javascript). diff --git a/flask_admin/form/fields.py b/flask_admin/form/fields.py index edbffea12..5795cb93c 100644 --- a/flask_admin/form/fields.py +++ b/flask_admin/form/fields.py @@ -11,7 +11,7 @@ """ An understanding of WTForms's Custom Widgets is helpful for understanding this code: -http://wtforms.simplecodes.com/docs/0.6.2/widgets.html#custom-widgets +https://wtforms.readthedocs.io/widgets/#custom-widgets """ __all__ = ['DateTimeField', 'TimeField', 'Select2Field', 'Select2TagsField', diff --git a/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/adding_a_new_model_backend.po b/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/adding_a_new_model_backend.po index c8c30b5de..28bd6a5be 100644 --- a/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/adding_a_new_model_backend.po +++ b/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/adding_a_new_model_backend.po @@ -1,5 +1,5 @@ # Adding A Model Backend -# http://flask-admin.readthedocs.io/en/latest/adding_a_new_model_backend/ +# https://flask-admin.readthedocs.io/en/latest/adding_a_new_model_backend/ # # Copyright (C) 2012-2015, Serge S. Koval # This file is distributed under the same license as the flask-admin diff --git a/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/advanced.po b/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/advanced.po index c41324b28..2c425b4b8 100644 --- a/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/advanced.po +++ b/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/advanced.po @@ -1,5 +1,5 @@ # Advanced Functionality -# http://flask-admin.readthedocs.io/en/latest/advanced/ +# https://flask-admin.readthedocs.io/en/latest/advanced/ # # Copyright (C) 2012-2015, Serge S. Koval # This file is distributed under the same license as the flask-admin @@ -169,10 +169,10 @@ msgstr "WYSIWIG 文本字段" #: ../../doc/advanced.rst:132 msgid "" "To handle complicated text content, you can use `CKEditor " -"<http://ckeditor.com/>`_ by subclassing some of the built-in WTForms " +"<https://ckeditor.com/>`_ by subclassing some of the built-in WTForms " "classes as follows::" msgstr "" -"要处理复杂的文本内容,可以通过子类化一些内置的 WTForms 类来集成 `CKEditor <http://ckeditor.com/>`_ " +"要处理复杂的文本内容,可以通过子类化一些内置的 WTForms 类来集成 `CKEditor <https://ckeditor.com/>`_ " "编辑器,示例如下::" #: ../../doc/advanced.rst:158 @@ -239,11 +239,11 @@ msgstr "一些显著的功能包括:" #: ../../doc/advanced.rst:186 msgid "" -"Maps are displayed using the amazing `Leaflet <http://leafletjs.com/>`_ " +"Maps are displayed using the amazing `Leaflet <https://leafletjs.com/>`_ " "Javascript library, with map data from `Mapbox " "<https://www.mapbox.com/>`_." msgstr "" -"使用惊人的 `Leaflet <http://leafletjs.com/>`_ Javascript 库显示地图,地图数据来自 `Mapbox " +"使用惊人的 `Leaflet <https://leafletjs.com/>`_ Javascript 库显示地图,地图数据来自 `Mapbox " "<https://www.mapbox.com/>`_。" #: ../../doc/advanced.rst:188 @@ -257,20 +257,20 @@ msgstr "" #: ../../doc/advanced.rst:190 msgid "" -"Graceful fallback: `GeoJSON <http://geojson.org/>`_ data can be edited in" +"Graceful fallback: `GeoJSON <https://geojson.org/>`_ data can be edited in" " a ``<textarea>``, if the user has turned off Javascript." msgstr "" "后备支持:如果用户已关闭 Javascript,则可以在 ``<textarea>`` 中编辑 `GeoJSON " -"<http://geojson.org/>`_ 数据。" +"<https://geojson.org/>`_ 数据。" #: ../../doc/advanced.rst:192 msgid "" "Works with a `Geometry " "<https://geoalchemy-2.readthedocs.io/en/latest/types.html#geoalchemy2.types.Geometry>`_" " SQL field that is integrated with `Shapely " -"<http://toblerity.org/shapely/>`_ objects." +"<https://shapely.readthedocs.io/>`_ objects." msgstr "" -"使用与 `Shapely <http://toblerity.org/shapely/>`_ 对象集成的 `Geometry " +"使用与 `Shapely <https://shapely.readthedocs.io/>`_ 对象集成的 `Geometry " "<https://geoalchemy-2.readthedocs.io/en/latest/types.html#geoalchemy2.types.Geometry>`_" " SQL 字段。" @@ -683,10 +683,10 @@ msgstr "相关模型的行内编辑" #: ../../doc/advanced.rst:398 msgid "" "In order to use peewee integration, you need to install two additional " -"Python packages: `peewee <http://docs.peewee-orm.com/>`_ and `wtf-peewee " +"Python packages: `peewee <https://docs.peewee-orm.com/>`_ and `wtf-peewee " "<https://github.com/coleifer/wtf-peewee/>`_." msgstr "" -"为了使用 peewee,您需要安装 2 个 Python 包:`peewee <http://docs.peewee-orm.com/>`_ 和 " +"为了使用 peewee,您需要安装 2 个 Python 包:`peewee <https://docs.peewee-orm.com/>`_ 和 " "`wtf-peewee <https://github.com/coleifer/wtf-peewee/>`_。" #: ../../doc/advanced.rst:403 @@ -794,14 +794,14 @@ msgid "" "provides you with several tools for getting up & running quickly, it will" " be up to you, as a developer, to tell Flask-Admin what should be " "displayed and how. Even though it is easy to get started with a simple " -"`CRUD <http://en.wikipedia.org/wiki/Create,_read,_update_and_delete>`_ " +"`CRUD <https://en.wikipedia.org/wiki/Create,_read,_update_and_delete>`_ " "interface for each model in your application, Flask-Admin doesn't fix you" " to this approach, and you are free to define other ways of interacting " "with some, or all, of your models." msgstr "" "Flask-Admin 遵循同样的设计理念。因此,即使它为您提供了几种快速启动和运行的工具,作为开发人员,还是应该由您告诉 Flask-Admin" " 应该显示什么以及如何显示。即使可以很容易的为应用程序的每个模型构建一个简单的 `CRUD " -"<http://en.wikipedia.org/wiki/Create,_read,_update_and_delete>`_ 接口" +"<https://en.wikipedia.org/wiki/Create,_read,_update_and_delete>`_ 接口" ",Flask-Admin 也不能完全解决所有问题,您可以灵活的定义与模块的交互方法,来实现所有功能。" #: ../../doc/advanced.rst:467 diff --git a/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/api.po b/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/api.po index 018bf4684..3d43d83ff 100644 --- a/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/api.po +++ b/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/api.po @@ -1,5 +1,5 @@ # API -# http://flask-admin.readthedocs.io/en/latest/api/ +# https://flask-admin.readthedocs.io/en/latest/api/ # # Copyright (C) 2012-2015, Serge S. Koval # This file is distributed under the same license as the flask-admin diff --git a/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/changelog.po b/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/changelog.po index d0d01efee..fa4fed729 100644 --- a/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/changelog.po +++ b/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/changelog.po @@ -1,5 +1,5 @@ # Changelog -# http://flask-admin.readthedocs.io/en/latest/changelog/ +# https://flask-admin.readthedocs.io/en/latest/changelog/ # # Copyright (C) 2012-2015, Serge S. Koval # This file is distributed under the same license as the flask-admin diff --git a/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/index.po b/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/index.po index e3a09f213..aceae8406 100644 --- a/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/index.po +++ b/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/index.po @@ -1,5 +1,5 @@ # Flask-Admin -# http://flask-admin.readthedocs.io/en/latest/ +# https://flask-admin.readthedocs.io/en/latest/ # # Copyright (C) 2012-2015, Serge S. Koval # This file is distributed under the same license as the flask-admin @@ -25,12 +25,12 @@ msgstr "Flask-Admin" #: ../../index.rst:6 msgid "" -"**Why Flask?** As a micro-framework, `Flask <http://flask.pocoo.org/>`_ " +"**Why Flask?** As a micro-framework, `Flask <https://flask.palletsprojects.com/>`_ " "lets you build web services with very little overhead. It offers freedom " "for you, the designer, to implement your project in a way that suits your" " particular application." msgstr "" -"**为什么选择 Flask?** 作为一个微框架,`Flask <http://flask.pocoo.org/>`_ " +"**为什么选择 Flask?** 作为一个微框架,`Flask <https://flask.palletsprojects.com/>`_ " "允许您以非常少的开销构建 Web 服务。它为您的设计提供了自由,使您能够以适合特定应用程序" "的方式实现您的项目。" diff --git a/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/introduction.po b/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/introduction.po index dfea35963..13154ca48 100644 --- a/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/introduction.po +++ b/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/introduction.po @@ -1,5 +1,5 @@ # Introduction To Flask-Admin -# http://flask-admin.readthedocs.io/en/latest/introduction/ +# https://flask-admin.readthedocs.io/en/latest/introduction/ # # Copyright (C) 2012-2015, Serge S. Koval # This file is distributed under the same license as the flask-admin @@ -454,9 +454,9 @@ msgstr "使用内置模板" #: ../../doc/introduction.rst:352 msgid "" -"Flask-Admin uses the `Jinja2 <http://jinja.pocoo.org/docs/>`_ templating " +"Flask-Admin uses the `Jinja2 <https://jinja.palletsprojects.com/>`_ templating " "engine." -msgstr "Flask-Admin 使用 `Jinja2 <http://jinja.pocoo.org/docs/>`_ 模板引擎。" +msgstr "Flask-Admin 使用 `Jinja2 <https://jinja.palletsprojects.com/>`_ 模板引擎。" #: ../../doc/introduction.rst:357 msgid "Extending the Built-in Templates" From a3cdfc8a705c731c57ff229e787eac9bf2df7004 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Tue, 3 Sep 2024 09:57:20 +0100 Subject: [PATCH 122/156] Stop publishing to test.pypi.org We don't do this any more, and the tokens we have set up can't do it. --- .github/workflows/publish.yaml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index ae7950395..712e40795 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -64,10 +64,6 @@ jobs: id-token: write steps: - uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 - - uses: pypa/gh-action-pypi-publish@ec4db0b4ddc65acdf4bff5fa45ac92d78b56bdf0 # v1.9.0 - with: - repository-url: https://test.pypi.org/legacy/ - packages-dir: artifact/ - uses: pypa/gh-action-pypi-publish@ec4db0b4ddc65acdf4bff5fa45ac92d78b56bdf0 # v1.9.0 with: packages-dir: artifact/ From 1760be9000efcf2f105ba2574b1a8bd38807bdc9 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Sun, 1 Sep 2024 21:32:19 +0100 Subject: [PATCH 123/156] Prepare v2.0.0a0 release --- flask_admin/__init__.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/flask_admin/__init__.py b/flask_admin/__init__.py index a074a308c..720f51b74 100644 --- a/flask_admin/__init__.py +++ b/flask_admin/__init__.py @@ -1,4 +1,4 @@ -__version__ = '1.6.1' +__version__ = '2.0.0a0' __author__ = 'Flask-Admin team' __email__ = 'contact@palletsproject.com' diff --git a/pyproject.toml b/pyproject.toml index aea40d992..952e2c5e2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "Flask-Admin" -version = "1.6.1" +version = "2.0.0a0" description = "Simple and extensible admin interface framework for Flask" readme = "README.md" license = { file = "LICENSE.txt" } From 030671ad34c07bfc25ae570b075af06d1dd3683b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Sep 2024 16:52:23 +0000 Subject: [PATCH 124/156] Bump the github-actions group across 1 directory with 3 updates Bumps the github-actions group with 3 updates in the / directory: [actions/setup-python](https://github.com/actions/setup-python), [actions/upload-artifact](https://github.com/actions/upload-artifact) and [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish). Updates `actions/setup-python` from 5.1.1 to 5.2.0 - [Release notes](https://github.com/actions/setup-python/releases) - [Commits](https://github.com/actions/setup-python/compare/39cd14951b08e74b54015e9e001cdefcf80e669f...f677139bbe7f9c59b41e40162b753c062f5d49a3) Updates `actions/upload-artifact` from 4.3.4 to 4.4.0 - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/0b2256b8c012f0828dc542b3febcab082c67f72b...50769540e7f4bd5e21e526ee35c689e35e0d6874) Updates `pypa/gh-action-pypi-publish` from 1.9.0 to 1.10.1 - [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases) - [Commits](https://github.com/pypa/gh-action-pypi-publish/compare/ec4db0b4ddc65acdf4bff5fa45ac92d78b56bdf0...0ab0b79471669eb3a4d647e625009c62f9f3b241) --- updated-dependencies: - dependency-name: actions/setup-python dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-actions - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-actions - dependency-name: pypa/gh-action-pypi-publish dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-actions ... Signed-off-by: dependabot[bot] <support@github.com> --- .github/workflows/publish.yaml | 6 +++--- .github/workflows/tests.yaml | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 712e40795..8b8b3adb6 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -10,7 +10,7 @@ jobs: hash: ${{ steps.hash.outputs.hash }} steps: - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - - uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 + - uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 # v5.2.0 with: python-version: '3.x' cache: pip @@ -23,7 +23,7 @@ jobs: - name: generate hash id: hash run: cd dist && echo "hash=$(sha256sum * | base64 -w0)" >> $GITHUB_OUTPUT - - uses: actions/upload-artifact@0b2256b8c012f0828dc542b3febcab082c67f72b # v4.3.4 + - uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0 with: path: ./dist provenance: @@ -64,6 +64,6 @@ jobs: id-token: write steps: - uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 - - uses: pypa/gh-action-pypi-publish@ec4db0b4ddc65acdf4bff5fa45ac92d78b56bdf0 # v1.9.0 + - uses: pypa/gh-action-pypi-publish@0ab0b79471669eb3a4d647e625009c62f9f3b241 # v1.10.1 with: packages-dir: artifact/ diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 9a2c4ce52..c8dda4f1e 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -62,7 +62,7 @@ jobs: - 10000:10000 steps: - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - - uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 + - uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 # v5.2.0 with: python-version: ${{ matrix.python }} allow-prereleases: true @@ -89,7 +89,7 @@ jobs: tox: ['docs', 'typing'] steps: - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - - uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 + - uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 # v5.2.0 with: python-version: 3.11 cache: pip From 5adf27f77c59b0e7e1a95ced5f9b533223bd36a5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Sep 2024 17:25:52 +0000 Subject: [PATCH 125/156] Bump the python-requirements group across 1 directory with 7 updates Bumps the python-requirements group with 7 updates in the /requirements directory: | Package | From | To | | --- | --- | --- | | [mypy](https://github.com/python/mypy) | `1.11.0` | `1.11.2` | | [pyright](https://github.com/RobertCraigie/pyright-python) | `1.1.373` | `1.1.378` | | [types-boto](https://github.com/python/typeshed) | `2.49.18.20240205` | `2.49.18.20240806` | | [types-peewee](https://github.com/python/typeshed) | `3.17.6.20240722` | `3.17.6.20240813` | | [types-pillow](https://github.com/python/typeshed) | `10.2.0.20240520` | `10.2.0.20240822` | | [types-shapely](https://github.com/python/typeshed) | `2.0.0.20240714` | `2.0.0.20240820` | | [tox](https://github.com/tox-dev/tox) | `4.16.0` | `4.18.0` | Updates `mypy` from 1.11.0 to 1.11.2 - [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md) - [Commits](https://github.com/python/mypy/compare/v1.11...v1.11.2) Updates `pyright` from 1.1.373 to 1.1.378 - [Release notes](https://github.com/RobertCraigie/pyright-python/releases) - [Commits](https://github.com/RobertCraigie/pyright-python/compare/v1.1.373...v1.1.378) Updates `types-boto` from 2.49.18.20240205 to 2.49.18.20240806 - [Commits](https://github.com/python/typeshed/commits) Updates `types-peewee` from 3.17.6.20240722 to 3.17.6.20240813 - [Commits](https://github.com/python/typeshed/commits) Updates `types-pillow` from 10.2.0.20240520 to 10.2.0.20240822 - [Commits](https://github.com/python/typeshed/commits) Updates `types-shapely` from 2.0.0.20240714 to 2.0.0.20240820 - [Commits](https://github.com/python/typeshed/commits) Updates `tox` from 4.16.0 to 4.18.0 - [Release notes](https://github.com/tox-dev/tox/releases) - [Changelog](https://github.com/tox-dev/tox/blob/main/docs/changelog.rst) - [Commits](https://github.com/tox-dev/tox/compare/4.16.0...4.18.0) --- updated-dependencies: - dependency-name: mypy dependency-type: direct:production update-type: version-update:semver-patch dependency-group: python-requirements - dependency-name: pyright dependency-type: direct:production update-type: version-update:semver-patch dependency-group: python-requirements - dependency-name: types-boto dependency-type: direct:production update-type: version-update:semver-patch dependency-group: python-requirements - dependency-name: types-peewee dependency-type: direct:production update-type: version-update:semver-patch dependency-group: python-requirements - dependency-name: types-pillow dependency-type: direct:production update-type: version-update:semver-patch dependency-group: python-requirements - dependency-name: types-shapely dependency-type: direct:production update-type: version-update:semver-patch dependency-group: python-requirements - dependency-name: tox dependency-type: direct:development update-type: version-update:semver-minor dependency-group: python-requirements ... Signed-off-by: dependabot[bot] <support@github.com> --- requirements/dev.txt | 14 +++++++------- requirements/typing.txt | 12 ++++++------ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/requirements/dev.txt b/requirements/dev.txt index 2b343f1ca..1da9b35f1 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -121,7 +121,7 @@ mccabe==0.7.0 # -r typing.txt # flake8 # pylint -mypy==1.11.0 +mypy==1.11.2 # via -r typing.txt mypy-extensions==1.0.0 # via @@ -188,7 +188,7 @@ pylint==3.2.6 # -r typing.txt pyproject-api==1.7.1 # via tox -pyright==1.1.373 +pyright==1.1.378 # via -r typing.txt pytest==8.3.2 # via @@ -267,11 +267,11 @@ tomlkit==0.13.0 # -r docs.txt # -r typing.txt # pylint -tox==4.16.0 +tox==4.18.0 # via -r dev.in types-beautifulsoup4==4.12.0.20240511 # via -r typing.txt -types-boto==2.49.18.20240205 +types-boto==2.49.18.20240806 # via -r typing.txt types-click==7.1.8 # via @@ -293,11 +293,11 @@ types-markupsafe==1.1.10 # via # -r typing.txt # types-jinja2 -types-peewee==3.17.6.20240722 +types-peewee==3.17.6.20240813 # via -r typing.txt -types-pillow==10.2.0.20240520 +types-pillow==10.2.0.20240822 # via -r typing.txt -types-shapely==2.0.0.20240714 +types-shapely==2.0.0.20240820 # via -r typing.txt types-sqlalchemy==1.4.53.38 # via diff --git a/requirements/typing.txt b/requirements/typing.txt index 2506639cb..741896dd4 100644 --- a/requirements/typing.txt +++ b/requirements/typing.txt @@ -38,7 +38,7 @@ mccabe==0.7.0 # via # flake8 # pylint -mypy==1.11.0 +mypy==1.11.2 # via -r typing.in mypy-extensions==1.0.0 # via mypy @@ -60,7 +60,7 @@ pyflakes==3.2.0 # via flake8 pylint==3.2.6 # via -r tests.in -pyright==1.1.373 +pyright==1.1.378 # via -r typing.in pytest==8.3.2 # via @@ -83,7 +83,7 @@ tomlkit==0.13.0 # via pylint types-beautifulsoup4==4.12.0.20240511 # via -r typing.in -types-boto==2.49.18.20240205 +types-boto==2.49.18.20240806 # via -r typing.in types-click==7.1.8 # via types-flask @@ -97,11 +97,11 @@ types-jinja2==2.11.9 # via types-flask types-markupsafe==1.1.10 # via types-jinja2 -types-peewee==3.17.6.20240722 +types-peewee==3.17.6.20240813 # via -r typing.in -types-pillow==10.2.0.20240520 +types-pillow==10.2.0.20240822 # via -r typing.in -types-shapely==2.0.0.20240714 +types-shapely==2.0.0.20240820 # via -r typing.in types-sqlalchemy==1.4.53.38 # via types-flask-sqlalchemy From 319f3cc85c945d889816736cd000bcf58cb0c631 Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Tue, 3 Sep 2024 19:34:55 +0100 Subject: [PATCH 126/156] Fix flask-babel documentation link --- doc/advanced.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/advanced.rst b/doc/advanced.rst index 89a5a5e89..9e88e718a 100644 --- a/doc/advanced.rst +++ b/doc/advanced.rst @@ -90,7 +90,7 @@ Go ahead and add your own logic to the locale selector function. The application a user profile, cookie, session, etc. It can also use the `Accept-Language` header to make the selection automatically. -If the built-in translations are not enough, look at the `Flask-Babel documentation <https://pythonhosted.org/Flask-Babel/>`_ +If the built-in translations are not enough, look at the `Flask-Babel documentation <https://python-babel.github.io/flask-babel/>`_ to see how you can add your own. Using with Flask in `host_matching` mode From 420aabfc2b206588786044855718b7e5b7acc65b Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Thu, 5 Sep 2024 19:30:32 +0100 Subject: [PATCH 127/156] Remove unused coveralls requirement Added in: bb93ee7c ("Test python 3.5, and use coveralls and pylint.", 2016-03-10) --- requirements-skip/tests-min.in | 1 - requirements-skip/tests-min.txt | 38 ++++++++++--------------- requirements/build.txt | 4 +-- requirements/dev.txt | 49 ++++++++++++--------------------- requirements/docs.txt | 36 +++++++++++------------- requirements/tests.in | 1 - requirements/tests.txt | 30 +++++--------------- requirements/typing.txt | 34 ++++++----------------- 8 files changed, 66 insertions(+), 127 deletions(-) diff --git a/requirements-skip/tests-min.in b/requirements-skip/tests-min.in index 982ee94fe..47fabebc6 100644 --- a/requirements-skip/tests-min.in +++ b/requirements-skip/tests-min.in @@ -1,4 +1,3 @@ -coveralls flake8 pylint pytest diff --git a/requirements-skip/tests-min.txt b/requirements-skip/tests-min.txt index 2eedb653d..12fd7107f 100644 --- a/requirements-skip/tests-min.txt +++ b/requirements-skip/tests-min.txt @@ -16,13 +16,13 @@ azure-storage-blob==2.1.0 # via -r tests-min.in azure-storage-common==2.1.0 # via azure-storage-blob -babel==2.15.0 +babel==2.16.0 # via flask-babel beautifulsoup4==4.12.3 # via -r tests-min.in -certifi==2024.7.4 +certifi==2024.8.30 # via requests -cffi==1.16.0 +cffi==1.17.1 # via cryptography charset-normalizer==3.3.2 # via requests @@ -30,13 +30,9 @@ click==8.1.7 # via flask colour==0.1.5 # via -r tests-min.in -coverage[toml]==7.6.0 - # via - # coveralls - # pytest-cov -coveralls==4.0.1 - # via -r tests-min.in -cryptography==43.0.0 +coverage[toml]==7.6.1 + # via pytest-cov +cryptography==43.0.1 # via azure-storage-common deprecated==1.2.14 # via redis @@ -44,13 +40,11 @@ dill==0.3.8 # via pylint dnspython==2.6.1 # via email-validator -docopt==0.6.2 - # via coveralls email-validator==2.0.0 # via -r tests-min.in exceptiongroup==1.2.2 # via pytest -flake8==7.1.0 +flake8==7.1.1 # via -r tests-min.in flask==2.2.0 # via @@ -65,11 +59,11 @@ geoalchemy2==0.14.0 # via -r tests-min.in greenlet==3.0.3 # via sqlalchemy -idna==3.7 +idna==3.8 # via # email-validator # requests -importlib-metadata==8.2.0 +importlib-metadata==8.4.0 # via flask iniconfig==2.0.0 # via pytest @@ -108,13 +102,13 @@ pluggy==1.5.0 # via pytest psycopg2==2.9.9 # via -r tests-min.in -pycodestyle==2.12.0 +pycodestyle==2.12.1 # via flake8 pycparser==2.22 # via cffi pyflakes==3.2.0 # via flake8 -pylint==3.2.6 +pylint==3.2.7 # via -r tests-min.in pymongo==3.7.0 # via -r tests-min.in @@ -135,16 +129,14 @@ pytz==2022.7.1 redis==4.0.0 # via -r tests-min.in requests==2.32.3 - # via - # azure-storage-common - # coveralls + # via azure-storage-common shapely==2.0.0 # via -r tests-min.in six==1.16.0 # via # python-dateutil # sqlalchemy-utils -soupsieve==2.5 +soupsieve==2.6 # via beautifulsoup4 sqlalchemy==1.4.18 # via @@ -164,7 +156,7 @@ tomli==2.0.1 # coverage # pylint # pytest -tomlkit==0.13.0 +tomlkit==0.13.2 # via pylint typing-extensions==4.12.2 # via @@ -184,5 +176,5 @@ wtforms==2.3.0 # via # -r tests-min.in # wtf-peewee -zipp==3.19.2 +zipp==3.20.1 # via importlib-metadata diff --git a/requirements/build.txt b/requirements/build.txt index 4e078ff3b..618ea9645 100644 --- a/requirements/build.txt +++ b/requirements/build.txt @@ -6,7 +6,7 @@ # build==1.2.1 # via -r build.in -importlib-metadata==8.2.0 +importlib-metadata==8.4.0 # via build packaging==24.1 # via build @@ -14,5 +14,5 @@ pyproject-hooks==1.1.0 # via build tomli==2.0.1 # via build -zipp==3.19.2 +zipp==3.20.1 # via importlib-metadata diff --git a/requirements/dev.txt b/requirements/dev.txt index 1da9b35f1..618e7f8b6 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -13,20 +13,20 @@ astroid==3.2.4 # -r docs.txt # -r typing.txt # pylint -babel==2.15.0 +babel==2.16.0 # via # -r docs.txt # sphinx beautifulsoup4==4.12.3 # via + # -r docs.txt # -r tests.in # -r typing.txt -cachetools==5.4.0 +cachetools==5.5.0 # via tox -certifi==2024.7.4 +certifi==2024.8.30 # via # -r docs.txt - # -r typing.txt # requests cfgv==3.4.0 # via pre-commit @@ -35,21 +35,14 @@ chardet==5.2.0 charset-normalizer==3.3.2 # via # -r docs.txt - # -r typing.txt # requests colorama==0.4.6 # via tox -coverage[toml]==7.6.0 +coverage[toml]==7.6.1 # via # -r docs.txt # -r typing.txt - # coveralls # pytest-cov -coveralls==4.0.1 - # via - # -r docs.txt - # -r tests.in - # -r typing.txt dill==0.3.8 # via # -r docs.txt @@ -57,11 +50,6 @@ dill==0.3.8 # pylint distlib==0.3.8 # via virtualenv -docopt==0.6.2 - # via - # -r docs.txt - # -r typing.txt - # coveralls docutils==0.20.1 # via # -r docs.txt @@ -75,23 +63,22 @@ filelock==3.15.4 # via # tox # virtualenv -flake8==7.1.0 +flake8==7.1.1 # via # -r docs.txt # -r tests.in # -r typing.txt identify==2.6.0 # via pre-commit -idna==3.7 +idna==3.8 # via # -r docs.txt - # -r typing.txt # requests imagesize==1.4.1 # via # -r docs.txt # sphinx -importlib-metadata==8.2.0 +importlib-metadata==8.4.0 # via # -r docs.txt # sphinx @@ -167,7 +154,7 @@ psycopg2==2.9.9 # -r docs.txt # -r tests.in # -r typing.txt -pycodestyle==2.12.0 +pycodestyle==2.12.1 # via # -r docs.txt # -r typing.txt @@ -181,14 +168,14 @@ pygments==2.18.0 # via # -r docs.txt # sphinx -pylint==3.2.6 +pylint==3.2.7 # via # -r docs.txt # -r tests.in # -r typing.txt pyproject-api==1.7.1 # via tox -pyright==1.1.378 +pyright==1.1.379 # via -r typing.txt pytest==8.3.2 # via @@ -205,20 +192,19 @@ pytz==2024.1 # via # -r docs.txt # babel -pyyaml==6.0.1 +pyyaml==6.0.2 # via pre-commit requests==2.32.3 # via # -r docs.txt - # -r typing.txt - # coveralls # sphinx snowballstemmer==2.2.0 # via # -r docs.txt # sphinx -soupsieve==2.5 +soupsieve==2.6 # via + # -r docs.txt # -r typing.txt # beautifulsoup4 sphinx==7.1.2 @@ -262,7 +248,7 @@ tomli==2.0.1 # pyproject-api # pytest # tox -tomlkit==0.13.0 +tomlkit==0.13.2 # via # -r docs.txt # -r typing.txt @@ -281,7 +267,7 @@ types-flask==1.1.6 # via -r typing.txt types-flask-sqlalchemy==2.5.9.4 # via -r typing.txt -types-html5lib==1.1.11.20240228 +types-html5lib==1.1.11.20240806 # via # -r typing.txt # types-beautifulsoup4 @@ -319,13 +305,12 @@ typing-extensions==4.12.2 urllib3==2.2.2 # via # -r docs.txt - # -r typing.txt # requests virtualenv==20.26.3 # via # pre-commit # tox -zipp==3.19.2 +zipp==3.20.1 # via # -r docs.txt # importlib-metadata diff --git a/requirements/docs.txt b/requirements/docs.txt index df2c324bf..bc1ac24ea 100644 --- a/requirements/docs.txt +++ b/requirements/docs.txt @@ -8,33 +8,29 @@ alabaster==0.7.13 # via sphinx astroid==3.2.4 # via pylint -babel==2.15.0 +babel==2.16.0 # via sphinx -certifi==2024.7.4 +beautifulsoup4==4.12.3 + # via -r tests.in +certifi==2024.8.30 # via requests charset-normalizer==3.3.2 # via requests -coverage[toml]==7.6.0 - # via - # coveralls - # pytest-cov -coveralls==4.0.1 - # via -r tests.in +coverage[toml]==7.6.1 + # via pytest-cov dill==0.3.8 # via pylint -docopt==0.6.2 - # via coveralls docutils==0.20.1 # via sphinx exceptiongroup==1.2.2 # via pytest -flake8==7.1.0 +flake8==7.1.1 # via -r tests.in -idna==3.7 +idna==3.8 # via requests imagesize==1.4.1 # via sphinx -importlib-metadata==8.2.0 +importlib-metadata==8.4.0 # via sphinx iniconfig==2.0.0 # via pytest @@ -61,13 +57,13 @@ pluggy==1.5.0 # via pytest psycopg2==2.9.9 # via -r tests.in -pycodestyle==2.12.0 +pycodestyle==2.12.1 # via flake8 pyflakes==3.2.0 # via flake8 pygments==2.18.0 # via sphinx -pylint==3.2.6 +pylint==3.2.7 # via -r tests.in pytest==8.3.2 # via @@ -78,11 +74,11 @@ pytest-cov==5.0.0 pytz==2024.1 # via babel requests==2.32.3 - # via - # coveralls - # sphinx + # via sphinx snowballstemmer==2.2.0 # via sphinx +soupsieve==2.6 + # via beautifulsoup4 sphinx==7.1.2 # via # -r docs.in @@ -107,7 +103,7 @@ tomli==2.0.1 # coverage # pylint # pytest -tomlkit==0.13.0 +tomlkit==0.13.2 # via pylint typing-extensions==4.12.2 # via @@ -115,5 +111,5 @@ typing-extensions==4.12.2 # pylint urllib3==2.2.2 # via requests -zipp==3.19.2 +zipp==3.20.1 # via importlib-metadata diff --git a/requirements/tests.in b/requirements/tests.in index b86178392..630525958 100644 --- a/requirements/tests.in +++ b/requirements/tests.in @@ -1,4 +1,3 @@ -coveralls flake8 pylint pytest diff --git a/requirements/tests.txt b/requirements/tests.txt index 8608ac9a6..6d1d120dc 100644 --- a/requirements/tests.txt +++ b/requirements/tests.txt @@ -8,26 +8,14 @@ astroid==3.2.4 # via pylint beautifulsoup4==4.12.3 # via -r tests.in -certifi==2024.7.4 - # via requests -charset-normalizer==3.3.2 - # via requests -coverage[toml]==7.6.0 - # via - # coveralls - # pytest-cov -coveralls==4.0.1 - # via -r tests.in +coverage[toml]==7.6.1 + # via pytest-cov dill==0.3.8 # via pylint -docopt==0.6.2 - # via coveralls exceptiongroup==1.2.2 # via pytest -flake8==7.1.0 +flake8==7.1.1 # via -r tests.in -idna==3.7 - # via requests iniconfig==2.0.0 # via pytest isort==5.13.2 @@ -44,11 +32,11 @@ pluggy==1.5.0 # via pytest psycopg2==2.9.9 # via -r tests.in -pycodestyle==2.12.0 +pycodestyle==2.12.1 # via flake8 pyflakes==3.2.0 # via flake8 -pylint==3.2.6 +pylint==3.2.7 # via -r tests.in pytest==8.3.2 # via @@ -56,20 +44,16 @@ pytest==8.3.2 # pytest-cov pytest-cov==5.0.0 # via -r tests.in -requests==2.32.3 - # via coveralls -soupsieve==2.5 +soupsieve==2.6 # via beautifulsoup4 tomli==2.0.1 # via # coverage # pylint # pytest -tomlkit==0.13.0 +tomlkit==0.13.2 # via pylint typing-extensions==4.12.2 # via # astroid # pylint -urllib3==2.2.2 - # via requests diff --git a/requirements/typing.txt b/requirements/typing.txt index 741896dd4..1662af32f 100644 --- a/requirements/typing.txt +++ b/requirements/typing.txt @@ -8,26 +8,14 @@ astroid==3.2.4 # via pylint beautifulsoup4==4.12.3 # via -r tests.in -certifi==2024.7.4 - # via requests -charset-normalizer==3.3.2 - # via requests -coverage[toml]==7.6.0 - # via - # coveralls - # pytest-cov -coveralls==4.0.1 - # via -r tests.in +coverage[toml]==7.6.1 + # via pytest-cov dill==0.3.8 # via pylint -docopt==0.6.2 - # via coveralls exceptiongroup==1.2.2 # via pytest -flake8==7.1.0 +flake8==7.1.1 # via -r tests.in -idna==3.7 - # via requests iniconfig==2.0.0 # via pytest isort==5.13.2 @@ -54,13 +42,13 @@ pluggy==1.5.0 # via pytest psycopg2==2.9.9 # via -r tests.in -pycodestyle==2.12.0 +pycodestyle==2.12.1 # via flake8 pyflakes==3.2.0 # via flake8 -pylint==3.2.6 +pylint==3.2.7 # via -r tests.in -pyright==1.1.378 +pyright==1.1.379 # via -r typing.in pytest==8.3.2 # via @@ -69,9 +57,7 @@ pytest==8.3.2 # pytest-cov pytest-cov==5.0.0 # via -r tests.in -requests==2.32.3 - # via coveralls -soupsieve==2.5 +soupsieve==2.6 # via beautifulsoup4 tomli==2.0.1 # via @@ -79,7 +65,7 @@ tomli==2.0.1 # mypy # pylint # pytest -tomlkit==0.13.0 +tomlkit==0.13.2 # via pylint types-beautifulsoup4==4.12.0.20240511 # via -r typing.in @@ -91,7 +77,7 @@ types-flask==1.1.6 # via -r typing.in types-flask-sqlalchemy==2.5.9.4 # via -r typing.in -types-html5lib==1.1.11.20240228 +types-html5lib==1.1.11.20240806 # via types-beautifulsoup4 types-jinja2==2.11.9 # via types-flask @@ -114,5 +100,3 @@ typing-extensions==4.12.2 # astroid # mypy # pylint -urllib3==2.2.2 - # via requests From adca7bc86d484daa33a8e01a26c42d9f4c9f7aa6 Mon Sep 17 00:00:00 2001 From: LeXofLeviafan <lexofleviafan@gmail.com> Date: Sat, 7 Sep 2024 23:36:20 +0200 Subject: [PATCH 128/156] fix translations_path --- flask_admin/babel.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/flask_admin/babel.py b/flask_admin/babel.py index 762ccb2ee..38ee8e734 100644 --- a/flask_admin/babel.py +++ b/flask_admin/babel.py @@ -26,15 +26,16 @@ class CustomDomain(Domain): def __init__(self): super(CustomDomain, self).__init__(translations.__path__[0], domain='admin') - def get_translations_path(self, ctx): + @property + def translation_directories(self): view = get_current_view() if view is not None: dirname = view.admin.translations_path if dirname is not None: - return dirname + return [dirname] + super().translation_directories - return super(CustomDomain, self).get_translations_path(ctx) + return super().translation_directories domain = CustomDomain() From 944b5a1de1b4fac7b5cc387d5ea8a826c8a247c9 Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Thu, 12 Sep 2024 19:22:32 +0100 Subject: [PATCH 129/156] Set tox minversion Use the older minversion instead of min_version for tox 3 compatibility. --- tox.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/tox.ini b/tox.ini index 658cc1fb5..5f63673ee 100644 --- a/tox.ini +++ b/tox.ini @@ -1,4 +1,5 @@ [tox] +minversion = 4.0 envlist = py3{8,9,10,11,12} py3{8,12}-sqlalchemy1 From 6614753003d1544ed2ceb11b81ae555b0396c5b2 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Sun, 15 Sep 2024 12:10:02 +0100 Subject: [PATCH 130/156] Fix 'Apply' filter button visibility This became permanent visibly after #2501 because jQuery's show/hide methods work toggle inline styles for `display: none`, but that PR switched over to the `d-none` class from bootstrap. This patch adds/removes the `d-none` class now. :w --- doc/changelog.rst | 7 +++++++ flask_admin/static/admin/js/bs4_filters.js | 15 ++++++++++----- .../bootstrap4/admin/model/layout.html | 2 +- .../translations/en/LC_MESSAGES/admin.mo | Bin 6263 -> 6263 bytes 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/doc/changelog.rst b/doc/changelog.rst index 576bfd525..05f979f2f 100644 --- a/doc/changelog.rst +++ b/doc/changelog.rst @@ -1,6 +1,13 @@ Changelog ========= +2.0.0a1 +------- + +Fixes: + +* The `Apply` button for filters will show/hide correctly again + 2.0.0a0 ------- diff --git a/flask_admin/static/admin/js/bs4_filters.js b/flask_admin/static/admin/js/bs4_filters.js index 24e342ddc..dfab241e8 100644 --- a/flask_admin/static/admin/js/bs4_filters.js +++ b/flask_admin/static/admin/js/bs4_filters.js @@ -22,11 +22,11 @@ var AdminFilters = function(element, filtersElement, filterGroups, activeFilters function removeFilter() { $(this).closest('tr').remove(); if($('.filters tr').length == 0) { - $('button', $root).hide(); + $('button', $root).addClass('d-none'); $('a[class=btn]', $root).hide(); $('.filters tbody').remove(); } else { - $('button', $root).show(); + $('button', $root).removeClass('d-none'); } return false; @@ -42,7 +42,7 @@ var AdminFilters = function(element, filtersElement, filterGroups, activeFilters var $field = createFilterInput($inputContainer, null, selectedFilter); styleFilterInput(selectedFilter, $field); - $('button', $root).show(); + $('button', $root).removeClass('d-none'); } // generate HTML for filter input - allows changing filter input type to one with options or tags @@ -69,6 +69,11 @@ var AdminFilters = function(element, filtersElement, filterGroups, activeFilters } inputContainer.replaceWith($('<td/>').append($field)); + // show "Apply Filter" button when filter input is changed + $field.on('input change', function() { + $('button', $root).removeClass('d-none'); + }); + return $field; } @@ -153,7 +158,7 @@ var AdminFilters = function(element, filtersElement, filterGroups, activeFilters addFilter(name, filterGroups[name], false, null); - $('button', $root).show(); + $('button', $root).removeClass('d-none'); }); // on page load - add active filters @@ -166,7 +171,7 @@ var AdminFilters = function(element, filtersElement, filterGroups, activeFilters // show "Apply Filter" button when filter input is changed $('.filter-val', $root).on('input change', function() { - $('button', $root).show(); + $('button', $root).removeClass('d-none'); }); $('.remove-filter', $root).click(removeFilter); diff --git a/flask_admin/templates/bootstrap4/admin/model/layout.html b/flask_admin/templates/bootstrap4/admin/model/layout.html index 6bd192f65..936bfd1d4 100644 --- a/flask_admin/templates/bootstrap4/admin/model/layout.html +++ b/flask_admin/templates/bootstrap4/admin/model/layout.html @@ -46,7 +46,7 @@ <input type="hidden" name="page_size" value="{{ page_size }}"> {% endif %} <div class="pull-right"> - <button type="submit" class="btn btn-primary" class="d-none">{{ _gettext('Apply') }}</button> + <button type="submit" class="btn btn-primary d-none">{{ _gettext('Apply') }}</button> {% if active_filters %} <a href="{{ clear_search_url }}" class="btn btn-secondary">{{ _gettext('Reset Filters') }}</a> {% endif %} diff --git a/flask_admin/translations/en/LC_MESSAGES/admin.mo b/flask_admin/translations/en/LC_MESSAGES/admin.mo index 94b61f16bfdc72324d7c8ddd085ba79d05ca0b6d..91e2551edf3ece9f6027b9317de0a4a4720e0d61 100644 GIT binary patch delta 14 Vcmexv@ZDeoj{u|DW?q3T4gf291e5>( delta 14 Vcmexv@ZDeoj{u|TW?q3T4gf231d{*& From f82d1d59fa335cc89a84dbc4b2097a1c806a2f0b Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Sun, 15 Sep 2024 12:10:21 +0100 Subject: [PATCH 131/156] Don't (try to) hide the `reset filters` button This lookup doesn't work because it's doing a full "class equals" check, but the class is "btn btn-primary". Also, because the page doesn't refresh when individual filters are removed, if the "Reset filters" button is removed altogether then users have no way to "apply" the removal of all filters. So we actually need to keep this button around when the last filter is removed (it remains a probably-weird user interaction, but I'm maintaining that for now - not because it's good, but just to not change the existing behaviour) --- flask_admin/static/admin/js/bs4_filters.js | 1 - 1 file changed, 1 deletion(-) diff --git a/flask_admin/static/admin/js/bs4_filters.js b/flask_admin/static/admin/js/bs4_filters.js index dfab241e8..248b7b65d 100644 --- a/flask_admin/static/admin/js/bs4_filters.js +++ b/flask_admin/static/admin/js/bs4_filters.js @@ -23,7 +23,6 @@ var AdminFilters = function(element, filtersElement, filterGroups, activeFilters $(this).closest('tr').remove(); if($('.filters tr').length == 0) { $('button', $root).addClass('d-none'); - $('a[class=btn]', $root).hide(); $('.filters tbody').remove(); } else { $('button', $root).removeClass('d-none'); From 2014eec78e033ac97b4c0fe82a310a25f8736138 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Tue, 24 Sep 2024 20:57:53 +0100 Subject: [PATCH 132/156] Close pymongo db properly --- flask_admin/tests/pymongo/conftest.py | 1 + 1 file changed, 1 insertion(+) diff --git a/flask_admin/tests/pymongo/conftest.py b/flask_admin/tests/pymongo/conftest.py index eb3dc2062..0b559ca44 100644 --- a/flask_admin/tests/pymongo/conftest.py +++ b/flask_admin/tests/pymongo/conftest.py @@ -9,6 +9,7 @@ def db(): client = MongoClient() db = client.tests yield db + client.close() @pytest.fixture From 7049d6cb90e4755bc9cd61aa35d8e2d44a50769e Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Mon, 23 Sep 2024 12:59:40 +0100 Subject: [PATCH 133/156] Capitalise to match other instances of Delete Record --- flask_admin/templates/bootstrap4/admin/model/row_actions.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flask_admin/templates/bootstrap4/admin/model/row_actions.html b/flask_admin/templates/bootstrap4/admin/model/row_actions.html index 74d65ca43..105b5fdf5 100644 --- a/flask_admin/templates/bootstrap4/admin/model/row_actions.html +++ b/flask_admin/templates/bootstrap4/admin/model/row_actions.html @@ -31,7 +31,7 @@ {% elif csrf_token %} <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/> {% endif %} - <button onclick="return faHelpers.safeConfirm('{{ _gettext('Are you sure you want to delete this record?') }}');" title="{{ _gettext('Delete record') }}"> + <button onclick="return faHelpers.safeConfirm('{{ _gettext('Are you sure you want to delete this record?') }}');" title="{{ _gettext('Delete Record') }}"> <span class="fa fa-trash glyphicon glyphicon-trash"></span> </button> </form> From baa4f3d227db8bcd16f2197e8c05db01c5ab0dd1 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Tue, 24 Sep 2024 21:22:00 +0100 Subject: [PATCH 134/156] Add command to babel.sh to update .po files --- babel/README.md | 9 +++++++++ babel/babel.sh | 5 +++++ 2 files changed, 14 insertions(+) create mode 100644 babel/README.md diff --git a/babel/README.md b/babel/README.md new file mode 100644 index 000000000..14af188cc --- /dev/null +++ b/babel/README.md @@ -0,0 +1,9 @@ +# Working with Babel translations + +## As a developer who's changed some text in Flask-Admin + +Run `./babel.sh --update` + +## As a translator who's updated some `.po`/`.mo` files + +Run `./babel.sh` diff --git a/babel/babel.sh b/babel/babel.sh index b7764fdf5..8f4582067 100755 --- a/babel/babel.sh +++ b/babel/babel.sh @@ -1,5 +1,10 @@ #!/bin/sh pybabel extract -F babel.ini -k _gettext -k _ngettext -k lazy_gettext -o admin.pot --project Flask-Admin ../flask_admin + +if [ "$1" = '--update' ]; then + pybabel update -i admin.pot -d ../flask_admin/translations -D admin -N +fi + pybabel compile -f -D admin -d ../flask_admin/translations/ # docs From f822cb69c03a0d1a3aad0f66ce3facf043a6e60e Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Tue, 24 Sep 2024 22:06:57 +0100 Subject: [PATCH 135/156] Re-run babel/babel.sh compile --- babel/admin.pot | 445 ++++++-------- .../translations/af/LC_MESSAGES/admin.mo | Bin 7085 -> 6328 bytes .../translations/af/LC_MESSAGES/admin.po | 466 +++++++------- .../translations/ar/LC_MESSAGES/admin.mo | Bin 8634 -> 7848 bytes .../translations/ar/LC_MESSAGES/admin.po | 467 +++++++-------- .../translations/be/LC_MESSAGES/admin.mo | Bin 9332 -> 9031 bytes .../translations/be/LC_MESSAGES/admin.po | 467 +++++++-------- .../translations/ca_ES/LC_MESSAGES/admin.mo | Bin 7451 -> 6674 bytes .../translations/ca_ES/LC_MESSAGES/admin.po | 466 +++++++------- .../translations/cs/LC_MESSAGES/admin.mo | Bin 7585 -> 6812 bytes .../translations/cs/LC_MESSAGES/admin.po | 466 +++++++------- .../translations/da/LC_MESSAGES/admin.mo | Bin 7143 -> 6379 bytes .../translations/da/LC_MESSAGES/admin.po | 466 +++++++------- .../translations/de/LC_MESSAGES/admin.mo | Bin 7813 -> 7558 bytes .../translations/de/LC_MESSAGES/admin.po | 466 +++++++------- .../translations/el/LC_MESSAGES/admin.mo | Bin 9711 -> 9105 bytes .../translations/el/LC_MESSAGES/admin.po | 466 +++++++------- .../translations/en/LC_MESSAGES/admin.mo | Bin 6263 -> 5793 bytes .../translations/en/LC_MESSAGES/admin.po | 567 +++++++++++------- .../translations/es/LC_MESSAGES/admin.mo | Bin 7693 -> 7450 bytes .../translations/es/LC_MESSAGES/admin.po | 466 +++++++------- .../translations/et/LC_MESSAGES/admin.mo | Bin 7326 -> 6767 bytes .../translations/et/LC_MESSAGES/admin.po | 466 +++++++------- .../translations/fa/LC_MESSAGES/admin.mo | Bin 8605 -> 8024 bytes .../translations/fa/LC_MESSAGES/admin.po | 466 +++++++------- .../translations/fi/LC_MESSAGES/admin.mo | Bin 7514 -> 6755 bytes .../translations/fi/LC_MESSAGES/admin.po | 466 +++++++------- .../translations/fr/LC_MESSAGES/admin.mo | Bin 7865 -> 7292 bytes .../translations/fr/LC_MESSAGES/admin.po | 466 +++++++------- .../translations/he/LC_MESSAGES/admin.mo | Bin 8153 -> 7390 bytes .../translations/he/LC_MESSAGES/admin.po | 467 +++++++-------- .../translations/hu/LC_MESSAGES/admin.mo | Bin 7583 -> 7020 bytes .../translations/hu/LC_MESSAGES/admin.po | 498 +++++++-------- .../translations/it/LC_MESSAGES/admin.mo | Bin 7566 -> 7296 bytes .../translations/it/LC_MESSAGES/admin.po | 466 +++++++------- .../translations/ja/LC_MESSAGES/admin.mo | Bin 8477 -> 8105 bytes .../translations/ja/LC_MESSAGES/admin.po | 466 +++++++------- .../translations/ko/LC_MESSAGES/admin.mo | Bin 7853 -> 7552 bytes .../translations/ko/LC_MESSAGES/admin.po | 466 +++++++------- .../translations/nl/LC_MESSAGES/admin.mo | Bin 7592 -> 7259 bytes .../translations/nl/LC_MESSAGES/admin.po | 466 +++++++------- .../translations/no/LC_MESSAGES/admin.mo | Bin 7111 -> 6300 bytes .../translations/no/LC_MESSAGES/admin.po | 465 +++++++------- .../translations/pa/LC_MESSAGES/admin.mo | Bin 10486 -> 9674 bytes .../translations/pa/LC_MESSAGES/admin.po | 470 +++++++-------- .../translations/pl/LC_MESSAGES/admin.mo | Bin 7702 -> 7371 bytes .../translations/pl/LC_MESSAGES/admin.po | 467 +++++++-------- .../translations/pt/LC_MESSAGES/admin.mo | Bin 7481 -> 6905 bytes .../translations/pt/LC_MESSAGES/admin.po | 466 +++++++------- .../translations/pt_BR/LC_MESSAGES/admin.mo | Bin 7559 -> 7289 bytes .../translations/pt_BR/LC_MESSAGES/admin.po | 466 +++++++------- .../translations/ro/LC_MESSAGES/admin.mo | Bin 7710 -> 6941 bytes .../translations/ro/LC_MESSAGES/admin.po | 467 +++++++-------- .../translations/ru/LC_MESSAGES/admin.mo | Bin 9473 -> 9190 bytes .../translations/ru/LC_MESSAGES/admin.po | 467 +++++++-------- .../translations/sk/LC_MESSAGES/admin.mo | Bin 7748 -> 7415 bytes .../translations/sk/LC_MESSAGES/admin.po | 466 +++++++------- .../translations/sr/LC_MESSAGES/admin.mo | Bin 7586 -> 6812 bytes .../translations/sr/LC_MESSAGES/admin.po | 467 +++++++-------- .../translations/sv/LC_MESSAGES/admin.mo | Bin 7270 -> 6762 bytes .../translations/sv/LC_MESSAGES/admin.po | 466 +++++++------- .../translations/tr/LC_MESSAGES/admin.mo | Bin 7585 -> 7336 bytes .../translations/tr/LC_MESSAGES/admin.po | 466 +++++++------- .../translations/uk/LC_MESSAGES/admin.mo | Bin 9410 -> 9102 bytes .../translations/uk/LC_MESSAGES/admin.po | 467 +++++++-------- .../translations/vi/LC_MESSAGES/admin.mo | Bin 7820 -> 7349 bytes .../translations/vi/LC_MESSAGES/admin.po | 466 +++++++------- .../zh_Hans_CN/LC_MESSAGES/admin.mo | Bin 7054 -> 6818 bytes .../zh_Hans_CN/LC_MESSAGES/admin.po | 466 +++++++------- .../zh_Hant_TW/LC_MESSAGES/admin.mo | Bin 7182 -> 6539 bytes .../zh_Hant_TW/LC_MESSAGES/admin.po | 460 +++++++------- 71 files changed, 7763 insertions(+), 9130 deletions(-) diff --git a/babel/admin.pot b/babel/admin.pot index 0233536bb..6648ed1a5 100644 --- a/babel/admin.pot +++ b/babel/admin.pot @@ -1,276 +1,268 @@ # Translations template for Flask-Admin. -# Copyright (C) 2017 ORGANIZATION +# Copyright (C) 2024 ORGANIZATION # This file is distributed under the same license as the Flask-Admin # project. -# FIRST AUTHOR <EMAIL@ADDRESS>, 2017. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2024. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: Flask-Admin VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-02-07 00:19-0600\n" +"POT-Creation-Date: 2024-09-24 22:09+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.1.1\n" +"Generated-By: Babel 2.16.0\n" -#: ../flask_admin/base.py:440 +#: ../flask_admin/base.py:458 msgid "Home" msgstr "" -#: ../flask_admin/contrib/rediscli.py:127 +#: ../flask_admin/contrib/rediscli.py:113 msgid "Cli: Invalid command." msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:352 +#: ../flask_admin/contrib/fileadmin/__init__.py:376 msgid "File to upload" msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:360 +#: ../flask_admin/contrib/fileadmin/__init__.py:384 msgid "File required." msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:365 +#: ../flask_admin/contrib/fileadmin/__init__.py:389 msgid "Invalid file type." msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:376 +#: ../flask_admin/contrib/fileadmin/__init__.py:400 msgid "Content" msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:390 +#: ../flask_admin/contrib/fileadmin/__init__.py:414 msgid "Invalid name" msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:398 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:106 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:112 -#: ../flask_admin/tests/sqla/test_translation.py:17 +#: ../flask_admin/contrib/fileadmin/__init__.py:422 +#: ../flask_admin/tests/sqla/test_translation.py:21 msgid "Name" msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:757 +#: ../flask_admin/contrib/fileadmin/__init__.py:784 #, python-format msgid "File \"%(name)s\" already exists." msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:802 -#: ../flask_admin/contrib/fileadmin/__init__.py:885 -#: ../flask_admin/contrib/fileadmin/__init__.py:947 -#: ../flask_admin/contrib/fileadmin/__init__.py:1000 -#: ../flask_admin/contrib/fileadmin/__init__.py:1047 -#: ../flask_admin/contrib/fileadmin/__init__.py:1099 -#: ../flask_admin/model/base.py:2168 +#: ../flask_admin/contrib/fileadmin/__init__.py:829 +#: ../flask_admin/contrib/fileadmin/__init__.py:926 +#: ../flask_admin/contrib/fileadmin/__init__.py:988 +#: ../flask_admin/contrib/fileadmin/__init__.py:1041 +#: ../flask_admin/contrib/fileadmin/__init__.py:1088 +#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/model/base.py:2324 msgid "Permission denied." msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:881 +#: ../flask_admin/contrib/fileadmin/__init__.py:922 msgid "File uploading is disabled." msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:892 +#: ../flask_admin/contrib/fileadmin/__init__.py:933 #, python-format msgid "Successfully saved file: %(name)s" msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:896 +#: ../flask_admin/contrib/fileadmin/__init__.py:937 #, python-format msgid "Failed to save file: %(error)s" msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:904 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:150 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:150 +#: ../flask_admin/contrib/fileadmin/__init__.py:945 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:150 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:152 msgid "Upload File" msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:943 +#: ../flask_admin/contrib/fileadmin/__init__.py:984 msgid "Directory creation is disabled." msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:956 +#: ../flask_admin/contrib/fileadmin/__init__.py:997 #, python-format msgid "Successfully created directory: %(directory)s" msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:960 +#: ../flask_admin/contrib/fileadmin/__init__.py:1001 #, python-format msgid "Failed to create directory: %(error)s" msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:970 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:161 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:161 +#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:161 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:163 msgid "Create Directory" msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:996 +#: ../flask_admin/contrib/fileadmin/__init__.py:1037 msgid "Deletion is disabled." msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:1005 +#: ../flask_admin/contrib/fileadmin/__init__.py:1046 msgid "Directory deletion is disabled." msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/contrib/fileadmin/__init__.py:1052 #, python-format msgid "Directory \"%(path)s\" was successfully deleted." msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:1013 +#: ../flask_admin/contrib/fileadmin/__init__.py:1054 #, python-format msgid "Failed to delete directory: %(error)s" msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:1019 -#: ../flask_admin/contrib/fileadmin/__init__.py:1176 +#: ../flask_admin/contrib/fileadmin/__init__.py:1060 +#: ../flask_admin/contrib/fileadmin/__init__.py:1215 #, python-format msgid "File \"%(name)s\" was successfully deleted." msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:1021 -#: ../flask_admin/contrib/fileadmin/__init__.py:1178 +#: ../flask_admin/contrib/fileadmin/__init__.py:1062 +#: ../flask_admin/contrib/fileadmin/__init__.py:1217 #, python-format msgid "Failed to delete file: %(name)s" msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:1043 +#: ../flask_admin/contrib/fileadmin/__init__.py:1084 msgid "Renaming is disabled." msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:1051 +#: ../flask_admin/contrib/fileadmin/__init__.py:1092 msgid "Path does not exist." msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:1061 +#: ../flask_admin/contrib/fileadmin/__init__.py:1102 #, python-format msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\"" msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:1064 +#: ../flask_admin/contrib/fileadmin/__init__.py:1105 #, python-format msgid "Failed to rename: %(error)s" msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:1078 +#: ../flask_admin/contrib/fileadmin/__init__.py:1119 #, python-format msgid "Rename %(name)s" msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:1115 +#: ../flask_admin/contrib/fileadmin/__init__.py:1155 #, python-format msgid "Error saving changes to %(name)s." msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:1119 +#: ../flask_admin/contrib/fileadmin/__init__.py:1159 #, python-format msgid "Changes to %(name)s saved successfully." msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:1128 +#: ../flask_admin/contrib/fileadmin/__init__.py:1167 #, python-format msgid "Error reading %(name)s." msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:1131 -#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/contrib/fileadmin/__init__.py:1170 +#: ../flask_admin/contrib/fileadmin/__init__.py:1179 #, python-format msgid "Unexpected error while reading from %(name)s" msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:1137 +#: ../flask_admin/contrib/fileadmin/__init__.py:1176 #, python-format msgid "Cannot edit %(name)s." msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:1155 +#: ../flask_admin/contrib/fileadmin/__init__.py:1194 #, python-format msgid "Editing %(path)s" msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/peewee/view.py:487 -#: ../flask_admin/contrib/pymongo/view.py:384 -#: ../flask_admin/contrib/sqla/view.py:1149 +#: ../flask_admin/contrib/fileadmin/__init__.py:1202 +#: ../flask_admin/contrib/peewee/view.py:510 +#: ../flask_admin/contrib/pymongo/view.py:385 +#: ../flask_admin/contrib/sqla/view.py:1241 msgid "Delete" msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:1164 +#: ../flask_admin/contrib/fileadmin/__init__.py:1203 msgid "Are you sure you want to delete these files?" msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:1167 +#: ../flask_admin/contrib/fileadmin/__init__.py:1206 msgid "File deletion is disabled." msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:1180 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:22 +#: ../flask_admin/contrib/fileadmin/__init__.py:1219 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:22 msgid "Edit" msgstr "" -#: ../flask_admin/contrib/fileadmin/s3.py:153 +#: ../flask_admin/contrib/fileadmin/s3.py:162 msgid "Cannot operate on non empty directories" msgstr "" #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 -#: ../flask_admin/contrib/sqla/filters.py:41 +#: ../flask_admin/contrib/sqla/filters.py:42 msgid "equals" msgstr "" #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 -#: ../flask_admin/contrib/sqla/filters.py:49 +#: ../flask_admin/contrib/sqla/filters.py:50 msgid "not equal" msgstr "" #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 -#: ../flask_admin/contrib/sqla/filters.py:58 +#: ../flask_admin/contrib/sqla/filters.py:59 msgid "contains" msgstr "" #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 -#: ../flask_admin/contrib/sqla/filters.py:67 +#: ../flask_admin/contrib/sqla/filters.py:68 msgid "not contains" msgstr "" #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 -#: ../flask_admin/contrib/sqla/filters.py:75 +#: ../flask_admin/contrib/sqla/filters.py:76 msgid "greater than" msgstr "" #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 -#: ../flask_admin/contrib/sqla/filters.py:83 +#: ../flask_admin/contrib/sqla/filters.py:84 msgid "smaller than" msgstr "" #: ../flask_admin/contrib/peewee/filters.py:88 -#: ../flask_admin/contrib/sqla/filters.py:94 +#: ../flask_admin/contrib/sqla/filters.py:95 msgid "empty" msgstr "" #: ../flask_admin/contrib/peewee/filters.py:102 -#: ../flask_admin/contrib/sqla/filters.py:108 +#: ../flask_admin/contrib/sqla/filters.py:109 msgid "in list" msgstr "" #: ../flask_admin/contrib/peewee/filters.py:111 -#: ../flask_admin/contrib/sqla/filters.py:118 +#: ../flask_admin/contrib/sqla/filters.py:119 msgid "not in list" msgstr "" @@ -283,84 +275,85 @@ msgstr "" msgid "not between" msgstr "" -msgid "ObjectId equals" -msgstr "" - -#, python-format -msgid "Failed to get model. %(error)s" -msgstr "" - -#: ../flask_admin/contrib/peewee/view.py:435 -#: ../flask_admin/contrib/pymongo/view.py:316 -#: ../flask_admin/contrib/sqla/view.py:1078 +#: ../flask_admin/contrib/peewee/view.py:458 +#: ../flask_admin/contrib/pymongo/view.py:317 +#: ../flask_admin/contrib/sqla/view.py:1170 #, python-format msgid "Failed to create record. %(error)s" msgstr "" -#: ../flask_admin/contrib/peewee/view.py:454 -#: ../flask_admin/contrib/pymongo/view.py:341 -#: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 -#: ../flask_admin/model/base.py:2313 ../flask_admin/model/base.py:2315 +#: ../flask_admin/contrib/peewee/view.py:477 +#: ../flask_admin/contrib/pymongo/view.py:342 +#: ../flask_admin/contrib/sqla/view.py:1196 ../flask_admin/model/base.py:2463 +#: ../flask_admin/model/base.py:2471 ../flask_admin/model/base.py:2473 #, python-format msgid "Failed to update record. %(error)s" msgstr "" -#: ../flask_admin/contrib/peewee/view.py:469 -#: ../flask_admin/contrib/pymongo/view.py:366 -#: ../flask_admin/contrib/sqla/view.py:1129 +#: ../flask_admin/contrib/peewee/view.py:492 +#: ../flask_admin/contrib/pymongo/view.py:367 +#: ../flask_admin/contrib/sqla/view.py:1221 #, python-format msgid "Failed to delete record. %(error)s" msgstr "" -#: ../flask_admin/contrib/peewee/view.py:488 -#: ../flask_admin/contrib/pymongo/view.py:385 -#: ../flask_admin/contrib/sqla/view.py:1150 +#: ../flask_admin/contrib/peewee/view.py:511 +#: ../flask_admin/contrib/pymongo/view.py:386 +#: ../flask_admin/contrib/sqla/view.py:1242 msgid "Are you sure you want to delete selected records?" msgstr "" -#: ../flask_admin/contrib/peewee/view.py:505 -#: ../flask_admin/contrib/pymongo/view.py:395 -#: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 +#: ../flask_admin/contrib/peewee/view.py:528 +#: ../flask_admin/contrib/pymongo/view.py:396 +#: ../flask_admin/contrib/sqla/view.py:1258 ../flask_admin/model/base.py:2272 #, python-format msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." msgstr[0] "" msgstr[1] "" -#: ../flask_admin/contrib/peewee/view.py:511 -#: ../flask_admin/contrib/pymongo/view.py:400 -#: ../flask_admin/contrib/sqla/view.py:1174 +#: ../flask_admin/contrib/peewee/view.py:534 +#: ../flask_admin/contrib/pymongo/view.py:401 +#: ../flask_admin/contrib/sqla/view.py:1266 #, python-format msgid "Failed to delete records. %(error)s" msgstr "" -#: ../flask_admin/contrib/sqla/fields.py:126 -#: ../flask_admin/contrib/sqla/fields.py:176 -#: ../flask_admin/contrib/sqla/fields.py:181 ../flask_admin/model/fields.py:173 -#: ../flask_admin/model/fields.py:222 +#: ../flask_admin/contrib/sqla/fields.py:117 +#: ../flask_admin/contrib/sqla/fields.py:167 +#: ../flask_admin/contrib/sqla/fields.py:172 ../flask_admin/model/fields.py:174 +#: ../flask_admin/model/fields.py:223 msgid "Not a valid choice" msgstr "" -#: ../flask_admin/contrib/sqla/fields.py:186 +#: ../flask_admin/contrib/sqla/fields.py:201 msgid "Key" msgstr "" -#: ../flask_admin/contrib/sqla/fields.py:187 +#: ../flask_admin/contrib/sqla/fields.py:202 msgid "Value" msgstr "" -#: ../flask_admin/contrib/sqla/validators.py:42 +#: ../flask_admin/contrib/sqla/validators.py:28 msgid "Already exists." msgstr "" -#: ../flask_admin/contrib/sqla/validators.py:60 +#: ../flask_admin/contrib/sqla/validators.py:59 #, python-format msgid "At least %(num)d item is required" msgid_plural "At least %(num)d items are required" msgstr[0] "" msgstr[1] "" -#: ../flask_admin/contrib/sqla/view.py:1057 +#: ../flask_admin/contrib/sqla/validators.py:75 +msgid "Not a valid ISO currency code (e.g. USD, EUR, CNY)." +msgstr "" + +#: ../flask_admin/contrib/sqla/validators.py:83 +msgid "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." +msgstr "" + +#: ../flask_admin/contrib/sqla/view.py:1134 #, python-format msgid "Integrity error. %(message)s" msgstr "" @@ -369,274 +362,230 @@ msgstr "" msgid "Invalid time format" msgstr "" -#: ../flask_admin/form/fields.py:144 +#: ../flask_admin/form/fields.py:147 msgid "Invalid Choice: could not coerce" msgstr "" -#: ../flask_admin/form/fields.py:208 +#: ../flask_admin/form/fields.py:221 msgid "Invalid JSON" msgstr "" -#: ../flask_admin/form/upload.py:207 +#: ../flask_admin/form/upload.py:216 msgid "Invalid file extension" msgstr "" -#: ../flask_admin/form/upload.py:214 ../flask_admin/form/upload.py:281 +#: ../flask_admin/form/upload.py:223 ../flask_admin/form/upload.py:293 #, python-format msgid "File \"%s\" already exists." msgstr "" -#: ../flask_admin/model/base.py:1649 +#: ../flask_admin/form/validators.py:16 +msgid "This field requires at least one item." +msgstr "" + +#: ../flask_admin/model/base.py:1737 msgid "There are no items in the table." msgstr "" -#: ../flask_admin/model/base.py:1673 +#: ../flask_admin/model/base.py:1746 #, python-format msgid "Invalid Filter Value: %(value)s" msgstr "" -#: ../flask_admin/model/base.py:1984 +#: ../flask_admin/model/base.py:2136 msgid "Record was successfully created." msgstr "" -#: ../flask_admin/model/base.py:2028 ../flask_admin/model/base.py:2080 -#: ../flask_admin/model/base.py:2113 ../flask_admin/model/base.py:2297 +#: ../flask_admin/model/base.py:2180 ../flask_admin/model/base.py:2232 +#: ../flask_admin/model/base.py:2265 ../flask_admin/model/base.py:2455 msgid "Record does not exist." msgstr "" -#: ../flask_admin/model/base.py:2037 ../flask_admin/model/base.py:2301 +#: ../flask_admin/model/base.py:2189 ../flask_admin/model/base.py:2459 msgid "Record was successfully saved." msgstr "" -#: ../flask_admin/model/base.py:2222 -msgid "Tablib dependency not installed." -msgstr "" - -#: ../flask_admin/model/base.py:2249 +#: ../flask_admin/model/base.py:2407 #, python-format msgid "Export type \"%(type)s not supported." msgstr "" -#: ../flask_admin/model/filters.py:103 ../flask_admin/model/widgets.py:111 +#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:119 msgid "Yes" msgstr "" -#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:110 +#: ../flask_admin/model/filters.py:105 ../flask_admin/model/widgets.py:118 msgid "No" msgstr "" -#: ../flask_admin/model/filters.py:172 ../flask_admin/model/filters.py:212 -#: ../flask_admin/model/filters.py:257 +#: ../flask_admin/model/filters.py:173 ../flask_admin/model/filters.py:213 +#: ../flask_admin/model/filters.py:258 msgid "between" msgstr "" -#: ../flask_admin/model/template.py:81 ../flask_admin/model/template.py:88 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:37 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:8 +#: ../flask_admin/model/template.py:83 ../flask_admin/model/template.py:90 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:7 msgid "View Record" msgstr "" -#: ../flask_admin/model/template.py:95 ../flask_admin/model/template.py:102 -#: ../flask_admin/model/template.py:109 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/edit.html:11 +#: ../flask_admin/model/template.py:97 ../flask_admin/model/template.py:104 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/edit.html:10 msgid "Edit Record" msgstr "" -#: ../flask_admin/model/widgets.py:61 +#: ../flask_admin/model/template.py:111 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Delete Record" +msgstr "" + +#: ../flask_admin/model/widgets.py:62 msgid "Please select model" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/actions.html:4 -#: ../flask_admin/templates/bootstrap3/admin/actions.html:4 +#: ../flask_admin/templates/bootstrap4/admin/actions.html:5 msgid "With selected" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:200 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:190 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:216 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:227 msgid "Save" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:205 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:195 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:221 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:232 msgid "Cancel" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:256 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:247 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:290 msgid "Save and Add Another" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:259 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:250 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:293 msgid "Save and Continue Editing" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:9 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:9 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:10 msgid "Root" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:90 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:99 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:89 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:98 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:42 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:51 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:89 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:98 #, python-format msgid "Sort by %(name)s" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:77 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:79 msgid "Rename File" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:88 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:88 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:90 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\' recursively?" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:97 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:97 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:99 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\'?" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:125 -msgid "Size" -msgstr "" - -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:185 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:187 msgid "Please select at least one file." msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:8 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:17 msgid "List" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:12 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:18 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 msgid "Create" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:26 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:26 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:21 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:26 msgid "Details" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:29 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:28 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:15 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:28 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:15 msgid "Filter" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:13 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:14 msgid "Delete?" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:33 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:16 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:35 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Are you sure you want to delete this record?" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:33 msgid "New" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:43 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:43 msgid "Add" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:3 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:3 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:2 msgid "Add Filter" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:30 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:19 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:26 msgid "Export" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:38 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:38 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:49 msgid "Apply" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:40 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:51 msgid "Reset Filters" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:66 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:64 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:80 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:93 +#, python-format +msgid "%(placeholder)s" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:88 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:94 msgid "Search" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:74 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:77 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:78 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:79 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:72 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:75 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:76 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:77 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:102 msgid "items" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/create.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/create.html:10 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/create.html:10 msgid "Create New Record" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:76 msgid "Select all records" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:120 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:119 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:119 msgid "Select record" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:186 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:195 msgid "Please select at least one record." msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/row_actions.html:34 -#: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 -msgid "Are you sure you want to delete this record?" -msgstr "" diff --git a/flask_admin/translations/af/LC_MESSAGES/admin.mo b/flask_admin/translations/af/LC_MESSAGES/admin.mo index 65e1224b2fdba4969e3d4820329a1e77fb9981cc..127c8a0727889acfad1dc29fe70793268a581320 100644 GIT binary patch delta 1801 zcmYMzS!~o*6vy#1cA?WUwlk%4+6w$-v2??k0j(p7R-_50oiwNriACGeNTp>^8dHsA z%7f7ur6#vvVv!dfa0#KNJU}86h#{mPnkJZ_vKSZK66L9oXz=^9H?f({=iW2_yPoqu z)O<9VyBy2kWBhgVe+U1KdFuWD_dubULJwjwwqPl?VF5mkY3#-(+=oe=#76wvTQ|#W z4gK{<$o64{S<Vj7s3mZ0CSczqADiY&58lEuEG#mMVkIhGhk7o7Ol0@rGR)ut-06KE z^XVVQ5<G>P?>ttrzFnblCxK~Pf>mL&h4>Jv-;J8^4Ilpi7tue9HTWma#}ckb<LXh* zw__a+U=_ZL)%XeCj^`xn+qX0{(Ql}e6|zn3ID$$^3<JCyHE{>d#_c#4cVY}jef%Jn z(?5cm=ZyCYyp8@8>iG+pn?vIlANU6Y`en?nlO$0KJb{XD#ddrPb>eSOwQv&|YT?LC zDk_kVHSnbkq`j+92V9NXz+(~apSE@KrJQWVCVUke@FP@ezQzD=U?Wy>e_F8ByAJuu zHld2OA5|OMk*wMfs#tfSHt;&KXWOm&*MnmOG~ogN!(k+?_NkAb_VFnk2~jhslV#bp z#tkAN8%DBdBe)#j!+JcAOYtV^U<;{anaR;uMdKCJz++g6pQDQBJ5&k^xi9T}9%|vm zs14R3bJ}v$Ngws`c2sIN;9b~{swIai#&Oh*<R)q8D!xJ$%_Z-3)KwP{RB@(o9%fJ} z=|@et8&wM*qZXRP0I#E-kFg7xKoxHWYjGR0k(}+Nq1R#@mBX{%i>QUKp-z^^ORgK3 zjhe6=wQv%(p$^pe7g6&KBSUQrm6~znV<-4hja<Ndz5f^gYnWX|4fp|dr8j&(%>8S^ z`KS%0k;B=OzTbzf^j||=?K#x=pHUl{MvX5ZuX<Yo)Ik!M$NJVxLpfcEq}v`w71cV_ zM4NCiW>G~niaPOe4Dbr7RxCbKL-nZf_n_u$LB02nqZVF|%6%ucYT+Iq*n%pmZKwx_ zP(_*Z@i)Drs4Ly?e?JtTsGl_)a#KZn+-Kpi8w#Ivy~S52HkW)ETF}<FW6&~P1HG2X z@)-=ef|t7b`!)wXTe5vUz3%zQfcri2mn$w^>Y7X6c0ZMFbZg2w+*sM(Xlg}MBHff) z5u{T0C(;dxq<bX#T;4MqTil1y)uEN{kLU~e$$OV2CZ3IDLvFhK9XB%PwA)p2V&bW} sKZc6hUf#jVT?4K?UgL)1o$lB8HFv9Ok*lp9c4w+LxFt1f-C#}nU&Um})&Kwi delta 2499 zcmb8vX>6259LMn~Ek`Zw_MmJ_!9JV?q}WnIxkL&Sk)t#e;sxlI9m~=^+U`@N7*ZrL z29cn7LJ$o`i3u@5-?YIh5rdj&)C7s*0f85UM2M&{njl8O@2?%>3r&>G?tW(Gnd3kI znccqX*K4~k6lU!=yxRGU=JRT%YJb0`4K+qhm3SLgV+iNtU|flFa1B=CGgysp<21bL zEFES{J@utHME$VXm~InLsG#9B=jnk5<~lOggt7+)gfXA`?O1?!y7oF$zh%gTrqR_O z#p%?OSdNFB?_d`7^O(c><{|}6`~!yZCXU50+f}4<Z~`vGiD+>g?s4@uPz!wF+JC|E z)WbOhi}SDyA9VGtsPX%;ob^o~g(>(omg1n{#*D(zn1{8_rKpM4p#p11?PMG3=ysro zFQ5WCj=aq|zDD9@EX13xy)c*j7tv5oL1$cpny}V6-?i7_AlmCu6D&jBfroGewz~G6 z=ur<)JM2Zx{}n2L@7(i2>}nPD@p<H5DQc%d6F!S1!Muz*%cIB`^ByX&&zxsa3!g=0 z>_=2avYA8y=A*`qM~$mS9q}xz#Cz}#><p2Ao%Jg;c=*2a5>BH&m{AI72I{siaP=jq z1sYMA+lab^&B(nqTTuPesKC0Atec&vetX^X{oNF_z>BWK5#;`vUe|uYwSSCHXOK$N zj+)t~#<d`uH)-VFnO#_edvPkB#L0LSwc}#WL)PH}>`qY7z@w<!|0Y)8Db%IBhB~{k z<XbzLjSApyRG>?cm`np|=MTH~&B)ty@TDC;g_Cd}>ard~j;`B$PC=>q9+je>kv01- zfE>X^&{0fA1+We$;Cj@r;Rzgrhfqg(9JRoC)ZO|GwQwoBD8Ys3;R85EzyIz11!JB^ z{cMh*GVmqpa@|1v97{-#&b-E1hYDadYUiz}0DV+IkD~%OhzhI^HU2DWzRNg*^-U&W z=?qJdU`++;Qr+dOL#4dl)t9?^1ClJ$gxpuN8FdufT>Ea+LNB2LeG8S*GtMj6tp|Tl zSc;`=S37=$FHN)^74aU_L<dm|^`dtA0V>c>P=TC6-sTct3it-<uR4>#x~#>h_OYn> zCygTiI?GxbbW7KxQuQQyc*OY;>M~wIUDhI^)}6T>HSq-0LRF|gszs;(>rwqyq847` z>i3~8?}oD3107r3gCuGJ-*r%W)NwcJhywTga9PjXAv-fBMUu&s@1@#oN5r>YD(NNp z*hHJ(<wav1c9Wm#h}m?|H}t>|>qlbobg*jJr&H^<wWT_IGl1uJwOMc6#L03>ni+gA z-PxudHX4MpFJ`w`-%F&THXgj2J+kL|_Nk156}HQ)jHP|k5J_0mU>^%k=Y&J6o42s! zy;0A$cScz2+nhvEW86m4)=S$skK8m(!+)xbY_(n_8TIO-d{}d{?J!M$H7-si{aCWo zdiBv5g_dAZ?$pfKb{lNT-B%uIj>nq4sBN>!s7-F_>W?^<O#6{|+(xGd*K*fqM&g}8 zV_wtXm~Rv5;Bel7g6i7Jsu`74wO&=#T$N`9%R?<eZ)kDwYp6Z5X8O#YM1CrxV)6gX z=(&RDhAwd_Z7uxpR#IA3bTW4Z$JC!vueGBqI8hYt`Mv0yjQswzcBRQ`B+;MM^TlQV x$m+G?jsKd}wIeUzVpivdC-!G`LwJ|B_P^44A$)%pX|=)3k`-CXYp|na-k(6AfkFTP diff --git a/flask_admin/translations/af/LC_MESSAGES/admin.po b/flask_admin/translations/af/LC_MESSAGES/admin.po index db643f262..3dd6ece40 100644 --- a/flask_admin/translations/af/LC_MESSAGES/admin.po +++ b/flask_admin/translations/af/LC_MESSAGES/admin.po @@ -1,275 +1,264 @@ + msgid "" msgstr "" -"Project-Id-Version: flask-admin\n" +"Project-Id-Version: flask-admin\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-02-07 00:17-0600\n" +"POT-Creation-Date: 2024-09-24 22:09+0100\n" "PO-Revision-Date: 2017-02-07 01:19-0500\n" "Last-Translator: mrjoes <serge.koval@gmail.com>\n" +"Language: af_ZA\n" "Language-Team: Afrikaans\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.1.1\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: flask-admin\n" -"X-Crowdin-Language: af\n" -"X-Crowdin-File: admin.pot\n" -"Language: af_ZA\n" +"Generated-By: Babel 2.16.0\n" -#: ../flask_admin/base.py:440 +#: ../flask_admin/base.py:458 msgid "Home" msgstr "Tuiste" -#: ../flask_admin/contrib/rediscli.py:127 +#: ../flask_admin/contrib/rediscli.py:113 msgid "Cli: Invalid command." msgstr "Cli: Ongeldige opdrag." -#: ../flask_admin/contrib/fileadmin/__init__.py:352 +#: ../flask_admin/contrib/fileadmin/__init__.py:376 msgid "File to upload" msgstr "Lêer te laai" -#: ../flask_admin/contrib/fileadmin/__init__.py:360 +#: ../flask_admin/contrib/fileadmin/__init__.py:384 msgid "File required." msgstr "Lêer vereis." -#: ../flask_admin/contrib/fileadmin/__init__.py:365 +#: ../flask_admin/contrib/fileadmin/__init__.py:389 msgid "Invalid file type." msgstr "Ongeldig lêer tipe." -#: ../flask_admin/contrib/fileadmin/__init__.py:376 +#: ../flask_admin/contrib/fileadmin/__init__.py:400 msgid "Content" msgstr "Inhoud" -#: ../flask_admin/contrib/fileadmin/__init__.py:390 +#: ../flask_admin/contrib/fileadmin/__init__.py:414 msgid "Invalid name" msgstr "Ongeldige naam" -#: ../flask_admin/contrib/fileadmin/__init__.py:398 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:106 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:112 -#: ../flask_admin/tests/sqla/test_translation.py:17 +#: ../flask_admin/contrib/fileadmin/__init__.py:422 +#: ../flask_admin/tests/sqla/test_translation.py:21 msgid "Name" msgstr "Naam" -#: ../flask_admin/contrib/fileadmin/__init__.py:757 +#: ../flask_admin/contrib/fileadmin/__init__.py:784 #, python-format msgid "File \"%(name)s\" already exists." msgstr "Lêer \"%(name)s\" bestaan reeds." -#: ../flask_admin/contrib/fileadmin/__init__.py:802 -#: ../flask_admin/contrib/fileadmin/__init__.py:885 -#: ../flask_admin/contrib/fileadmin/__init__.py:947 -#: ../flask_admin/contrib/fileadmin/__init__.py:1000 -#: ../flask_admin/contrib/fileadmin/__init__.py:1047 -#: ../flask_admin/contrib/fileadmin/__init__.py:1099 -#: ../flask_admin/model/base.py:2168 +#: ../flask_admin/contrib/fileadmin/__init__.py:829 +#: ../flask_admin/contrib/fileadmin/__init__.py:926 +#: ../flask_admin/contrib/fileadmin/__init__.py:988 +#: ../flask_admin/contrib/fileadmin/__init__.py:1041 +#: ../flask_admin/contrib/fileadmin/__init__.py:1088 +#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/model/base.py:2324 msgid "Permission denied." msgstr "Toestemming geweier." -#: ../flask_admin/contrib/fileadmin/__init__.py:881 +#: ../flask_admin/contrib/fileadmin/__init__.py:922 msgid "File uploading is disabled." msgstr "Lêer oplaai is afgeskakel." -#: ../flask_admin/contrib/fileadmin/__init__.py:892 +#: ../flask_admin/contrib/fileadmin/__init__.py:933 #, python-format msgid "Successfully saved file: %(name)s" msgstr "Suksesvol gestoor lêer: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:896 +#: ../flask_admin/contrib/fileadmin/__init__.py:937 #, python-format msgid "Failed to save file: %(error)s" msgstr "Kon lêer te stoor: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:904 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:150 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:150 +#: ../flask_admin/contrib/fileadmin/__init__.py:945 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:150 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:152 msgid "Upload File" msgstr "Laai Lêer" -#: ../flask_admin/contrib/fileadmin/__init__.py:943 +#: ../flask_admin/contrib/fileadmin/__init__.py:984 msgid "Directory creation is disabled." msgstr "Gids skepping is afgeskakel." -#: ../flask_admin/contrib/fileadmin/__init__.py:956 +#: ../flask_admin/contrib/fileadmin/__init__.py:997 #, python-format msgid "Successfully created directory: %(directory)s" msgstr "Suksesvol geskep gids: %(directory)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:960 +#: ../flask_admin/contrib/fileadmin/__init__.py:1001 #, python-format msgid "Failed to create directory: %(error)s" msgstr "Kon gids te skep: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:970 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:161 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:161 +#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:161 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:163 msgid "Create Directory" msgstr "Skep Gids" -#: ../flask_admin/contrib/fileadmin/__init__.py:996 +#: ../flask_admin/contrib/fileadmin/__init__.py:1037 msgid "Deletion is disabled." msgstr "Skrap is afgeskakel." -#: ../flask_admin/contrib/fileadmin/__init__.py:1005 +#: ../flask_admin/contrib/fileadmin/__init__.py:1046 msgid "Directory deletion is disabled." msgstr "Gids skrap is afgeskakel." -#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/contrib/fileadmin/__init__.py:1052 #, python-format msgid "Directory \"%(path)s\" was successfully deleted." msgstr "Gids \"%(path)s\" is suksesvol verwyder." -#: ../flask_admin/contrib/fileadmin/__init__.py:1013 +#: ../flask_admin/contrib/fileadmin/__init__.py:1054 #, python-format msgid "Failed to delete directory: %(error)s" msgstr "Kon directory verwyder: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1019 -#: ../flask_admin/contrib/fileadmin/__init__.py:1176 +#: ../flask_admin/contrib/fileadmin/__init__.py:1060 +#: ../flask_admin/contrib/fileadmin/__init__.py:1215 #, python-format msgid "File \"%(name)s\" was successfully deleted." msgstr "Lêer \"%(name)s\" is suksesvol verwyder." -#: ../flask_admin/contrib/fileadmin/__init__.py:1021 -#: ../flask_admin/contrib/fileadmin/__init__.py:1178 +#: ../flask_admin/contrib/fileadmin/__init__.py:1062 +#: ../flask_admin/contrib/fileadmin/__init__.py:1217 #, python-format msgid "Failed to delete file: %(name)s" msgstr "Kon lêer verwyder: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1043 +#: ../flask_admin/contrib/fileadmin/__init__.py:1084 msgid "Renaming is disabled." msgstr "Herbenaming is afgeskakel." -#: ../flask_admin/contrib/fileadmin/__init__.py:1051 +#: ../flask_admin/contrib/fileadmin/__init__.py:1092 msgid "Path does not exist." msgstr "Pad bestaan nie." -#: ../flask_admin/contrib/fileadmin/__init__.py:1061 +#: ../flask_admin/contrib/fileadmin/__init__.py:1102 #, python-format msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\"" msgstr "Suksesvol herdoop \"%(src)s\" na \"%(dst)s\"" -#: ../flask_admin/contrib/fileadmin/__init__.py:1064 +#: ../flask_admin/contrib/fileadmin/__init__.py:1105 #, python-format msgid "Failed to rename: %(error)s" msgstr "Versuim om te hernoem: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1078 +#: ../flask_admin/contrib/fileadmin/__init__.py:1119 #, python-format msgid "Rename %(name)s" msgstr "Hernoem %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1115 +#: ../flask_admin/contrib/fileadmin/__init__.py:1155 #, python-format msgid "Error saving changes to %(name)s." msgstr "Fout tydens stoor veranderinge aan %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1119 +#: ../flask_admin/contrib/fileadmin/__init__.py:1159 #, python-format msgid "Changes to %(name)s saved successfully." msgstr "Wysigings aan %(name)s suksesvol gestoor." -#: ../flask_admin/contrib/fileadmin/__init__.py:1128 +#: ../flask_admin/contrib/fileadmin/__init__.py:1167 #, python-format msgid "Error reading %(name)s." msgstr "Fout lees %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1131 -#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/contrib/fileadmin/__init__.py:1170 +#: ../flask_admin/contrib/fileadmin/__init__.py:1179 #, python-format msgid "Unexpected error while reading from %(name)s" msgstr "Onverwagte fout met die lees van %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1137 +#: ../flask_admin/contrib/fileadmin/__init__.py:1176 #, python-format msgid "Cannot edit %(name)s." msgstr "Kan %(name)s nie wysig." -#: ../flask_admin/contrib/fileadmin/__init__.py:1155 +#: ../flask_admin/contrib/fileadmin/__init__.py:1194 #, python-format msgid "Editing %(path)s" msgstr "Redigering %(path)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/peewee/view.py:487 -#: ../flask_admin/contrib/pymongo/view.py:384 -#: ../flask_admin/contrib/sqla/view.py:1149 +#: ../flask_admin/contrib/fileadmin/__init__.py:1202 +#: ../flask_admin/contrib/peewee/view.py:510 +#: ../flask_admin/contrib/pymongo/view.py:385 +#: ../flask_admin/contrib/sqla/view.py:1241 msgid "Delete" msgstr "Verwyder" -#: ../flask_admin/contrib/fileadmin/__init__.py:1164 +#: ../flask_admin/contrib/fileadmin/__init__.py:1203 msgid "Are you sure you want to delete these files?" msgstr "Is jy seker jy wil hierdie lêers verwyder?" -#: ../flask_admin/contrib/fileadmin/__init__.py:1167 +#: ../flask_admin/contrib/fileadmin/__init__.py:1206 msgid "File deletion is disabled." msgstr "Lêer skrap is afgeskakel." -#: ../flask_admin/contrib/fileadmin/__init__.py:1180 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:22 +#: ../flask_admin/contrib/fileadmin/__init__.py:1219 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:22 msgid "Edit" msgstr "Wysig" -#: ../flask_admin/contrib/fileadmin/s3.py:153 +#: ../flask_admin/contrib/fileadmin/s3.py:162 msgid "Cannot operate on non empty directories" msgstr "" #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 -#: ../flask_admin/contrib/sqla/filters.py:41 +#: ../flask_admin/contrib/sqla/filters.py:42 msgid "equals" msgstr "gelyk" #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 -#: ../flask_admin/contrib/sqla/filters.py:49 +#: ../flask_admin/contrib/sqla/filters.py:50 msgid "not equal" msgstr "nie gelyk" #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 -#: ../flask_admin/contrib/sqla/filters.py:58 +#: ../flask_admin/contrib/sqla/filters.py:59 msgid "contains" msgstr "bevat" #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 -#: ../flask_admin/contrib/sqla/filters.py:67 +#: ../flask_admin/contrib/sqla/filters.py:68 msgid "not contains" msgstr "nie bevat" #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 -#: ../flask_admin/contrib/sqla/filters.py:75 +#: ../flask_admin/contrib/sqla/filters.py:76 msgid "greater than" msgstr "groter as" #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 -#: ../flask_admin/contrib/sqla/filters.py:83 +#: ../flask_admin/contrib/sqla/filters.py:84 msgid "smaller than" msgstr "kleiner as" #: ../flask_admin/contrib/peewee/filters.py:88 -#: ../flask_admin/contrib/sqla/filters.py:94 +#: ../flask_admin/contrib/sqla/filters.py:95 msgid "empty" msgstr "leë" #: ../flask_admin/contrib/peewee/filters.py:102 -#: ../flask_admin/contrib/sqla/filters.py:108 +#: ../flask_admin/contrib/sqla/filters.py:109 msgid "in list" msgstr "in lys" #: ../flask_admin/contrib/peewee/filters.py:111 -#: ../flask_admin/contrib/sqla/filters.py:118 +#: ../flask_admin/contrib/sqla/filters.py:119 msgid "not in list" msgstr "nie in die lys" @@ -282,84 +271,85 @@ msgstr "nie in die lys" msgid "not between" msgstr "nie tussen" -msgid "ObjectId equals" -msgstr "" - -#, python-format -msgid "Failed to get model. %(error)s" -msgstr "Kon model kry. %(error)s" - -#: ../flask_admin/contrib/peewee/view.py:435 -#: ../flask_admin/contrib/pymongo/view.py:316 -#: ../flask_admin/contrib/sqla/view.py:1078 +#: ../flask_admin/contrib/peewee/view.py:458 +#: ../flask_admin/contrib/pymongo/view.py:317 +#: ../flask_admin/contrib/sqla/view.py:1170 #, python-format msgid "Failed to create record. %(error)s" msgstr "Kon rekord te skep. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:454 -#: ../flask_admin/contrib/pymongo/view.py:341 -#: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 -#: ../flask_admin/model/base.py:2313 ../flask_admin/model/base.py:2315 +#: ../flask_admin/contrib/peewee/view.py:477 +#: ../flask_admin/contrib/pymongo/view.py:342 +#: ../flask_admin/contrib/sqla/view.py:1196 ../flask_admin/model/base.py:2463 +#: ../flask_admin/model/base.py:2471 ../flask_admin/model/base.py:2473 #, python-format msgid "Failed to update record. %(error)s" msgstr "Kon rekord te werk. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:469 -#: ../flask_admin/contrib/pymongo/view.py:366 -#: ../flask_admin/contrib/sqla/view.py:1129 +#: ../flask_admin/contrib/peewee/view.py:492 +#: ../flask_admin/contrib/pymongo/view.py:367 +#: ../flask_admin/contrib/sqla/view.py:1221 #, python-format msgid "Failed to delete record. %(error)s" msgstr "Kon rekord verwyder. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:488 -#: ../flask_admin/contrib/pymongo/view.py:385 -#: ../flask_admin/contrib/sqla/view.py:1150 +#: ../flask_admin/contrib/peewee/view.py:511 +#: ../flask_admin/contrib/pymongo/view.py:386 +#: ../flask_admin/contrib/sqla/view.py:1242 msgid "Are you sure you want to delete selected records?" msgstr "Is jy seker jy wil gekies rekords skrap?" -#: ../flask_admin/contrib/peewee/view.py:505 -#: ../flask_admin/contrib/pymongo/view.py:395 -#: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 +#: ../flask_admin/contrib/peewee/view.py:528 +#: ../flask_admin/contrib/pymongo/view.py:396 +#: ../flask_admin/contrib/sqla/view.py:1258 ../flask_admin/model/base.py:2272 #, python-format msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." msgstr[0] "Rekord is suksesvol verwyder." msgstr[1] "%(count)s rekords is suksesvol verwyder." -#: ../flask_admin/contrib/peewee/view.py:511 -#: ../flask_admin/contrib/pymongo/view.py:400 -#: ../flask_admin/contrib/sqla/view.py:1174 +#: ../flask_admin/contrib/peewee/view.py:534 +#: ../flask_admin/contrib/pymongo/view.py:401 +#: ../flask_admin/contrib/sqla/view.py:1266 #, python-format msgid "Failed to delete records. %(error)s" msgstr "Versuim om rekords te skrap. %(error)s" -#: ../flask_admin/contrib/sqla/fields.py:126 -#: ../flask_admin/contrib/sqla/fields.py:176 -#: ../flask_admin/contrib/sqla/fields.py:181 ../flask_admin/model/fields.py:173 -#: ../flask_admin/model/fields.py:222 +#: ../flask_admin/contrib/sqla/fields.py:117 +#: ../flask_admin/contrib/sqla/fields.py:167 +#: ../flask_admin/contrib/sqla/fields.py:172 ../flask_admin/model/fields.py:174 +#: ../flask_admin/model/fields.py:223 msgid "Not a valid choice" msgstr "Nie 'n geldige keuse" -#: ../flask_admin/contrib/sqla/fields.py:186 +#: ../flask_admin/contrib/sqla/fields.py:201 msgid "Key" msgstr "" -#: ../flask_admin/contrib/sqla/fields.py:187 +#: ../flask_admin/contrib/sqla/fields.py:202 msgid "Value" msgstr "" -#: ../flask_admin/contrib/sqla/validators.py:42 +#: ../flask_admin/contrib/sqla/validators.py:28 msgid "Already exists." msgstr "Bestaan reeds." -#: ../flask_admin/contrib/sqla/validators.py:60 +#: ../flask_admin/contrib/sqla/validators.py:59 #, python-format msgid "At least %(num)d item is required" msgid_plural "At least %(num)d items are required" msgstr[0] "Ten minste %(num)d item vereis" msgstr[1] "Ten minste %(num)d items vereis" -#: ../flask_admin/contrib/sqla/view.py:1057 +#: ../flask_admin/contrib/sqla/validators.py:75 +msgid "Not a valid ISO currency code (e.g. USD, EUR, CNY)." +msgstr "" + +#: ../flask_admin/contrib/sqla/validators.py:83 +msgid "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." +msgstr "" + +#: ../flask_admin/contrib/sqla/view.py:1134 #, python-format msgid "Integrity error. %(message)s" msgstr "Integriteit fout. %(message)s" @@ -368,274 +358,242 @@ msgstr "Integriteit fout. %(message)s" msgid "Invalid time format" msgstr "Ongeldige tyd formaat" -#: ../flask_admin/form/fields.py:144 +#: ../flask_admin/form/fields.py:147 msgid "Invalid Choice: could not coerce" msgstr "Ongeldig Choice: kon nie dwing" -#: ../flask_admin/form/fields.py:208 +#: ../flask_admin/form/fields.py:221 msgid "Invalid JSON" msgstr "Ongeldig JSON" -#: ../flask_admin/form/upload.py:207 +#: ../flask_admin/form/upload.py:216 msgid "Invalid file extension" msgstr "Ongeldig lêer uitbreiding" -#: ../flask_admin/form/upload.py:214 ../flask_admin/form/upload.py:281 +#: ../flask_admin/form/upload.py:223 ../flask_admin/form/upload.py:293 #, python-format msgid "File \"%s\" already exists." msgstr "Lêer \"%s\" bestaan reeds." -#: ../flask_admin/model/base.py:1649 +#: ../flask_admin/form/validators.py:16 +msgid "This field requires at least one item." +msgstr "" + +#: ../flask_admin/model/base.py:1737 msgid "There are no items in the table." msgstr "Daar is geen items in die tabel." -#: ../flask_admin/model/base.py:1673 +#: ../flask_admin/model/base.py:1746 #, python-format msgid "Invalid Filter Value: %(value)s" msgstr "Ongeldig Filter Waarde: %(value)s" -#: ../flask_admin/model/base.py:1984 +#: ../flask_admin/model/base.py:2136 msgid "Record was successfully created." msgstr "Rekord is suksesvol geskep." -#: ../flask_admin/model/base.py:2028 ../flask_admin/model/base.py:2080 -#: ../flask_admin/model/base.py:2113 ../flask_admin/model/base.py:2297 +#: ../flask_admin/model/base.py:2180 ../flask_admin/model/base.py:2232 +#: ../flask_admin/model/base.py:2265 ../flask_admin/model/base.py:2455 msgid "Record does not exist." msgstr "Rekord bestaan nie." -#: ../flask_admin/model/base.py:2037 ../flask_admin/model/base.py:2301 +#: ../flask_admin/model/base.py:2189 ../flask_admin/model/base.py:2459 msgid "Record was successfully saved." msgstr "Rekord suksesvol gestoor." -#: ../flask_admin/model/base.py:2222 -msgid "Tablib dependency not installed." -msgstr "" - -#: ../flask_admin/model/base.py:2249 +#: ../flask_admin/model/base.py:2407 #, python-format msgid "Export type \"%(type)s not supported." msgstr "" -#: ../flask_admin/model/filters.py:103 ../flask_admin/model/widgets.py:111 +#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:119 msgid "Yes" msgstr "Ja" -#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:110 +#: ../flask_admin/model/filters.py:105 ../flask_admin/model/widgets.py:118 msgid "No" msgstr "Geen" -#: ../flask_admin/model/filters.py:172 ../flask_admin/model/filters.py:212 -#: ../flask_admin/model/filters.py:257 +#: ../flask_admin/model/filters.py:173 ../flask_admin/model/filters.py:213 +#: ../flask_admin/model/filters.py:258 msgid "between" msgstr "tussen" -#: ../flask_admin/model/template.py:81 ../flask_admin/model/template.py:88 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:37 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:8 +#: ../flask_admin/model/template.py:83 ../flask_admin/model/template.py:90 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:7 msgid "View Record" msgstr "View Record" -#: ../flask_admin/model/template.py:95 ../flask_admin/model/template.py:102 -#: ../flask_admin/model/template.py:109 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/edit.html:11 +#: ../flask_admin/model/template.py:97 ../flask_admin/model/template.py:104 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/edit.html:10 msgid "Edit Record" msgstr "Rekord Wysig" -#: ../flask_admin/model/widgets.py:61 +#: ../flask_admin/model/template.py:111 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Delete Record" +msgstr "" + +#: ../flask_admin/model/widgets.py:62 msgid "Please select model" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/actions.html:4 -#: ../flask_admin/templates/bootstrap3/admin/actions.html:4 +#: ../flask_admin/templates/bootstrap4/admin/actions.html:5 msgid "With selected" msgstr "Met geselekteerde" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:200 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:190 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:216 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:227 msgid "Save" msgstr "Red" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:205 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:195 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:221 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:232 msgid "Cancel" msgstr "Kanselleer" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:256 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:247 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:290 msgid "Save and Add Another" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:259 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:250 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:293 msgid "Save and Continue Editing" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:9 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:9 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:10 msgid "Root" msgstr "Wortel" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:90 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:99 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:89 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:98 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:42 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:51 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:89 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:98 #, python-format msgid "Sort by %(name)s" msgstr "Sorteer %(name)s" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:77 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:79 msgid "Rename File" msgstr "Hernoem Lêer" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:88 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:88 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:90 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\' recursively?" msgstr "Is jy seker jy wil \\'%(name)s\\' rekursief verwyder?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:97 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:97 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:99 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\'?" msgstr "Is jy seker jy wil verwyder \\'%(name)s \\'?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:125 -msgid "Size" -msgstr "" - -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:185 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:187 msgid "Please select at least one file." msgstr "Kies ten minste een lêer." -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:8 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:17 msgid "List" msgstr "Lys" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:12 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:18 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 msgid "Create" msgstr "Skep" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:26 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:26 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:21 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:26 msgid "Details" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:29 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:28 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:15 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:28 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:15 msgid "Filter" msgstr "Filtreer" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:13 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:14 msgid "Delete?" msgstr "Verwyder?" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:33 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:16 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:35 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Are you sure you want to delete this record?" +msgstr "Is jy seker jy wil hierdie rekord verwyder?" + +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:33 msgid "New" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:43 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:43 msgid "Add" msgstr "Voeg" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:3 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:3 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:2 msgid "Add Filter" msgstr "Filter Voeg" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:30 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:19 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:26 msgid "Export" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:38 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:38 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:49 msgid "Apply" msgstr "Toepassing" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:40 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:51 msgid "Reset Filters" msgstr "Filters Herstel" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:66 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:64 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:80 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:93 +#, python-format +msgid "%(placeholder)s" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:88 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:94 msgid "Search" msgstr "Soek" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:74 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:77 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:78 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:79 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:72 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:75 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:76 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:77 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:102 msgid "items" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/create.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/create.html:10 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/create.html:10 msgid "Create New Record" msgstr "Skep Nuwe Rekord" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:76 msgid "Select all records" msgstr "Kies alle rekords" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:120 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:119 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:119 msgid "Select record" msgstr "Kies rekord" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:186 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:195 msgid "Please select at least one record." msgstr "Kies ten minste een rekord." -#: ../flask_admin/templates/bootstrap2/admin/model/row_actions.html:34 -#: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 -msgid "Are you sure you want to delete this record?" -msgstr "Is jy seker jy wil hierdie rekord verwyder?" +#~ msgid "ObjectId equals" +#~ msgstr "" + +#~ msgid "Failed to get model. %(error)s" +#~ msgstr "Kon model kry. %(error)s" + +#~ msgid "Tablib dependency not installed." +#~ msgstr "" + +#~ msgid "Size" +#~ msgstr "" + diff --git a/flask_admin/translations/ar/LC_MESSAGES/admin.mo b/flask_admin/translations/ar/LC_MESSAGES/admin.mo index a29d3e412dab2b214a31d1ec2cebedaed452ca4b..783dbcf1013a64645bb0e284aa95b40f8739b75f 100644 GIT binary patch delta 1819 zcmYMze@s<n9LMnoB;Z2V`=j8BqW54a^5e?o$}})QVA95vG_$Q%7C-KikcpEuwsbdJ zF8}C<+Y`Da&OcZI{^RWS4`pufhihfp*kt$S7SVFc{G;rjYYRv3Pn@m0bI<E}zUQ3h z`JU(doG;rZ8WTSSb4ComZvLhGt5>M^|L^HsV-#w{0&GDa?!rg#Wvs_;jNmBN;<s3h zi>?)U#_Xj30unN#SY%AXjL|43Ftr>o3&>$IoOI(7`Y|`(m;i=Q@e0&^QDh+V6mG^& z4C8Uv^O!^bYb?YW)Oa^A#QbKSMj3$&Zom?cG3&7z)$c|Pc*>1W;1l$}!!`H^uERo> zN6%HF?%$0SIDjR17FXkCT#45u^PAf=G|=y;H_IhWW$Z<jB!~{ypa$N9kK!N}<8ch) z$8LNaAEW;TYMgIezsGF)v#9%TVd8Nbzqx^j=+O5wy56J~HNo?!ct7sO_fc>BBWf@F zjXY{R-sMshA&05rqy*|+n@}&<hDxBr%lgwcuW(XL`Z0pXunI4tN;8KJKEP@$Vf{2= zyX$kvC366^Sr4K1#voEvGmP4-Cr}BzhvaNN)cWhja|ATtn0w(8QdV=tjbC%)v$&AO zo<XW*rpa0>aUECTJybl0ow^@=*otx7hZDFB7qK1d60E~58gHR8+DqZI^aoHko<Qw^ zDbyaBLrw4(a+rslv_b*us5je!dZ7kfi>+9LuVE#g#*O$D>i)zpG)TtWMGg25YLof+ zrrNLuwTqA9COnTC=o*&eeK%ghM$z?FRJ`BqTh}Y7=k8zx{UKwX)c4=C+%P?;&*Ky_ zrWr#eGKJb?Y1A9tMJ;(A>m9?5xE)_aayKKW&+{TGp&Q7YCWHE%SMn`t1?&Ek`Zv?i zF6}@EpG8ePh&*FXV*^gQ{)$Q@OtxCeMhvkhdQqi2MxB)41$6K#YP@;Wrd~oNP(@wy zncr-sp+GZgfDTki22hzNum#UxBc@O#DJF|3?!ag82x{e~P|x2)t=s~t*7sc>xYw7k zU7tsQbd|tr)MvB-_23q_--b$LuNyyzW%P&L>z}MkR_48(WoPq8>{XA)4tu6;yx`|# zZ{f|X@UFh2L#DH9AZ|Jja|}6M&YN9_`g)z7gNOTi;`R;ifW7Da(-!zP*=@cL>>b}r zcBg-jJ?B3Yh}A`+^^sVe6N@!O>#L%*wl(njidXlw*vY_1)^^(zJd#tpb#pZNd2lA% zjuy?^#kHmOLUG2<gqD(-RWsQ|>334&sn60UQ<Ek&o_;s=X)2jMY3J6ITW{&5<PW7z Xwhf1O*xvB8ZFfGhx1AxozbyVQj9B8X delta 2537 zcmb8vdu&rx9Ki9jZez^RZ9GO9?s3O}jk%6(D3dp14<7QE%o*bY($NEScI~#_0RweI z!60J9+)NUYM2(6>G$fq~ptxlGV~kOVEVP1)AtsQBJQ5Q^48iYjJL(^rh)sJx=lt$H zuirVhA1ydp(>*jUsaNr7=a<9p{Y0t#{V7dRN<v<|4=XSO=VLOi#5uSYy|@o6@FbSv zRb%#OrRu2H<0yF!vy|#q4uv8DM~r7jZm8QxTa}SI(!hh6)bnsG&NT6Al;@Tq9jXRX z--u<@Lzs_;jHfV(`j42#`05e`>G&FY@Gcghhvmvl=ipRajMGr#6nxdxKSdefoQeO2 zh15N1Ocv+i{rIG*Z$W9_i}{SNj#HR{G0aBS7^Nm-4yI$3u^y$PCX|V_qpV~b%GN!P z7QTftq0f=8y1->3UcqsA*Tl!U$^Uo)`4nW2XQ6ahWt?x~)#xH#htk0^lr!)YPQYhP zyaz4n4$2DqQ2IZQGJ#*reHW`*MZGYc{7Z`32}p<gktC>hQ1<dD(nbxSOzezt5M|&W zP%?HMB_pYHA`{F+X;+BSt^#F?XQLOF;se;3LH=d0-z8w-Y2(jWN<EoYGNDS8)4tHu zYf%PhK*`)Xltb8zoLkj`@_YnkVqHkqRS(K@ubKP3-4tYigXV$5$oW%!CjO;~e~lLt zNF{Q<R3FQf%=P0W972iT!X|W)_a*oQHsV37!s}R%MWk;KyF(OYX0_y7_UutCLK~&Q z+bD<Y9LnLli87Fz4W%zN2_=K2C@Wo!vce|J#b-=?2hODa5|&^Tr_1|4L_r!R^X|!e zJqD%YJd{&hi8Z(u<+(R;Djq_4YX-0wucCCEMLJ{wi&5g6jc?#X)K8lGH-_Wv|0GV3 zJXnp=K?}+u=|vgnwDAhcYw6}f5>zqD1Q#O5MXf_waR_B=_F*M{jPq~^<<L$hjq?96 z6N?#NHBul6>N%7@7zgE0oj^(TDdSfr{yoa6K93e&M47-HlnJ@nFBYe~I2Y@UJ5e(G z1<FLvU^jc9u2JxCxUz`K8SpZFSwRCA3&SWK??-uUj-gEKBFbsMjIy#DNRm`C56k_0 zl>SOkwssZD#Mh%N*q_h-S5w$QU;&;&+0)<A!f9N}u^yM=R+QBDqr6^&C>>uw$-u8D zXXK7CsbJ)O8p=d-Q6@GW<@K#7czC4YA_CIk8gruwWriD2I^K?a)m|>r@MuAF?x>!G z>Ap}XY+K<r-Qlyf6%JV;e!8{I?y~%W4!yw+cLa3AIi7N0l(v0=V8mH9`kRuvZEfKW zTa94ZU2WQ$GObvg5upd$igdQg6WZ^1QZJ=$(zewa_UoY2pE@ymJN3JSv5)93wK5Q~ z)oNd>R;%?^=WLoMV@-1lLoWAQy1moKSeMgU$2SDEFQTo84sy$M(>Ug)*SAGmzL4Ll z_VZ)R&ALN1{u!(ZhwMP8Q(JZZ0EJD?5_d^rV7qo&+^^^RnuCF6%dgvX$ge{ix`t;Q z2t{mPFsS`y&Mo)TiN0W`(~#bn9I$n3#Cb3Mz}Si^Z+WG+yviyspDX3r&WempPG3f^ zvm&!SaaP%b(f-T<S5eJ9X0&JgPbsw{DUGh5Fd^Z8<TTozm5@*v-x=R)#SX`J#XgCB z7T*)!WyMa!cg0_^;xET{$M?jJ#g0bTPaJgRN~+^8#tz3mjPH&eQNv9>h(+VOhts}1 zyXYTj4`(0yx3ov|CKtHM{>t&aC4ON}byA~b{)L<Y>#_ez{i59c$&ZtJ?R=ZtX_CJr GZ{r^;@}(;P diff --git a/flask_admin/translations/ar/LC_MESSAGES/admin.po b/flask_admin/translations/ar/LC_MESSAGES/admin.po index 0012ba85b..6b9f43687 100644 --- a/flask_admin/translations/ar/LC_MESSAGES/admin.po +++ b/flask_admin/translations/ar/LC_MESSAGES/admin.po @@ -1,275 +1,265 @@ + msgid "" msgstr "" -"Project-Id-Version: flask-admin\n" +"Project-Id-Version: flask-admin\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-02-07 00:17-0600\n" +"POT-Creation-Date: 2024-09-24 22:09+0100\n" "PO-Revision-Date: 2017-02-07 01:19-0500\n" "Last-Translator: mrjoes <serge.koval@gmail.com>\n" +"Language: ar_SA\n" "Language-Team: Arabic\n" +"Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : " +"n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.1.1\n" -"Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: flask-admin\n" -"X-Crowdin-Language: ar\n" -"X-Crowdin-File: admin.pot\n" -"Language: ar_SA\n" +"Generated-By: Babel 2.16.0\n" -#: ../flask_admin/base.py:440 +#: ../flask_admin/base.py:458 msgid "Home" msgstr "الصفحة الرئيسية" -#: ../flask_admin/contrib/rediscli.py:127 +#: ../flask_admin/contrib/rediscli.py:113 msgid "Cli: Invalid command." msgstr "Cli: أمر غير صالح." -#: ../flask_admin/contrib/fileadmin/__init__.py:352 +#: ../flask_admin/contrib/fileadmin/__init__.py:376 msgid "File to upload" msgstr "ملف لتحميله" -#: ../flask_admin/contrib/fileadmin/__init__.py:360 +#: ../flask_admin/contrib/fileadmin/__init__.py:384 msgid "File required." msgstr "الملف المطلوب." -#: ../flask_admin/contrib/fileadmin/__init__.py:365 +#: ../flask_admin/contrib/fileadmin/__init__.py:389 msgid "Invalid file type." msgstr "امتداد الملف غير صالح." -#: ../flask_admin/contrib/fileadmin/__init__.py:376 +#: ../flask_admin/contrib/fileadmin/__init__.py:400 msgid "Content" msgstr "محتوى السكريبت" -#: ../flask_admin/contrib/fileadmin/__init__.py:390 +#: ../flask_admin/contrib/fileadmin/__init__.py:414 msgid "Invalid name" msgstr "اسم غير صالح" -#: ../flask_admin/contrib/fileadmin/__init__.py:398 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:106 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:112 -#: ../flask_admin/tests/sqla/test_translation.py:17 +#: ../flask_admin/contrib/fileadmin/__init__.py:422 +#: ../flask_admin/tests/sqla/test_translation.py:21 msgid "Name" msgstr "الإسم" -#: ../flask_admin/contrib/fileadmin/__init__.py:757 +#: ../flask_admin/contrib/fileadmin/__init__.py:784 #, python-format msgid "File \"%(name)s\" already exists." msgstr "ملف \"%(name)s\" موجود بالفعل." -#: ../flask_admin/contrib/fileadmin/__init__.py:802 -#: ../flask_admin/contrib/fileadmin/__init__.py:885 -#: ../flask_admin/contrib/fileadmin/__init__.py:947 -#: ../flask_admin/contrib/fileadmin/__init__.py:1000 -#: ../flask_admin/contrib/fileadmin/__init__.py:1047 -#: ../flask_admin/contrib/fileadmin/__init__.py:1099 -#: ../flask_admin/model/base.py:2168 +#: ../flask_admin/contrib/fileadmin/__init__.py:829 +#: ../flask_admin/contrib/fileadmin/__init__.py:926 +#: ../flask_admin/contrib/fileadmin/__init__.py:988 +#: ../flask_admin/contrib/fileadmin/__init__.py:1041 +#: ../flask_admin/contrib/fileadmin/__init__.py:1088 +#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/model/base.py:2324 msgid "Permission denied." msgstr "ممنوع الدخول." -#: ../flask_admin/contrib/fileadmin/__init__.py:881 +#: ../flask_admin/contrib/fileadmin/__init__.py:922 msgid "File uploading is disabled." msgstr "تحميل الملف معطل." -#: ../flask_admin/contrib/fileadmin/__init__.py:892 +#: ../flask_admin/contrib/fileadmin/__init__.py:933 #, python-format msgid "Successfully saved file: %(name)s" msgstr "ملف تم حفظه بنجاح: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:896 +#: ../flask_admin/contrib/fileadmin/__init__.py:937 #, python-format msgid "Failed to save file: %(error)s" msgstr "فشل في حفظ الملف: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:904 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:150 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:150 +#: ../flask_admin/contrib/fileadmin/__init__.py:945 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:150 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:152 msgid "Upload File" msgstr "تحميل الملف" -#: ../flask_admin/contrib/fileadmin/__init__.py:943 +#: ../flask_admin/contrib/fileadmin/__init__.py:984 msgid "Directory creation is disabled." msgstr "يتم تعطيل إنشاء الدليل." -#: ../flask_admin/contrib/fileadmin/__init__.py:956 +#: ../flask_admin/contrib/fileadmin/__init__.py:997 #, python-format msgid "Successfully created directory: %(directory)s" msgstr "الدليل الذي تم إنشاؤه بنجاح: %(directory)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:960 +#: ../flask_admin/contrib/fileadmin/__init__.py:1001 #, python-format msgid "Failed to create directory: %(error)s" msgstr "فشل إنشاء الدليل: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:970 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:161 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:161 +#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:161 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:163 msgid "Create Directory" msgstr "إنشاء دليل" -#: ../flask_admin/contrib/fileadmin/__init__.py:996 +#: ../flask_admin/contrib/fileadmin/__init__.py:1037 msgid "Deletion is disabled." msgstr "يتم تعطيل الحذف." -#: ../flask_admin/contrib/fileadmin/__init__.py:1005 +#: ../flask_admin/contrib/fileadmin/__init__.py:1046 msgid "Directory deletion is disabled." msgstr "يتم تعطيل حذف الدليل." -#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/contrib/fileadmin/__init__.py:1052 #, python-format msgid "Directory \"%(path)s\" was successfully deleted." msgstr "تم بنجاح حذف الدليل \"%(path)s\"." -#: ../flask_admin/contrib/fileadmin/__init__.py:1013 +#: ../flask_admin/contrib/fileadmin/__init__.py:1054 #, python-format msgid "Failed to delete directory: %(error)s" msgstr "فشل في حذف الدليل: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1019 -#: ../flask_admin/contrib/fileadmin/__init__.py:1176 +#: ../flask_admin/contrib/fileadmin/__init__.py:1060 +#: ../flask_admin/contrib/fileadmin/__init__.py:1215 #, python-format msgid "File \"%(name)s\" was successfully deleted." msgstr "تم بنجاح حذف الملف \"%(name)s\"." -#: ../flask_admin/contrib/fileadmin/__init__.py:1021 -#: ../flask_admin/contrib/fileadmin/__init__.py:1178 +#: ../flask_admin/contrib/fileadmin/__init__.py:1062 +#: ../flask_admin/contrib/fileadmin/__init__.py:1217 #, python-format msgid "Failed to delete file: %(name)s" msgstr "فشل في حذف الملف: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1043 +#: ../flask_admin/contrib/fileadmin/__init__.py:1084 msgid "Renaming is disabled." msgstr "إعادة تسمية معطل." -#: ../flask_admin/contrib/fileadmin/__init__.py:1051 +#: ../flask_admin/contrib/fileadmin/__init__.py:1092 msgid "Path does not exist." msgstr "المسار غير موجود." -#: ../flask_admin/contrib/fileadmin/__init__.py:1061 +#: ../flask_admin/contrib/fileadmin/__init__.py:1102 #, python-format msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\"" msgstr "أعيدت تسميته بنجاح \"%(src)s\" إلى \"%(dst)s\"" -#: ../flask_admin/contrib/fileadmin/__init__.py:1064 +#: ../flask_admin/contrib/fileadmin/__init__.py:1105 #, python-format msgid "Failed to rename: %(error)s" msgstr "فشل إعادة تسمية: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1078 +#: ../flask_admin/contrib/fileadmin/__init__.py:1119 #, python-format msgid "Rename %(name)s" msgstr "إعادة تسمية %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1115 +#: ../flask_admin/contrib/fileadmin/__init__.py:1155 #, python-format msgid "Error saving changes to %(name)s." msgstr "حدث خطأ أثناء حفظ التغييرات إلى %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1119 +#: ../flask_admin/contrib/fileadmin/__init__.py:1159 #, python-format msgid "Changes to %(name)s saved successfully." msgstr "التغييرات إلى %(name)s حفظه بنجاح." -#: ../flask_admin/contrib/fileadmin/__init__.py:1128 +#: ../flask_admin/contrib/fileadmin/__init__.py:1167 #, python-format msgid "Error reading %(name)s." msgstr "خطأ القراءة %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1131 -#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/contrib/fileadmin/__init__.py:1170 +#: ../flask_admin/contrib/fileadmin/__init__.py:1179 #, python-format msgid "Unexpected error while reading from %(name)s" msgstr "حدث خطأ غير متوقع أثناء القراءة من %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1137 +#: ../flask_admin/contrib/fileadmin/__init__.py:1176 #, python-format msgid "Cannot edit %(name)s." msgstr "لا يمكن تحرير %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1155 +#: ../flask_admin/contrib/fileadmin/__init__.py:1194 #, python-format msgid "Editing %(path)s" msgstr "تحرير %(path)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/peewee/view.py:487 -#: ../flask_admin/contrib/pymongo/view.py:384 -#: ../flask_admin/contrib/sqla/view.py:1149 +#: ../flask_admin/contrib/fileadmin/__init__.py:1202 +#: ../flask_admin/contrib/peewee/view.py:510 +#: ../flask_admin/contrib/pymongo/view.py:385 +#: ../flask_admin/contrib/sqla/view.py:1241 msgid "Delete" msgstr "مسح" -#: ../flask_admin/contrib/fileadmin/__init__.py:1164 +#: ../flask_admin/contrib/fileadmin/__init__.py:1203 msgid "Are you sure you want to delete these files?" msgstr "هل تريد فعلا حذف %d من الملفات؟?" -#: ../flask_admin/contrib/fileadmin/__init__.py:1167 +#: ../flask_admin/contrib/fileadmin/__init__.py:1206 msgid "File deletion is disabled." msgstr "يتم تعطيل حذف الملف." -#: ../flask_admin/contrib/fileadmin/__init__.py:1180 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:22 +#: ../flask_admin/contrib/fileadmin/__init__.py:1219 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:22 msgid "Edit" msgstr "عدل" -#: ../flask_admin/contrib/fileadmin/s3.py:153 +#: ../flask_admin/contrib/fileadmin/s3.py:162 msgid "Cannot operate on non empty directories" msgstr "" #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 -#: ../flask_admin/contrib/sqla/filters.py:41 +#: ../flask_admin/contrib/sqla/filters.py:42 msgid "equals" msgstr "يساوي" #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 -#: ../flask_admin/contrib/sqla/filters.py:49 +#: ../flask_admin/contrib/sqla/filters.py:50 msgid "not equal" msgstr "لا تساوي" #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 -#: ../flask_admin/contrib/sqla/filters.py:58 +#: ../flask_admin/contrib/sqla/filters.py:59 msgid "contains" msgstr "يحتوي على" #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 -#: ../flask_admin/contrib/sqla/filters.py:67 +#: ../flask_admin/contrib/sqla/filters.py:68 msgid "not contains" msgstr "لا تحتوي علي" #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 -#: ../flask_admin/contrib/sqla/filters.py:75 +#: ../flask_admin/contrib/sqla/filters.py:76 msgid "greater than" msgstr "اكبر من" #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 -#: ../flask_admin/contrib/sqla/filters.py:83 +#: ../flask_admin/contrib/sqla/filters.py:84 msgid "smaller than" msgstr "أصغر من" #: ../flask_admin/contrib/peewee/filters.py:88 -#: ../flask_admin/contrib/sqla/filters.py:94 +#: ../flask_admin/contrib/sqla/filters.py:95 msgid "empty" msgstr "فارغ" #: ../flask_admin/contrib/peewee/filters.py:102 -#: ../flask_admin/contrib/sqla/filters.py:108 +#: ../flask_admin/contrib/sqla/filters.py:109 msgid "in list" msgstr "في قائمة" #: ../flask_admin/contrib/peewee/filters.py:111 -#: ../flask_admin/contrib/sqla/filters.py:118 +#: ../flask_admin/contrib/sqla/filters.py:119 msgid "not in list" msgstr "غير موجود في قائمة" @@ -282,44 +272,37 @@ msgstr "غير موجود في قائمة" msgid "not between" msgstr "ليس بين" -msgid "ObjectId equals" -msgstr "" - -#, python-format -msgid "Failed to get model. %(error)s" -msgstr "فشل في الحصول على نموذج. %(error)s" - -#: ../flask_admin/contrib/peewee/view.py:435 -#: ../flask_admin/contrib/pymongo/view.py:316 -#: ../flask_admin/contrib/sqla/view.py:1078 +#: ../flask_admin/contrib/peewee/view.py:458 +#: ../flask_admin/contrib/pymongo/view.py:317 +#: ../flask_admin/contrib/sqla/view.py:1170 #, python-format msgid "Failed to create record. %(error)s" msgstr "فشل في إنشاء سجل. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:454 -#: ../flask_admin/contrib/pymongo/view.py:341 -#: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 -#: ../flask_admin/model/base.py:2313 ../flask_admin/model/base.py:2315 +#: ../flask_admin/contrib/peewee/view.py:477 +#: ../flask_admin/contrib/pymongo/view.py:342 +#: ../flask_admin/contrib/sqla/view.py:1196 ../flask_admin/model/base.py:2463 +#: ../flask_admin/model/base.py:2471 ../flask_admin/model/base.py:2473 #, python-format msgid "Failed to update record. %(error)s" msgstr "فشل في إنشاء سجل. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:469 -#: ../flask_admin/contrib/pymongo/view.py:366 -#: ../flask_admin/contrib/sqla/view.py:1129 +#: ../flask_admin/contrib/peewee/view.py:492 +#: ../flask_admin/contrib/pymongo/view.py:367 +#: ../flask_admin/contrib/sqla/view.py:1221 #, python-format msgid "Failed to delete record. %(error)s" msgstr "فشل في حذف السجل. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:488 -#: ../flask_admin/contrib/pymongo/view.py:385 -#: ../flask_admin/contrib/sqla/view.py:1150 +#: ../flask_admin/contrib/peewee/view.py:511 +#: ../flask_admin/contrib/pymongo/view.py:386 +#: ../flask_admin/contrib/sqla/view.py:1242 msgid "Are you sure you want to delete selected records?" msgstr "هل أنت متأكد من أنك تريد حذف السجلات المحددة؟?" -#: ../flask_admin/contrib/peewee/view.py:505 -#: ../flask_admin/contrib/pymongo/view.py:395 -#: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 +#: ../flask_admin/contrib/peewee/view.py:528 +#: ../flask_admin/contrib/pymongo/view.py:396 +#: ../flask_admin/contrib/sqla/view.py:1258 ../flask_admin/model/base.py:2272 #, python-format msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." @@ -330,33 +313,33 @@ msgstr[3] "تم بنجاح حذف السجلات %(count)s." msgstr[4] "تم بنجاح حذف السجلات %(count)s." msgstr[5] "تم بنجاح حذف السجلات %(count)s." -#: ../flask_admin/contrib/peewee/view.py:511 -#: ../flask_admin/contrib/pymongo/view.py:400 -#: ../flask_admin/contrib/sqla/view.py:1174 +#: ../flask_admin/contrib/peewee/view.py:534 +#: ../flask_admin/contrib/pymongo/view.py:401 +#: ../flask_admin/contrib/sqla/view.py:1266 #, python-format msgid "Failed to delete records. %(error)s" msgstr "فشل في حذف السجل. %(error)s" -#: ../flask_admin/contrib/sqla/fields.py:126 -#: ../flask_admin/contrib/sqla/fields.py:176 -#: ../flask_admin/contrib/sqla/fields.py:181 ../flask_admin/model/fields.py:173 -#: ../flask_admin/model/fields.py:222 +#: ../flask_admin/contrib/sqla/fields.py:117 +#: ../flask_admin/contrib/sqla/fields.py:167 +#: ../flask_admin/contrib/sqla/fields.py:172 ../flask_admin/model/fields.py:174 +#: ../flask_admin/model/fields.py:223 msgid "Not a valid choice" msgstr "ليس خياراً صالحاً" -#: ../flask_admin/contrib/sqla/fields.py:186 +#: ../flask_admin/contrib/sqla/fields.py:201 msgid "Key" msgstr "" -#: ../flask_admin/contrib/sqla/fields.py:187 +#: ../flask_admin/contrib/sqla/fields.py:202 msgid "Value" msgstr "" -#: ../flask_admin/contrib/sqla/validators.py:42 +#: ../flask_admin/contrib/sqla/validators.py:28 msgid "Already exists." msgstr "موجود بالفعل." -#: ../flask_admin/contrib/sqla/validators.py:60 +#: ../flask_admin/contrib/sqla/validators.py:59 #, python-format msgid "At least %(num)d item is required" msgid_plural "At least %(num)d items are required" @@ -367,7 +350,15 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "" -#: ../flask_admin/contrib/sqla/view.py:1057 +#: ../flask_admin/contrib/sqla/validators.py:75 +msgid "Not a valid ISO currency code (e.g. USD, EUR, CNY)." +msgstr "" + +#: ../flask_admin/contrib/sqla/validators.py:83 +msgid "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." +msgstr "" + +#: ../flask_admin/contrib/sqla/view.py:1134 #, python-format msgid "Integrity error. %(message)s" msgstr "خطأ سلامة. %(message)s" @@ -376,274 +367,242 @@ msgstr "خطأ سلامة. %(message)s" msgid "Invalid time format" msgstr "تنسيق الوقت غير صالح" -#: ../flask_admin/form/fields.py:144 +#: ../flask_admin/form/fields.py:147 msgid "Invalid Choice: could not coerce" msgstr "خيار غير صالح: لا يمكن إرغام" -#: ../flask_admin/form/fields.py:208 +#: ../flask_admin/form/fields.py:221 msgid "Invalid JSON" msgstr "JSON غير صالح" -#: ../flask_admin/form/upload.py:207 +#: ../flask_admin/form/upload.py:216 msgid "Invalid file extension" msgstr "ملحق الملف غير صالح" -#: ../flask_admin/form/upload.py:214 ../flask_admin/form/upload.py:281 +#: ../flask_admin/form/upload.py:223 ../flask_admin/form/upload.py:293 #, python-format msgid "File \"%s\" already exists." msgstr "ملف \"%s\" موجود بالفعل." -#: ../flask_admin/model/base.py:1649 +#: ../flask_admin/form/validators.py:16 +msgid "This field requires at least one item." +msgstr "" + +#: ../flask_admin/model/base.py:1737 msgid "There are no items in the table." msgstr "لا توجد أي عناصر في الجدول." -#: ../flask_admin/model/base.py:1673 +#: ../flask_admin/model/base.py:1746 #, python-format msgid "Invalid Filter Value: %(value)s" msgstr "قيمة عامل التصفية غير صالح: %(value)s" -#: ../flask_admin/model/base.py:1984 +#: ../flask_admin/model/base.py:2136 msgid "Record was successfully created." msgstr "تم إنشاء السجل بنجاح." -#: ../flask_admin/model/base.py:2028 ../flask_admin/model/base.py:2080 -#: ../flask_admin/model/base.py:2113 ../flask_admin/model/base.py:2297 +#: ../flask_admin/model/base.py:2180 ../flask_admin/model/base.py:2232 +#: ../flask_admin/model/base.py:2265 ../flask_admin/model/base.py:2455 msgid "Record does not exist." msgstr "السجل غير موجود." -#: ../flask_admin/model/base.py:2037 ../flask_admin/model/base.py:2301 +#: ../flask_admin/model/base.py:2189 ../flask_admin/model/base.py:2459 msgid "Record was successfully saved." msgstr "تم حفظ السجل بنجاح." -#: ../flask_admin/model/base.py:2222 -msgid "Tablib dependency not installed." -msgstr "" - -#: ../flask_admin/model/base.py:2249 +#: ../flask_admin/model/base.py:2407 #, python-format msgid "Export type \"%(type)s not supported." msgstr "" -#: ../flask_admin/model/filters.py:103 ../flask_admin/model/widgets.py:111 +#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:119 msgid "Yes" msgstr "نعم" -#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:110 +#: ../flask_admin/model/filters.py:105 ../flask_admin/model/widgets.py:118 msgid "No" msgstr "لا" -#: ../flask_admin/model/filters.py:172 ../flask_admin/model/filters.py:212 -#: ../flask_admin/model/filters.py:257 +#: ../flask_admin/model/filters.py:173 ../flask_admin/model/filters.py:213 +#: ../flask_admin/model/filters.py:258 msgid "between" msgstr "بين" -#: ../flask_admin/model/template.py:81 ../flask_admin/model/template.py:88 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:37 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:8 +#: ../flask_admin/model/template.py:83 ../flask_admin/model/template.py:90 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:7 msgid "View Record" msgstr "عرض السجل" -#: ../flask_admin/model/template.py:95 ../flask_admin/model/template.py:102 -#: ../flask_admin/model/template.py:109 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/edit.html:11 +#: ../flask_admin/model/template.py:97 ../flask_admin/model/template.py:104 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/edit.html:10 msgid "Edit Record" msgstr "تحرير سجل" -#: ../flask_admin/model/widgets.py:61 +#: ../flask_admin/model/template.py:111 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Delete Record" +msgstr "" + +#: ../flask_admin/model/widgets.py:62 msgid "Please select model" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/actions.html:4 -#: ../flask_admin/templates/bootstrap3/admin/actions.html:4 +#: ../flask_admin/templates/bootstrap4/admin/actions.html:5 msgid "With selected" msgstr "مع تحديد" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:200 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:190 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:216 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:227 msgid "Save" msgstr "احفظ" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:205 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:195 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:221 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:232 msgid "Cancel" msgstr "إالغاء" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:256 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:247 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:290 msgid "Save and Add Another" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:259 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:250 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:293 msgid "Save and Continue Editing" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:9 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:9 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:10 msgid "Root" msgstr "الجذر" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:90 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:99 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:89 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:98 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:42 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:51 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:89 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:98 #, python-format msgid "Sort by %(name)s" msgstr "فرز حسب %(name)s" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:77 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:79 msgid "Rename File" msgstr "إعادة تسمية الملف" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:88 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:88 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:90 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\' recursively?" msgstr "هل أنت متأكد من أنك تريد حذف \\'%(name)s\\' بشكل متكرر؟" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:97 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:97 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:99 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\'?" msgstr "هل أنت متأكد من أنك تريد حذف \\'%(name)s\\ '؟" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:125 -msgid "Size" -msgstr "" - -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:185 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:187 msgid "Please select at least one file." msgstr "الرجاء تحديد ملف واحد على الأقل." -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:8 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:17 msgid "List" msgstr "قائمة" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:12 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:18 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 msgid "Create" msgstr "إنشاء" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:26 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:26 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:21 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:26 msgid "Details" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:29 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:28 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:15 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:28 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:15 msgid "Filter" msgstr "الذهاب »" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:13 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:14 msgid "Delete?" msgstr "مسح?" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:33 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:16 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:35 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Are you sure you want to delete this record?" +msgstr "هل أنت متأكد من أنك تريد حذف هذا السجل؟" + +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:33 msgid "New" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:43 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:43 msgid "Add" msgstr "إضافة" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:3 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:3 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:2 msgid "Add Filter" msgstr "إضافة عامل تصفية" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:30 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:19 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:26 msgid "Export" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:38 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:38 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:49 msgid "Apply" msgstr "تطبيق" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:40 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:51 msgid "Reset Filters" msgstr "إعادة تعيين عوامل تصفية" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:66 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:64 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:80 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:93 +#, python-format +msgid "%(placeholder)s" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:88 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:94 msgid "Search" msgstr "البحث" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:74 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:77 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:78 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:79 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:72 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:75 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:76 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:77 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:102 msgid "items" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/create.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/create.html:10 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/create.html:10 msgid "Create New Record" msgstr "قم بإنشاء سجل جديد" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:76 msgid "Select all records" msgstr "تحديد كافة السجلات" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:120 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:119 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:119 msgid "Select record" msgstr "حدد السجل" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:186 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:195 msgid "Please select at least one record." msgstr "الرجاء تحديد سجل واحد على الأقل." -#: ../flask_admin/templates/bootstrap2/admin/model/row_actions.html:34 -#: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 -msgid "Are you sure you want to delete this record?" -msgstr "هل أنت متأكد من أنك تريد حذف هذا السجل؟" +#~ msgid "ObjectId equals" +#~ msgstr "" + +#~ msgid "Failed to get model. %(error)s" +#~ msgstr "فشل في الحصول على نموذج. %(error)s" + +#~ msgid "Tablib dependency not installed." +#~ msgstr "" + +#~ msgid "Size" +#~ msgstr "" + diff --git a/flask_admin/translations/be/LC_MESSAGES/admin.mo b/flask_admin/translations/be/LC_MESSAGES/admin.mo index 9322646cd7e4f71853cdb3fdbd4753406b5175d1..b577457d3090f1f123c845b51b4acb5c07c02be5 100644 GIT binary patch delta 1885 zcmYM!e{9Tm9LMqZX?Mk;?oe$h*J^2T&D~8~)isN*evN9RNf8?%jar0gvOmm^oMiss z50>RLMncB?p@>Sp{bOcAnkFsT)@9Qap?}EcM-U`_lkt4HPqOCj9^cQ8@8`$+^ZxYd z{O-Alflzv@@wb8Rc)mN+RQmt#f!|D34{<0y!AyLMAK|bJvq}tM1Q%fpx8QU<<-CS- zDEkNVRX-eKmaqmMrcm*f^ZQhTokiZUUepWyI1&dih>u*oZ%C@&U}QiW>B^I_lyWIf z#4nxOF`e=u3^2bP<v|0V#<6$-^RXW_@hdDuZNCVLumBgj@<!AI`&@koPNLk8<M0hm zz_EeUd*!J9%dv#{?He9)@F&d0^Ed*pI`5zcdX8F9Xjp0oIjAF>fMKjc4g3Z2v2FZh z;cg7!kFMUsQIs!YLT7u02ZiLS^CqhP77oJOr~&TbXngC+!QrWi3sDi7gBo}pYT|9K zJ&ARcJ5Z4r#O{<s`6Gxwo3a=cI=gD5k2RncwA#5AHSu~>q;{YpaS*kzBdGT}P)FH` z5&Rpcp^w>gq!A2bJx<3>nZ#cUI7EfAxeZlrM-6xm6^TozWc(e;JL^OBA3!bSA0#Mt zAJy-rYu9Qto*&g7Lej}5y84oYYbe9(KC>EE&SP8J=~UDXYxyCMY$-0oHTW5x!$y3E zpJOBOmq)M@A0SQEPWW^!J8?cf#cE7c6L%%oR%CA5?>z46&!V!w&(*(1UB3VaT#R|B zq@9bO;A;FB4?F)t9i5-6rQ{svtU|7R!dCE5MZ>qqaoGi&hksxNW@V@T!7N6VcVRhR zboDP#@5cz2>NlYJ9YfXMz{!}+Dre%S7{<+5ru%=uRrI2=`0<AZGMTXG%od;`(}+=Q z#s&BTmf<brxGkHzI2DUA4;zp@SPO=6H!62dI6WN7{PwG>=tgDzpU9Zjhb-QnARh}b zYCRU?65Nam^<`B5|4<Rg<&JgX5>z>hxKF}5XA8zDw_<{?_3)#e-bL;78J3_wOt>(L zO1@2~2yI0z>@f1NpZQV0Ygmgp`KgIlVkzZTT#8-D8f`p-Xr5UG#9u34NCkOi&8X|N z9W~)jRPuc1%Ez4Ts3iOabxnUm4R{@O6!%dJe1poVF>GJApb*twp>WJ@YO>j0JY!V4 z*A#f+^VSdV_9ZJa_jvziF7gHAGa}K-NPI>(9-kGhoED8GYl6*bt7?`f+k$(2RmqA_ iOM0xlH0qrUt;z7_<$j&!_2%`YC6DG0cwGf&eD48x&cn+9 delta 2124 zcmYM!drZ}39LMp8ix8q*D<D9A1cfCam*QwphAEdWfVS+mxpCmcFv1wvv}uRzwnc{R z2wS=|w?;Q<+JV)$HK}!7>-Sq)t<*K<va)45{>Zgv?@#AhG2r!lzrW{se$VyyN!@%y z@Kjptkm09?za0Kvi&6CdPjS34N|oS3EXQQ5!3B6HuEh0Nf-hh>PGB+qX3e_Hn6<=p z7^ix8g)u=BqEJNQO{*7qU@jtUO>#n{K?bG}FTqq?Zu7OMdJRa2rp3k&VJUGp=HV;W zX^bU4iHW@5%u!Iszheeo!hFnNx*F+9EW}&!8VumoIAG&<P%k)U^Yd6hoRP?2u^O}S z0UJMtYCnW|yx+V};X3>dvoLy*F;`&@CZW$-hwA7a)WCXBGuevTx*h1?Uetglkzexz z|E|QJF%2)-eA;5xKb=G#1?_PqszaZ(#^!4=n*3T+2Mwq*@E~4}58He{I>aH=498IY ze~TKxS^GSiS=~ikki`0HiF!z=!`;Xtm{(DIc?fA^W>Eukt;bO>{vNer=TIw>Kqnet z3aVWJs$Ds1i>t5%>v0)wNoM`E*9S>B_@VVQ785U^l?GISI_<aEcn#_WEvS{-h&qIR z<lLG~sQSIAfo(%p-SngC?Xu5@f)w<EeYV2u$oVs4Ha}zYpX2c;meR(fOj9$TK+X6V z|2TK%4Bm$q@HV`I_1}Plcsu@NEob>=iG$lIsDo9kx9;tFY`~}SX8aO$=n~mL-ffDk zD^U4HEX07#KaaYe`*10aq7L&nScB)W5=*&i7&Lwg+RI_oseRk}1r`yX#cE8?jNFE1 ztS8=xJ{&=PfKJ&slVzzQZb9XrL$yC@<G)eQeT>Sd``=AL6-Mw{oWm8E!1NqkjW=SO zjbBEc?g^VeiQ3zA?x0r4!7?nzM)afFA3~0mnZxVx0_O65lbaj)@KmEid^hS4^;vhI z_V!sDzl1u~dy#jW1IV_TNn~>7E2MAp3pQgMS8N?_KrQ_nsCFkXsHOOm!biBA^;bNP z`hqQUA~s_MaWC@7jG$)xF>1zNqds7#aTO-zM+V%4TB-X{1KV!%!$?(gFrW2TgIN-5 zFq+yLKt1a8K7plrj`!kuWKyP)(doq<sF`d<&Z*ghx^8cwR_qAsY)#qNvz|a5(lZ5Y zwC?dm66!FXqpUs3M2&bU@@+AzQMY8BecoOe{xvQ;HlZWX=RC5xJ<t_Cw{UTEa<hL^ zpsla5-3jz;Y3=F_|F!7TsF=>j1EHfygL$p~u1>$x9(Xj+-5%&}+vap{?sGc3d;40u zx&rN`;ilxKsMK;_Nm)fnna?RJyGiA$&}d3WC?oa7&`4@eOl9c};p{Yj{F1}oPOsk^ zaHrhE?zB7Y4Lbi8$Glzcq&FOH&DtH4{@-A{es{*(PpyIQA32}JBpjg8lsoSAhu(93 ztaZl;k9g0xGwzt`IPM1|CcLNU7@fYzxQWIcZ@>4Xx0CdwH|V~L)GrP1$qz^U1BN6m AE&u=k diff --git a/flask_admin/translations/be/LC_MESSAGES/admin.po b/flask_admin/translations/be/LC_MESSAGES/admin.po index da1923928..404ca1d17 100644 --- a/flask_admin/translations/be/LC_MESSAGES/admin.po +++ b/flask_admin/translations/be/LC_MESSAGES/admin.po @@ -1,275 +1,265 @@ + msgid "" msgstr "" -"Project-Id-Version: flask-admin\n" +"Project-Id-Version: flask-admin\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-02-07 00:17-0600\n" +"POT-Creation-Date: 2024-09-24 22:09+0100\n" "PO-Revision-Date: 2017-02-13 09:18-0500\n" "Last-Translator: mrjoes <serge.koval@gmail.com>\n" +"Language: be_BY\n" "Language-Team: Belarusian\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.1.1\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: flask-admin\n" -"X-Crowdin-Language: be\n" -"X-Crowdin-File: admin.pot\n" -"Language: be_BY\n" +"Generated-By: Babel 2.16.0\n" -#: ../flask_admin/base.py:440 +#: ../flask_admin/base.py:458 msgid "Home" msgstr "Галоўная" -#: ../flask_admin/contrib/rediscli.py:127 +#: ../flask_admin/contrib/rediscli.py:113 msgid "Cli: Invalid command." msgstr "Cli: хібны загад." -#: ../flask_admin/contrib/fileadmin/__init__.py:352 +#: ../flask_admin/contrib/fileadmin/__init__.py:376 msgid "File to upload" msgstr "Файл для ладавання" -#: ../flask_admin/contrib/fileadmin/__init__.py:360 +#: ../flask_admin/contrib/fileadmin/__init__.py:384 msgid "File required." msgstr "Патрабуецца файл." -#: ../flask_admin/contrib/fileadmin/__init__.py:365 +#: ../flask_admin/contrib/fileadmin/__init__.py:389 msgid "Invalid file type." msgstr "Хібны тып файлу." -#: ../flask_admin/contrib/fileadmin/__init__.py:376 +#: ../flask_admin/contrib/fileadmin/__init__.py:400 msgid "Content" msgstr "Змесціва" -#: ../flask_admin/contrib/fileadmin/__init__.py:390 +#: ../flask_admin/contrib/fileadmin/__init__.py:414 msgid "Invalid name" msgstr "Хібная назва" -#: ../flask_admin/contrib/fileadmin/__init__.py:398 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:106 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:112 -#: ../flask_admin/tests/sqla/test_translation.py:17 +#: ../flask_admin/contrib/fileadmin/__init__.py:422 +#: ../flask_admin/tests/sqla/test_translation.py:21 msgid "Name" msgstr "Назва" -#: ../flask_admin/contrib/fileadmin/__init__.py:757 +#: ../flask_admin/contrib/fileadmin/__init__.py:784 #, python-format msgid "File \"%(name)s\" already exists." msgstr "Файл \"%(name)s\" ужо йснуе." -#: ../flask_admin/contrib/fileadmin/__init__.py:802 -#: ../flask_admin/contrib/fileadmin/__init__.py:885 -#: ../flask_admin/contrib/fileadmin/__init__.py:947 -#: ../flask_admin/contrib/fileadmin/__init__.py:1000 -#: ../flask_admin/contrib/fileadmin/__init__.py:1047 -#: ../flask_admin/contrib/fileadmin/__init__.py:1099 -#: ../flask_admin/model/base.py:2168 +#: ../flask_admin/contrib/fileadmin/__init__.py:829 +#: ../flask_admin/contrib/fileadmin/__init__.py:926 +#: ../flask_admin/contrib/fileadmin/__init__.py:988 +#: ../flask_admin/contrib/fileadmin/__init__.py:1041 +#: ../flask_admin/contrib/fileadmin/__init__.py:1088 +#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/model/base.py:2324 msgid "Permission denied." msgstr "Бракуе дазволу." -#: ../flask_admin/contrib/fileadmin/__init__.py:881 +#: ../flask_admin/contrib/fileadmin/__init__.py:922 msgid "File uploading is disabled." msgstr "Ладаванне файлаў адключанае." -#: ../flask_admin/contrib/fileadmin/__init__.py:892 +#: ../flask_admin/contrib/fileadmin/__init__.py:933 #, python-format msgid "Successfully saved file: %(name)s" msgstr "Файл паспяхова захаваны: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:896 +#: ../flask_admin/contrib/fileadmin/__init__.py:937 #, python-format msgid "Failed to save file: %(error)s" msgstr "Памылка захавання файлу: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:904 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:150 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:150 +#: ../flask_admin/contrib/fileadmin/__init__.py:945 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:150 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:152 msgid "Upload File" msgstr "Заладаваць файл" -#: ../flask_admin/contrib/fileadmin/__init__.py:943 +#: ../flask_admin/contrib/fileadmin/__init__.py:984 msgid "Directory creation is disabled." msgstr "Стварэнне тэчак адключанае." -#: ../flask_admin/contrib/fileadmin/__init__.py:956 +#: ../flask_admin/contrib/fileadmin/__init__.py:997 #, python-format msgid "Successfully created directory: %(directory)s" msgstr "Тэчка паспяхова створаная: %(directory)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:960 +#: ../flask_admin/contrib/fileadmin/__init__.py:1001 #, python-format msgid "Failed to create directory: %(error)s" msgstr "Памылка стварэння тэчкі: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:970 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:161 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:161 +#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:161 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:163 msgid "Create Directory" msgstr "Стварыць тэчку" -#: ../flask_admin/contrib/fileadmin/__init__.py:996 +#: ../flask_admin/contrib/fileadmin/__init__.py:1037 msgid "Deletion is disabled." msgstr "Выдаленне адключанае." -#: ../flask_admin/contrib/fileadmin/__init__.py:1005 +#: ../flask_admin/contrib/fileadmin/__init__.py:1046 msgid "Directory deletion is disabled." msgstr "Выдаленне тэчак адключанае." -#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/contrib/fileadmin/__init__.py:1052 #, python-format msgid "Directory \"%(path)s\" was successfully deleted." msgstr "Тэчка \"%(path)s\" паспяхова выдаленая." -#: ../flask_admin/contrib/fileadmin/__init__.py:1013 +#: ../flask_admin/contrib/fileadmin/__init__.py:1054 #, python-format msgid "Failed to delete directory: %(error)s" msgstr "Памылка выдалення тэчкі: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1019 -#: ../flask_admin/contrib/fileadmin/__init__.py:1176 +#: ../flask_admin/contrib/fileadmin/__init__.py:1060 +#: ../flask_admin/contrib/fileadmin/__init__.py:1215 #, python-format msgid "File \"%(name)s\" was successfully deleted." msgstr "Файл \"%(name)s\" паспяхова выдалены." -#: ../flask_admin/contrib/fileadmin/__init__.py:1021 -#: ../flask_admin/contrib/fileadmin/__init__.py:1178 +#: ../flask_admin/contrib/fileadmin/__init__.py:1062 +#: ../flask_admin/contrib/fileadmin/__init__.py:1217 #, python-format msgid "Failed to delete file: %(name)s" msgstr "Памылка выдалення файлу: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1043 +#: ../flask_admin/contrib/fileadmin/__init__.py:1084 msgid "Renaming is disabled." msgstr "Перайменаванне адключанае." -#: ../flask_admin/contrib/fileadmin/__init__.py:1051 +#: ../flask_admin/contrib/fileadmin/__init__.py:1092 msgid "Path does not exist." msgstr "Шлях не йснуе." -#: ../flask_admin/contrib/fileadmin/__init__.py:1061 +#: ../flask_admin/contrib/fileadmin/__init__.py:1102 #, python-format msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\"" msgstr "Паспяхова змененае імя з \"%(src)s\" у \"%(dst)s\"" -#: ../flask_admin/contrib/fileadmin/__init__.py:1064 +#: ../flask_admin/contrib/fileadmin/__init__.py:1105 #, python-format msgid "Failed to rename: %(error)s" msgstr "Памылка перайменавання: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1078 +#: ../flask_admin/contrib/fileadmin/__init__.py:1119 #, python-format msgid "Rename %(name)s" msgstr "Перайменаваць %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1115 +#: ../flask_admin/contrib/fileadmin/__init__.py:1155 #, python-format msgid "Error saving changes to %(name)s." msgstr "Памылка захавання зменаў у %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1119 +#: ../flask_admin/contrib/fileadmin/__init__.py:1159 #, python-format msgid "Changes to %(name)s saved successfully." msgstr "Змены ў %(name)s паспяхова захаваныя." -#: ../flask_admin/contrib/fileadmin/__init__.py:1128 +#: ../flask_admin/contrib/fileadmin/__init__.py:1167 #, python-format msgid "Error reading %(name)s." msgstr "Памылка чытання %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1131 -#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/contrib/fileadmin/__init__.py:1170 +#: ../flask_admin/contrib/fileadmin/__init__.py:1179 #, python-format msgid "Unexpected error while reading from %(name)s" msgstr "Непрадугледжаная памылка падчас чытання з %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1137 +#: ../flask_admin/contrib/fileadmin/__init__.py:1176 #, python-format msgid "Cannot edit %(name)s." msgstr "Немагчыма рэдагаваць %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1155 +#: ../flask_admin/contrib/fileadmin/__init__.py:1194 #, python-format msgid "Editing %(path)s" msgstr "Рэдагаванне %(path)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/peewee/view.py:487 -#: ../flask_admin/contrib/pymongo/view.py:384 -#: ../flask_admin/contrib/sqla/view.py:1149 +#: ../flask_admin/contrib/fileadmin/__init__.py:1202 +#: ../flask_admin/contrib/peewee/view.py:510 +#: ../flask_admin/contrib/pymongo/view.py:385 +#: ../flask_admin/contrib/sqla/view.py:1241 msgid "Delete" msgstr "Выдаліць" -#: ../flask_admin/contrib/fileadmin/__init__.py:1164 +#: ../flask_admin/contrib/fileadmin/__init__.py:1203 msgid "Are you sure you want to delete these files?" msgstr "Вы дакладна хочаце выдаліць гэтыя файлы?" -#: ../flask_admin/contrib/fileadmin/__init__.py:1167 +#: ../flask_admin/contrib/fileadmin/__init__.py:1206 msgid "File deletion is disabled." msgstr "Выдаленне файлаў адключанае." -#: ../flask_admin/contrib/fileadmin/__init__.py:1180 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:22 +#: ../flask_admin/contrib/fileadmin/__init__.py:1219 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:22 msgid "Edit" msgstr "Рэдагаваць" -#: ../flask_admin/contrib/fileadmin/s3.py:153 +#: ../flask_admin/contrib/fileadmin/s3.py:162 msgid "Cannot operate on non empty directories" msgstr "Дзеянне з непустымі тэчкамі немагчымае" #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 -#: ../flask_admin/contrib/sqla/filters.py:41 +#: ../flask_admin/contrib/sqla/filters.py:42 msgid "equals" msgstr "роўны" #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 -#: ../flask_admin/contrib/sqla/filters.py:49 +#: ../flask_admin/contrib/sqla/filters.py:50 msgid "not equal" msgstr "няроўны" #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 -#: ../flask_admin/contrib/sqla/filters.py:58 +#: ../flask_admin/contrib/sqla/filters.py:59 msgid "contains" msgstr "утрымлівае" #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 -#: ../flask_admin/contrib/sqla/filters.py:67 +#: ../flask_admin/contrib/sqla/filters.py:68 msgid "not contains" msgstr "ня ўтрымлівае" #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 -#: ../flask_admin/contrib/sqla/filters.py:75 +#: ../flask_admin/contrib/sqla/filters.py:76 msgid "greater than" msgstr "большы за" #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 -#: ../flask_admin/contrib/sqla/filters.py:83 +#: ../flask_admin/contrib/sqla/filters.py:84 msgid "smaller than" msgstr "меншы за" #: ../flask_admin/contrib/peewee/filters.py:88 -#: ../flask_admin/contrib/sqla/filters.py:94 +#: ../flask_admin/contrib/sqla/filters.py:95 msgid "empty" msgstr "пусты" #: ../flask_admin/contrib/peewee/filters.py:102 -#: ../flask_admin/contrib/sqla/filters.py:108 +#: ../flask_admin/contrib/sqla/filters.py:109 msgid "in list" msgstr "у спісе" #: ../flask_admin/contrib/peewee/filters.py:111 -#: ../flask_admin/contrib/sqla/filters.py:118 +#: ../flask_admin/contrib/sqla/filters.py:119 msgid "not in list" msgstr "ня ў спісе" @@ -282,44 +272,37 @@ msgstr "ня ў спісе" msgid "not between" msgstr "не паміж" -msgid "ObjectId equals" -msgstr "ObjectId роўны" - -#, python-format -msgid "Failed to get model. %(error)s" -msgstr "Памылка атрымання мадэлі. %(error)s" - -#: ../flask_admin/contrib/peewee/view.py:435 -#: ../flask_admin/contrib/pymongo/view.py:316 -#: ../flask_admin/contrib/sqla/view.py:1078 +#: ../flask_admin/contrib/peewee/view.py:458 +#: ../flask_admin/contrib/pymongo/view.py:317 +#: ../flask_admin/contrib/sqla/view.py:1170 #, python-format msgid "Failed to create record. %(error)s" msgstr "Памылка стварэння запісу. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:454 -#: ../flask_admin/contrib/pymongo/view.py:341 -#: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 -#: ../flask_admin/model/base.py:2313 ../flask_admin/model/base.py:2315 +#: ../flask_admin/contrib/peewee/view.py:477 +#: ../flask_admin/contrib/pymongo/view.py:342 +#: ../flask_admin/contrib/sqla/view.py:1196 ../flask_admin/model/base.py:2463 +#: ../flask_admin/model/base.py:2471 ../flask_admin/model/base.py:2473 #, python-format msgid "Failed to update record. %(error)s" msgstr "Памылка аднаўлення запісу. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:469 -#: ../flask_admin/contrib/pymongo/view.py:366 -#: ../flask_admin/contrib/sqla/view.py:1129 +#: ../flask_admin/contrib/peewee/view.py:492 +#: ../flask_admin/contrib/pymongo/view.py:367 +#: ../flask_admin/contrib/sqla/view.py:1221 #, python-format msgid "Failed to delete record. %(error)s" msgstr "Памылка выдалення запісу. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:488 -#: ../flask_admin/contrib/pymongo/view.py:385 -#: ../flask_admin/contrib/sqla/view.py:1150 +#: ../flask_admin/contrib/peewee/view.py:511 +#: ../flask_admin/contrib/pymongo/view.py:386 +#: ../flask_admin/contrib/sqla/view.py:1242 msgid "Are you sure you want to delete selected records?" msgstr "Вы дакладна хочаце выдаліць пазначаныя запісы?" -#: ../flask_admin/contrib/peewee/view.py:505 -#: ../flask_admin/contrib/pymongo/view.py:395 -#: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 +#: ../flask_admin/contrib/peewee/view.py:528 +#: ../flask_admin/contrib/pymongo/view.py:396 +#: ../flask_admin/contrib/sqla/view.py:1258 ../flask_admin/model/base.py:2272 #, python-format msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." @@ -327,33 +310,33 @@ msgstr[0] "Запіс быў паспяхова выдалены." msgstr[1] "%(count)s запісы былі паспяхова выдаленыя." msgstr[2] "%(count)s запісаў было паспяхова выдалена." -#: ../flask_admin/contrib/peewee/view.py:511 -#: ../flask_admin/contrib/pymongo/view.py:400 -#: ../flask_admin/contrib/sqla/view.py:1174 +#: ../flask_admin/contrib/peewee/view.py:534 +#: ../flask_admin/contrib/pymongo/view.py:401 +#: ../flask_admin/contrib/sqla/view.py:1266 #, python-format msgid "Failed to delete records. %(error)s" msgstr "Памылка выдалення запісаў. %(error)s" -#: ../flask_admin/contrib/sqla/fields.py:126 -#: ../flask_admin/contrib/sqla/fields.py:176 -#: ../flask_admin/contrib/sqla/fields.py:181 ../flask_admin/model/fields.py:173 -#: ../flask_admin/model/fields.py:222 +#: ../flask_admin/contrib/sqla/fields.py:117 +#: ../flask_admin/contrib/sqla/fields.py:167 +#: ../flask_admin/contrib/sqla/fields.py:172 ../flask_admin/model/fields.py:174 +#: ../flask_admin/model/fields.py:223 msgid "Not a valid choice" msgstr "Няслушны выбар" -#: ../flask_admin/contrib/sqla/fields.py:186 +#: ../flask_admin/contrib/sqla/fields.py:201 msgid "Key" msgstr "Ключ" -#: ../flask_admin/contrib/sqla/fields.py:187 +#: ../flask_admin/contrib/sqla/fields.py:202 msgid "Value" msgstr "Значэнне" -#: ../flask_admin/contrib/sqla/validators.py:42 +#: ../flask_admin/contrib/sqla/validators.py:28 msgid "Already exists." msgstr "Ужо йснуе." -#: ../flask_admin/contrib/sqla/validators.py:60 +#: ../flask_admin/contrib/sqla/validators.py:59 #, python-format msgid "At least %(num)d item is required" msgid_plural "At least %(num)d items are required" @@ -361,7 +344,15 @@ msgstr[0] "Патрабуецца як найменш %(num)d аб'ект" msgstr[1] "Патрабуецца як найменш %(num)d аб'екты" msgstr[2] "Патрабуецца як найменш %(num)d аб'ектаў" -#: ../flask_admin/contrib/sqla/view.py:1057 +#: ../flask_admin/contrib/sqla/validators.py:75 +msgid "Not a valid ISO currency code (e.g. USD, EUR, CNY)." +msgstr "" + +#: ../flask_admin/contrib/sqla/validators.py:83 +msgid "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." +msgstr "" + +#: ../flask_admin/contrib/sqla/view.py:1134 #, python-format msgid "Integrity error. %(message)s" msgstr "Памылка цэласнасці. %(message)s" @@ -370,274 +361,242 @@ msgstr "Памылка цэласнасці. %(message)s" msgid "Invalid time format" msgstr "Хібны фармат часу" -#: ../flask_admin/form/fields.py:144 +#: ../flask_admin/form/fields.py:147 msgid "Invalid Choice: could not coerce" msgstr "Хібны выбар: немагчыма пераўтварыць тып" -#: ../flask_admin/form/fields.py:208 +#: ../flask_admin/form/fields.py:221 msgid "Invalid JSON" msgstr "Хібны JSON" -#: ../flask_admin/form/upload.py:207 +#: ../flask_admin/form/upload.py:216 msgid "Invalid file extension" msgstr "Хібнае пашырэнне файла" -#: ../flask_admin/form/upload.py:214 ../flask_admin/form/upload.py:281 +#: ../flask_admin/form/upload.py:223 ../flask_admin/form/upload.py:293 #, python-format msgid "File \"%s\" already exists." msgstr "Файл \"%s\" ужо йснуе." -#: ../flask_admin/model/base.py:1649 +#: ../flask_admin/form/validators.py:16 +msgid "This field requires at least one item." +msgstr "" + +#: ../flask_admin/model/base.py:1737 msgid "There are no items in the table." msgstr "Няма элементаў ў табліцы." -#: ../flask_admin/model/base.py:1673 +#: ../flask_admin/model/base.py:1746 #, python-format msgid "Invalid Filter Value: %(value)s" msgstr "Хібнае значэнне цэдалю: %(value)s" -#: ../flask_admin/model/base.py:1984 +#: ../flask_admin/model/base.py:2136 msgid "Record was successfully created." msgstr "Запіс быў паспяхова створаны." -#: ../flask_admin/model/base.py:2028 ../flask_admin/model/base.py:2080 -#: ../flask_admin/model/base.py:2113 ../flask_admin/model/base.py:2297 +#: ../flask_admin/model/base.py:2180 ../flask_admin/model/base.py:2232 +#: ../flask_admin/model/base.py:2265 ../flask_admin/model/base.py:2455 msgid "Record does not exist." msgstr "Запіс не йснуе." -#: ../flask_admin/model/base.py:2037 ../flask_admin/model/base.py:2301 +#: ../flask_admin/model/base.py:2189 ../flask_admin/model/base.py:2459 msgid "Record was successfully saved." msgstr "Запіс быў паспяхова захаваны." -#: ../flask_admin/model/base.py:2222 -msgid "Tablib dependency not installed." -msgstr "Неабходны пакунак tablib не ўсталяваны." - -#: ../flask_admin/model/base.py:2249 +#: ../flask_admin/model/base.py:2407 #, python-format msgid "Export type \"%(type)s not supported." msgstr "Тып экспарта \"%(type)s\" не падтрымліваецца." -#: ../flask_admin/model/filters.py:103 ../flask_admin/model/widgets.py:111 +#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:119 msgid "Yes" msgstr "Так" -#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:110 +#: ../flask_admin/model/filters.py:105 ../flask_admin/model/widgets.py:118 msgid "No" msgstr "Не" -#: ../flask_admin/model/filters.py:172 ../flask_admin/model/filters.py:212 -#: ../flask_admin/model/filters.py:257 +#: ../flask_admin/model/filters.py:173 ../flask_admin/model/filters.py:213 +#: ../flask_admin/model/filters.py:258 msgid "between" msgstr "паміж" -#: ../flask_admin/model/template.py:81 ../flask_admin/model/template.py:88 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:37 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:8 +#: ../flask_admin/model/template.py:83 ../flask_admin/model/template.py:90 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:7 msgid "View Record" msgstr "Глядзець запіс" -#: ../flask_admin/model/template.py:95 ../flask_admin/model/template.py:102 -#: ../flask_admin/model/template.py:109 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/edit.html:11 +#: ../flask_admin/model/template.py:97 ../flask_admin/model/template.py:104 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/edit.html:10 msgid "Edit Record" msgstr "Рэдагаваць запіс" -#: ../flask_admin/model/widgets.py:61 +#: ../flask_admin/model/template.py:111 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Delete Record" +msgstr "" + +#: ../flask_admin/model/widgets.py:62 msgid "Please select model" msgstr "Выберыце, калі ласка, мадэль" -#: ../flask_admin/templates/bootstrap2/admin/actions.html:4 -#: ../flask_admin/templates/bootstrap3/admin/actions.html:4 +#: ../flask_admin/templates/bootstrap4/admin/actions.html:5 msgid "With selected" msgstr "З выбранымі" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:200 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:190 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:216 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:227 msgid "Save" msgstr "Захаваць" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:205 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:195 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:221 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:232 msgid "Cancel" msgstr "Скасаваць" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:256 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:247 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:290 msgid "Save and Add Another" msgstr "Захаваць і дадаць іншы" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:259 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:250 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:293 msgid "Save and Continue Editing" msgstr "Захаваць і працягнуць рэдагаванне" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:9 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:9 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:10 msgid "Root" msgstr "Корань" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:90 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:99 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:89 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:98 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:42 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:51 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:89 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:98 #, python-format msgid "Sort by %(name)s" msgstr "Сартаваць па %(name)s" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:77 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:79 msgid "Rename File" msgstr "Перайменаваць файл" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:88 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:88 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:90 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\' recursively?" msgstr "Вы дакладна жадаеце выдаліць \\'%(name)s\\' рэкурсіўна?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:97 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:97 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:99 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\'?" msgstr "Вы дакладна жадаеце выдаліць \\'%(name)s\\'?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:125 -msgid "Size" -msgstr "Памер" - -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:185 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:187 msgid "Please select at least one file." msgstr "Выберыце, калі ласка, як найменш адзін файл." -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:8 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:17 msgid "List" msgstr "Спіс" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:12 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:18 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 msgid "Create" msgstr "Стварыць" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:26 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:26 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:21 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:26 msgid "Details" msgstr "Падрабязнасці" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:29 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:28 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:15 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:28 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:15 msgid "Filter" msgstr "Цэдаль" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:13 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:14 msgid "Delete?" msgstr "Выдаліць?" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:33 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:16 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:35 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Are you sure you want to delete this record?" +msgstr "Вы дакладна жадаеце выдаліць гэты запіс?" + +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:33 msgid "New" msgstr "Новы" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:43 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:43 msgid "Add" msgstr "Дадаць" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:3 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:3 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:2 msgid "Add Filter" msgstr "Дадаць цэдаль" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:30 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:19 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:26 msgid "Export" msgstr "Экспарт" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:38 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:38 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:49 msgid "Apply" msgstr "Ужыць" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:40 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:51 msgid "Reset Filters" msgstr "Скасаваць цэдалі" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:66 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:64 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:80 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:93 +#, python-format +msgid "%(placeholder)s" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:88 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:94 msgid "Search" msgstr "Пошук" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:74 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:77 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:78 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:79 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:72 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:75 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:76 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:77 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:102 msgid "items" msgstr "элементы" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/create.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/create.html:10 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/create.html:10 msgid "Create New Record" msgstr "Стварыць новы запіс" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:76 msgid "Select all records" msgstr "Выбраць усе запісы" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:120 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:119 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:119 msgid "Select record" msgstr "Выбраць запіс" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:186 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:195 msgid "Please select at least one record." msgstr "Выберыце, калі ласка, як найменш адзін запіс." -#: ../flask_admin/templates/bootstrap2/admin/model/row_actions.html:34 -#: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 -msgid "Are you sure you want to delete this record?" -msgstr "Вы дакладна жадаеце выдаліць гэты запіс?" +#~ msgid "ObjectId equals" +#~ msgstr "ObjectId роўны" + +#~ msgid "Failed to get model. %(error)s" +#~ msgstr "Памылка атрымання мадэлі. %(error)s" + +#~ msgid "Tablib dependency not installed." +#~ msgstr "Неабходны пакунак tablib не ўсталяваны." + +#~ msgid "Size" +#~ msgstr "Памер" + diff --git a/flask_admin/translations/ca_ES/LC_MESSAGES/admin.mo b/flask_admin/translations/ca_ES/LC_MESSAGES/admin.mo index d26d62f35d5df2e7b770f1f037300cc5353324b7..1b38561690b06ea3007857d1123968766ad2b4c3 100644 GIT binary patch delta 1819 zcmYMzZEVw36vy#Xm}6b7>&9m7R$bBP9y{AQhGQx|1QtyhD27CWm~L%i-Rh<;!V8y9 zU#Kz8p%>6(z#AYKH6d7IFp2>+#E6P6@c}i8!4Z`ZjBkKsI={c{pV+kh+<W@(J?B16 zEq|r6_;XF!cH`C0C(5UNp?d$nZYeiY=vJ)6JFp7Vco}ZQZtTZ6?!+X1hV3}(*|NxN zCH?hC$aZ3#S<&{;Xd>|5e87H1-gbd6JvfIUEUz%D#xN@0f_g523}iQB2linjj(P6F zGWv%xfFGg8`x3+Cw_j*1A#ee&$B5tTT3mtZ_oD`U-iyDE*U>+Y4R{`}!2rvn|Fxo? zUyUtTzzDvI^>`4kz|ST5?ME6K=ugzl$|+M72T@y6gE71jHSk)z97pg<9K#yi=Ee8p zV*2l(#`)Cq3tT{d8uk1)SgfV-yBGKeWAsCeu9+lJ3GPS52XQsNh??;asIzbh`K$SZ z^IK7eyseEd70~T@8)|}gp$fPs$okW^2l>*T3}PIg!Zv&ZwKd;j3@>6kMp!>3T;+Km z@{?^s9o8Y#*%(1~)wZAx>(i(Lo<nN3m$d$RaEgEi+~fUl0NGaiz>6RA;?p?c<IJE2 zDp0i&k9t0X8gDD=R=kEPcp8`D9CqMRPO{?JA`M-Omr(_LhdLyuQHSSW)D|?eUMgq> zY9@E1mT(PU+QNR+OgE#R8%K@v0^WrCP>1;>CU6clfntJ_qCH%O#H<&?xB<2FkE6C? z8#dz+RAGOh&d6f2E8c}S;6tcH&!TS0Td4nkg*v>mn8GM`mRnJ@H8k{K9$6imKoznZ zoA4m2(vzr}pF$0E29>a!<<a$uBfDa~cr~s^t-vU1ize|Z+=UwNU0kU9f0%}@#ZhEZ z_6bs?eUBRO9BRN>jA1>?LvHIq&GcS;05_uw{u<deyM&rhfUK<;MTW3m)I>I68Tl<s zLlxyw*J=b+z$B`my{IKT<oO$F#X?M5&v&A>WF0E;7^?6|Q~|qD6Fh)Q{I=IWgsXHv z-}invf;vRUP}k#x*Z;};ea4HQMV*<8sKZuKUus=6?sL->+uetLzuV$J>T;E*O4+~( zUt>D|#HjUU3OVZ=<~<tA#GcFy<+HJYhlle6Irm7g;LZmBa+OuhZduiYo2lC1R)*HP zsnCw<RA)TV9Zz+}QmN&M?zTkI-C6ynug9IMeyl9n)sZM=YIgWsW9?pdy!O01Q}?$^ zhyA5MxM{(XwDM+1SWw<|xuM*^K>p)W?9t)*^cgo8$(Bw>I(+W-h8{QGu+=4_8=Z@$ I-AuIWKlq2(bN~PV delta 2515 zcmb8veN5F=9LMnkC`!nq#Dik|5)q$39!wIgNr_r1vB<Ve+b-TCUcB53+>3#&LH$u} znmT@wE>{cZmagVj*yePZMSoP*Ojpx#)n-|3Ikk;y{?Y9Hfm8iaTgJHeb<X*n-#Op& zJ?Gs11$%3Izs?>vVEF6cQ^;q3l4^hd&6{A1n#%Adti%jlg5z-&F2V<}47Xz?9>sZh z$yqSbn0o5VF<JfaW@CDdPob2CgU-`q56m^>U6YYA_Cg+JQojYWaK3A=L-kvU3}_l% zeIu4rk6;nL<a`^)QU3~4ncrNXpn)%A9$v>=F^}ac(nUA}mtqN8oQ~UE{Saz`&s_Tm z7E{klC0JaHQ*o`UZ$Z63fJMx2j!>A5=db`1CmAyZ3o#vQoXb%Itw9CWfm%s7YU`dr z4_`zDbPV}7=lROTA2A!RyY}of@;{k|A`05$YSe%=&LytB4ijmwM-8wNbp{^69Ng^M z`_QBAqgHqrHU3#t06)3siL7ch_2P8$uM~CApaFLwNieUV_VRV)9rGS4uuq+zqbB|m zm9Z<RjHED#0?b6cSB!eE61Bw(u?$z>T<ppq|Jv(88ay0!euwj@kLN7~RE0Y2ce?sA z)C7&F%sq-agw4pgHLa-rF;rkZNY+gss^4?&`9LoPO|aK>cojK+=CEr&?%F@XZ3(0j zHQ)x8sQ_A?-Kc?|MqS4ps0Dn0x8W~Xj&s=$wXa28$KGcsD1c8;hwck3#Szq@EF{m` zyXC0B)}vO|f{ba}kbl$1msUQ2>i05gyaTAfhOrt?VhLWy3f=z_Hd-rs2+6uxkD~*l zu45l+i}s-U9mN^=E@}_I$61(7lnQt;>hM`q`?EL`-*C^*p#n%`@M7KnSrjzTD%7>< z#wy%{I$S4F_xU1{eUp+u7T^?Arpi!(twCjG9cr9r)WlDr#yN<bQ!|Xy@C;62esh(A z_A-@T6ior@P*tG@Ug+v~IO}lqIwHGdR-!Vu4#}zsqb7P1HPJ5g@DQs1DI{s;TkKUT zu2Faxi`X!&s0Z~EJBV8G5YEB(k?ff(sFf!3YozNn2{myRGL)H#3VbQ*darQLH=_DK zjtZo2D*0FHpQk~dK&AQ;dYH-2ng*yu?QJ6}u&t;7wxd?sj|y}Um6<o)^S5067;56< zu6-DFSU)Vhee7PIaSy(64=%d;Wz@YLL8Ul>eCl*(O&h9B?n{^%h(w}sFWPQ9199s` zBVL4$ZEKJBc)?Jo-4Ks<hHT6~GGTYJjR!*En7?}B$8+kt+oPRvGlm!MX}8|=l38+g zj1l5qtgBr;Y|zh3xscLg<6c`dXv6+HDY-+}Qcfjg-Di8us!%L$8Uk(BG}y=d)2VqG z_cymP<vl^qc60@p>xa~~$&Fzfh*>XY!#r}sG)?-sEU?9Tfk@D+3-V#kO}5iC{n>bT zG!hR*x~x|p3{hzD?@F7K6xwS2*0h~Pf#z_i*$dis8wuLThMv)gLy=fK5Dwd5x&K?* zx}-q3%Wq6?8Xt<=wwS*!eRo!6O<6@%Sw)RkQBkY%LjT^3*Zf~II+Ci(7YuFAd?8`R z4W;t;tOFC4xm@ngzWRT1**|%ts3GdbN;d_(_Gn8N8`m7Skx-{+!(*8#_Xl%whIZzZ zCT5RjSSb#ehG^SpicjR`|0Bg`bA$hu;-T8S`3dEJ<@3gpyeWT4Qd4NFzc0Vvd+@)q VTwSn!99g#hj)Df4=JN$Le*nzoi*5h_ diff --git a/flask_admin/translations/ca_ES/LC_MESSAGES/admin.po b/flask_admin/translations/ca_ES/LC_MESSAGES/admin.po index 7de4fcf09..e735ee24b 100644 --- a/flask_admin/translations/ca_ES/LC_MESSAGES/admin.po +++ b/flask_admin/translations/ca_ES/LC_MESSAGES/admin.po @@ -1,275 +1,264 @@ + msgid "" msgstr "" -"Project-Id-Version: flask-admin\n" +"Project-Id-Version: flask-admin\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-02-07 00:17-0600\n" +"POT-Creation-Date: 2024-09-24 22:09+0100\n" "PO-Revision-Date: 2017-02-07 01:19-0500\n" "Last-Translator: mrjoes <serge.koval@gmail.com>\n" +"Language: ca_ES\n" "Language-Team: Catalan\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.1.1\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: flask-admin\n" -"X-Crowdin-Language: ca\n" -"X-Crowdin-File: admin.pot\n" -"Language: ca_ES\n" +"Generated-By: Babel 2.16.0\n" -#: ../flask_admin/base.py:440 +#: ../flask_admin/base.py:458 msgid "Home" msgstr "Inici" -#: ../flask_admin/contrib/rediscli.py:127 +#: ../flask_admin/contrib/rediscli.py:113 msgid "Cli: Invalid command." msgstr "Cli: comanda no vàlid" -#: ../flask_admin/contrib/fileadmin/__init__.py:352 +#: ../flask_admin/contrib/fileadmin/__init__.py:376 msgid "File to upload" msgstr "Arxiu per carregar" -#: ../flask_admin/contrib/fileadmin/__init__.py:360 +#: ../flask_admin/contrib/fileadmin/__init__.py:384 msgid "File required." msgstr "Requereix Arxiu." -#: ../flask_admin/contrib/fileadmin/__init__.py:365 +#: ../flask_admin/contrib/fileadmin/__init__.py:389 msgid "Invalid file type." msgstr "Tipus de fitxer no vàlid." -#: ../flask_admin/contrib/fileadmin/__init__.py:376 +#: ../flask_admin/contrib/fileadmin/__init__.py:400 msgid "Content" msgstr "Contingut" -#: ../flask_admin/contrib/fileadmin/__init__.py:390 +#: ../flask_admin/contrib/fileadmin/__init__.py:414 msgid "Invalid name" msgstr "Nom no vàlid" -#: ../flask_admin/contrib/fileadmin/__init__.py:398 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:106 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:112 -#: ../flask_admin/tests/sqla/test_translation.py:17 +#: ../flask_admin/contrib/fileadmin/__init__.py:422 +#: ../flask_admin/tests/sqla/test_translation.py:21 msgid "Name" msgstr "Nom" -#: ../flask_admin/contrib/fileadmin/__init__.py:757 +#: ../flask_admin/contrib/fileadmin/__init__.py:784 #, python-format msgid "File \"%(name)s\" already exists." msgstr "L'Arxiu \"%(name)s\" ja existeix." -#: ../flask_admin/contrib/fileadmin/__init__.py:802 -#: ../flask_admin/contrib/fileadmin/__init__.py:885 -#: ../flask_admin/contrib/fileadmin/__init__.py:947 -#: ../flask_admin/contrib/fileadmin/__init__.py:1000 -#: ../flask_admin/contrib/fileadmin/__init__.py:1047 -#: ../flask_admin/contrib/fileadmin/__init__.py:1099 -#: ../flask_admin/model/base.py:2168 +#: ../flask_admin/contrib/fileadmin/__init__.py:829 +#: ../flask_admin/contrib/fileadmin/__init__.py:926 +#: ../flask_admin/contrib/fileadmin/__init__.py:988 +#: ../flask_admin/contrib/fileadmin/__init__.py:1041 +#: ../flask_admin/contrib/fileadmin/__init__.py:1088 +#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/model/base.py:2324 msgid "Permission denied." msgstr "Permis denegat" -#: ../flask_admin/contrib/fileadmin/__init__.py:881 +#: ../flask_admin/contrib/fileadmin/__init__.py:922 msgid "File uploading is disabled." msgstr "La pujada de fitxers està desactivada." -#: ../flask_admin/contrib/fileadmin/__init__.py:892 +#: ../flask_admin/contrib/fileadmin/__init__.py:933 #, python-format msgid "Successfully saved file: %(name)s" msgstr "Fitxer desat correctament: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:896 +#: ../flask_admin/contrib/fileadmin/__init__.py:937 #, python-format msgid "Failed to save file: %(error)s" msgstr "Error en desar el fitxer: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:904 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:150 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:150 +#: ../flask_admin/contrib/fileadmin/__init__.py:945 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:150 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:152 msgid "Upload File" msgstr "Carrega un fitxer" -#: ../flask_admin/contrib/fileadmin/__init__.py:943 +#: ../flask_admin/contrib/fileadmin/__init__.py:984 msgid "Directory creation is disabled." msgstr "Creació directory està desactivada." -#: ../flask_admin/contrib/fileadmin/__init__.py:956 +#: ../flask_admin/contrib/fileadmin/__init__.py:997 #, python-format msgid "Successfully created directory: %(directory)s" msgstr "Directori reeixidament creat: %(directory)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:960 +#: ../flask_admin/contrib/fileadmin/__init__.py:1001 #, python-format msgid "Failed to create directory: %(error)s" msgstr "No s'ha pogut crear el directori: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:970 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:161 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:161 +#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:161 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:163 msgid "Create Directory" msgstr "Crear un directori" -#: ../flask_admin/contrib/fileadmin/__init__.py:996 +#: ../flask_admin/contrib/fileadmin/__init__.py:1037 msgid "Deletion is disabled." msgstr "Eliminar està desactivat." -#: ../flask_admin/contrib/fileadmin/__init__.py:1005 +#: ../flask_admin/contrib/fileadmin/__init__.py:1046 msgid "Directory deletion is disabled." msgstr "La opció eliminar directori està deshabilitada" -#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/contrib/fileadmin/__init__.py:1052 #, python-format msgid "Directory \"%(path)s\" was successfully deleted." msgstr "El directori \"%(path)s\" s'ha eliminat correctament." -#: ../flask_admin/contrib/fileadmin/__init__.py:1013 +#: ../flask_admin/contrib/fileadmin/__init__.py:1054 #, python-format msgid "Failed to delete directory: %(error)s" msgstr "Error en esborrar el directori: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1019 -#: ../flask_admin/contrib/fileadmin/__init__.py:1176 +#: ../flask_admin/contrib/fileadmin/__init__.py:1060 +#: ../flask_admin/contrib/fileadmin/__init__.py:1215 #, python-format msgid "File \"%(name)s\" was successfully deleted." msgstr "L'arxiu \"%(name)s\" ha estat eliminat correctament " -#: ../flask_admin/contrib/fileadmin/__init__.py:1021 -#: ../flask_admin/contrib/fileadmin/__init__.py:1178 +#: ../flask_admin/contrib/fileadmin/__init__.py:1062 +#: ../flask_admin/contrib/fileadmin/__init__.py:1217 #, python-format msgid "Failed to delete file: %(name)s" msgstr "Error en eliminar fitxer: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1043 +#: ../flask_admin/contrib/fileadmin/__init__.py:1084 msgid "Renaming is disabled." msgstr "La opció canvi de nom està deshabilitada" -#: ../flask_admin/contrib/fileadmin/__init__.py:1051 +#: ../flask_admin/contrib/fileadmin/__init__.py:1092 msgid "Path does not exist." msgstr "La ruta no extisteix" -#: ../flask_admin/contrib/fileadmin/__init__.py:1061 +#: ../flask_admin/contrib/fileadmin/__init__.py:1102 #, python-format msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\"" msgstr "Èxit en reanomenar \"%(src)s\" per \"%(dst)s\"" -#: ../flask_admin/contrib/fileadmin/__init__.py:1064 +#: ../flask_admin/contrib/fileadmin/__init__.py:1105 #, python-format msgid "Failed to rename: %(error)s" msgstr "Error en canviar el nom de: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1078 +#: ../flask_admin/contrib/fileadmin/__init__.py:1119 #, python-format msgid "Rename %(name)s" msgstr "Rebategi %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1115 +#: ../flask_admin/contrib/fileadmin/__init__.py:1155 #, python-format msgid "Error saving changes to %(name)s." msgstr "Error en desar canvis a %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1119 +#: ../flask_admin/contrib/fileadmin/__init__.py:1159 #, python-format msgid "Changes to %(name)s saved successfully." msgstr "Canvis a %(name)s guardat correctament \"." -#: ../flask_admin/contrib/fileadmin/__init__.py:1128 +#: ../flask_admin/contrib/fileadmin/__init__.py:1167 #, python-format msgid "Error reading %(name)s." msgstr "Error llegint %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1131 -#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/contrib/fileadmin/__init__.py:1170 +#: ../flask_admin/contrib/fileadmin/__init__.py:1179 #, python-format msgid "Unexpected error while reading from %(name)s" msgstr "Error inesperat en llegir des de %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1137 +#: ../flask_admin/contrib/fileadmin/__init__.py:1176 #, python-format msgid "Cannot edit %(name)s." msgstr "No es pot editar %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1155 +#: ../flask_admin/contrib/fileadmin/__init__.py:1194 #, python-format msgid "Editing %(path)s" msgstr "%(path)s d'edició" -#: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/peewee/view.py:487 -#: ../flask_admin/contrib/pymongo/view.py:384 -#: ../flask_admin/contrib/sqla/view.py:1149 +#: ../flask_admin/contrib/fileadmin/__init__.py:1202 +#: ../flask_admin/contrib/peewee/view.py:510 +#: ../flask_admin/contrib/pymongo/view.py:385 +#: ../flask_admin/contrib/sqla/view.py:1241 msgid "Delete" msgstr "Eliminar" -#: ../flask_admin/contrib/fileadmin/__init__.py:1164 +#: ../flask_admin/contrib/fileadmin/__init__.py:1203 msgid "Are you sure you want to delete these files?" msgstr "Esteu segur que voleu eliminar aquests arxius?" -#: ../flask_admin/contrib/fileadmin/__init__.py:1167 +#: ../flask_admin/contrib/fileadmin/__init__.py:1206 msgid "File deletion is disabled." msgstr "Eliminació de fitxer inhabilitada." -#: ../flask_admin/contrib/fileadmin/__init__.py:1180 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:22 +#: ../flask_admin/contrib/fileadmin/__init__.py:1219 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:22 msgid "Edit" msgstr "Editar" -#: ../flask_admin/contrib/fileadmin/s3.py:153 +#: ../flask_admin/contrib/fileadmin/s3.py:162 msgid "Cannot operate on non empty directories" msgstr "" #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 -#: ../flask_admin/contrib/sqla/filters.py:41 +#: ../flask_admin/contrib/sqla/filters.py:42 msgid "equals" msgstr "igual" #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 -#: ../flask_admin/contrib/sqla/filters.py:49 +#: ../flask_admin/contrib/sqla/filters.py:50 msgid "not equal" msgstr "no és igual" #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 -#: ../flask_admin/contrib/sqla/filters.py:58 +#: ../flask_admin/contrib/sqla/filters.py:59 msgid "contains" msgstr "te" #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 -#: ../flask_admin/contrib/sqla/filters.py:67 +#: ../flask_admin/contrib/sqla/filters.py:68 msgid "not contains" msgstr "no te" #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 -#: ../flask_admin/contrib/sqla/filters.py:75 +#: ../flask_admin/contrib/sqla/filters.py:76 msgid "greater than" msgstr "més que" #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 -#: ../flask_admin/contrib/sqla/filters.py:83 +#: ../flask_admin/contrib/sqla/filters.py:84 msgid "smaller than" msgstr "menor que" #: ../flask_admin/contrib/peewee/filters.py:88 -#: ../flask_admin/contrib/sqla/filters.py:94 +#: ../flask_admin/contrib/sqla/filters.py:95 msgid "empty" msgstr "buit" #: ../flask_admin/contrib/peewee/filters.py:102 -#: ../flask_admin/contrib/sqla/filters.py:108 +#: ../flask_admin/contrib/sqla/filters.py:109 msgid "in list" msgstr "en la llista" #: ../flask_admin/contrib/peewee/filters.py:111 -#: ../flask_admin/contrib/sqla/filters.py:118 +#: ../flask_admin/contrib/sqla/filters.py:119 msgid "not in list" msgstr "no en la llista" @@ -282,84 +271,85 @@ msgstr "no en la llista" msgid "not between" msgstr "no entre" -msgid "ObjectId equals" -msgstr "" - -#, python-format -msgid "Failed to get model. %(error)s" -msgstr "No s'ha pogut obtenir el model. %(error)s" - -#: ../flask_admin/contrib/peewee/view.py:435 -#: ../flask_admin/contrib/pymongo/view.py:316 -#: ../flask_admin/contrib/sqla/view.py:1078 +#: ../flask_admin/contrib/peewee/view.py:458 +#: ../flask_admin/contrib/pymongo/view.py:317 +#: ../flask_admin/contrib/sqla/view.py:1170 #, python-format msgid "Failed to create record. %(error)s" msgstr "Error en eliminar el registre. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:454 -#: ../flask_admin/contrib/pymongo/view.py:341 -#: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 -#: ../flask_admin/model/base.py:2313 ../flask_admin/model/base.py:2315 +#: ../flask_admin/contrib/peewee/view.py:477 +#: ../flask_admin/contrib/pymongo/view.py:342 +#: ../flask_admin/contrib/sqla/view.py:1196 ../flask_admin/model/base.py:2463 +#: ../flask_admin/model/base.py:2471 ../flask_admin/model/base.py:2473 #, python-format msgid "Failed to update record. %(error)s" msgstr "Error en actualitzar el registre. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:469 -#: ../flask_admin/contrib/pymongo/view.py:366 -#: ../flask_admin/contrib/sqla/view.py:1129 +#: ../flask_admin/contrib/peewee/view.py:492 +#: ../flask_admin/contrib/pymongo/view.py:367 +#: ../flask_admin/contrib/sqla/view.py:1221 #, python-format msgid "Failed to delete record. %(error)s" msgstr "Error en eliminar el registre. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:488 -#: ../flask_admin/contrib/pymongo/view.py:385 -#: ../flask_admin/contrib/sqla/view.py:1150 +#: ../flask_admin/contrib/peewee/view.py:511 +#: ../flask_admin/contrib/pymongo/view.py:386 +#: ../flask_admin/contrib/sqla/view.py:1242 msgid "Are you sure you want to delete selected records?" msgstr "¿Segur que vols esborrar els registres seleccionats?" -#: ../flask_admin/contrib/peewee/view.py:505 -#: ../flask_admin/contrib/pymongo/view.py:395 -#: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 +#: ../flask_admin/contrib/peewee/view.py:528 +#: ../flask_admin/contrib/pymongo/view.py:396 +#: ../flask_admin/contrib/sqla/view.py:1258 ../flask_admin/model/base.py:2272 #, python-format msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." msgstr[0] "El registre he sigut eliminat correctament." msgstr[1] "%(count)s registres s'han eliminat amb èxit." -#: ../flask_admin/contrib/peewee/view.py:511 -#: ../flask_admin/contrib/pymongo/view.py:400 -#: ../flask_admin/contrib/sqla/view.py:1174 +#: ../flask_admin/contrib/peewee/view.py:534 +#: ../flask_admin/contrib/pymongo/view.py:401 +#: ../flask_admin/contrib/sqla/view.py:1266 #, python-format msgid "Failed to delete records. %(error)s" msgstr "Error en eliminar registres. %(error)s" -#: ../flask_admin/contrib/sqla/fields.py:126 -#: ../flask_admin/contrib/sqla/fields.py:176 -#: ../flask_admin/contrib/sqla/fields.py:181 ../flask_admin/model/fields.py:173 -#: ../flask_admin/model/fields.py:222 +#: ../flask_admin/contrib/sqla/fields.py:117 +#: ../flask_admin/contrib/sqla/fields.py:167 +#: ../flask_admin/contrib/sqla/fields.py:172 ../flask_admin/model/fields.py:174 +#: ../flask_admin/model/fields.py:223 msgid "Not a valid choice" msgstr "Selecció no valida" -#: ../flask_admin/contrib/sqla/fields.py:186 +#: ../flask_admin/contrib/sqla/fields.py:201 msgid "Key" msgstr "" -#: ../flask_admin/contrib/sqla/fields.py:187 +#: ../flask_admin/contrib/sqla/fields.py:202 msgid "Value" msgstr "" -#: ../flask_admin/contrib/sqla/validators.py:42 +#: ../flask_admin/contrib/sqla/validators.py:28 msgid "Already exists." msgstr "Ja existeixen" -#: ../flask_admin/contrib/sqla/validators.py:60 +#: ../flask_admin/contrib/sqla/validators.py:59 #, python-format msgid "At least %(num)d item is required" msgid_plural "At least %(num)d items are required" msgstr[0] "" msgstr[1] "" -#: ../flask_admin/contrib/sqla/view.py:1057 +#: ../flask_admin/contrib/sqla/validators.py:75 +msgid "Not a valid ISO currency code (e.g. USD, EUR, CNY)." +msgstr "" + +#: ../flask_admin/contrib/sqla/validators.py:83 +msgid "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." +msgstr "" + +#: ../flask_admin/contrib/sqla/view.py:1134 #, python-format msgid "Integrity error. %(message)s" msgstr "Error d'integritat. %(message)s" @@ -368,274 +358,242 @@ msgstr "Error d'integritat. %(message)s" msgid "Invalid time format" msgstr "Format d'hora no vàlida" -#: ../flask_admin/form/fields.py:144 +#: ../flask_admin/form/fields.py:147 msgid "Invalid Choice: could not coerce" msgstr "Opció no vàlida: no es pot realitxar" -#: ../flask_admin/form/fields.py:208 +#: ../flask_admin/form/fields.py:221 msgid "Invalid JSON" msgstr "JSON no vàlid" -#: ../flask_admin/form/upload.py:207 +#: ../flask_admin/form/upload.py:216 msgid "Invalid file extension" msgstr "Extensió de fitxer no vàlid" -#: ../flask_admin/form/upload.py:214 ../flask_admin/form/upload.py:281 +#: ../flask_admin/form/upload.py:223 ../flask_admin/form/upload.py:293 #, python-format msgid "File \"%s\" already exists." msgstr "L'Arxiu \"%s\" ja existeix." -#: ../flask_admin/model/base.py:1649 +#: ../flask_admin/form/validators.py:16 +msgid "This field requires at least one item." +msgstr "" + +#: ../flask_admin/model/base.py:1737 msgid "There are no items in the table." msgstr "No hi ha registres a la taula." -#: ../flask_admin/model/base.py:1673 +#: ../flask_admin/model/base.py:1746 #, python-format msgid "Invalid Filter Value: %(value)s" msgstr "Valor de filtre no vàlid" -#: ../flask_admin/model/base.py:1984 +#: ../flask_admin/model/base.py:2136 msgid "Record was successfully created." msgstr "Registre ha estat creat correctament." -#: ../flask_admin/model/base.py:2028 ../flask_admin/model/base.py:2080 -#: ../flask_admin/model/base.py:2113 ../flask_admin/model/base.py:2297 +#: ../flask_admin/model/base.py:2180 ../flask_admin/model/base.py:2232 +#: ../flask_admin/model/base.py:2265 ../flask_admin/model/base.py:2455 msgid "Record does not exist." msgstr "Registre no existeix." -#: ../flask_admin/model/base.py:2037 ../flask_admin/model/base.py:2301 +#: ../flask_admin/model/base.py:2189 ../flask_admin/model/base.py:2459 msgid "Record was successfully saved." msgstr "El registre ha estat guardat amb èxit " -#: ../flask_admin/model/base.py:2222 -msgid "Tablib dependency not installed." -msgstr "" - -#: ../flask_admin/model/base.py:2249 +#: ../flask_admin/model/base.py:2407 #, python-format msgid "Export type \"%(type)s not supported." msgstr "" -#: ../flask_admin/model/filters.py:103 ../flask_admin/model/widgets.py:111 +#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:119 msgid "Yes" msgstr "Si" -#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:110 +#: ../flask_admin/model/filters.py:105 ../flask_admin/model/widgets.py:118 msgid "No" msgstr "No" -#: ../flask_admin/model/filters.py:172 ../flask_admin/model/filters.py:212 -#: ../flask_admin/model/filters.py:257 +#: ../flask_admin/model/filters.py:173 ../flask_admin/model/filters.py:213 +#: ../flask_admin/model/filters.py:258 msgid "between" msgstr "entre" -#: ../flask_admin/model/template.py:81 ../flask_admin/model/template.py:88 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:37 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:8 +#: ../flask_admin/model/template.py:83 ../flask_admin/model/template.py:90 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:7 msgid "View Record" msgstr "Veure Registre" -#: ../flask_admin/model/template.py:95 ../flask_admin/model/template.py:102 -#: ../flask_admin/model/template.py:109 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/edit.html:11 +#: ../flask_admin/model/template.py:97 ../flask_admin/model/template.py:104 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/edit.html:10 msgid "Edit Record" msgstr "Editar Registre" -#: ../flask_admin/model/widgets.py:61 +#: ../flask_admin/model/template.py:111 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Delete Record" +msgstr "" + +#: ../flask_admin/model/widgets.py:62 msgid "Please select model" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/actions.html:4 -#: ../flask_admin/templates/bootstrap3/admin/actions.html:4 +#: ../flask_admin/templates/bootstrap4/admin/actions.html:5 msgid "With selected" msgstr "Amb la selecció" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:200 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:190 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:216 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:227 msgid "Save" msgstr "Desa" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:205 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:195 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:221 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:232 msgid "Cancel" msgstr "Cancel·lar" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:256 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:247 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:290 msgid "Save and Add Another" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:259 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:250 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:293 msgid "Save and Continue Editing" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:9 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:9 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:10 msgid "Root" msgstr "Arrel" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:90 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:99 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:89 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:98 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:42 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:51 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:89 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:98 #, python-format msgid "Sort by %(name)s" msgstr "Ordena per %(name)s" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:77 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:79 msgid "Rename File" msgstr "Reanomenar arxiu" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:88 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:88 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:90 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\' recursively?" msgstr "Esteu segur que voleu eliminar \\'%(name)s\\' recursivament" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:97 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:97 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:99 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\'?" msgstr "Esteu segur que voleu eliminar \\'%(name)s\\'?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:125 -msgid "Size" -msgstr "" - -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:185 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:187 msgid "Please select at least one file." msgstr "Seleccionar almenys un fitxer" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:8 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:17 msgid "List" msgstr "LLista" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:12 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:18 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 msgid "Create" msgstr "Crear" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:26 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:26 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:21 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:26 msgid "Details" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:29 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:28 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:15 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:28 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:15 msgid "Filter" msgstr "Filtre" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:13 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:14 msgid "Delete?" msgstr "Esborrar?" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:33 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:16 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:35 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Are you sure you want to delete this record?" +msgstr "Esteu segurs que voleu eliminar el registre?" + +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:33 msgid "New" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:43 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:43 msgid "Add" msgstr "Afegir" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:3 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:3 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:2 msgid "Add Filter" msgstr "Afegir filtre" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:30 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:19 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:26 msgid "Export" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:38 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:38 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:49 msgid "Apply" msgstr "Aplicar" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:40 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:51 msgid "Reset Filters" msgstr "restabliment de filtre" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:66 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:64 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:80 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:93 +#, python-format +msgid "%(placeholder)s" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:88 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:94 msgid "Search" msgstr "Cercar" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:74 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:77 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:78 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:79 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:72 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:75 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:76 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:77 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:102 msgid "items" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/create.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/create.html:10 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/create.html:10 msgid "Create New Record" msgstr "Crea Un Nou Registre" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:76 msgid "Select all records" msgstr "Seleccionar tots els registres" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:120 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:119 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:119 msgid "Select record" msgstr "Seleccionar registre" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:186 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:195 msgid "Please select at least one record." msgstr "Seleccionar almenys un registre." -#: ../flask_admin/templates/bootstrap2/admin/model/row_actions.html:34 -#: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 -msgid "Are you sure you want to delete this record?" -msgstr "Esteu segurs que voleu eliminar el registre?" +#~ msgid "ObjectId equals" +#~ msgstr "" + +#~ msgid "Failed to get model. %(error)s" +#~ msgstr "No s'ha pogut obtenir el model. %(error)s" + +#~ msgid "Tablib dependency not installed." +#~ msgstr "" + +#~ msgid "Size" +#~ msgstr "" + diff --git a/flask_admin/translations/cs/LC_MESSAGES/admin.mo b/flask_admin/translations/cs/LC_MESSAGES/admin.mo index 4413d1c10626e779af58f1525966314b3b4c0c23..531d529e00620d868816d03d6cc8b641916e352e 100644 GIT binary patch delta 1815 zcmYM!Yi!e17{~FatZcMh-Bx#@yRZr>?9$maojOq#nZsnlLc|!-ICUEf8>0*bm6$=< z8zoWDc$fs427`_vi3W-<OuPg|qk@u*;0uh3i5M?0&}cSIB>4Tge`3@9Kj)mD|2fY& z=Q(?I>3B=_+lYV6`1JBu&0k}lYX5(3&o@)k9T>zru?Sb<Tzmjqu@~bwj?MTvHsU{? zbp>V})bB@{Y#htXvUZ5VVjA9=ZLsf=ug&mK$E#S3`SZ+5umaUyhw7I=2C`eR3A?Zs zw|l;fe(LXG2tP!P_a#;^zkNsHIvQs128;&G7GfK!-isP=m)Aati>RN*D!hyfFvRxg zy?RvtRal1^jN(45#AA33o{`LNUsKRPzo1r@Pne20j5?AC#_%T8z^kzkH)A<&#|ZBA z+7IKk)K8$s`PB0ZoI`yI)&D$ZODX*1HC(|M^<qZXN}5p<+=pr(!d3VzYQ+~&x$rmg zss+NcM^T1+t$~LEX!Tr%T3|aWfX*=cPuaS8=uCz%jw9HBZ=jCmD~#b^*oaZ~PZO^2 zychY&9z-SUMpSNWMo!hXp^|kJ6~NO-%(h4SuZ{<3(13@$AKpTa)!y~mKk?e9aKcB< zpx%3ms5S8(q{+rn6CT9`p1|wz64qmo4A$*vLFLx^EQLV|yHNwqppxY(>V+u#G#~Fm zt)LqfSRd+)GgyJ6sFm$UjdKw7-XtdRBrd@}Q32KPvifD0Q_vZ9B0*Xjm2^X>?A?WN zJnq#mdIm`xtsv!@_T1??fqMT8YT{|sf@-;|vJ(j;Ymdzq>?LGu`v3{j&Y>pw5w-F{ zGEqiQ0nSGyX$$H)u0<We2<kRHgX(t}wXjpDojs4*smuS#`A<{OwYY*csQqO3Z2>Bf z1m1}4sDL)00(~B1_!^Gl$6ozz_MMn*0M%~?D$o~D0ltk2;1m|<{-5?5&LLmBz(W!L zfsAQ>!fwK9OyWJLfOeo({yOSbe1@7}8uk8M{@W<a%Tc#t5$ZZFMkQ$@u23?yP|()4 zp|ZIH)xHLU*zGxhx+PmsIg>?A@LXlCzF?=%P0br~?*{^ITi~SY4_?fz3!U}Vt{mL5 z)w+5z{nj<icWbOC_IS_6!F92|f#Jcvezzf<aleLtbHSn|?v|q6?ov_Obri352Z~=T zNv7h7)_5`%OD1niv^FG~-SU$4c@MRx-I0>CZ>h_RJmPP@xhau*A~NQ4snSXJL+S7C zXj#Y=mjCR|mWOh670c#?*YrQRsV8HdnU9Wa8g?Vmh3?Jhqq$UNyU$HjCEYhw2i+^x N4?BO&TGw0C_AkwV(DwiU delta 2517 zcmb8vTWnNC9LMqL4XC|rDbS@r>9OSwEiF_kmk^K^k(&)w5|CiF>{u4|(ssAdlGK*S zgHaTcV?$IVLWrbMh^BoY5|z;CgE0YA0#WpVkZ43D64YQ+{Ql^u51NQgcRw?8&dmJh zKQnvqzQYT<zbwq`HT<>mnZW00hH8KR%^Gfunkw)fti}K?!Yo{k^Kl(k;9ji8w{aGJ z>nt8&Og;7GI85*17-PDPPhlzzea`bk56ms3uL)!ibqHbs^@%tVXS?>LsP|SN1DXa` ze*!D1$FUS&alV6@)W5(S<~LU;XyETLh_~@x46<BBIv*$D5}b?{%kWuOKY^OyQ`deI z%c%!*2o@LOc--jfJ5c?5v6T7ENea{P5*A~6t})|q0_J0_b2)0DM^S;bqE^y@+PW_E z@Fi40r;va1IbTKiH5TG+*It-M{zuVJN<n)(7d2q5bCGLbis`i1qXt-kIs=d4Xx#4F zd(flqqgFV88vi0HfNSn~I;&bky*!`%D@Cm|Xu$nQ63nZpy?g`dW6q!gJLkNBn)owR z#;&6>lFc9rumIJs9M!KHwZ-$W0w2Vg*d8GN+UvtKcsS_1inFL^(Mti%L7n!+u3m?l zpaGS+&8S1zgq&Nm4fTE!6<8;db<=}-?>YCpx0`|{c-g&h3^{*hz_q{Y+CRj@X`~W0 zKqt#o0K1XJn|-K>4`CG^!%27vXW(zBYdMYm&>`N45$x`vpaH)@rSb+&#a!~Mjx{(I zA4jdI0~O$t$gAdQ)U7#)TIm34yi=%tgRXuV=TN_j(=f>X5@5GkLO~rYl64b97HPUr zr}}x+?RXtE!3EUHE~EA`jgzJ4vz;4ID}2h?=RAv=_(xZtNYvAH|LZ8|K^(Q>1I{z3 ziN13dvK+0r7Rjbrg_>wHDl>bW&!7U|kGciNQNIW0P+N5qb&WGf_XOSlQVLq}BGeYF z;Y)|A8MWf=&NkQHiMozmSb{yM%pF4gGM+#Mcp9hRC#XPwK`p@J$3@m)w?|<Gh20oI z)vqDhHMxYT7t2s9nTJ}z22@~MQCpWlw$<!J<}iER^Vg8Yn&YSiet?;H5lO1KJf8el zQn*Qj4o5k8Q^f1h!!A_n4xz5&8B_q*Q7Qi&HE<?r(DfRF%3K+0qA93bF%xxYYf$|b zqi#=K$^AnQ*0~3pke_eU<cy)NX9p_9dr%X-P}09(SWnuNP&}SUd5IR=7D`z!5%=PJ zY^){K>4hV0c1tSJ7O_eH<nRN-Y$_CqCjB)dKAKVA(UNFOnIXJXXN&d9CQp;olZ=q^ zlI<;e!-oA}_Lb~roAP3bu#NifWf%3|%08Pma+U2gt0T#jSsRL3v)1nP&*uaK4>xUN z%7?<9ZEX)R*H<~QQ4LWWN?I>zqdaoMH0J(L5!zwBP(17{4fA2nt+vfH{@J)J5l=<p z?bfRgM<_J=59H0ri0rcdw!D3%p{8i0$qU;S8xPy~md-m7N8-s;C>pilO8@7)O&OtR zyWf!Cm=#IcSkga|e_&*FZAI0bimF<#s%nAC^Zb>8W`7{C(GL`~X3VXu>EBb(n>KaX zU1oG_Vc+mNm(tUPH~vpb-yHQ*(OTP*2#4N(F%nIX8gJL&@#OYU%8!kn*#Fk(#pz>| z-$uJD9*UWjvBAE0;!ci#Eh_s*j!S~cf6H<IzF=Ki<zETCyDWb^cJ7@lXA~dt9{H~{ WA1w}LttZdc&m6bGC3@4iC4T@z^o)G~ diff --git a/flask_admin/translations/cs/LC_MESSAGES/admin.po b/flask_admin/translations/cs/LC_MESSAGES/admin.po index 444812275..b5eeace60 100644 --- a/flask_admin/translations/cs/LC_MESSAGES/admin.po +++ b/flask_admin/translations/cs/LC_MESSAGES/admin.po @@ -1,275 +1,264 @@ + msgid "" msgstr "" -"Project-Id-Version: flask-admin\n" +"Project-Id-Version: flask-admin\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-02-07 00:17-0600\n" +"POT-Creation-Date: 2024-09-24 22:09+0100\n" "PO-Revision-Date: 2017-02-07 01:19-0500\n" "Last-Translator: mrjoes <serge.koval@gmail.com>\n" +"Language: cs_CZ\n" "Language-Team: Czech\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.1.1\n" -"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: flask-admin\n" -"X-Crowdin-Language: cs\n" -"X-Crowdin-File: admin.pot\n" -"Language: cs_CZ\n" +"Generated-By: Babel 2.16.0\n" -#: ../flask_admin/base.py:440 +#: ../flask_admin/base.py:458 msgid "Home" msgstr "Domů" -#: ../flask_admin/contrib/rediscli.py:127 +#: ../flask_admin/contrib/rediscli.py:113 msgid "Cli: Invalid command." msgstr "CLI: Neplatný příkaz." -#: ../flask_admin/contrib/fileadmin/__init__.py:352 +#: ../flask_admin/contrib/fileadmin/__init__.py:376 msgid "File to upload" msgstr "Soubor k nahrání" -#: ../flask_admin/contrib/fileadmin/__init__.py:360 +#: ../flask_admin/contrib/fileadmin/__init__.py:384 msgid "File required." msgstr "Soubor vyžadován." -#: ../flask_admin/contrib/fileadmin/__init__.py:365 +#: ../flask_admin/contrib/fileadmin/__init__.py:389 msgid "Invalid file type." msgstr "Nesprávný formát souboru." -#: ../flask_admin/contrib/fileadmin/__init__.py:376 +#: ../flask_admin/contrib/fileadmin/__init__.py:400 msgid "Content" msgstr "Obsah" -#: ../flask_admin/contrib/fileadmin/__init__.py:390 +#: ../flask_admin/contrib/fileadmin/__init__.py:414 msgid "Invalid name" msgstr "Neplatný název" -#: ../flask_admin/contrib/fileadmin/__init__.py:398 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:106 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:112 -#: ../flask_admin/tests/sqla/test_translation.py:17 +#: ../flask_admin/contrib/fileadmin/__init__.py:422 +#: ../flask_admin/tests/sqla/test_translation.py:21 msgid "Name" msgstr "Jméno" -#: ../flask_admin/contrib/fileadmin/__init__.py:757 +#: ../flask_admin/contrib/fileadmin/__init__.py:784 #, python-format msgid "File \"%(name)s\" already exists." msgstr "Soubor s názvem \"%(name)s\" již existuje." -#: ../flask_admin/contrib/fileadmin/__init__.py:802 -#: ../flask_admin/contrib/fileadmin/__init__.py:885 -#: ../flask_admin/contrib/fileadmin/__init__.py:947 -#: ../flask_admin/contrib/fileadmin/__init__.py:1000 -#: ../flask_admin/contrib/fileadmin/__init__.py:1047 -#: ../flask_admin/contrib/fileadmin/__init__.py:1099 -#: ../flask_admin/model/base.py:2168 +#: ../flask_admin/contrib/fileadmin/__init__.py:829 +#: ../flask_admin/contrib/fileadmin/__init__.py:926 +#: ../flask_admin/contrib/fileadmin/__init__.py:988 +#: ../flask_admin/contrib/fileadmin/__init__.py:1041 +#: ../flask_admin/contrib/fileadmin/__init__.py:1088 +#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/model/base.py:2324 msgid "Permission denied." msgstr "Přístup zamezen." -#: ../flask_admin/contrib/fileadmin/__init__.py:881 +#: ../flask_admin/contrib/fileadmin/__init__.py:922 msgid "File uploading is disabled." msgstr "Nahrávání souborů není povoleno." -#: ../flask_admin/contrib/fileadmin/__init__.py:892 +#: ../flask_admin/contrib/fileadmin/__init__.py:933 #, python-format msgid "Successfully saved file: %(name)s" msgstr "Úspěšně uložený soubor: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:896 +#: ../flask_admin/contrib/fileadmin/__init__.py:937 #, python-format msgid "Failed to save file: %(error)s" msgstr "Chyba při ukládání souboru: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:904 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:150 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:150 +#: ../flask_admin/contrib/fileadmin/__init__.py:945 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:150 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:152 msgid "Upload File" msgstr "Nahrát soubor" -#: ../flask_admin/contrib/fileadmin/__init__.py:943 +#: ../flask_admin/contrib/fileadmin/__init__.py:984 msgid "Directory creation is disabled." msgstr "Vytváření adresářů není povoleno." -#: ../flask_admin/contrib/fileadmin/__init__.py:956 +#: ../flask_admin/contrib/fileadmin/__init__.py:997 #, python-format msgid "Successfully created directory: %(directory)s" msgstr "Úspěšně vytvořen adresář: %(directory)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:960 +#: ../flask_admin/contrib/fileadmin/__init__.py:1001 #, python-format msgid "Failed to create directory: %(error)s" msgstr "Chyba při vytváření adresáře: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:970 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:161 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:161 +#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:161 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:163 msgid "Create Directory" msgstr "Vytvořit adresář" -#: ../flask_admin/contrib/fileadmin/__init__.py:996 +#: ../flask_admin/contrib/fileadmin/__init__.py:1037 msgid "Deletion is disabled." msgstr "Mazání není povoleno." -#: ../flask_admin/contrib/fileadmin/__init__.py:1005 +#: ../flask_admin/contrib/fileadmin/__init__.py:1046 msgid "Directory deletion is disabled." msgstr "Mazání adresářů není povoleno." -#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/contrib/fileadmin/__init__.py:1052 #, python-format msgid "Directory \"%(path)s\" was successfully deleted." msgstr "Adresář \"%(path)s\" byla úspěšně odstraněna." -#: ../flask_admin/contrib/fileadmin/__init__.py:1013 +#: ../flask_admin/contrib/fileadmin/__init__.py:1054 #, python-format msgid "Failed to delete directory: %(error)s" msgstr "Chyba při mazání adresáře: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1019 -#: ../flask_admin/contrib/fileadmin/__init__.py:1176 +#: ../flask_admin/contrib/fileadmin/__init__.py:1060 +#: ../flask_admin/contrib/fileadmin/__init__.py:1215 #, python-format msgid "File \"%(name)s\" was successfully deleted." msgstr "Soubor \"%(name)s\" byl úspěšně smazán." -#: ../flask_admin/contrib/fileadmin/__init__.py:1021 -#: ../flask_admin/contrib/fileadmin/__init__.py:1178 +#: ../flask_admin/contrib/fileadmin/__init__.py:1062 +#: ../flask_admin/contrib/fileadmin/__init__.py:1217 #, python-format msgid "Failed to delete file: %(name)s" msgstr "Chyba při mazání souboru: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1043 +#: ../flask_admin/contrib/fileadmin/__init__.py:1084 msgid "Renaming is disabled." msgstr "Přejmenovávání není povoleno." -#: ../flask_admin/contrib/fileadmin/__init__.py:1051 +#: ../flask_admin/contrib/fileadmin/__init__.py:1092 msgid "Path does not exist." msgstr "Cesta neexistuje." -#: ../flask_admin/contrib/fileadmin/__init__.py:1061 +#: ../flask_admin/contrib/fileadmin/__init__.py:1102 #, python-format msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\"" msgstr "Úspěšné přejmenování \"%(src)s\" na \"%(dst)s\"" -#: ../flask_admin/contrib/fileadmin/__init__.py:1064 +#: ../flask_admin/contrib/fileadmin/__init__.py:1105 #, python-format msgid "Failed to rename: %(error)s" msgstr "Chyba při přejmenování: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1078 +#: ../flask_admin/contrib/fileadmin/__init__.py:1119 #, python-format msgid "Rename %(name)s" msgstr "Přejmenovat %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1115 +#: ../flask_admin/contrib/fileadmin/__init__.py:1155 #, python-format msgid "Error saving changes to %(name)s." msgstr "Chyba při ukládání změn do %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1119 +#: ../flask_admin/contrib/fileadmin/__init__.py:1159 #, python-format msgid "Changes to %(name)s saved successfully." msgstr "Změny v %(name)s byl úspěšně uložen." -#: ../flask_admin/contrib/fileadmin/__init__.py:1128 +#: ../flask_admin/contrib/fileadmin/__init__.py:1167 #, python-format msgid "Error reading %(name)s." msgstr "Chyba při čtení %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1131 -#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/contrib/fileadmin/__init__.py:1170 +#: ../flask_admin/contrib/fileadmin/__init__.py:1179 #, python-format msgid "Unexpected error while reading from %(name)s" msgstr "Neočekávaná chyba při čtení z %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1137 +#: ../flask_admin/contrib/fileadmin/__init__.py:1176 #, python-format msgid "Cannot edit %(name)s." msgstr "Nelze upravovat %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1155 +#: ../flask_admin/contrib/fileadmin/__init__.py:1194 #, python-format msgid "Editing %(path)s" msgstr "Editace %(path)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/peewee/view.py:487 -#: ../flask_admin/contrib/pymongo/view.py:384 -#: ../flask_admin/contrib/sqla/view.py:1149 +#: ../flask_admin/contrib/fileadmin/__init__.py:1202 +#: ../flask_admin/contrib/peewee/view.py:510 +#: ../flask_admin/contrib/pymongo/view.py:385 +#: ../flask_admin/contrib/sqla/view.py:1241 msgid "Delete" msgstr "Smazat" -#: ../flask_admin/contrib/fileadmin/__init__.py:1164 +#: ../flask_admin/contrib/fileadmin/__init__.py:1203 msgid "Are you sure you want to delete these files?" msgstr "Skutečně chcete vymazat následující soubory?" -#: ../flask_admin/contrib/fileadmin/__init__.py:1167 +#: ../flask_admin/contrib/fileadmin/__init__.py:1206 msgid "File deletion is disabled." msgstr "Odstranění souborů je zakázáno." -#: ../flask_admin/contrib/fileadmin/__init__.py:1180 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:22 +#: ../flask_admin/contrib/fileadmin/__init__.py:1219 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:22 msgid "Edit" msgstr "Úpravy" -#: ../flask_admin/contrib/fileadmin/s3.py:153 +#: ../flask_admin/contrib/fileadmin/s3.py:162 msgid "Cannot operate on non empty directories" msgstr "" #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 -#: ../flask_admin/contrib/sqla/filters.py:41 +#: ../flask_admin/contrib/sqla/filters.py:42 msgid "equals" msgstr "rovno" #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 -#: ../flask_admin/contrib/sqla/filters.py:49 +#: ../flask_admin/contrib/sqla/filters.py:50 msgid "not equal" msgstr "není rovno" #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 -#: ../flask_admin/contrib/sqla/filters.py:58 +#: ../flask_admin/contrib/sqla/filters.py:59 msgid "contains" msgstr "obsahuje" #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 -#: ../flask_admin/contrib/sqla/filters.py:67 +#: ../flask_admin/contrib/sqla/filters.py:68 msgid "not contains" msgstr "neobsahuje" #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 -#: ../flask_admin/contrib/sqla/filters.py:75 +#: ../flask_admin/contrib/sqla/filters.py:76 msgid "greater than" msgstr "větší než" #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 -#: ../flask_admin/contrib/sqla/filters.py:83 +#: ../flask_admin/contrib/sqla/filters.py:84 msgid "smaller than" msgstr "menší než" #: ../flask_admin/contrib/peewee/filters.py:88 -#: ../flask_admin/contrib/sqla/filters.py:94 +#: ../flask_admin/contrib/sqla/filters.py:95 msgid "empty" msgstr "prázdné" #: ../flask_admin/contrib/peewee/filters.py:102 -#: ../flask_admin/contrib/sqla/filters.py:108 +#: ../flask_admin/contrib/sqla/filters.py:109 msgid "in list" msgstr "v seznamu" #: ../flask_admin/contrib/peewee/filters.py:111 -#: ../flask_admin/contrib/sqla/filters.py:118 +#: ../flask_admin/contrib/sqla/filters.py:119 msgid "not in list" msgstr "není v seznamu" @@ -282,44 +271,37 @@ msgstr "není v seznamu" msgid "not between" msgstr "není mezi" -msgid "ObjectId equals" -msgstr "" - -#, python-format -msgid "Failed to get model. %(error)s" -msgstr "Nepodařilo se získat modelu. %(error)s" - -#: ../flask_admin/contrib/peewee/view.py:435 -#: ../flask_admin/contrib/pymongo/view.py:316 -#: ../flask_admin/contrib/sqla/view.py:1078 +#: ../flask_admin/contrib/peewee/view.py:458 +#: ../flask_admin/contrib/pymongo/view.py:317 +#: ../flask_admin/contrib/sqla/view.py:1170 #, python-format msgid "Failed to create record. %(error)s" msgstr "Chyba při vytváření modelu. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:454 -#: ../flask_admin/contrib/pymongo/view.py:341 -#: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 -#: ../flask_admin/model/base.py:2313 ../flask_admin/model/base.py:2315 +#: ../flask_admin/contrib/peewee/view.py:477 +#: ../flask_admin/contrib/pymongo/view.py:342 +#: ../flask_admin/contrib/sqla/view.py:1196 ../flask_admin/model/base.py:2463 +#: ../flask_admin/model/base.py:2471 ../flask_admin/model/base.py:2473 #, python-format msgid "Failed to update record. %(error)s" msgstr "Chyba při aktualizaci modelu. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:469 -#: ../flask_admin/contrib/pymongo/view.py:366 -#: ../flask_admin/contrib/sqla/view.py:1129 +#: ../flask_admin/contrib/peewee/view.py:492 +#: ../flask_admin/contrib/pymongo/view.py:367 +#: ../flask_admin/contrib/sqla/view.py:1221 #, python-format msgid "Failed to delete record. %(error)s" msgstr "Chyba při mazání modelu. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:488 -#: ../flask_admin/contrib/pymongo/view.py:385 -#: ../flask_admin/contrib/sqla/view.py:1150 +#: ../flask_admin/contrib/peewee/view.py:511 +#: ../flask_admin/contrib/pymongo/view.py:386 +#: ../flask_admin/contrib/sqla/view.py:1242 msgid "Are you sure you want to delete selected records?" msgstr "Skutečně chcete vymazat vybrané modely?" -#: ../flask_admin/contrib/peewee/view.py:505 -#: ../flask_admin/contrib/pymongo/view.py:395 -#: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 +#: ../flask_admin/contrib/peewee/view.py:528 +#: ../flask_admin/contrib/pymongo/view.py:396 +#: ../flask_admin/contrib/sqla/view.py:1258 ../flask_admin/model/base.py:2272 #, python-format msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." @@ -327,33 +309,33 @@ msgstr[0] "%(count)s model byl úspěšně smazán." msgstr[1] "%(count)s modely byly úspěšně smazány." msgstr[2] "%(count)s modelů bylo úspěšně smazáno." -#: ../flask_admin/contrib/peewee/view.py:511 -#: ../flask_admin/contrib/pymongo/view.py:400 -#: ../flask_admin/contrib/sqla/view.py:1174 +#: ../flask_admin/contrib/peewee/view.py:534 +#: ../flask_admin/contrib/pymongo/view.py:401 +#: ../flask_admin/contrib/sqla/view.py:1266 #, python-format msgid "Failed to delete records. %(error)s" msgstr "Chyba při mazání modelu. %(error)s" -#: ../flask_admin/contrib/sqla/fields.py:126 -#: ../flask_admin/contrib/sqla/fields.py:176 -#: ../flask_admin/contrib/sqla/fields.py:181 ../flask_admin/model/fields.py:173 -#: ../flask_admin/model/fields.py:222 +#: ../flask_admin/contrib/sqla/fields.py:117 +#: ../flask_admin/contrib/sqla/fields.py:167 +#: ../flask_admin/contrib/sqla/fields.py:172 ../flask_admin/model/fields.py:174 +#: ../flask_admin/model/fields.py:223 msgid "Not a valid choice" msgstr "Tato volba není přípustná" -#: ../flask_admin/contrib/sqla/fields.py:186 +#: ../flask_admin/contrib/sqla/fields.py:201 msgid "Key" msgstr "" -#: ../flask_admin/contrib/sqla/fields.py:187 +#: ../flask_admin/contrib/sqla/fields.py:202 msgid "Value" msgstr "" -#: ../flask_admin/contrib/sqla/validators.py:42 +#: ../flask_admin/contrib/sqla/validators.py:28 msgid "Already exists." msgstr "Již existuje." -#: ../flask_admin/contrib/sqla/validators.py:60 +#: ../flask_admin/contrib/sqla/validators.py:59 #, python-format msgid "At least %(num)d item is required" msgid_plural "At least %(num)d items are required" @@ -361,7 +343,15 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: ../flask_admin/contrib/sqla/view.py:1057 +#: ../flask_admin/contrib/sqla/validators.py:75 +msgid "Not a valid ISO currency code (e.g. USD, EUR, CNY)." +msgstr "" + +#: ../flask_admin/contrib/sqla/validators.py:83 +msgid "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." +msgstr "" + +#: ../flask_admin/contrib/sqla/view.py:1134 #, python-format msgid "Integrity error. %(message)s" msgstr "Chyba integrity. %(message)s" @@ -370,274 +360,242 @@ msgstr "Chyba integrity. %(message)s" msgid "Invalid time format" msgstr "Nesprávný formát času" -#: ../flask_admin/form/fields.py:144 +#: ../flask_admin/form/fields.py:147 msgid "Invalid Choice: could not coerce" msgstr "Neplatná volba: nebylo převedeno" -#: ../flask_admin/form/fields.py:208 +#: ../flask_admin/form/fields.py:221 msgid "Invalid JSON" msgstr "Neplatný JSON" -#: ../flask_admin/form/upload.py:207 +#: ../flask_admin/form/upload.py:216 msgid "Invalid file extension" msgstr "Neplatná přípona souboru" -#: ../flask_admin/form/upload.py:214 ../flask_admin/form/upload.py:281 +#: ../flask_admin/form/upload.py:223 ../flask_admin/form/upload.py:293 #, python-format msgid "File \"%s\" already exists." msgstr "Soubor s názvem \"%s\" již existuje." -#: ../flask_admin/model/base.py:1649 +#: ../flask_admin/form/validators.py:16 +msgid "This field requires at least one item." +msgstr "" + +#: ../flask_admin/model/base.py:1737 msgid "There are no items in the table." msgstr "V tabulce nejsou žádné položky." -#: ../flask_admin/model/base.py:1673 +#: ../flask_admin/model/base.py:1746 #, python-format msgid "Invalid Filter Value: %(value)s" msgstr "Neplatná hodnota filtru: %(value)s" -#: ../flask_admin/model/base.py:1984 +#: ../flask_admin/model/base.py:2136 msgid "Record was successfully created." msgstr "Model byl úspěšně vytvořen." -#: ../flask_admin/model/base.py:2028 ../flask_admin/model/base.py:2080 -#: ../flask_admin/model/base.py:2113 ../flask_admin/model/base.py:2297 +#: ../flask_admin/model/base.py:2180 ../flask_admin/model/base.py:2232 +#: ../flask_admin/model/base.py:2265 ../flask_admin/model/base.py:2455 msgid "Record does not exist." msgstr "Záznam neexistuje." -#: ../flask_admin/model/base.py:2037 ../flask_admin/model/base.py:2301 +#: ../flask_admin/model/base.py:2189 ../flask_admin/model/base.py:2459 msgid "Record was successfully saved." msgstr "Záznam byl úspěšně uložen." -#: ../flask_admin/model/base.py:2222 -msgid "Tablib dependency not installed." -msgstr "" - -#: ../flask_admin/model/base.py:2249 +#: ../flask_admin/model/base.py:2407 #, python-format msgid "Export type \"%(type)s not supported." msgstr "" -#: ../flask_admin/model/filters.py:103 ../flask_admin/model/widgets.py:111 +#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:119 msgid "Yes" msgstr "Ano" -#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:110 +#: ../flask_admin/model/filters.py:105 ../flask_admin/model/widgets.py:118 msgid "No" msgstr "Ne" -#: ../flask_admin/model/filters.py:172 ../flask_admin/model/filters.py:212 -#: ../flask_admin/model/filters.py:257 +#: ../flask_admin/model/filters.py:173 ../flask_admin/model/filters.py:213 +#: ../flask_admin/model/filters.py:258 msgid "between" msgstr "mezi" -#: ../flask_admin/model/template.py:81 ../flask_admin/model/template.py:88 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:37 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:8 +#: ../flask_admin/model/template.py:83 ../flask_admin/model/template.py:90 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:7 msgid "View Record" msgstr "Zobrazit záznam" -#: ../flask_admin/model/template.py:95 ../flask_admin/model/template.py:102 -#: ../flask_admin/model/template.py:109 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/edit.html:11 +#: ../flask_admin/model/template.py:97 ../flask_admin/model/template.py:104 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/edit.html:10 msgid "Edit Record" msgstr "Upravit Záznam" -#: ../flask_admin/model/widgets.py:61 +#: ../flask_admin/model/template.py:111 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Delete Record" +msgstr "" + +#: ../flask_admin/model/widgets.py:62 msgid "Please select model" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/actions.html:4 -#: ../flask_admin/templates/bootstrap3/admin/actions.html:4 +#: ../flask_admin/templates/bootstrap4/admin/actions.html:5 msgid "With selected" msgstr "S vybranými" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:200 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:190 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:216 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:227 msgid "Save" msgstr "Uložit" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:205 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:195 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:221 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:232 msgid "Cancel" msgstr "Zrušit" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:256 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:247 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:290 msgid "Save and Add Another" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:259 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:250 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:293 msgid "Save and Continue Editing" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:9 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:9 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:10 msgid "Root" msgstr "Kořen" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:90 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:99 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:89 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:98 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:42 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:51 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:89 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:98 #, python-format msgid "Sort by %(name)s" msgstr "Seřadit podle %(name)s" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:77 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:79 msgid "Rename File" msgstr "Přejmenovat Soubor" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:88 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:88 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:90 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\' recursively?" msgstr "Opravdu chcete vymazat \\'%(name)s\\' rekurzivně?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:97 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:97 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:99 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\'?" msgstr "Opravdu chcete vymazat \\'%(name)s\\'?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:125 -msgid "Size" -msgstr "" - -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:185 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:187 msgid "Please select at least one file." msgstr "Vyberte prosím alespoň jeden soubor." -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:8 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:17 msgid "List" msgstr "Seznam" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:12 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:18 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 msgid "Create" msgstr "Vytvořit" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:26 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:26 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:21 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:26 msgid "Details" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:29 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:28 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:15 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:28 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:15 msgid "Filter" msgstr "Filtr" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:13 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:14 msgid "Delete?" msgstr "Smazat?" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:33 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:16 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:35 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Are you sure you want to delete this record?" +msgstr "Opravdu chcete vymazat tento záznam?" + +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:33 msgid "New" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:43 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:43 msgid "Add" msgstr "Přidat" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:3 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:3 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:2 msgid "Add Filter" msgstr "Přidat filtr" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:30 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:19 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:26 msgid "Export" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:38 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:38 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:49 msgid "Apply" msgstr "Potvrdit" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:40 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:51 msgid "Reset Filters" msgstr "Zrušit filtry" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:66 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:64 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:80 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:93 +#, python-format +msgid "%(placeholder)s" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:88 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:94 msgid "Search" msgstr "Hledat" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:74 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:77 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:78 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:79 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:72 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:75 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:76 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:77 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:102 msgid "items" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/create.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/create.html:10 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/create.html:10 msgid "Create New Record" msgstr "Vytvořit Nový Záznam" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:76 msgid "Select all records" msgstr "Vybrat všechny záznamy" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:120 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:119 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:119 msgid "Select record" msgstr "Výběr záznamu" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:186 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:195 msgid "Please select at least one record." msgstr "Vyberte prosím alespoň jeden model." -#: ../flask_admin/templates/bootstrap2/admin/model/row_actions.html:34 -#: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 -msgid "Are you sure you want to delete this record?" -msgstr "Opravdu chcete vymazat tento záznam?" +#~ msgid "ObjectId equals" +#~ msgstr "" + +#~ msgid "Failed to get model. %(error)s" +#~ msgstr "Nepodařilo se získat modelu. %(error)s" + +#~ msgid "Tablib dependency not installed." +#~ msgstr "" + +#~ msgid "Size" +#~ msgstr "" + diff --git a/flask_admin/translations/da/LC_MESSAGES/admin.mo b/flask_admin/translations/da/LC_MESSAGES/admin.mo index 044e7e3dd1fe4795836c1feba542a25694cdc835..04fb48b1deb5e4b7b29f33ade5d7045f82527a5b 100644 GIT binary patch delta 1803 zcmYM!drVwK6vy$iLV<;@%OcN3+pAc4F5N{U-D)lN6|Du)pe9wSOIceA2#rW;+Gf=> zVw(EOl$zT52k9TJ#Kct8#6*eKq-m^HLxe<4Ed8VLL45p&jW+oGr8jYN+0V?`d(X_7 znaj^D^NGw)McHG<r<=bU`D@5h@BhzTIc5s2!F;?2!?*>P;NzIYZj9k^OyHN;fdBf| z=9+D!{|FMY<5*&ru@f|^34DAlV3&}~7WmSQi&%&`d1etTL&a-R_r;M!wh9}u9hc*N z-?uTF{-;=gXHfYrU>W1vMH)8~Silun5j496*P{B}sDv;3@l#ku|2$UWpSTPQSROrB zhq}KFYjFT8@J)>3X}li4l8kRZ(omw`P?hB{P0cuj+L9vla3v~n2QI}SEXDm;gopk3 zNxXsn2dF&fe80x)=ue~WpTSHqjbHr0RrKf=l3kS~Py=+L;(geLhfo#&fI16TkVh>T zy0#T1$Yu3>X#z>#yHN$MM@?XJi1nv!U3_Uz`Y?w3upTE+TQiFu{*4V-!TM>yO}-By zKiM|aVeLnqjUi-LZ4c_OzJQv*C^BbzRqL-Cj}cJ96aEkHA=_%7`0=xTd>Ri0I5Vik z{mh!CJ&Rh&1E_pQu?5Gm5x>Vc=5c~mSQ6_nouQ%E;&oKQS=3p$h}HNHY744ZFC|{> zyAH`|n^9Zv7;35eP?Zj0IgX%K@HM;@PouVW7L_k^g@zIYI58S1f@N5Pnt3bg6c3^j z97QFVLLJ6SsJ9_N`Emu`g!iF--+_8=6g81|QD^4@QfS70r=bUeyu{j*YSfZ8qh6Qw zs6E?;sxXauD|VrWqo{#Sp`Jg7s(c2uLVuvn#v*EELsY31s>N)*|0`+e&@>}+u~o>T zSQ}EDJ&8PP!^mX^{rI>a{}68{ejc@wi>QIaETbmmp$dti3cD9Ifk!cm@vV!7DoddT zehT?lV9%ijK7cw4Z($9dK~*x3TFP9?Rs1&8a}S^n?^e_VdQk8EZq!N+qwd>_n^gHr ze&8VLEf_-`#&N$tfvW5yRN}LK|65d|x$?=n+~)&sI&aKP1%qx+@N<{WpPTF{_$IJ? zOYbwo)}9(jTl*l_u$S^iQvJO>-u9h?z1!1nS7^Y^hyHT;;TqQxe#Ko5Z*?0BJKV9t zBax=&SUeePYWA9%R>za|@q}9!*^%|chWp(+k=DSS?$^lf?8F_7@yV{DHv+D-_^^Aw zc+O3gT%P=*bS99mp&2$c^0b>MkGk*5A9iahK64GxD%Tl((Je$f-Gh}K?qp@_f9#RV A!2kdN delta 2513 zcmb8vdra0<9LMp4AW8@ipz)ws{PL1FAW$cH%^T)DCfUlgdhj{ogAWgv=Lbr&!Dg#J zu#5d7&1y5dIIYzt{^4}lru|XPRyMMGTh@k~&Q>eUY_s<Vj%#aeCF95Iobx-E@A;nd z<6L=fMf-PoX<de&CZ3TzucoT@_fPR4W7JfFH()u2a25{4<v1NzVF_->ay){?c-}dD zurZa?7h$^k;f=<$n}EVN8umL+^}jHek+CL}(LW%JIn-~)T)fS-&qMWFj7(^%TzvzU zQcqwJzT|ud)2M%onXGTlP|(B|FpO9677VjpMLHeF;9MMw7Dr*HtG|U>pvSfUileEA zGYJ-FVj-?^^;XpQE-YewbC|*e`~rvLfFZ_=z>%1Z70yMdiB_WmYeMa03+m_|K@WGM z0y>KPny>kjk7qFtue$cUEb>2;h9U|&<0+^KE1a`j`#c;#dnIau#i%=QKMuo9uDt_2 z>H%tphfwo>jtbzMdq03(t)M<SoBS(9O*Cl2r;#L>J*cyM6B%QUqXPTH`59{AuTUBL z36+ryCQ*PnsBxoF<H}J-JPk|mPMm}-A@Z-YewhXjPdI<XV(J4KrGO@*Zu=ZpUx-?u z3YEDBP?xX<xwobc)jx>}tPRP!=|J^+!oBZmr=SI1a2@s`_s<-1?Z;gEhxm93sYEUC zAlqcqW+N&Sn^6;Q#|nHFOYtO@;T6=5i#d;pcrWU6Y~Myf6MlfYT%Y1Nyx`1dcAecE z)B>xW>yTKCMUrJ&QK^0mwewCaz#XV@2T++lh-0t^xg+i7vg<IC1J^`jPzz2)eU8ge zJ6VrP<uj-Wo=1H($6Wm^>e6K~Shv3n^%+(<eb>GVZ=(HhU!C(mO+gc0L`7K0s=Ac3 zQ5ji_8n6X*hR>l={|f3eJ%|eIBUA=@P@m(M=;1|FKw;9M@fE1dEaXoP>zj2HbeR&U z1-GIu)h<*jUqns3*R}6+zJVmqyp77-d&n`H9^~{)FOn2<1=*X)<x^4nc;_r^SBEMJ zQ*Z-nqTQ&oJ%Eb%C~BwgqjvrSDzINrf&PvP<WJ<+<kDFIPeKJ$hWt}B3tan3)VkFp zIDcKX7!Bib2Py+c(8JTHqqyYW=krn%-GK^VDe7yfLIt`8^^d9+btHAD{!OSrx4L=< z>Z|K4yuJVS@1#K!?r|?(M`hw5YJuafeiAj|H-+6Z(mPUajU*BczSq!bn<KvU8WLWD z$JRIcZC*6iY}fk@%`uw{4iDOyZv99so(xtDJ~^>+OJhT`Z~F24wnpoX8arN2NHT-( zC0iQR!$yN}#+i&->wEPLQ5z55&B*V*obho=?lRkEmdBF5SsAIfW~JR6oXQM`?y9L{ z$t6+GHnl`pt2eWLXjR-slGaPwIIr9^)kA(RiL_cTl8AcqqCBj*(KegvYmEyU5`HYv zV!g^}j6!WNKWk!Y>|q<!Wj$3CsfovGyr^xoiKtDiZ|jRVmPq=Mc-%%ygG*U!QzP+~ zpenn1V9dAm$zX5x&fM~flCsGqWffjo*$kDZ1xrJ<!J*LH;I~jy>Xg!{-E}!TQpPR# zpBeolw`<Tsm(nNmzQ3N7)(`E?*l^;t{#<m=9(F!u=CyQ^%1CQM`Q)iHOEzt?9?7q5 zi$`O%zSkOw*P4GOd3pXldH<5*J^9D4Gsh2w$M)rTTli7$?*B@1dco>6l5B(f3Rb1{ KC3%0r{J#J-Z;eO* diff --git a/flask_admin/translations/da/LC_MESSAGES/admin.po b/flask_admin/translations/da/LC_MESSAGES/admin.po index 6e89f14d6..5601b83f0 100644 --- a/flask_admin/translations/da/LC_MESSAGES/admin.po +++ b/flask_admin/translations/da/LC_MESSAGES/admin.po @@ -1,275 +1,264 @@ + msgid "" msgstr "" -"Project-Id-Version: flask-admin\n" +"Project-Id-Version: flask-admin\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-02-07 00:17-0600\n" +"POT-Creation-Date: 2024-09-24 22:09+0100\n" "PO-Revision-Date: 2017-02-07 01:19-0500\n" "Last-Translator: mrjoes <serge.koval@gmail.com>\n" +"Language: da_DK\n" "Language-Team: Danish\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.1.1\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: flask-admin\n" -"X-Crowdin-Language: da\n" -"X-Crowdin-File: admin.pot\n" -"Language: da_DK\n" +"Generated-By: Babel 2.16.0\n" -#: ../flask_admin/base.py:440 +#: ../flask_admin/base.py:458 msgid "Home" msgstr "Hjem" -#: ../flask_admin/contrib/rediscli.py:127 +#: ../flask_admin/contrib/rediscli.py:113 msgid "Cli: Invalid command." msgstr "CLI: Ugyldig kommando." -#: ../flask_admin/contrib/fileadmin/__init__.py:352 +#: ../flask_admin/contrib/fileadmin/__init__.py:376 msgid "File to upload" msgstr "Fil til upload" -#: ../flask_admin/contrib/fileadmin/__init__.py:360 +#: ../flask_admin/contrib/fileadmin/__init__.py:384 msgid "File required." msgstr "Fil kræves." -#: ../flask_admin/contrib/fileadmin/__init__.py:365 +#: ../flask_admin/contrib/fileadmin/__init__.py:389 msgid "Invalid file type." msgstr "Ugyldig filtype." -#: ../flask_admin/contrib/fileadmin/__init__.py:376 +#: ../flask_admin/contrib/fileadmin/__init__.py:400 msgid "Content" msgstr "Indhold" -#: ../flask_admin/contrib/fileadmin/__init__.py:390 +#: ../flask_admin/contrib/fileadmin/__init__.py:414 msgid "Invalid name" msgstr "Ugyldigt navn" -#: ../flask_admin/contrib/fileadmin/__init__.py:398 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:106 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:112 -#: ../flask_admin/tests/sqla/test_translation.py:17 +#: ../flask_admin/contrib/fileadmin/__init__.py:422 +#: ../flask_admin/tests/sqla/test_translation.py:21 msgid "Name" msgstr "Navn" -#: ../flask_admin/contrib/fileadmin/__init__.py:757 +#: ../flask_admin/contrib/fileadmin/__init__.py:784 #, python-format msgid "File \"%(name)s\" already exists." msgstr "Filen \"%(name)s\" findes allerede." -#: ../flask_admin/contrib/fileadmin/__init__.py:802 -#: ../flask_admin/contrib/fileadmin/__init__.py:885 -#: ../flask_admin/contrib/fileadmin/__init__.py:947 -#: ../flask_admin/contrib/fileadmin/__init__.py:1000 -#: ../flask_admin/contrib/fileadmin/__init__.py:1047 -#: ../flask_admin/contrib/fileadmin/__init__.py:1099 -#: ../flask_admin/model/base.py:2168 +#: ../flask_admin/contrib/fileadmin/__init__.py:829 +#: ../flask_admin/contrib/fileadmin/__init__.py:926 +#: ../flask_admin/contrib/fileadmin/__init__.py:988 +#: ../flask_admin/contrib/fileadmin/__init__.py:1041 +#: ../flask_admin/contrib/fileadmin/__init__.py:1088 +#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/model/base.py:2324 msgid "Permission denied." msgstr "Tilladelse nægtet." -#: ../flask_admin/contrib/fileadmin/__init__.py:881 +#: ../flask_admin/contrib/fileadmin/__init__.py:922 msgid "File uploading is disabled." msgstr "Fil-upload er deaktiveret." -#: ../flask_admin/contrib/fileadmin/__init__.py:892 +#: ../flask_admin/contrib/fileadmin/__init__.py:933 #, python-format msgid "Successfully saved file: %(name)s" msgstr "Med held gemt fil: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:896 +#: ../flask_admin/contrib/fileadmin/__init__.py:937 #, python-format msgid "Failed to save file: %(error)s" msgstr "Kunne ikke gemme fil: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:904 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:150 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:150 +#: ../flask_admin/contrib/fileadmin/__init__.py:945 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:150 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:152 msgid "Upload File" msgstr "Upload fil" -#: ../flask_admin/contrib/fileadmin/__init__.py:943 +#: ../flask_admin/contrib/fileadmin/__init__.py:984 msgid "Directory creation is disabled." msgstr "Directory oprettelse er deaktiveret." -#: ../flask_admin/contrib/fileadmin/__init__.py:956 +#: ../flask_admin/contrib/fileadmin/__init__.py:997 #, python-format msgid "Successfully created directory: %(directory)s" msgstr "Med held oprettede mappe: %(directory)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:960 +#: ../flask_admin/contrib/fileadmin/__init__.py:1001 #, python-format msgid "Failed to create directory: %(error)s" msgstr "Kunne ikke oprette denne mappe: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:970 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:161 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:161 +#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:161 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:163 msgid "Create Directory" msgstr "Oprette Register" -#: ../flask_admin/contrib/fileadmin/__init__.py:996 +#: ../flask_admin/contrib/fileadmin/__init__.py:1037 msgid "Deletion is disabled." msgstr "Sletning er deaktiveret." -#: ../flask_admin/contrib/fileadmin/__init__.py:1005 +#: ../flask_admin/contrib/fileadmin/__init__.py:1046 msgid "Directory deletion is disabled." msgstr "Directory sletning er deaktiveret." -#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/contrib/fileadmin/__init__.py:1052 #, python-format msgid "Directory \"%(path)s\" was successfully deleted." msgstr "Register \"%(path)s\" blev slettet." -#: ../flask_admin/contrib/fileadmin/__init__.py:1013 +#: ../flask_admin/contrib/fileadmin/__init__.py:1054 #, python-format msgid "Failed to delete directory: %(error)s" msgstr "Kunne ikke slette mappe: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1019 -#: ../flask_admin/contrib/fileadmin/__init__.py:1176 +#: ../flask_admin/contrib/fileadmin/__init__.py:1060 +#: ../flask_admin/contrib/fileadmin/__init__.py:1215 #, python-format msgid "File \"%(name)s\" was successfully deleted." msgstr "Filen \"%(name)s\" blev slettet." -#: ../flask_admin/contrib/fileadmin/__init__.py:1021 -#: ../flask_admin/contrib/fileadmin/__init__.py:1178 +#: ../flask_admin/contrib/fileadmin/__init__.py:1062 +#: ../flask_admin/contrib/fileadmin/__init__.py:1217 #, python-format msgid "Failed to delete file: %(name)s" msgstr "Kunne ikke slette fil: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1043 +#: ../flask_admin/contrib/fileadmin/__init__.py:1084 msgid "Renaming is disabled." msgstr "Omdøbning er deaktiveret." -#: ../flask_admin/contrib/fileadmin/__init__.py:1051 +#: ../flask_admin/contrib/fileadmin/__init__.py:1092 msgid "Path does not exist." msgstr "Stien findes ikke." -#: ../flask_admin/contrib/fileadmin/__init__.py:1061 +#: ../flask_admin/contrib/fileadmin/__init__.py:1102 #, python-format msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\"" msgstr "Med held omdøbt \"%(src)s\" til \"%(dst)s\"" -#: ../flask_admin/contrib/fileadmin/__init__.py:1064 +#: ../flask_admin/contrib/fileadmin/__init__.py:1105 #, python-format msgid "Failed to rename: %(error)s" msgstr "Undladt at omdøbe: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1078 +#: ../flask_admin/contrib/fileadmin/__init__.py:1119 #, python-format msgid "Rename %(name)s" msgstr "Omdøbe %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1115 +#: ../flask_admin/contrib/fileadmin/__init__.py:1155 #, python-format msgid "Error saving changes to %(name)s." msgstr "Fejl under lagring af ændringer til %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1119 +#: ../flask_admin/contrib/fileadmin/__init__.py:1159 #, python-format msgid "Changes to %(name)s saved successfully." msgstr "Ændringer til %(name)s gemmes korrekt." -#: ../flask_admin/contrib/fileadmin/__init__.py:1128 +#: ../flask_admin/contrib/fileadmin/__init__.py:1167 #, python-format msgid "Error reading %(name)s." msgstr "Fejl læsning %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1131 -#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/contrib/fileadmin/__init__.py:1170 +#: ../flask_admin/contrib/fileadmin/__init__.py:1179 #, python-format msgid "Unexpected error while reading from %(name)s" msgstr "Uventet fejl under læsning fra %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1137 +#: ../flask_admin/contrib/fileadmin/__init__.py:1176 #, python-format msgid "Cannot edit %(name)s." msgstr "Kan ikke redigere %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1155 +#: ../flask_admin/contrib/fileadmin/__init__.py:1194 #, python-format msgid "Editing %(path)s" msgstr "Redigering af %(path)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/peewee/view.py:487 -#: ../flask_admin/contrib/pymongo/view.py:384 -#: ../flask_admin/contrib/sqla/view.py:1149 +#: ../flask_admin/contrib/fileadmin/__init__.py:1202 +#: ../flask_admin/contrib/peewee/view.py:510 +#: ../flask_admin/contrib/pymongo/view.py:385 +#: ../flask_admin/contrib/sqla/view.py:1241 msgid "Delete" msgstr "Slet" -#: ../flask_admin/contrib/fileadmin/__init__.py:1164 +#: ../flask_admin/contrib/fileadmin/__init__.py:1203 msgid "Are you sure you want to delete these files?" msgstr "Er du sikker på du vil slette disse filer?" -#: ../flask_admin/contrib/fileadmin/__init__.py:1167 +#: ../flask_admin/contrib/fileadmin/__init__.py:1206 msgid "File deletion is disabled." msgstr "Filsletningen er deaktiveret." -#: ../flask_admin/contrib/fileadmin/__init__.py:1180 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:22 +#: ../flask_admin/contrib/fileadmin/__init__.py:1219 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:22 msgid "Edit" msgstr "Rediger" -#: ../flask_admin/contrib/fileadmin/s3.py:153 +#: ../flask_admin/contrib/fileadmin/s3.py:162 msgid "Cannot operate on non empty directories" msgstr "" #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 -#: ../flask_admin/contrib/sqla/filters.py:41 +#: ../flask_admin/contrib/sqla/filters.py:42 msgid "equals" msgstr "er lig med" #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 -#: ../flask_admin/contrib/sqla/filters.py:49 +#: ../flask_admin/contrib/sqla/filters.py:50 msgid "not equal" msgstr "ikke lige" #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 -#: ../flask_admin/contrib/sqla/filters.py:58 +#: ../flask_admin/contrib/sqla/filters.py:59 msgid "contains" msgstr "indeholder" #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 -#: ../flask_admin/contrib/sqla/filters.py:67 +#: ../flask_admin/contrib/sqla/filters.py:68 msgid "not contains" msgstr "ikke indeholder" #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 -#: ../flask_admin/contrib/sqla/filters.py:75 +#: ../flask_admin/contrib/sqla/filters.py:76 msgid "greater than" msgstr "større end" #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 -#: ../flask_admin/contrib/sqla/filters.py:83 +#: ../flask_admin/contrib/sqla/filters.py:84 msgid "smaller than" msgstr "mindre end" #: ../flask_admin/contrib/peewee/filters.py:88 -#: ../flask_admin/contrib/sqla/filters.py:94 +#: ../flask_admin/contrib/sqla/filters.py:95 msgid "empty" msgstr "Tom" #: ../flask_admin/contrib/peewee/filters.py:102 -#: ../flask_admin/contrib/sqla/filters.py:108 +#: ../flask_admin/contrib/sqla/filters.py:109 msgid "in list" msgstr "i listen" #: ../flask_admin/contrib/peewee/filters.py:111 -#: ../flask_admin/contrib/sqla/filters.py:118 +#: ../flask_admin/contrib/sqla/filters.py:119 msgid "not in list" msgstr "ikke på listen" @@ -282,84 +271,85 @@ msgstr "ikke på listen" msgid "not between" msgstr "ikke mellem" -msgid "ObjectId equals" -msgstr "" - -#, python-format -msgid "Failed to get model. %(error)s" -msgstr "Undladt at få model. %(error)s" - -#: ../flask_admin/contrib/peewee/view.py:435 -#: ../flask_admin/contrib/pymongo/view.py:316 -#: ../flask_admin/contrib/sqla/view.py:1078 +#: ../flask_admin/contrib/peewee/view.py:458 +#: ../flask_admin/contrib/pymongo/view.py:317 +#: ../flask_admin/contrib/sqla/view.py:1170 #, python-format msgid "Failed to create record. %(error)s" msgstr "Kunne ikke oprette posten. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:454 -#: ../flask_admin/contrib/pymongo/view.py:341 -#: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 -#: ../flask_admin/model/base.py:2313 ../flask_admin/model/base.py:2315 +#: ../flask_admin/contrib/peewee/view.py:477 +#: ../flask_admin/contrib/pymongo/view.py:342 +#: ../flask_admin/contrib/sqla/view.py:1196 ../flask_admin/model/base.py:2463 +#: ../flask_admin/model/base.py:2471 ../flask_admin/model/base.py:2473 #, python-format msgid "Failed to update record. %(error)s" msgstr "Kunne ikke oprette posten. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:469 -#: ../flask_admin/contrib/pymongo/view.py:366 -#: ../flask_admin/contrib/sqla/view.py:1129 +#: ../flask_admin/contrib/peewee/view.py:492 +#: ../flask_admin/contrib/pymongo/view.py:367 +#: ../flask_admin/contrib/sqla/view.py:1221 #, python-format msgid "Failed to delete record. %(error)s" msgstr "Kunne ikke slette posten. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:488 -#: ../flask_admin/contrib/pymongo/view.py:385 -#: ../flask_admin/contrib/sqla/view.py:1150 +#: ../flask_admin/contrib/peewee/view.py:511 +#: ../flask_admin/contrib/pymongo/view.py:386 +#: ../flask_admin/contrib/sqla/view.py:1242 msgid "Are you sure you want to delete selected records?" msgstr "Er du sikker på du vil slette de valgte poster?" -#: ../flask_admin/contrib/peewee/view.py:505 -#: ../flask_admin/contrib/pymongo/view.py:395 -#: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 +#: ../flask_admin/contrib/peewee/view.py:528 +#: ../flask_admin/contrib/pymongo/view.py:396 +#: ../flask_admin/contrib/sqla/view.py:1258 ../flask_admin/model/base.py:2272 #, python-format msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." msgstr[0] "Posten blev slettet." msgstr[1] "%(count)s poster blev slettet." -#: ../flask_admin/contrib/peewee/view.py:511 -#: ../flask_admin/contrib/pymongo/view.py:400 -#: ../flask_admin/contrib/sqla/view.py:1174 +#: ../flask_admin/contrib/peewee/view.py:534 +#: ../flask_admin/contrib/pymongo/view.py:401 +#: ../flask_admin/contrib/sqla/view.py:1266 #, python-format msgid "Failed to delete records. %(error)s" msgstr "Kunne ikke slette posten. %(error)s" -#: ../flask_admin/contrib/sqla/fields.py:126 -#: ../flask_admin/contrib/sqla/fields.py:176 -#: ../flask_admin/contrib/sqla/fields.py:181 ../flask_admin/model/fields.py:173 -#: ../flask_admin/model/fields.py:222 +#: ../flask_admin/contrib/sqla/fields.py:117 +#: ../flask_admin/contrib/sqla/fields.py:167 +#: ../flask_admin/contrib/sqla/fields.py:172 ../flask_admin/model/fields.py:174 +#: ../flask_admin/model/fields.py:223 msgid "Not a valid choice" msgstr "Ikke et gyldigt valg" -#: ../flask_admin/contrib/sqla/fields.py:186 +#: ../flask_admin/contrib/sqla/fields.py:201 msgid "Key" msgstr "" -#: ../flask_admin/contrib/sqla/fields.py:187 +#: ../flask_admin/contrib/sqla/fields.py:202 msgid "Value" msgstr "" -#: ../flask_admin/contrib/sqla/validators.py:42 +#: ../flask_admin/contrib/sqla/validators.py:28 msgid "Already exists." msgstr "Der findes allerede." -#: ../flask_admin/contrib/sqla/validators.py:60 +#: ../flask_admin/contrib/sqla/validators.py:59 #, python-format msgid "At least %(num)d item is required" msgid_plural "At least %(num)d items are required" msgstr[0] "" msgstr[1] "" -#: ../flask_admin/contrib/sqla/view.py:1057 +#: ../flask_admin/contrib/sqla/validators.py:75 +msgid "Not a valid ISO currency code (e.g. USD, EUR, CNY)." +msgstr "" + +#: ../flask_admin/contrib/sqla/validators.py:83 +msgid "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." +msgstr "" + +#: ../flask_admin/contrib/sqla/view.py:1134 #, python-format msgid "Integrity error. %(message)s" msgstr "Integritetsfejl. %(message)s" @@ -368,274 +358,242 @@ msgstr "Integritetsfejl. %(message)s" msgid "Invalid time format" msgstr "Ugyldigt klokkeslætsformat" -#: ../flask_admin/form/fields.py:144 +#: ../flask_admin/form/fields.py:147 msgid "Invalid Choice: could not coerce" msgstr "Ugyldigt valg: kunne ikke tvinge" -#: ../flask_admin/form/fields.py:208 +#: ../flask_admin/form/fields.py:221 msgid "Invalid JSON" msgstr "Ugyldig JSON" -#: ../flask_admin/form/upload.py:207 +#: ../flask_admin/form/upload.py:216 msgid "Invalid file extension" msgstr "Ugyldig fil forlængelse" -#: ../flask_admin/form/upload.py:214 ../flask_admin/form/upload.py:281 +#: ../flask_admin/form/upload.py:223 ../flask_admin/form/upload.py:293 #, python-format msgid "File \"%s\" already exists." msgstr "Filen \"%s\" findes allerede." -#: ../flask_admin/model/base.py:1649 +#: ../flask_admin/form/validators.py:16 +msgid "This field requires at least one item." +msgstr "" + +#: ../flask_admin/model/base.py:1737 msgid "There are no items in the table." msgstr "Der er ingen varer i tabellen." -#: ../flask_admin/model/base.py:1673 +#: ../flask_admin/model/base.py:1746 #, python-format msgid "Invalid Filter Value: %(value)s" msgstr "Ugyldig filterværdi: %(value)s" -#: ../flask_admin/model/base.py:1984 +#: ../flask_admin/model/base.py:2136 msgid "Record was successfully created." msgstr "Posten blev oprettet." -#: ../flask_admin/model/base.py:2028 ../flask_admin/model/base.py:2080 -#: ../flask_admin/model/base.py:2113 ../flask_admin/model/base.py:2297 +#: ../flask_admin/model/base.py:2180 ../flask_admin/model/base.py:2232 +#: ../flask_admin/model/base.py:2265 ../flask_admin/model/base.py:2455 msgid "Record does not exist." msgstr "Posten findes ikke." -#: ../flask_admin/model/base.py:2037 ../flask_admin/model/base.py:2301 +#: ../flask_admin/model/base.py:2189 ../flask_admin/model/base.py:2459 msgid "Record was successfully saved." msgstr "Post blev gemt." -#: ../flask_admin/model/base.py:2222 -msgid "Tablib dependency not installed." -msgstr "" - -#: ../flask_admin/model/base.py:2249 +#: ../flask_admin/model/base.py:2407 #, python-format msgid "Export type \"%(type)s not supported." msgstr "" -#: ../flask_admin/model/filters.py:103 ../flask_admin/model/widgets.py:111 +#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:119 msgid "Yes" msgstr "Ja" -#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:110 +#: ../flask_admin/model/filters.py:105 ../flask_admin/model/widgets.py:118 msgid "No" msgstr "Nej" -#: ../flask_admin/model/filters.py:172 ../flask_admin/model/filters.py:212 -#: ../flask_admin/model/filters.py:257 +#: ../flask_admin/model/filters.py:173 ../flask_admin/model/filters.py:213 +#: ../flask_admin/model/filters.py:258 msgid "between" msgstr "mellem" -#: ../flask_admin/model/template.py:81 ../flask_admin/model/template.py:88 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:37 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:8 +#: ../flask_admin/model/template.py:83 ../flask_admin/model/template.py:90 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:7 msgid "View Record" msgstr "View Post" -#: ../flask_admin/model/template.py:95 ../flask_admin/model/template.py:102 -#: ../flask_admin/model/template.py:109 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/edit.html:11 +#: ../flask_admin/model/template.py:97 ../flask_admin/model/template.py:104 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/edit.html:10 msgid "Edit Record" msgstr "Redigere Posten" -#: ../flask_admin/model/widgets.py:61 +#: ../flask_admin/model/template.py:111 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Delete Record" +msgstr "" + +#: ../flask_admin/model/widgets.py:62 msgid "Please select model" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/actions.html:4 -#: ../flask_admin/templates/bootstrap3/admin/actions.html:4 +#: ../flask_admin/templates/bootstrap4/admin/actions.html:5 msgid "With selected" msgstr "Med udvalgte" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:200 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:190 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:216 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:227 msgid "Save" msgstr "Gem" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:205 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:195 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:221 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:232 msgid "Cancel" msgstr "Annuller" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:256 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:247 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:290 msgid "Save and Add Another" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:259 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:250 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:293 msgid "Save and Continue Editing" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:9 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:9 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:10 msgid "Root" msgstr "Roden" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:90 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:99 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:89 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:98 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:42 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:51 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:89 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:98 #, python-format msgid "Sort by %(name)s" msgstr "Sorter efter %(name)s" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:77 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:79 msgid "Rename File" msgstr "Omdøb filen" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:88 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:88 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:90 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\' recursively?" msgstr "Er du sikker på du vil slette \\'%(name)s\\' \"rekursivt?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:97 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:97 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:99 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\'?" msgstr "Er du sikker på du vil slette \\'%(name)s\\' \"?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:125 -msgid "Size" -msgstr "" - -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:185 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:187 msgid "Please select at least one file." msgstr "Vælg mindst én fil." -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:8 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:17 msgid "List" msgstr "Liste" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:12 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:18 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 msgid "Create" msgstr "Oprette" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:26 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:26 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:21 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:26 msgid "Details" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:29 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:28 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:15 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:28 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:15 msgid "Filter" msgstr "Filter" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:13 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:14 msgid "Delete?" msgstr "Slet?" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:33 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:16 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:35 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Are you sure you want to delete this record?" +msgstr "Er du sikker på du vil slette denne post?" + +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:33 msgid "New" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:43 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:43 msgid "Add" msgstr "Tilføje" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:3 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:3 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:2 msgid "Add Filter" msgstr "Tilføj Filter" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:30 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:19 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:26 msgid "Export" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:38 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:38 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:49 msgid "Apply" msgstr "Anvende" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:40 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:51 msgid "Reset Filters" msgstr "Nulstil filtre" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:66 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:64 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:80 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:93 +#, python-format +msgid "%(placeholder)s" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:88 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:94 msgid "Search" msgstr "Søg" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:74 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:77 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:78 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:79 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:72 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:75 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:76 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:77 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:102 msgid "items" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/create.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/create.html:10 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/create.html:10 msgid "Create New Record" msgstr "Opret Ny Rekord" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:76 msgid "Select all records" msgstr "Marker alle poster" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:120 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:119 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:119 msgid "Select record" msgstr "Vælg post" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:186 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:195 msgid "Please select at least one record." msgstr "Vælg mindst én post." -#: ../flask_admin/templates/bootstrap2/admin/model/row_actions.html:34 -#: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 -msgid "Are you sure you want to delete this record?" -msgstr "Er du sikker på du vil slette denne post?" +#~ msgid "ObjectId equals" +#~ msgstr "" + +#~ msgid "Failed to get model. %(error)s" +#~ msgstr "Undladt at få model. %(error)s" + +#~ msgid "Tablib dependency not installed." +#~ msgstr "" + +#~ msgid "Size" +#~ msgstr "" + diff --git a/flask_admin/translations/de/LC_MESSAGES/admin.mo b/flask_admin/translations/de/LC_MESSAGES/admin.mo index 104566183401e00161d7029e327c9cce01847856..622816cc6f626343f8cf826ab1dd44196057f918 100644 GIT binary patch delta 1884 zcmYM!e@N7K9LMqZU6)pt=bbIHshy=++1cIo!`Trl(Gh4wIL3m76tX35{U9Q;;-a5K z?T_&-#)3vFF$$Tmlc2(q{wN|^usJO-q1yUEg|$CcQNf-s?gNQ;kMHOG{eC{5_viij ze(u21gUQrLIB?wf`;Jc$pZ#Oh`tbKG%S@r?I00W`5Z~cgoS1D^gJFzfBgU~E=V7<= z4%XAo8plV^;YVgEYvQ7UK&$hI%ndt_^s!s04nvrSBN)O_7x#_NJU0#*(DGb+7FN-& z!s)oyxf=ttPht-9TPGJ9_*X2z%UFs-sEOZT8EX0EP>wUO!L>J{COGEey*QKh5Ppnr zu>=cpGW`~#o?nA=nBR7AQHWhQ4f`+`Z#y5M2Ko<`P<Ucy1%;?BE5QgRQ3HR4{M#<R zrr===<0%(UV?OPEOlfZixKK%MJMW_6_tB3JQ3E`|$@tE-Lz6NSm!T?Bj~aLbYT{k) zzK1Jm_o6D{XLWjqN^_|{i?TQY?cGx38EZl%w9ff8YT`CjrS_mIaRQZC2dZB$YAdf` z6#v9Z^f8;ZG>Q>ih4XN8koqfulLYiOpFy>IPy=2>RpL78WxR>JclH<R`4Lnie<MY) zr>N&%yZg#U<7J`lhmqIGrn~r@l)JGAkNV7NUHcZVxK=jo97PS}Cs>QQsAIPpSKtv` zf&-YuAp5We8&DIT##z{d)i{VTOyyEn?cJxSm8?f~Xhm(wR@A9Dj9PhzyMGq76}_kx z|BefA5LMa<be7e~0k9S%H`|07Z!a=$%1&^RAkc?O;04acS1ummO`1=;3H97QoQvmB zE4YVo3^S^ZX&q|sTTu!9h&qlpTznLZX%|n`ac2LMTu=>Lhg8|Np&mGdO6W9due(vl z>o-&af1oP&9@#aEP!1MvaU^7)q2kR*j<y-Kg@;h%c^F`R`-uy^WIro_ov04KAVsiC zs00VF0w1F)lE;q)i?L;>3BN?GbPIlg$5DI!4AnoM9}y)~f%-l9gs+q`{+tV~ycM<g zJCT1oz?TN@KxKTv#rskHhEWN;L?twyUn6Z%4Jy%ZQ42VRm3S6)3I<UNeNaUGIVtv- zfJ*Zk{TQJBdfBp_d8iJBs4Xc$4OH&#C!9&-$XlJW$;H>Zb{lG*cC_U!Ew((J$j%R> zTXJ6c(ruHj`Mm1j_vwFvjlNJ~VKi0~O)QKg5=&w=m9e;28~SEUb6vf6CbZ0#^qz#a g1mcUUV(GQv?PJsL3)=nZBhwc6y{koCo>%<u|FzY*$p8QV delta 2097 zcmYM!YfM~47{>8oxm4Q1a#0rwg;StbT6W8&vI4b&wiJ_63Gv<pW!VEPY?m&(wPIqH z4^}>4Q{#p&HMZ7}D2W=At&NwoiIS)>F>2C!Yuacv(NtrNl9<LA{68|L1o)kI&Y78a z-kEcr={S5x>QYJ0oZ%<VUnPI@*@~|JG^{d4O@3UBP3Xn#n2UR`4g1lL&ten4iw*dz zwfqKSb`f`Do}R;-j7ga^7n^8Uuzs;}!(2o98gKqe2Oky@S79-3we4M~=X#I<O`na2 zF+d!{YJAap26Kon;u_{Rm$}fuzo8G8aRd5Tt}<=II_$)a=wc1d+V~CB1m|q~64ny? z){rcAU<E#6<Hu3`=dhaj&D&hm<JVY@p0&oT!%8f~ptTz{(EX^y;;5B8f!eyK(7|J< zgx*7b%?1A5j6Y)uF5C8!0_tB%Lp2xL;}+C_LF;zg-i038ccBL8L7jnpcq5M6_Gxs8 z)2J1mLXH0wDuG|@eGjYZC9W-`{wh(N1`YTeQUvo7YA;_y`j`(;iG6N8kDB;fRK>2M zDw5A2O0WpkuNKv>3AM$o=*Qi-1rK_uzxMhh4Gu0^f5ZmjTzV;?X4GllVdI^s3Hnf# z8$cbx5OQwK80z^1DzPb~>Sh}C+!1?!F2#i=c)>pK3UdC;DcgS5wts>%S(MVokFrdy zG-^$u#(5s^!sDpd@_X#T3ihEL!`Oi*@L^0{;6fALMm=xAJ28mE*oenbd-)k^C4Zov zzlPePZ2sx3DMzim33b06wKY3YD;~fW97a|4*orCh5f{8MW(i5wETaZ2;lya-&De~+ zs060*R-CczZ{k+sA8cGo=gq|3s0GAPAEcL2{mx+>{)2wK|21VRnf0OG+ow^7<W*dc zU!vaoC8Stp9m~=OD1f@(iArn$wdXGC^&3YeGK*TsX=L}zH%Rf!6)a<Zvutma@zS#h zQ;*uqPSk*VP^Y*bb=V%X@jle^kD(GfgcQ%r+V~`HB7O^1p^M0(O#vSf)?zkdN-N&M z#RC{Zoq=~y1Ad3fcnSG6xqM}m`36)4T2Xu5gSy|38aReZe8#pPLG@ceorSZgL_Vyf z{>tnU4cg;E>Zy#oupT3*6{T?tE}&kc^QekkM&4BO6RKi=p$D`1sOT`}S-q&|%TQaj z9yLx~)$R7w+6UW_Z;83v+HczjZ9ImWXsRl6C9fhUf5c5X`zOL~G;?)zfyaAqXv`f- z-V=7*_`$(wBJ=m!kF&BPPrB*%3y)S0hN6*>6Lt@{v9KE(nsQ<jNhcCZBnP8WHyp_9 z_3q6oZVLJvoBfSJr?IhJ*RAQ-i$>DE;?DF##qsQxz_!e%#fNgMy4}&JJL!bn$bP41 zBI?E%H{tXulV~E4Y4aWSlwMCJmP{O&j0}w?GiS=Tc~<S7Ts*ya!cG5PF<;*m8eN=^ gjYLMq-AK}@x$nOuYn+&#{y({hJDCim)0Kbz3xe_TyZ`_I diff --git a/flask_admin/translations/de/LC_MESSAGES/admin.po b/flask_admin/translations/de/LC_MESSAGES/admin.po index f129a83c7..32aae063e 100644 --- a/flask_admin/translations/de/LC_MESSAGES/admin.po +++ b/flask_admin/translations/de/LC_MESSAGES/admin.po @@ -1,275 +1,264 @@ + msgid "" msgstr "" -"Project-Id-Version: flask-admin\n" +"Project-Id-Version: flask-admin\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-02-07 00:17-0600\n" +"POT-Creation-Date: 2024-09-24 22:09+0100\n" "PO-Revision-Date: 2017-02-13 09:18-0500\n" "Last-Translator: mrjoes <serge.koval@gmail.com>\n" +"Language: de_DE\n" "Language-Team: German\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.1.1\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: flask-admin\n" -"X-Crowdin-Language: de\n" -"X-Crowdin-File: admin.pot\n" -"Language: de_DE\n" +"Generated-By: Babel 2.16.0\n" -#: ../flask_admin/base.py:440 +#: ../flask_admin/base.py:458 msgid "Home" msgstr "Start" -#: ../flask_admin/contrib/rediscli.py:127 +#: ../flask_admin/contrib/rediscli.py:113 msgid "Cli: Invalid command." msgstr "Kommandozeile: Ungültiger Befehl." -#: ../flask_admin/contrib/fileadmin/__init__.py:352 +#: ../flask_admin/contrib/fileadmin/__init__.py:376 msgid "File to upload" msgstr "Datei für Upload" -#: ../flask_admin/contrib/fileadmin/__init__.py:360 +#: ../flask_admin/contrib/fileadmin/__init__.py:384 msgid "File required." msgstr "Datei erforderlich." -#: ../flask_admin/contrib/fileadmin/__init__.py:365 +#: ../flask_admin/contrib/fileadmin/__init__.py:389 msgid "Invalid file type." msgstr "Ungültiges Dateiformat." -#: ../flask_admin/contrib/fileadmin/__init__.py:376 +#: ../flask_admin/contrib/fileadmin/__init__.py:400 msgid "Content" msgstr "Inhalt" -#: ../flask_admin/contrib/fileadmin/__init__.py:390 +#: ../flask_admin/contrib/fileadmin/__init__.py:414 msgid "Invalid name" msgstr "Ungültiger Name" -#: ../flask_admin/contrib/fileadmin/__init__.py:398 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:106 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:112 -#: ../flask_admin/tests/sqla/test_translation.py:17 +#: ../flask_admin/contrib/fileadmin/__init__.py:422 +#: ../flask_admin/tests/sqla/test_translation.py:21 msgid "Name" msgstr "Name" -#: ../flask_admin/contrib/fileadmin/__init__.py:757 +#: ../flask_admin/contrib/fileadmin/__init__.py:784 #, python-format msgid "File \"%(name)s\" already exists." msgstr "Datei \"%(name)s\" existiert bereits." -#: ../flask_admin/contrib/fileadmin/__init__.py:802 -#: ../flask_admin/contrib/fileadmin/__init__.py:885 -#: ../flask_admin/contrib/fileadmin/__init__.py:947 -#: ../flask_admin/contrib/fileadmin/__init__.py:1000 -#: ../flask_admin/contrib/fileadmin/__init__.py:1047 -#: ../flask_admin/contrib/fileadmin/__init__.py:1099 -#: ../flask_admin/model/base.py:2168 +#: ../flask_admin/contrib/fileadmin/__init__.py:829 +#: ../flask_admin/contrib/fileadmin/__init__.py:926 +#: ../flask_admin/contrib/fileadmin/__init__.py:988 +#: ../flask_admin/contrib/fileadmin/__init__.py:1041 +#: ../flask_admin/contrib/fileadmin/__init__.py:1088 +#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/model/base.py:2324 msgid "Permission denied." msgstr "Zugriff verweigert." -#: ../flask_admin/contrib/fileadmin/__init__.py:881 +#: ../flask_admin/contrib/fileadmin/__init__.py:922 msgid "File uploading is disabled." msgstr "Datei-Upload ist deaktiviert." -#: ../flask_admin/contrib/fileadmin/__init__.py:892 +#: ../flask_admin/contrib/fileadmin/__init__.py:933 #, python-format msgid "Successfully saved file: %(name)s" msgstr "Datei erfolgreich gespeichert: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:896 +#: ../flask_admin/contrib/fileadmin/__init__.py:937 #, python-format msgid "Failed to save file: %(error)s" msgstr "Speichern der Datei fehlgeschlagen: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:904 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:150 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:150 +#: ../flask_admin/contrib/fileadmin/__init__.py:945 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:150 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:152 msgid "Upload File" msgstr "Datei-Upload" -#: ../flask_admin/contrib/fileadmin/__init__.py:943 +#: ../flask_admin/contrib/fileadmin/__init__.py:984 msgid "Directory creation is disabled." msgstr "Erzeugen von Verzeichnissen ist deaktiviert." -#: ../flask_admin/contrib/fileadmin/__init__.py:956 +#: ../flask_admin/contrib/fileadmin/__init__.py:997 #, python-format msgid "Successfully created directory: %(directory)s" msgstr "Verzeichnis erfolgreich erstellt: %(directory)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:960 +#: ../flask_admin/contrib/fileadmin/__init__.py:1001 #, python-format msgid "Failed to create directory: %(error)s" msgstr "Erzeugen von Verzeichnis fehlgeschlagen: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:970 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:161 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:161 +#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:161 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:163 msgid "Create Directory" msgstr "Verzeichnis erstellen" -#: ../flask_admin/contrib/fileadmin/__init__.py:996 +#: ../flask_admin/contrib/fileadmin/__init__.py:1037 msgid "Deletion is disabled." msgstr "Löschen ist deaktiviert." -#: ../flask_admin/contrib/fileadmin/__init__.py:1005 +#: ../flask_admin/contrib/fileadmin/__init__.py:1046 msgid "Directory deletion is disabled." msgstr "Löschen von Verzeichnissen ist deaktiviert." -#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/contrib/fileadmin/__init__.py:1052 #, python-format msgid "Directory \"%(path)s\" was successfully deleted." msgstr "Verzeichnis \"%(path)s\" wurde erfolgreich gelöscht." -#: ../flask_admin/contrib/fileadmin/__init__.py:1013 +#: ../flask_admin/contrib/fileadmin/__init__.py:1054 #, python-format msgid "Failed to delete directory: %(error)s" msgstr "Löschen von Verzeichnis fehlgeschlagen: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1019 -#: ../flask_admin/contrib/fileadmin/__init__.py:1176 +#: ../flask_admin/contrib/fileadmin/__init__.py:1060 +#: ../flask_admin/contrib/fileadmin/__init__.py:1215 #, python-format msgid "File \"%(name)s\" was successfully deleted." msgstr "Datei \"%(name)s\" wurde erfolgreich gelöscht." -#: ../flask_admin/contrib/fileadmin/__init__.py:1021 -#: ../flask_admin/contrib/fileadmin/__init__.py:1178 +#: ../flask_admin/contrib/fileadmin/__init__.py:1062 +#: ../flask_admin/contrib/fileadmin/__init__.py:1217 #, python-format msgid "Failed to delete file: %(name)s" msgstr "Löschen der Datei %(name)s fehlgeschlagen" -#: ../flask_admin/contrib/fileadmin/__init__.py:1043 +#: ../flask_admin/contrib/fileadmin/__init__.py:1084 msgid "Renaming is disabled." msgstr "Umbenennen ist deaktiviert." -#: ../flask_admin/contrib/fileadmin/__init__.py:1051 +#: ../flask_admin/contrib/fileadmin/__init__.py:1092 msgid "Path does not exist." msgstr "Pfad existiert nicht." -#: ../flask_admin/contrib/fileadmin/__init__.py:1061 +#: ../flask_admin/contrib/fileadmin/__init__.py:1102 #, python-format msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\"" msgstr "\"%(src)s\" wurde erfolgreich in \"%(dst)s\" umbenannt" -#: ../flask_admin/contrib/fileadmin/__init__.py:1064 +#: ../flask_admin/contrib/fileadmin/__init__.py:1105 #, python-format msgid "Failed to rename: %(error)s" msgstr "Umbenennen fehlgeschlagen: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1078 +#: ../flask_admin/contrib/fileadmin/__init__.py:1119 #, python-format msgid "Rename %(name)s" msgstr "%(name)s umbenennen" -#: ../flask_admin/contrib/fileadmin/__init__.py:1115 +#: ../flask_admin/contrib/fileadmin/__init__.py:1155 #, python-format msgid "Error saving changes to %(name)s." msgstr "Fehler beim Speichern von Änderungen an %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1119 +#: ../flask_admin/contrib/fileadmin/__init__.py:1159 #, python-format msgid "Changes to %(name)s saved successfully." msgstr "Änderungen an %(name)s erfolgreich gespeichert." -#: ../flask_admin/contrib/fileadmin/__init__.py:1128 +#: ../flask_admin/contrib/fileadmin/__init__.py:1167 #, python-format msgid "Error reading %(name)s." msgstr "Fehler beim Einlesen von %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1131 -#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/contrib/fileadmin/__init__.py:1170 +#: ../flask_admin/contrib/fileadmin/__init__.py:1179 #, python-format msgid "Unexpected error while reading from %(name)s" msgstr "Unerwarteter Fehler beim Lesen von %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1137 +#: ../flask_admin/contrib/fileadmin/__init__.py:1176 #, python-format msgid "Cannot edit %(name)s." msgstr "%(name)s kann nicht bearbeitet werden." -#: ../flask_admin/contrib/fileadmin/__init__.py:1155 +#: ../flask_admin/contrib/fileadmin/__init__.py:1194 #, python-format msgid "Editing %(path)s" msgstr "Bearbeiten von %(path)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/peewee/view.py:487 -#: ../flask_admin/contrib/pymongo/view.py:384 -#: ../flask_admin/contrib/sqla/view.py:1149 +#: ../flask_admin/contrib/fileadmin/__init__.py:1202 +#: ../flask_admin/contrib/peewee/view.py:510 +#: ../flask_admin/contrib/pymongo/view.py:385 +#: ../flask_admin/contrib/sqla/view.py:1241 msgid "Delete" msgstr "Löschen" -#: ../flask_admin/contrib/fileadmin/__init__.py:1164 +#: ../flask_admin/contrib/fileadmin/__init__.py:1203 msgid "Are you sure you want to delete these files?" msgstr "Sind Sie sicher, dass Sie diese Dateien löschen möchten?" -#: ../flask_admin/contrib/fileadmin/__init__.py:1167 +#: ../flask_admin/contrib/fileadmin/__init__.py:1206 msgid "File deletion is disabled." msgstr "Löschen von Dateien ist deaktiviert." -#: ../flask_admin/contrib/fileadmin/__init__.py:1180 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:22 +#: ../flask_admin/contrib/fileadmin/__init__.py:1219 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:22 msgid "Edit" msgstr "Bearbeiten" -#: ../flask_admin/contrib/fileadmin/s3.py:153 +#: ../flask_admin/contrib/fileadmin/s3.py:162 msgid "Cannot operate on non empty directories" msgstr "Operieren in nicht-leeren Verzeichnissen nicht möglich" #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 -#: ../flask_admin/contrib/sqla/filters.py:41 +#: ../flask_admin/contrib/sqla/filters.py:42 msgid "equals" msgstr "gleich" #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 -#: ../flask_admin/contrib/sqla/filters.py:49 +#: ../flask_admin/contrib/sqla/filters.py:50 msgid "not equal" msgstr "ungleich" #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 -#: ../flask_admin/contrib/sqla/filters.py:58 +#: ../flask_admin/contrib/sqla/filters.py:59 msgid "contains" msgstr "enthält" #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 -#: ../flask_admin/contrib/sqla/filters.py:67 +#: ../flask_admin/contrib/sqla/filters.py:68 msgid "not contains" msgstr "enthält nicht" #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 -#: ../flask_admin/contrib/sqla/filters.py:75 +#: ../flask_admin/contrib/sqla/filters.py:76 msgid "greater than" msgstr "größer als" #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 -#: ../flask_admin/contrib/sqla/filters.py:83 +#: ../flask_admin/contrib/sqla/filters.py:84 msgid "smaller than" msgstr "kleiner als" #: ../flask_admin/contrib/peewee/filters.py:88 -#: ../flask_admin/contrib/sqla/filters.py:94 +#: ../flask_admin/contrib/sqla/filters.py:95 msgid "empty" msgstr "leer" #: ../flask_admin/contrib/peewee/filters.py:102 -#: ../flask_admin/contrib/sqla/filters.py:108 +#: ../flask_admin/contrib/sqla/filters.py:109 msgid "in list" msgstr "in Liste" #: ../flask_admin/contrib/peewee/filters.py:111 -#: ../flask_admin/contrib/sqla/filters.py:118 +#: ../flask_admin/contrib/sqla/filters.py:119 msgid "not in list" msgstr "nicht in Liste" @@ -282,84 +271,85 @@ msgstr "nicht in Liste" msgid "not between" msgstr "nicht zwischen" -msgid "ObjectId equals" -msgstr "ObjectId entspricht" - -#, python-format -msgid "Failed to get model. %(error)s" -msgstr "Fehler beim Holen des Modells. %(error)s" - -#: ../flask_admin/contrib/peewee/view.py:435 -#: ../flask_admin/contrib/pymongo/view.py:316 -#: ../flask_admin/contrib/sqla/view.py:1078 +#: ../flask_admin/contrib/peewee/view.py:458 +#: ../flask_admin/contrib/pymongo/view.py:317 +#: ../flask_admin/contrib/sqla/view.py:1170 #, python-format msgid "Failed to create record. %(error)s" msgstr "Erstellen von Eintrag fehlgeschlagen: %(error)s" -#: ../flask_admin/contrib/peewee/view.py:454 -#: ../flask_admin/contrib/pymongo/view.py:341 -#: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 -#: ../flask_admin/model/base.py:2313 ../flask_admin/model/base.py:2315 +#: ../flask_admin/contrib/peewee/view.py:477 +#: ../flask_admin/contrib/pymongo/view.py:342 +#: ../flask_admin/contrib/sqla/view.py:1196 ../flask_admin/model/base.py:2463 +#: ../flask_admin/model/base.py:2471 ../flask_admin/model/base.py:2473 #, python-format msgid "Failed to update record. %(error)s" msgstr "Aktualisieren von Eintrag fehlgeschlagen: %(error)s" -#: ../flask_admin/contrib/peewee/view.py:469 -#: ../flask_admin/contrib/pymongo/view.py:366 -#: ../flask_admin/contrib/sqla/view.py:1129 +#: ../flask_admin/contrib/peewee/view.py:492 +#: ../flask_admin/contrib/pymongo/view.py:367 +#: ../flask_admin/contrib/sqla/view.py:1221 #, python-format msgid "Failed to delete record. %(error)s" msgstr "Eintrag konnte nicht gelöscht werden: %(error)s" -#: ../flask_admin/contrib/peewee/view.py:488 -#: ../flask_admin/contrib/pymongo/view.py:385 -#: ../flask_admin/contrib/sqla/view.py:1150 +#: ../flask_admin/contrib/peewee/view.py:511 +#: ../flask_admin/contrib/pymongo/view.py:386 +#: ../flask_admin/contrib/sqla/view.py:1242 msgid "Are you sure you want to delete selected records?" msgstr "Sind Sie sicher, dass Sie die ausgewählten Einträge löschen möchten?" -#: ../flask_admin/contrib/peewee/view.py:505 -#: ../flask_admin/contrib/pymongo/view.py:395 -#: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 +#: ../flask_admin/contrib/peewee/view.py:528 +#: ../flask_admin/contrib/pymongo/view.py:396 +#: ../flask_admin/contrib/sqla/view.py:1258 ../flask_admin/model/base.py:2272 #, python-format msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." msgstr[0] "Eintrag wurde erfolgreich gelöscht." msgstr[1] "%(count)s Einträge wurden erfolgreich gelöscht." -#: ../flask_admin/contrib/peewee/view.py:511 -#: ../flask_admin/contrib/pymongo/view.py:400 -#: ../flask_admin/contrib/sqla/view.py:1174 +#: ../flask_admin/contrib/peewee/view.py:534 +#: ../flask_admin/contrib/pymongo/view.py:401 +#: ../flask_admin/contrib/sqla/view.py:1266 #, python-format msgid "Failed to delete records. %(error)s" msgstr "Löschen von Einträgen fehlgeschlagen: %(error)s" -#: ../flask_admin/contrib/sqla/fields.py:126 -#: ../flask_admin/contrib/sqla/fields.py:176 -#: ../flask_admin/contrib/sqla/fields.py:181 ../flask_admin/model/fields.py:173 -#: ../flask_admin/model/fields.py:222 +#: ../flask_admin/contrib/sqla/fields.py:117 +#: ../flask_admin/contrib/sqla/fields.py:167 +#: ../flask_admin/contrib/sqla/fields.py:172 ../flask_admin/model/fields.py:174 +#: ../flask_admin/model/fields.py:223 msgid "Not a valid choice" msgstr "Keine gültige Auswahl" -#: ../flask_admin/contrib/sqla/fields.py:186 +#: ../flask_admin/contrib/sqla/fields.py:201 msgid "Key" msgstr "Eigenschaft" -#: ../flask_admin/contrib/sqla/fields.py:187 +#: ../flask_admin/contrib/sqla/fields.py:202 msgid "Value" msgstr "Wert" -#: ../flask_admin/contrib/sqla/validators.py:42 +#: ../flask_admin/contrib/sqla/validators.py:28 msgid "Already exists." msgstr "Existiert bereits." -#: ../flask_admin/contrib/sqla/validators.py:60 +#: ../flask_admin/contrib/sqla/validators.py:59 #, python-format msgid "At least %(num)d item is required" msgid_plural "At least %(num)d items are required" msgstr[0] "Mindestens %(num)d Element ist erforderlich" msgstr[1] "Mindestens %(num)d Elemente sind erforderlich" -#: ../flask_admin/contrib/sqla/view.py:1057 +#: ../flask_admin/contrib/sqla/validators.py:75 +msgid "Not a valid ISO currency code (e.g. USD, EUR, CNY)." +msgstr "" + +#: ../flask_admin/contrib/sqla/validators.py:83 +msgid "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." +msgstr "" + +#: ../flask_admin/contrib/sqla/view.py:1134 #, python-format msgid "Integrity error. %(message)s" msgstr "Integritätsfehler. %(message)s" @@ -368,274 +358,242 @@ msgstr "Integritätsfehler. %(message)s" msgid "Invalid time format" msgstr "Ungültiges Zeitformat" -#: ../flask_admin/form/fields.py:144 +#: ../flask_admin/form/fields.py:147 msgid "Invalid Choice: could not coerce" msgstr "Ungültige Auswahl: Konnte nicht umwandeln" -#: ../flask_admin/form/fields.py:208 +#: ../flask_admin/form/fields.py:221 msgid "Invalid JSON" msgstr "Ungültiges JSON" -#: ../flask_admin/form/upload.py:207 +#: ../flask_admin/form/upload.py:216 msgid "Invalid file extension" msgstr "Ungültiger Dateityp" -#: ../flask_admin/form/upload.py:214 ../flask_admin/form/upload.py:281 +#: ../flask_admin/form/upload.py:223 ../flask_admin/form/upload.py:293 #, python-format msgid "File \"%s\" already exists." msgstr "Datei \"%s\" existiert bereits." -#: ../flask_admin/model/base.py:1649 +#: ../flask_admin/form/validators.py:16 +msgid "This field requires at least one item." +msgstr "" + +#: ../flask_admin/model/base.py:1737 msgid "There are no items in the table." msgstr "Die Tabelle ist leer." -#: ../flask_admin/model/base.py:1673 +#: ../flask_admin/model/base.py:1746 #, python-format msgid "Invalid Filter Value: %(value)s" msgstr "Ungültiger Filter-Wert: %(value)s" -#: ../flask_admin/model/base.py:1984 +#: ../flask_admin/model/base.py:2136 msgid "Record was successfully created." msgstr "Eintrag wurde erfolgreich erstellt." -#: ../flask_admin/model/base.py:2028 ../flask_admin/model/base.py:2080 -#: ../flask_admin/model/base.py:2113 ../flask_admin/model/base.py:2297 +#: ../flask_admin/model/base.py:2180 ../flask_admin/model/base.py:2232 +#: ../flask_admin/model/base.py:2265 ../flask_admin/model/base.py:2455 msgid "Record does not exist." msgstr "Eintrag existiert nicht." -#: ../flask_admin/model/base.py:2037 ../flask_admin/model/base.py:2301 +#: ../flask_admin/model/base.py:2189 ../flask_admin/model/base.py:2459 msgid "Record was successfully saved." msgstr "Eintrag wurde erfolgreich gespeichert." -#: ../flask_admin/model/base.py:2222 -msgid "Tablib dependency not installed." -msgstr "Abhängigkeit \"Tablib\" nicht installiert." - -#: ../flask_admin/model/base.py:2249 +#: ../flask_admin/model/base.py:2407 #, python-format msgid "Export type \"%(type)s not supported." msgstr "Export-Typ \"%(type)s nicht unterstützt." -#: ../flask_admin/model/filters.py:103 ../flask_admin/model/widgets.py:111 +#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:119 msgid "Yes" msgstr "Ja" -#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:110 +#: ../flask_admin/model/filters.py:105 ../flask_admin/model/widgets.py:118 msgid "No" msgstr "Nein" -#: ../flask_admin/model/filters.py:172 ../flask_admin/model/filters.py:212 -#: ../flask_admin/model/filters.py:257 +#: ../flask_admin/model/filters.py:173 ../flask_admin/model/filters.py:213 +#: ../flask_admin/model/filters.py:258 msgid "between" msgstr "zwischen" -#: ../flask_admin/model/template.py:81 ../flask_admin/model/template.py:88 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:37 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:8 +#: ../flask_admin/model/template.py:83 ../flask_admin/model/template.py:90 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:7 msgid "View Record" msgstr "Eintrag ansehen" -#: ../flask_admin/model/template.py:95 ../flask_admin/model/template.py:102 -#: ../flask_admin/model/template.py:109 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/edit.html:11 +#: ../flask_admin/model/template.py:97 ../flask_admin/model/template.py:104 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/edit.html:10 msgid "Edit Record" msgstr "Eintrag bearbeiten" -#: ../flask_admin/model/widgets.py:61 +#: ../flask_admin/model/template.py:111 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Delete Record" +msgstr "" + +#: ../flask_admin/model/widgets.py:62 msgid "Please select model" msgstr "Bitte Modell auswählen" -#: ../flask_admin/templates/bootstrap2/admin/actions.html:4 -#: ../flask_admin/templates/bootstrap3/admin/actions.html:4 +#: ../flask_admin/templates/bootstrap4/admin/actions.html:5 msgid "With selected" msgstr "Mit Auswahl" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:200 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:190 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:216 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:227 msgid "Save" msgstr "Speichern" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:205 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:195 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:221 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:232 msgid "Cancel" msgstr "Abbrechen" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:256 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:247 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:290 msgid "Save and Add Another" msgstr "Speichern und neuer Eintrag" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:259 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:250 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:293 msgid "Save and Continue Editing" msgstr "Speichern und Fortfahren" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:9 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:9 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:10 msgid "Root" msgstr "Wurzelverzeichnis" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:90 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:99 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:89 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:98 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:42 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:51 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:89 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:98 #, python-format msgid "Sort by %(name)s" msgstr "Nach %(name)s sortieren" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:77 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:79 msgid "Rename File" msgstr "Datei umbenennen" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:88 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:88 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:90 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\' recursively?" msgstr "Sind Sie sicher, dass Sie \\'%(name)s\\' rekursiv löschen möchten?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:97 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:97 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:99 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\'?" msgstr "Sind Sie sicher, dass Sie \\'%(name)s\\' löschen möchten?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:125 -msgid "Size" -msgstr "Größe" - -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:185 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:187 msgid "Please select at least one file." msgstr "Bitte mindestens eine Datei auswählen." -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:8 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:17 msgid "List" msgstr "Liste" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:12 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:18 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 msgid "Create" msgstr "Erstellen" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:26 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:26 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:21 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:26 msgid "Details" msgstr "Details" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:29 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:28 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:15 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:28 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:15 msgid "Filter" msgstr "Filter" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:13 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:14 msgid "Delete?" msgstr "Löschen?" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:33 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:16 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:35 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Are you sure you want to delete this record?" +msgstr "Sind Sie sicher, dass Sie diesen Eintrag löschen möchten?" + +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:33 msgid "New" msgstr "Neu" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:43 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:43 msgid "Add" msgstr "Hinzufügen:" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:3 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:3 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:2 msgid "Add Filter" msgstr "Filter hinzufügen" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:30 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:19 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:26 msgid "Export" msgstr "Export" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:38 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:38 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:49 msgid "Apply" msgstr "Übernehmen" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:40 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:51 msgid "Reset Filters" msgstr "Filter zurücksetzen" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:66 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:64 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:80 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:93 +#, python-format +msgid "%(placeholder)s" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:88 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:94 msgid "Search" msgstr "Suche" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:74 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:77 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:78 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:79 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:72 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:75 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:76 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:77 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:102 msgid "items" msgstr "Elemente" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/create.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/create.html:10 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/create.html:10 msgid "Create New Record" msgstr "Neuen Eintrag erstellen" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:76 msgid "Select all records" msgstr "Alle Datensätze auswählen" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:120 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:119 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:119 msgid "Select record" msgstr "Datensatz auswählen" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:186 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:195 msgid "Please select at least one record." msgstr "Bitte wählen Sie mindestens einen Eintrag aus." -#: ../flask_admin/templates/bootstrap2/admin/model/row_actions.html:34 -#: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 -msgid "Are you sure you want to delete this record?" -msgstr "Sind Sie sicher, dass Sie diesen Eintrag löschen möchten?" +#~ msgid "ObjectId equals" +#~ msgstr "ObjectId entspricht" + +#~ msgid "Failed to get model. %(error)s" +#~ msgstr "Fehler beim Holen des Modells. %(error)s" + +#~ msgid "Tablib dependency not installed." +#~ msgstr "Abhängigkeit \"Tablib\" nicht installiert." + +#~ msgid "Size" +#~ msgstr "Größe" + diff --git a/flask_admin/translations/el/LC_MESSAGES/admin.mo b/flask_admin/translations/el/LC_MESSAGES/admin.mo index f7215339817976e0470eb9d312931e3ec5b91f58..ad3a5cd59aeed4a42566cbe4c9e5c83ab887866e 100644 GIT binary patch delta 1869 zcmYM!e@v8h9Ki9<ai9hw9P&d>gF84xIgaj5*M(Uqp_rgj!AM528&DpFL^((^&&oMB zm4=T|Q?|DJgXI>CJ#G1`v05c-_0Zf}H7Q-rLfP_<3YY)X`@=n3x4Y-{{d{<y@6XS} zow~u=_%B(>?+Bmg_^seq@6_o3&;A7>ntB~m@eRztW0-=&ScxBC0H-m8sS8EQalLH} zHxUmZx5zZ+h{WXvjZzZ-Bog9XBtlans5e$&CT>O-Hrx3a>U}RE9m%V9Jb)F%Ls*Dk z+TO%u;*|SD(l8Y>8DDZ~<dG;vFIJ%r9K{mcg+(}E$K$9S|6u3uVllCs?OBeGVga_G zKDQV3{$X5=moOiHLpS5kPiF}%XIg3*YDbl*6KO)7c`ND>MbU!?P&<Af7vlux;y0Lu zH|+czE+uwyllGHmy8`1$B)l~A0Uu^##E$FHL)?bCl7pxNoU!v4a2xSe)D^EzPt?X1 zWK4M)^=LYfuk7QZ6F6dfJe~d50Z)+7Eg3;w@n@(Lnnb>Gm5bKEEezm2^y4bFOOLD( zJ=llk_%7-MzOelcc|@jBi}^Nc?fkKX{iiNuj)Ye8zo-*Pp~P8~EJnRCAGJfToev<# zF6-=kjh%16qYja0aDKvE^oZ`E?wp$n)_e%NusTkoiN;6Rk4~1|j;~=1uc5v+k8^<3 zi@c3%@D%EE7T%9OwowPDM%~e!T(sDBV+Fp4I`Cy=DESdLVEi_XWi<R8R6W*UGY;ZY zcnh`TN4S(?BkGFwqYf~PJMb%H^CXv7sRm1MJ$B&+9KmXwL0yoaK`}19G;~FuU@gv~ z-nfQ>(0m_m!Lz7m|0n8zUU#A>d(lUH5}&~Hs7IH^E2Kxe48!Qf7HmZAXAE=o{r{Op zh{Rv0TeXsROkcAmE?U(uqi+46?J#PMj39H7Q7pqroSz_WBldDGI?*0ng%kJ~&fsAz zr}K@BFD4D$(!WuwIfq~~Mlgs6P**aBoR*x!2!4yYl_{RY+fs)Q5I>9jNd|Bwj$#vj zk9Fv0kgeE{@hTdh)7XhgMTuf+MeSf8>IzSxuJ~irt-Xj^Op~Y+`w6K-`4!njnL{nI zEdDKO-iI8!JcL>!4R+jC%*&+%^cS0D3lBQXD~onJjLy{SW=GnTqp&{q${yJs?e3KA zJ$(0gqMp9!i?I$*`>vi?d#BNr-fhmN*E)<y#&P3jMvJj2v%xr>Iphkj4FoF#;kBM{ zcwMm49}F4QuIHU?wNDx!x~d!x8#Aun<j{i^L9;dM_ayU$oMxv{kymam&EM-Vzjj}C z=2)k#v8lJF4q4-39kV{QCag==xG`E#WLz(}Yt9zlNiwe$Wjl;)-#O!o@2v4=N%wyn Cu;ZZs delta 2390 zcma*nYiyHM7{Kw<bsLV2b+AD}2RmyS7v0J(${eC>j$M@7kWCQ@rdwZ^j;`(24k*!# z7zN@bKwhVb#srN)1sNYoM8J)JA0R|KG!hI15kmqADk#LjC;UI|B!19DmbSlhp7%Ys z=bW=0P1hFn|2QFiK=IeZw~+5gPO1I#S2{*136<ektUwpe#|&JIHTV>k;Tu?ihp-fX zF;2NhsRrtem?`h!M5X$bO<^X1PmSM>K2W!jw#t<?+Q5x@)TiNioMYm3DDO2R9jX>n ze*t~e!&rpx8;3BR`gzP|eDyO0>G(Hv;~gwUH_Mfo*5Guk#S*m8gRh(VAj$yWoA^!i zQg>%FS$qWV!&Rof4yFA77BRm1g2HV40jFSEj#BqxA?9MWu@R-CHk66=psZvA%GSMv z8s9~k&|&1G&haw|uiyl{W8xFWk^g)GMHFO@t57<uHqJNkI!q(pfYL!T${BbL3vjK8 zZ$eGoMp@y0l>X14OyH_{p2n({Q1|ANe@Rgf0qJl%k_5FAWiLNN+NfhF6FX%*jWY0A zl#E?N$w(HR$OQ9H+IdmhRiJF~Tr9&Td;t4g<X`ss0|FYqGG4+`>KU|>300z;_Qy<p zA<6(PD4AP>atPazbE~>g-jAV7EP-TQZ9;kPP4j%9pMnhVo_XP8<ov1qCO&N9Cvmfb zR3aa>hGohgM^I9`4JEz{yYK+Ep@;mh#|_wl*D;8#q))D6|1bp(tV$=}Rp`Q*SdY@d zTAYeUQ3kqzlKMYU4sA9;A3lUKfdI<&?892zf|KzCF2;-a4EnfgE9Cxfra(-cMH%>a zl$A}Pl?+gW%di94W|hS0cnlZfWt@+t9E4g7;^Vj*Wre>QtGH5+Qcs{P^Z+)={l7{< z8dPz&<iR>@#@#4~<p#<Gin(JR>_M5pTeut#qU>!pX_CF4jFni7tFRTNpM59`J&*Dq z@+SHiU(MhO(1&V6xedMi$f4SSvNZ$7ohH5q<xuTI7N<T(&Z|0w_v23}17?%PC0K*9 zfGwDhXK)r?#r}E<1)9T!E3pnQAkS1WSA&nL<EIfjupD=ztn?hpS-6DNcpD|<6{Lyt zr`F>fd<~_)LnznrEY83S9`fHtA=9hWB3zA6;wPx_1}?w?^8GBfB3V;|DA((2l#ahc z$;2NhnaL>`-I9EiL#a_FT!E5-dC0D+r6muKp4Kh`83bN5FT9MLL-jVwp&K;yA(Vkm zmn1i4ZgR}<hr^M$jzq0qf85fMunzOJx}))g4g`Cxj(DUuXvLDZ#zY;{8#Y8Ey>T5+ zL@n(pnI+DS(IBp4eNlO21$=gA*2Sz&E3UgE0V`zZj-8Zj9y{U~zsO3c#lcuyE%kR> zYN@r});Vt1vi2^9cp{*!o<4slX3x#(&Tk1>{+Oj>R)|NV-6TKEX?8e+8!h|FxNSxL z_E4~02dt<S4p`xi#NRUrhGTJmC?qrJ%U$jChx+VP?uv|H-0F_m+V#%(it4iR%Chom zU0yy<%5&`#u1>o$Z-L#L*W;}6J(#?lcR6il{aq&HoBWkd?_DIs-Zs&fT<%Ud^x@Rt z$kx;WJ@QKG$jGZY^=0ZvYKY3-)L{wu?C0Ink|!r0cRI<Hy}i)wlq~Hk^!zJJ#|v-$ oXO@PiUQbJ3L7I|#^+bnm{l7#VEk2m>G?}vOglCUQmDd~o3o*TPqyPW_ diff --git a/flask_admin/translations/el/LC_MESSAGES/admin.po b/flask_admin/translations/el/LC_MESSAGES/admin.po index 825634517..81c83df92 100644 --- a/flask_admin/translations/el/LC_MESSAGES/admin.po +++ b/flask_admin/translations/el/LC_MESSAGES/admin.po @@ -1,275 +1,264 @@ + msgid "" msgstr "" -"Project-Id-Version: flask-admin\n" +"Project-Id-Version: flask-admin\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-02-07 00:17-0600\n" +"POT-Creation-Date: 2024-09-24 22:09+0100\n" "PO-Revision-Date: 2017-02-07 01:19-0500\n" "Last-Translator: mrjoes <serge.koval@gmail.com>\n" +"Language: el_GR\n" "Language-Team: Greek\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.1.1\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: flask-admin\n" -"X-Crowdin-Language: el\n" -"X-Crowdin-File: admin.pot\n" -"Language: el_GR\n" +"Generated-By: Babel 2.16.0\n" -#: ../flask_admin/base.py:440 +#: ../flask_admin/base.py:458 msgid "Home" msgstr "Αρχή" -#: ../flask_admin/contrib/rediscli.py:127 +#: ../flask_admin/contrib/rediscli.py:113 msgid "Cli: Invalid command." msgstr "CLI: Άκυρη εντολή." -#: ../flask_admin/contrib/fileadmin/__init__.py:352 +#: ../flask_admin/contrib/fileadmin/__init__.py:376 msgid "File to upload" msgstr "Αρχείο για ανέβασμα" -#: ../flask_admin/contrib/fileadmin/__init__.py:360 +#: ../flask_admin/contrib/fileadmin/__init__.py:384 msgid "File required." msgstr "Απαιτείται αρχείο." -#: ../flask_admin/contrib/fileadmin/__init__.py:365 +#: ../flask_admin/contrib/fileadmin/__init__.py:389 msgid "Invalid file type." msgstr "Μη έγκυρος τύπος αρχείου." -#: ../flask_admin/contrib/fileadmin/__init__.py:376 +#: ../flask_admin/contrib/fileadmin/__init__.py:400 msgid "Content" msgstr "Περιεχόμενο" -#: ../flask_admin/contrib/fileadmin/__init__.py:390 +#: ../flask_admin/contrib/fileadmin/__init__.py:414 msgid "Invalid name" msgstr "Μη έγκυρο όνομα" -#: ../flask_admin/contrib/fileadmin/__init__.py:398 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:106 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:112 -#: ../flask_admin/tests/sqla/test_translation.py:17 +#: ../flask_admin/contrib/fileadmin/__init__.py:422 +#: ../flask_admin/tests/sqla/test_translation.py:21 msgid "Name" msgstr "Όνομα" -#: ../flask_admin/contrib/fileadmin/__init__.py:757 +#: ../flask_admin/contrib/fileadmin/__init__.py:784 #, python-format msgid "File \"%(name)s\" already exists." msgstr "Το αρχείο \"%(name)s\" υπάρχει ήδη." -#: ../flask_admin/contrib/fileadmin/__init__.py:802 -#: ../flask_admin/contrib/fileadmin/__init__.py:885 -#: ../flask_admin/contrib/fileadmin/__init__.py:947 -#: ../flask_admin/contrib/fileadmin/__init__.py:1000 -#: ../flask_admin/contrib/fileadmin/__init__.py:1047 -#: ../flask_admin/contrib/fileadmin/__init__.py:1099 -#: ../flask_admin/model/base.py:2168 +#: ../flask_admin/contrib/fileadmin/__init__.py:829 +#: ../flask_admin/contrib/fileadmin/__init__.py:926 +#: ../flask_admin/contrib/fileadmin/__init__.py:988 +#: ../flask_admin/contrib/fileadmin/__init__.py:1041 +#: ../flask_admin/contrib/fileadmin/__init__.py:1088 +#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/model/base.py:2324 msgid "Permission denied." msgstr "Απαγορευεται η προσβαση." -#: ../flask_admin/contrib/fileadmin/__init__.py:881 +#: ../flask_admin/contrib/fileadmin/__init__.py:922 msgid "File uploading is disabled." msgstr "Το ανέβασμα αρχείων είναι απενεργοποιημένο." -#: ../flask_admin/contrib/fileadmin/__init__.py:892 +#: ../flask_admin/contrib/fileadmin/__init__.py:933 #, python-format msgid "Successfully saved file: %(name)s" msgstr "Το αρχείο: %(name)s αποθηκεύτηκε με επιτυχία" -#: ../flask_admin/contrib/fileadmin/__init__.py:896 +#: ../flask_admin/contrib/fileadmin/__init__.py:937 #, python-format msgid "Failed to save file: %(error)s" msgstr "Η αποθήκευση του αρχείου απέτυχε: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:904 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:150 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:150 +#: ../flask_admin/contrib/fileadmin/__init__.py:945 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:150 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:152 msgid "Upload File" msgstr "Ανεβάστε αρχείο" -#: ../flask_admin/contrib/fileadmin/__init__.py:943 +#: ../flask_admin/contrib/fileadmin/__init__.py:984 msgid "Directory creation is disabled." msgstr "Η δημιουργία καταλόγου είναι απενεργοποιημένη." -#: ../flask_admin/contrib/fileadmin/__init__.py:956 +#: ../flask_admin/contrib/fileadmin/__init__.py:997 #, python-format msgid "Successfully created directory: %(directory)s" msgstr "Ο κατάλογος δημιουργήθηκε με επιτυχία: %(directory)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:960 +#: ../flask_admin/contrib/fileadmin/__init__.py:1001 #, python-format msgid "Failed to create directory: %(error)s" msgstr "Η δημιουργία καταλόγου απέτυχε: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:970 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:161 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:161 +#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:161 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:163 msgid "Create Directory" msgstr "Δημιουργήστε κατάλογο" -#: ../flask_admin/contrib/fileadmin/__init__.py:996 +#: ../flask_admin/contrib/fileadmin/__init__.py:1037 msgid "Deletion is disabled." msgstr "Η διαγραφή είναι απενεργοποιημένη." -#: ../flask_admin/contrib/fileadmin/__init__.py:1005 +#: ../flask_admin/contrib/fileadmin/__init__.py:1046 msgid "Directory deletion is disabled." msgstr "Η διαγραφή καταλόγου είναι απενεργοποιημένη." -#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/contrib/fileadmin/__init__.py:1052 #, python-format msgid "Directory \"%(path)s\" was successfully deleted." msgstr "Ο κατάλογος \"%(path)s\" διαγράφηκε με επιτυχία." -#: ../flask_admin/contrib/fileadmin/__init__.py:1013 +#: ../flask_admin/contrib/fileadmin/__init__.py:1054 #, python-format msgid "Failed to delete directory: %(error)s" msgstr "Απέτυχε η διαγραφή καταλόγου: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1019 -#: ../flask_admin/contrib/fileadmin/__init__.py:1176 +#: ../flask_admin/contrib/fileadmin/__init__.py:1060 +#: ../flask_admin/contrib/fileadmin/__init__.py:1215 #, python-format msgid "File \"%(name)s\" was successfully deleted." msgstr "Το αρχείο \"%(name)s\" διαγράφηκε με επιτυχία." -#: ../flask_admin/contrib/fileadmin/__init__.py:1021 -#: ../flask_admin/contrib/fileadmin/__init__.py:1178 +#: ../flask_admin/contrib/fileadmin/__init__.py:1062 +#: ../flask_admin/contrib/fileadmin/__init__.py:1217 #, python-format msgid "Failed to delete file: %(name)s" msgstr "Απέτυχε η διαγραφή του αρχείου: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1043 +#: ../flask_admin/contrib/fileadmin/__init__.py:1084 msgid "Renaming is disabled." msgstr "Η μετονομασία είναι απενεργοποιημένη." -#: ../flask_admin/contrib/fileadmin/__init__.py:1051 +#: ../flask_admin/contrib/fileadmin/__init__.py:1092 msgid "Path does not exist." msgstr "Η διαδρομή δεν υπάρχει." -#: ../flask_admin/contrib/fileadmin/__init__.py:1061 +#: ../flask_admin/contrib/fileadmin/__init__.py:1102 #, python-format msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\"" msgstr "Μετονομάστηκε επιτυχώς από \"%(src)s\" σε \"%(dst)s\"" -#: ../flask_admin/contrib/fileadmin/__init__.py:1064 +#: ../flask_admin/contrib/fileadmin/__init__.py:1105 #, python-format msgid "Failed to rename: %(error)s" msgstr "Απέτυχε η μετονομασία: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1078 +#: ../flask_admin/contrib/fileadmin/__init__.py:1119 #, python-format msgid "Rename %(name)s" msgstr "Μετονομάσια %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1115 +#: ../flask_admin/contrib/fileadmin/__init__.py:1155 #, python-format msgid "Error saving changes to %(name)s." msgstr "Σφάλμα κατά την αποθήκευση αλλαγών σε %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1119 +#: ../flask_admin/contrib/fileadmin/__init__.py:1159 #, python-format msgid "Changes to %(name)s saved successfully." msgstr "Οι αλλαγές στο %(name)s αποθηκεύτηκαν με επιτυχία." -#: ../flask_admin/contrib/fileadmin/__init__.py:1128 +#: ../flask_admin/contrib/fileadmin/__init__.py:1167 #, python-format msgid "Error reading %(name)s." msgstr "Σφάλμα ανάγνωσης %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1131 -#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/contrib/fileadmin/__init__.py:1170 +#: ../flask_admin/contrib/fileadmin/__init__.py:1179 #, python-format msgid "Unexpected error while reading from %(name)s" msgstr "Μη αναμενόμενο σφάλμα κατά την ανάγνωση από %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1137 +#: ../flask_admin/contrib/fileadmin/__init__.py:1176 #, python-format msgid "Cannot edit %(name)s." msgstr "Αδυναμία επεξεργασίας %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1155 +#: ../flask_admin/contrib/fileadmin/__init__.py:1194 #, python-format msgid "Editing %(path)s" msgstr "Επεξεργασία %(path)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/peewee/view.py:487 -#: ../flask_admin/contrib/pymongo/view.py:384 -#: ../flask_admin/contrib/sqla/view.py:1149 +#: ../flask_admin/contrib/fileadmin/__init__.py:1202 +#: ../flask_admin/contrib/peewee/view.py:510 +#: ../flask_admin/contrib/pymongo/view.py:385 +#: ../flask_admin/contrib/sqla/view.py:1241 msgid "Delete" msgstr "Διαγραφή" -#: ../flask_admin/contrib/fileadmin/__init__.py:1164 +#: ../flask_admin/contrib/fileadmin/__init__.py:1203 msgid "Are you sure you want to delete these files?" msgstr "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτά τα αρχεία;" -#: ../flask_admin/contrib/fileadmin/__init__.py:1167 +#: ../flask_admin/contrib/fileadmin/__init__.py:1206 msgid "File deletion is disabled." msgstr "Η διαγραφή αρχείων είναι απενεργοποιημένη." -#: ../flask_admin/contrib/fileadmin/__init__.py:1180 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:22 +#: ../flask_admin/contrib/fileadmin/__init__.py:1219 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:22 msgid "Edit" msgstr "Επεξεργασία" -#: ../flask_admin/contrib/fileadmin/s3.py:153 +#: ../flask_admin/contrib/fileadmin/s3.py:162 msgid "Cannot operate on non empty directories" msgstr "" #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 -#: ../flask_admin/contrib/sqla/filters.py:41 +#: ../flask_admin/contrib/sqla/filters.py:42 msgid "equals" msgstr "ισούται με" #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 -#: ../flask_admin/contrib/sqla/filters.py:49 +#: ../flask_admin/contrib/sqla/filters.py:50 msgid "not equal" msgstr "διάφορο" #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 -#: ../flask_admin/contrib/sqla/filters.py:58 +#: ../flask_admin/contrib/sqla/filters.py:59 msgid "contains" msgstr "περιέχει" #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 -#: ../flask_admin/contrib/sqla/filters.py:67 +#: ../flask_admin/contrib/sqla/filters.py:68 msgid "not contains" msgstr "δεν περιέχει" #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 -#: ../flask_admin/contrib/sqla/filters.py:75 +#: ../flask_admin/contrib/sqla/filters.py:76 msgid "greater than" msgstr "μεγαλύτερο από" #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 -#: ../flask_admin/contrib/sqla/filters.py:83 +#: ../flask_admin/contrib/sqla/filters.py:84 msgid "smaller than" msgstr "μικρότερο από" #: ../flask_admin/contrib/peewee/filters.py:88 -#: ../flask_admin/contrib/sqla/filters.py:94 +#: ../flask_admin/contrib/sqla/filters.py:95 msgid "empty" msgstr "κενό" #: ../flask_admin/contrib/peewee/filters.py:102 -#: ../flask_admin/contrib/sqla/filters.py:108 +#: ../flask_admin/contrib/sqla/filters.py:109 msgid "in list" msgstr "στη λίστα" #: ../flask_admin/contrib/peewee/filters.py:111 -#: ../flask_admin/contrib/sqla/filters.py:118 +#: ../flask_admin/contrib/sqla/filters.py:119 msgid "not in list" msgstr "εκτός λίστας" @@ -282,84 +271,85 @@ msgstr "εκτός λίστας" msgid "not between" msgstr "δεν μεταξύ" -msgid "ObjectId equals" -msgstr "" - -#, python-format -msgid "Failed to get model. %(error)s" -msgstr "Απέτυχε η λήψη του μοντέλου. %(error)s" - -#: ../flask_admin/contrib/peewee/view.py:435 -#: ../flask_admin/contrib/pymongo/view.py:316 -#: ../flask_admin/contrib/sqla/view.py:1078 +#: ../flask_admin/contrib/peewee/view.py:458 +#: ../flask_admin/contrib/pymongo/view.py:317 +#: ../flask_admin/contrib/sqla/view.py:1170 #, python-format msgid "Failed to create record. %(error)s" msgstr "Απέτυχε η δημιουργία ρεκόρ. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:454 -#: ../flask_admin/contrib/pymongo/view.py:341 -#: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 -#: ../flask_admin/model/base.py:2313 ../flask_admin/model/base.py:2315 +#: ../flask_admin/contrib/peewee/view.py:477 +#: ../flask_admin/contrib/pymongo/view.py:342 +#: ../flask_admin/contrib/sqla/view.py:1196 ../flask_admin/model/base.py:2463 +#: ../flask_admin/model/base.py:2471 ../flask_admin/model/base.py:2473 #, python-format msgid "Failed to update record. %(error)s" msgstr "Απέτυχε η δημιουργία εγγραφής. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:469 -#: ../flask_admin/contrib/pymongo/view.py:366 -#: ../flask_admin/contrib/sqla/view.py:1129 +#: ../flask_admin/contrib/peewee/view.py:492 +#: ../flask_admin/contrib/pymongo/view.py:367 +#: ../flask_admin/contrib/sqla/view.py:1221 #, python-format msgid "Failed to delete record. %(error)s" msgstr "Απέτυχε η διαγραφή της εγγραφής. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:488 -#: ../flask_admin/contrib/pymongo/view.py:385 -#: ../flask_admin/contrib/sqla/view.py:1150 +#: ../flask_admin/contrib/peewee/view.py:511 +#: ../flask_admin/contrib/pymongo/view.py:386 +#: ../flask_admin/contrib/sqla/view.py:1242 msgid "Are you sure you want to delete selected records?" msgstr "Είστε βέβαιοι ότι θέλετε να διαγράψετε τις επιλεγμένες εγγραφές;" -#: ../flask_admin/contrib/peewee/view.py:505 -#: ../flask_admin/contrib/pymongo/view.py:395 -#: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 +#: ../flask_admin/contrib/peewee/view.py:528 +#: ../flask_admin/contrib/pymongo/view.py:396 +#: ../flask_admin/contrib/sqla/view.py:1258 ../flask_admin/model/base.py:2272 #, python-format msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." msgstr[0] "Η εγγραφή διαγράφηκε με επιτυχία." msgstr[1] "%(count)s εγγραφές διαγράφηκαν με επιτυχία." -#: ../flask_admin/contrib/peewee/view.py:511 -#: ../flask_admin/contrib/pymongo/view.py:400 -#: ../flask_admin/contrib/sqla/view.py:1174 +#: ../flask_admin/contrib/peewee/view.py:534 +#: ../flask_admin/contrib/pymongo/view.py:401 +#: ../flask_admin/contrib/sqla/view.py:1266 #, python-format msgid "Failed to delete records. %(error)s" msgstr "Απέτυχε η διαγραφή της εγγραφής. %(error)s" -#: ../flask_admin/contrib/sqla/fields.py:126 -#: ../flask_admin/contrib/sqla/fields.py:176 -#: ../flask_admin/contrib/sqla/fields.py:181 ../flask_admin/model/fields.py:173 -#: ../flask_admin/model/fields.py:222 +#: ../flask_admin/contrib/sqla/fields.py:117 +#: ../flask_admin/contrib/sqla/fields.py:167 +#: ../flask_admin/contrib/sqla/fields.py:172 ../flask_admin/model/fields.py:174 +#: ../flask_admin/model/fields.py:223 msgid "Not a valid choice" msgstr "Άκυρη επιλογή" -#: ../flask_admin/contrib/sqla/fields.py:186 +#: ../flask_admin/contrib/sqla/fields.py:201 msgid "Key" msgstr "" -#: ../flask_admin/contrib/sqla/fields.py:187 +#: ../flask_admin/contrib/sqla/fields.py:202 msgid "Value" msgstr "" -#: ../flask_admin/contrib/sqla/validators.py:42 +#: ../flask_admin/contrib/sqla/validators.py:28 msgid "Already exists." msgstr "Υπάρχει ήδη." -#: ../flask_admin/contrib/sqla/validators.py:60 +#: ../flask_admin/contrib/sqla/validators.py:59 #, python-format msgid "At least %(num)d item is required" msgid_plural "At least %(num)d items are required" msgstr[0] "" msgstr[1] "" -#: ../flask_admin/contrib/sqla/view.py:1057 +#: ../flask_admin/contrib/sqla/validators.py:75 +msgid "Not a valid ISO currency code (e.g. USD, EUR, CNY)." +msgstr "" + +#: ../flask_admin/contrib/sqla/validators.py:83 +msgid "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." +msgstr "" + +#: ../flask_admin/contrib/sqla/view.py:1134 #, python-format msgid "Integrity error. %(message)s" msgstr "Σφάλμα ακεραιότητας. %(message)s" @@ -368,274 +358,242 @@ msgstr "Σφάλμα ακεραιότητας. %(message)s" msgid "Invalid time format" msgstr "Άκυρη μορφή ώρας" -#: ../flask_admin/form/fields.py:144 +#: ../flask_admin/form/fields.py:147 msgid "Invalid Choice: could not coerce" msgstr "Μη έγκυρη επιλογή: δεν θα μπορούσε να εξαναγκάσει" -#: ../flask_admin/form/fields.py:208 +#: ../flask_admin/form/fields.py:221 msgid "Invalid JSON" msgstr "Μη έγκυρο JSON" -#: ../flask_admin/form/upload.py:207 +#: ../flask_admin/form/upload.py:216 msgid "Invalid file extension" msgstr "Μη έγκυρη επέκταση αρχείου" -#: ../flask_admin/form/upload.py:214 ../flask_admin/form/upload.py:281 +#: ../flask_admin/form/upload.py:223 ../flask_admin/form/upload.py:293 #, python-format msgid "File \"%s\" already exists." msgstr "Το αρχείο \"%s\" υπάρχει ήδη." -#: ../flask_admin/model/base.py:1649 +#: ../flask_admin/form/validators.py:16 +msgid "This field requires at least one item." +msgstr "" + +#: ../flask_admin/model/base.py:1737 msgid "There are no items in the table." msgstr "Δεν υπάρχουν στοιχεία στον πίνακα." -#: ../flask_admin/model/base.py:1673 +#: ../flask_admin/model/base.py:1746 #, python-format msgid "Invalid Filter Value: %(value)s" msgstr "Άκυρη τιμή φίλτρου: %(value)s" -#: ../flask_admin/model/base.py:1984 +#: ../flask_admin/model/base.py:2136 msgid "Record was successfully created." msgstr "Η εγγραφή δημιουργήθηκε με επιτυχία." -#: ../flask_admin/model/base.py:2028 ../flask_admin/model/base.py:2080 -#: ../flask_admin/model/base.py:2113 ../flask_admin/model/base.py:2297 +#: ../flask_admin/model/base.py:2180 ../flask_admin/model/base.py:2232 +#: ../flask_admin/model/base.py:2265 ../flask_admin/model/base.py:2455 msgid "Record does not exist." msgstr "Η εγγραφή δεν υπάρχει." -#: ../flask_admin/model/base.py:2037 ../flask_admin/model/base.py:2301 +#: ../flask_admin/model/base.py:2189 ../flask_admin/model/base.py:2459 msgid "Record was successfully saved." msgstr "Η καρτέλα αποθηκεύτηκε με επιτυχία." -#: ../flask_admin/model/base.py:2222 -msgid "Tablib dependency not installed." -msgstr "" - -#: ../flask_admin/model/base.py:2249 +#: ../flask_admin/model/base.py:2407 #, python-format msgid "Export type \"%(type)s not supported." msgstr "" -#: ../flask_admin/model/filters.py:103 ../flask_admin/model/widgets.py:111 +#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:119 msgid "Yes" msgstr "Ναι" -#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:110 +#: ../flask_admin/model/filters.py:105 ../flask_admin/model/widgets.py:118 msgid "No" msgstr "Όχι" -#: ../flask_admin/model/filters.py:172 ../flask_admin/model/filters.py:212 -#: ../flask_admin/model/filters.py:257 +#: ../flask_admin/model/filters.py:173 ../flask_admin/model/filters.py:213 +#: ../flask_admin/model/filters.py:258 msgid "between" msgstr "μεταξύ" -#: ../flask_admin/model/template.py:81 ../flask_admin/model/template.py:88 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:37 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:8 +#: ../flask_admin/model/template.py:83 ../flask_admin/model/template.py:90 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:7 msgid "View Record" msgstr "Προβολή καρτέλας" -#: ../flask_admin/model/template.py:95 ../flask_admin/model/template.py:102 -#: ../flask_admin/model/template.py:109 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/edit.html:11 +#: ../flask_admin/model/template.py:97 ../flask_admin/model/template.py:104 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/edit.html:10 msgid "Edit Record" msgstr "Επεξεργασία εγγραφής" -#: ../flask_admin/model/widgets.py:61 +#: ../flask_admin/model/template.py:111 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Delete Record" +msgstr "" + +#: ../flask_admin/model/widgets.py:62 msgid "Please select model" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/actions.html:4 -#: ../flask_admin/templates/bootstrap3/admin/actions.html:4 +#: ../flask_admin/templates/bootstrap4/admin/actions.html:5 msgid "With selected" msgstr "Με επιλεγμένο" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:200 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:190 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:216 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:227 msgid "Save" msgstr "Αποθήκευση" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:205 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:195 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:221 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:232 msgid "Cancel" msgstr "Άκυρο" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:256 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:247 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:290 msgid "Save and Add Another" msgstr "Αποθήκευση και Προσθήκη Άλλου" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:259 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:250 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:293 msgid "Save and Continue Editing" msgstr "Αποθήκευση και Συνέχεια Επεξεργασίας" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:9 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:9 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:10 msgid "Root" msgstr "Ρίζα" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:90 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:99 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:89 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:98 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:42 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:51 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:89 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:98 #, python-format msgid "Sort by %(name)s" msgstr "Ταξινόμηση κατά %(name)s" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:77 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:79 msgid "Rename File" msgstr "Μετονοσία αρχείου" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:88 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:88 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:90 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\' recursively?" msgstr "Είστε βέβαιοι ότι θέλετε να διαγράψετε \\'%(name)s\\' αναδρομικά;" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:97 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:97 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:99 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\'?" msgstr "Είστε βέβαιοι ότι θέλετε να διαγράψετε \\'%(name)s\\';" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:125 -msgid "Size" -msgstr "" - -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:185 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:187 msgid "Please select at least one file." msgstr "Παρακαλώ επιλέξτε τουλάχιστον ένα αρχείο." -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:8 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:17 msgid "List" msgstr "Λίστα" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:12 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:18 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 msgid "Create" msgstr "Δημιουργία" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:26 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:26 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:21 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:26 msgid "Details" msgstr "Λεπτομέρειες" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:29 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:28 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:15 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:28 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:15 msgid "Filter" msgstr "Φίλτρο" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:13 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:14 msgid "Delete?" msgstr "Διαγραφή?" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:33 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:16 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:35 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Are you sure you want to delete this record?" +msgstr "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν την εγγραφή;" + +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:33 msgid "New" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:43 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:43 msgid "Add" msgstr "Προσθήκη" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:3 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:3 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:2 msgid "Add Filter" msgstr "Προσθήκη φίλτρου" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:30 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:19 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:26 msgid "Export" msgstr "Εξαγωγή" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:38 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:38 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:49 msgid "Apply" msgstr "Εφαρμογή" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:40 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:51 msgid "Reset Filters" msgstr "Επαναφορά αρχικών φίλτρων" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:66 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:64 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:80 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:93 +#, python-format +msgid "%(placeholder)s" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:88 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:94 msgid "Search" msgstr "Αναζήτηση" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:74 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:77 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:78 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:79 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:72 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:75 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:76 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:77 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:102 msgid "items" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/create.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/create.html:10 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/create.html:10 msgid "Create New Record" msgstr "Δημιουργία νέας εγγραφής" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:76 msgid "Select all records" msgstr "Επιλογή όλων των εγγραφών" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:120 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:119 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:119 msgid "Select record" msgstr "Επιλέξτε εγγραφή" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:186 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:195 msgid "Please select at least one record." msgstr "Παρακαλώ επιλέξτε τουλάχιστον μία εγγραφή." -#: ../flask_admin/templates/bootstrap2/admin/model/row_actions.html:34 -#: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 -msgid "Are you sure you want to delete this record?" -msgstr "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν την εγγραφή;" +#~ msgid "ObjectId equals" +#~ msgstr "" + +#~ msgid "Failed to get model. %(error)s" +#~ msgstr "Απέτυχε η λήψη του μοντέλου. %(error)s" + +#~ msgid "Tablib dependency not installed." +#~ msgstr "" + +#~ msgid "Size" +#~ msgstr "" + diff --git a/flask_admin/translations/en/LC_MESSAGES/admin.mo b/flask_admin/translations/en/LC_MESSAGES/admin.mo index 91e2551edf3ece9f6027b9317de0a4a4720e0d61..17ee0e6b42f1cd62d6a99ded80ee3b3ed9bff6f1 100644 GIT binary patch delta 1590 zcmbu;+e=hY6vy#p=B?DmOPW@8yp)<VrlU{_LX;I!mQo~0MG{g`SwRL7HK8v>8pT*d z7}P^I=%uCyp$7@UE>J<)Q>Y|#0}HB$q>%dlbVGkY!}fgk+Gn4=&slr<v+Q~xG?F^= zqVa3uZvlTpGZg*%b;X!P6L#Y)ynu7C7io5vOBLS70FGlhX2+WOaf9<1t|7jOG#lqK z*DPc|=oB)L5H~eo<w&!2Tr_bL`f#g@cO%W(xUhg7#Zv6TMflM97H1Ow#!R$$vs{>m zi?JH>*xz=#flkx{ccyNbJ;i+Dah#971hX9UV;-(Y&2PhEJcrrXhspTbIfi=v8|sCU zNTV{HiXQvhGCEqQ0Tb~MX5a}-#U3|)3)6@npcZ=Ke2zM`SE%`KFdaX+coIEg-|XoZ zFGs~&FjP;cosPb20F}})Ou`A&MzOq=oQ*mXA8Mma)V!srBU*taSce|AqaQCJOW6Qw z{!3I%4JVR+j>q0HK$h(@Qa|<`wb2C9><<^sOXO)Sl#UwrkgQt3jW2iOtFb$ZjG{Ig z;XFu!jiHM73u>RqWb&`-jb=1}HK^*{hkm^3e1@vtpQsnB;d7O#S}eq77k8ju^fGGR zHKf@s7x$s=_oJSF9HLW7XBbrji7C_iQ7PYms@_J-#l5KNJ&P*BdoCVAJ^#y%XLCL( z-WpW#wV;mp1nRk7)cjCConktpsOn9i!pM#lI4e*KtU|re4pjB-LJv=&7P^i)l1HfG zeSs`#@7?$W(kzC`)H+$yhAfAUsy83?z!Iccm5Vo`N8EyX^9~o^z<T0A)R(1`Po=bi z3&(DCsEwMO+fYZ+g4$;fCh7nGI32QYXHeC91w9-@)xbxbDmp$(3wx-dDn*@T5LLX@ zsG?ep+Nchdkp|Sf?WlEH-S}Zl(Al1JH%_}7Js9!%3Zi0)+S(5khgZfebiKxu^Rcz9 z`&*B+hT~FuB9Zv4sK{vAWK=jWBRxDf<3l(*vnaed>2^4N-obEZa&t<sGEi0(2v&N* TV0BqlNm+U1Yx3F||F!O4;@qag literal 6263 zcmeH~U2Gjk6@aIuxUKn1(*!6rbZqK6rrC?_;HX?Tb)DD=uHwY9omLSQ>3Vm3?<RY9 zFFSkfTz(!<!~+jirAk$y50Ma6kU*6XNJV`?B5$o)RFEQgXe$Cwh<^b>3RLi&-MQCx z?U3?r>w3RCXV1(zbLPyMxo_>h<r&4_6a4qd|9g0B`0MLYN<<%ry|5pC2=0gPg%85d z!o$#mUxB0WdvHH|!}0c8m71V^5F%0;+zZ=q2tMW7KZbnNYdl2n3fu+XfOo(@I{AO# z2Wa=)R_gD8GF~67z%h6a^c}wjZ=wBd_&#_Eegysy_QO};Ap8RyfV*!m+v8Bi`8*W) zm*FSjMfeGL8Qu-Ay7t>p^!f;v^qYjk@C^JI{096WeBSX#Q2Jkn;@?|P*5S8MLvdEd z>4)!!Q}Dy^1l$dclb?ro(*8P>alYkv5#CJuJ5cm5!9DOL*Zvv2m-bbtVGl;c{~;*t zN8lVh2W7r5L5cIPpv3=AQ0)EN@g{_PRXtGF>rN=^I0(i5e#l2n@{oRWP}X+=-VXz) z;Ztxw`~k!@^(N$_e#b-d@t^Rc@L!NrP<sd}OQ-sv<mDg~yZ1x!XAFwoB$V-vIr$=F z$<z~0e%8rX;gdHhbpeXKJ8+UEQG21}zlLIG1WNuNgdS`{$^VN`{D0l?Z7BKwDS{$? ztw4!m0}jCpuKj%|e*P4S-pi1#>UGFRU3K!mL8h**LD9dB;L3QrU<KX>C2vkSwxGoO z87T9A4od!Cg8lF(Q1buRP}aYPWRmtUlyOc%k*84d|7j@s@FJA_z2e$`g`&5MB$Ivz zpydA|l>GlHB&6z_j^BmS|3xVN{Q^q<{}O8WcPQiRWpc8P<52SdFvL}L+R0;xY1M`@ z&XbN$!<%V83q}7q$dKv<*S-wzrF{izcnymGcVk4_55YNj2FiS2fT*Zfp~U|;Q0)E1 z@gGq9yar{xZY9XFj(0(^uc7oi0Hxm)l=VFdCI26T8eV{sKhHy1ub)Hd_a>Bl{5_QX z|1&JspN8cBE+~0<7ZkhqK=J23D0&B=j5p!r$Dri@l9PYI$<IPH6^8P!k4ABBGBp)v z#t+-toR4g7D{89QjN57|GrFC&v~9UBYkrdJJk_CzO>Xq#LxcMgzhQ>$<3l<#K`XP- zs)^f^|5wi&Yg^0(xe3KanuYepJ@UG-Mz2J%c~{Djbwe|9u4CidTn~mi%1uKT@4ncI zGDF1P@zQFa$YjR7KH?{Vi4{oFT$?ar6c?b1I#TzOnz0hTj!;{Fm08(V5EyG$T5;S) zFOI5uHd*!KDAYmPX!uEpG);1o<mw3Plp6;<jaNaQX6=q3F>7unYPwh>ht0ytQW~X+ z%r1<qzZ@HkbcfRegZr9(ULUptdd;_+Jamh{Nj(s+{>N}dzHE6vLx7Y#I^NA>S(?%C z!zihBqf}9)oM4GK*c!)*I_k63p~SXu#V{!snJVKL8F$!j)hhF;vaO2C@f!@}v?SBS zQn?#87;^95g`rZ#ZtqOZ<hqeE*!Hh8BZjx1s^nO)6SjZdYKA0~TY*iZGbPD`a!Lc* ze@BU+a%_5k{X8i&i$H8if#OwX|FDcQCX3i=#;G5c&GNgf{H9#}T-q>dmQ7L1qMX7d zODyg;*hzkklElk$4;`teQ9y8lv=xV1c4m;8ERf!%0#>Pk`cXe_6){BG+Bm=?iziQX zl~=??bDqs;nayT#-fo&oS0sV!Hu9*!Dx_J%&((2itU4iYPo#Wu?d#H!pzu`9v-5PA zQY(rwA|<(^=1ta!tk`4&CXsB{c_~yzH?wp#3XPV%FE+)@dMY}lvV>~CQ^3-sOp5L( z+bOuLRSQMg-C7CCy@n^(Qz)|^g~5G9KgowXb=K-NL*?99`PS>o^+qeIr5IzDTk>In zf}gwN%&LVn&DA2AUpzD=RLhAclA<ByG)h{$Hhvb=ft)bpc<gq9?TE@4sKw|@D5qJj zm)q;XUEEN)=_t_;WzX0wkkUye(+Dl|9#BhlnX#M~Nm`sNR!52EpwhXN--<ewnDfo@ zoGY?fuhk{jI^}RBOB?H!PZc{v=4;er5&6<NBh_hR)oBiGu_Q-OSxU=lu9i){W=x_2 z=I=*|Ri@F*+lm9skFBZ|hf9W2exh(LmPC~t>~t$PkLy|_r*te-I_kDT5ZO(|81q?r zmKk}oq4%iaa*!rftyf~-p7Z>WHSAq5O=9ZJ*;*8Ohg&u4Eu~dGGdDGR{NbtT>4lla z#oqaoOI~s8(cPP-SXK4d$mqB?@)>VzjIY(PF>hpiWCTTT!K_ANW*fcH>i9wWpm&_( z-CN51#Kt~{XH_?{v$ESBv?i;W%DI%?_;9Vkky7FOeF*)e)}p3VwMovLTI{yHCF3{n zHmMP)dhdMP%KX?n$|ko}oivN4Jv26<%ddy_CA$BR9vz<OotvGTS&ztQWu(`g@7@w6 zq^ffY%%__%D>NbJT}EmjYUL~51M7O?{))-GnIuT%xUA|2mZQA)m`O}VjEH8tst^0i zCe~w>(Sw-Sx%0_}bO&-?FYa}6o!q(e6<5feJ6|_BcJ6!}WO9J*-1&-MVLNxe?(b9g V`)cRTSNvMvx$_lQ#7%d;{{o>B$?X6D diff --git a/flask_admin/translations/en/LC_MESSAGES/admin.po b/flask_admin/translations/en/LC_MESSAGES/admin.po index 4099a1869..ef93fa2ed 100644 --- a/flask_admin/translations/en/LC_MESSAGES/admin.po +++ b/flask_admin/translations/en/LC_MESSAGES/admin.po @@ -1,516 +1,619 @@ + msgid "" msgstr "" -"Project-Id-Version: flask-admin\n" +"Project-Id-Version: flask-admin\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-04-22 20:22-0500\n" +"POT-Creation-Date: 2024-09-24 22:09+0100\n" "PO-Revision-Date: 2015-04-22 21:56-0400\n" "Last-Translator: mrjoes <serge.koval@gmail.com>\n" +"Language: en_US\n" "Language-Team: English\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 1.3\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: flask-admin\n" -"X-Crowdin-Language: en\n" -"X-Crowdin-File: admin.pot\n" -"Language: en_US\n" +"Generated-By: Babel 2.16.0\n" -#: ../flask_admin/base.py:427 +#: ../flask_admin/base.py:458 msgid "Home" msgstr "Home" -#: ../flask_admin/contrib/fileadmin.py:222 +#: ../flask_admin/contrib/rediscli.py:113 +msgid "Cli: Invalid command." +msgstr "Cli: Invalid command." + +#: ../flask_admin/contrib/fileadmin/__init__.py:376 msgid "File to upload" msgstr "File to upload" -#: ../flask_admin/contrib/fileadmin.py:230 +#: ../flask_admin/contrib/fileadmin/__init__.py:384 msgid "File required." msgstr "File required." -#: ../flask_admin/contrib/fileadmin.py:235 +#: ../flask_admin/contrib/fileadmin/__init__.py:389 msgid "Invalid file type." msgstr "Invalid file type." -#: ../flask_admin/contrib/fileadmin.py:246 +#: ../flask_admin/contrib/fileadmin/__init__.py:400 msgid "Content" msgstr "Content" -#: ../flask_admin/contrib/fileadmin.py:260 +#: ../flask_admin/contrib/fileadmin/__init__.py:414 msgid "Invalid name" msgstr "Invalid name" -#: ../flask_admin/contrib/fileadmin.py:268 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:35 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:35 +#: ../flask_admin/contrib/fileadmin/__init__.py:422 +#: ../flask_admin/tests/sqla/test_translation.py:21 msgid "Name" msgstr "Name" -#: ../flask_admin/contrib/fileadmin.py:546 +#: ../flask_admin/contrib/fileadmin/__init__.py:784 #, python-format msgid "File \"%(name)s\" already exists." msgstr "File \"%(name)s\" already exists." -#: ../flask_admin/contrib/fileadmin.py:570 -#: ../flask_admin/contrib/fileadmin.py:637 -#: ../flask_admin/contrib/fileadmin.py:690 -#: ../flask_admin/contrib/fileadmin.py:731 -#: ../flask_admin/contrib/fileadmin.py:777 -#: ../flask_admin/contrib/fileadmin.py:826 +#: ../flask_admin/contrib/fileadmin/__init__.py:829 +#: ../flask_admin/contrib/fileadmin/__init__.py:926 +#: ../flask_admin/contrib/fileadmin/__init__.py:988 +#: ../flask_admin/contrib/fileadmin/__init__.py:1041 +#: ../flask_admin/contrib/fileadmin/__init__.py:1088 +#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/model/base.py:2324 msgid "Permission denied." msgstr "Permission denied." -#: ../flask_admin/contrib/fileadmin.py:633 +#: ../flask_admin/contrib/fileadmin/__init__.py:922 msgid "File uploading is disabled." msgstr "File uploading is disabled." -#: ../flask_admin/contrib/fileadmin.py:646 +#: ../flask_admin/contrib/fileadmin/__init__.py:933 +#, python-format +msgid "Successfully saved file: %(name)s" +msgstr "" + +#: ../flask_admin/contrib/fileadmin/__init__.py:937 #, python-format msgid "Failed to save file: %(error)s" msgstr "Failed to save file: %(error)s" -#: ../flask_admin/contrib/fileadmin.py:686 +#: ../flask_admin/contrib/fileadmin/__init__.py:945 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:150 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:152 +msgid "Upload File" +msgstr "Upload File" + +#: ../flask_admin/contrib/fileadmin/__init__.py:984 msgid "Directory creation is disabled." msgstr "Directory creation is disabled." -#: ../flask_admin/contrib/fileadmin.py:701 +#: ../flask_admin/contrib/fileadmin/__init__.py:997 +#, python-format +msgid "Successfully created directory: %(directory)s" +msgstr "" + +#: ../flask_admin/contrib/fileadmin/__init__.py:1001 #, python-format msgid "Failed to create directory: %(error)s" msgstr "Failed to create directory: %(error)s" -#: ../flask_admin/contrib/fileadmin.py:727 +#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:161 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:163 +msgid "Create Directory" +msgstr "Create Directory" + +#: ../flask_admin/contrib/fileadmin/__init__.py:1037 msgid "Deletion is disabled." msgstr "Deletion is disabled." -#: ../flask_admin/contrib/fileadmin.py:736 +#: ../flask_admin/contrib/fileadmin/__init__.py:1046 msgid "Directory deletion is disabled." msgstr "Directory deletion is disabled." -#: ../flask_admin/contrib/fileadmin.py:742 +#: ../flask_admin/contrib/fileadmin/__init__.py:1052 #, python-format msgid "Directory \"%(path)s\" was successfully deleted." msgstr "Directory \"%(path)s\" was successfully deleted." -#: ../flask_admin/contrib/fileadmin.py:744 +#: ../flask_admin/contrib/fileadmin/__init__.py:1054 #, python-format msgid "Failed to delete directory: %(error)s" msgstr "Failed to delete directory: %(error)s" -#: ../flask_admin/contrib/fileadmin.py:749 -#: ../flask_admin/contrib/fileadmin.py:894 +#: ../flask_admin/contrib/fileadmin/__init__.py:1060 +#: ../flask_admin/contrib/fileadmin/__init__.py:1215 #, python-format msgid "File \"%(name)s\" was successfully deleted." msgstr "File \"%(name)s\" was successfully deleted." -#: ../flask_admin/contrib/fileadmin.py:751 -#: ../flask_admin/contrib/fileadmin.py:896 +#: ../flask_admin/contrib/fileadmin/__init__.py:1062 +#: ../flask_admin/contrib/fileadmin/__init__.py:1217 #, python-format msgid "Failed to delete file: %(name)s" msgstr "Failed to delete file: %(name)s" -#: ../flask_admin/contrib/fileadmin.py:773 +#: ../flask_admin/contrib/fileadmin/__init__.py:1084 msgid "Renaming is disabled." msgstr "Renaming is disabled." -#: ../flask_admin/contrib/fileadmin.py:781 +#: ../flask_admin/contrib/fileadmin/__init__.py:1092 msgid "Path does not exist." msgstr "Path does not exist." -#: ../flask_admin/contrib/fileadmin.py:792 +#: ../flask_admin/contrib/fileadmin/__init__.py:1102 #, python-format msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\"" msgstr "Successfully renamed \"%(src)s\" to \"%(dst)s\"" -#: ../flask_admin/contrib/fileadmin.py:795 +#: ../flask_admin/contrib/fileadmin/__init__.py:1105 #, python-format msgid "Failed to rename: %(error)s" msgstr "Failed to rename: %(error)s" -#: ../flask_admin/contrib/fileadmin.py:842 +#: ../flask_admin/contrib/fileadmin/__init__.py:1119 +#, python-format +msgid "Rename %(name)s" +msgstr "" + +#: ../flask_admin/contrib/fileadmin/__init__.py:1155 #, python-format msgid "Error saving changes to %(name)s." msgstr "Error saving changes to %(name)s." -#: ../flask_admin/contrib/fileadmin.py:846 +#: ../flask_admin/contrib/fileadmin/__init__.py:1159 #, python-format msgid "Changes to %(name)s saved successfully." msgstr "Changes to %(name)s saved successfully." -#: ../flask_admin/contrib/fileadmin.py:855 +#: ../flask_admin/contrib/fileadmin/__init__.py:1167 #, python-format msgid "Error reading %(name)s." msgstr "Error reading %(name)s." -#: ../flask_admin/contrib/fileadmin.py:858 -#: ../flask_admin/contrib/fileadmin.py:867 +#: ../flask_admin/contrib/fileadmin/__init__.py:1170 +#: ../flask_admin/contrib/fileadmin/__init__.py:1179 #, python-format msgid "Unexpected error while reading from %(name)s" msgstr "Unexpected error while reading from %(name)s" -#: ../flask_admin/contrib/fileadmin.py:864 +#: ../flask_admin/contrib/fileadmin/__init__.py:1176 #, python-format msgid "Cannot edit %(name)s." msgstr "Cannot edit %(name)s." -#: ../flask_admin/contrib/fileadmin.py:881 -#: ../flask_admin/contrib/peewee/view.py:429 -#: ../flask_admin/contrib/pymongo/view.py:349 -#: ../flask_admin/contrib/sqla/view.py:956 +#: ../flask_admin/contrib/fileadmin/__init__.py:1194 +#, python-format +msgid "Editing %(path)s" +msgstr "" + +#: ../flask_admin/contrib/fileadmin/__init__.py:1202 +#: ../flask_admin/contrib/peewee/view.py:510 +#: ../flask_admin/contrib/pymongo/view.py:385 +#: ../flask_admin/contrib/sqla/view.py:1241 msgid "Delete" msgstr "Delete" -#: ../flask_admin/contrib/fileadmin.py:882 +#: ../flask_admin/contrib/fileadmin/__init__.py:1203 msgid "Are you sure you want to delete these files?" msgstr "Are you sure you want to delete these files?" -#: ../flask_admin/contrib/fileadmin.py:885 +#: ../flask_admin/contrib/fileadmin/__init__.py:1206 msgid "File deletion is disabled." msgstr "File deletion is disabled." -#: ../flask_admin/contrib/fileadmin.py:898 +#: ../flask_admin/contrib/fileadmin/__init__.py:1219 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:22 msgid "Edit" msgstr "Edit" -#: ../flask_admin/contrib/rediscli.py:125 -msgid "Cli: Invalid command." -msgstr "Cli: Invalid command." - -#: ../flask_admin/contrib/geoa/fields.py:29 -msgid "Invalid JSON" -msgstr "Invalid JSON" +#: ../flask_admin/contrib/fileadmin/s3.py:162 +msgid "Cannot operate on non empty directories" +msgstr "" -#: ../flask_admin/contrib/peewee/filters.py:38 +#: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 -#: ../flask_admin/contrib/sqla/filters.py:38 +#: ../flask_admin/contrib/sqla/filters.py:42 msgid "equals" msgstr "equals" -#: ../flask_admin/contrib/peewee/filters.py:46 +#: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 -#: ../flask_admin/contrib/sqla/filters.py:46 +#: ../flask_admin/contrib/sqla/filters.py:50 msgid "not equal" msgstr "not equal" -#: ../flask_admin/contrib/peewee/filters.py:55 +#: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 -#: ../flask_admin/contrib/sqla/filters.py:55 +#: ../flask_admin/contrib/sqla/filters.py:59 msgid "contains" msgstr "contains" -#: ../flask_admin/contrib/peewee/filters.py:64 +#: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 -#: ../flask_admin/contrib/sqla/filters.py:64 +#: ../flask_admin/contrib/sqla/filters.py:68 msgid "not contains" msgstr "not contains" -#: ../flask_admin/contrib/peewee/filters.py:72 +#: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 -#: ../flask_admin/contrib/sqla/filters.py:72 +#: ../flask_admin/contrib/sqla/filters.py:76 msgid "greater than" msgstr "greater than" -#: ../flask_admin/contrib/peewee/filters.py:80 +#: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 -#: ../flask_admin/contrib/sqla/filters.py:80 +#: ../flask_admin/contrib/sqla/filters.py:84 msgid "smaller than" msgstr "smaller than" -#: ../flask_admin/contrib/peewee/filters.py:91 -#: ../flask_admin/contrib/sqla/filters.py:91 +#: ../flask_admin/contrib/peewee/filters.py:88 +#: ../flask_admin/contrib/sqla/filters.py:95 msgid "empty" msgstr "empty" -#: ../flask_admin/contrib/peewee/filters.py:105 -#: ../flask_admin/contrib/sqla/filters.py:105 +#: ../flask_admin/contrib/peewee/filters.py:102 +#: ../flask_admin/contrib/sqla/filters.py:109 msgid "in list" msgstr "in list" -#: ../flask_admin/contrib/peewee/filters.py:114 -#: ../flask_admin/contrib/sqla/filters.py:114 +#: ../flask_admin/contrib/peewee/filters.py:111 +#: ../flask_admin/contrib/sqla/filters.py:119 msgid "not in list" msgstr "not in list" -#: ../flask_admin/contrib/peewee/filters.py:208 -#: ../flask_admin/contrib/peewee/filters.py:245 -#: ../flask_admin/contrib/peewee/filters.py:282 -#: ../flask_admin/contrib/sqla/filters.py:209 -#: ../flask_admin/contrib/sqla/filters.py:246 -#: ../flask_admin/contrib/sqla/filters.py:283 +#: ../flask_admin/contrib/peewee/filters.py:207 +#: ../flask_admin/contrib/peewee/filters.py:244 +#: ../flask_admin/contrib/peewee/filters.py:281 +#: ../flask_admin/contrib/sqla/filters.py:213 +#: ../flask_admin/contrib/sqla/filters.py:250 +#: ../flask_admin/contrib/sqla/filters.py:287 msgid "not between" msgstr "not between" -#, python-format -msgid "Failed to get model. %(error)s" -msgstr "Failed to get model. %(error)s" - -#: ../flask_admin/contrib/peewee/view.py:380 -#: ../flask_admin/contrib/pymongo/view.py:284 -#: ../flask_admin/contrib/sqla/view.py:888 +#: ../flask_admin/contrib/peewee/view.py:458 +#: ../flask_admin/contrib/pymongo/view.py:317 +#: ../flask_admin/contrib/sqla/view.py:1170 #, python-format msgid "Failed to create record. %(error)s" msgstr "Failed to create record. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:399 -#: ../flask_admin/contrib/pymongo/view.py:309 -#: ../flask_admin/contrib/sqla/view.py:914 ../flask_admin/model/base.py:1671 -#: ../flask_admin/model/base.py:1680 +#: ../flask_admin/contrib/peewee/view.py:477 +#: ../flask_admin/contrib/pymongo/view.py:342 +#: ../flask_admin/contrib/sqla/view.py:1196 ../flask_admin/model/base.py:2463 +#: ../flask_admin/model/base.py:2471 ../flask_admin/model/base.py:2473 #, python-format msgid "Failed to update record. %(error)s" msgstr "Failed to update record. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:415 -#: ../flask_admin/contrib/pymongo/view.py:335 -#: ../flask_admin/contrib/sqla/view.py:940 +#: ../flask_admin/contrib/peewee/view.py:492 +#: ../flask_admin/contrib/pymongo/view.py:367 +#: ../flask_admin/contrib/sqla/view.py:1221 #, python-format msgid "Failed to delete record. %(error)s" msgstr "Failed to delete record. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:430 -#: ../flask_admin/contrib/pymongo/view.py:350 -#: ../flask_admin/contrib/sqla/view.py:957 +#: ../flask_admin/contrib/peewee/view.py:511 +#: ../flask_admin/contrib/pymongo/view.py:386 +#: ../flask_admin/contrib/sqla/view.py:1242 msgid "Are you sure you want to delete selected records?" msgstr "Are you sure you want to delete selected records?" -#: ../flask_admin/contrib/peewee/view.py:446 -#: ../flask_admin/contrib/pymongo/view.py:360 -#: ../flask_admin/contrib/sqla/view.py:973 ../flask_admin/model/base.py:1619 +#: ../flask_admin/contrib/peewee/view.py:528 +#: ../flask_admin/contrib/pymongo/view.py:396 +#: ../flask_admin/contrib/sqla/view.py:1258 ../flask_admin/model/base.py:2272 #, python-format msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." msgstr[0] "Record was successfully deleted." msgstr[1] "%(count)s records were successfully deleted." -#: ../flask_admin/contrib/peewee/view.py:452 -#: ../flask_admin/contrib/pymongo/view.py:365 -#: ../flask_admin/contrib/sqla/view.py:981 +#: ../flask_admin/contrib/peewee/view.py:534 +#: ../flask_admin/contrib/pymongo/view.py:401 +#: ../flask_admin/contrib/sqla/view.py:1266 #, python-format msgid "Failed to delete records. %(error)s" msgstr "Failed to delete records. %(error)s" -#: ../flask_admin/contrib/sqla/fields.py:123 -#: ../flask_admin/contrib/sqla/fields.py:173 -#: ../flask_admin/contrib/sqla/fields.py:178 ../flask_admin/model/fields.py:225 -#: ../flask_admin/model/fields.py:274 +#: ../flask_admin/contrib/sqla/fields.py:117 +#: ../flask_admin/contrib/sqla/fields.py:167 +#: ../flask_admin/contrib/sqla/fields.py:172 ../flask_admin/model/fields.py:174 +#: ../flask_admin/model/fields.py:223 msgid "Not a valid choice" msgstr "Not a valid choice" -#: ../flask_admin/contrib/sqla/validators.py:42 +#: ../flask_admin/contrib/sqla/fields.py:201 +msgid "Key" +msgstr "" + +#: ../flask_admin/contrib/sqla/fields.py:202 +msgid "Value" +msgstr "" + +#: ../flask_admin/contrib/sqla/validators.py:28 msgid "Already exists." msgstr "Already exists." -#: ../flask_admin/contrib/sqla/validators.py:60 +#: ../flask_admin/contrib/sqla/validators.py:59 #, python-format -msgid "At least %d item is required" -msgid_plural "At least %d items are required" -msgstr[0] "At least %d item is required" -msgstr[1] "At least %d items are required" +msgid "At least %(num)d item is required" +msgid_plural "At least %(num)d items are required" +msgstr[0] "" +msgstr[1] "" + +#: ../flask_admin/contrib/sqla/validators.py:75 +msgid "Not a valid ISO currency code (e.g. USD, EUR, CNY)." +msgstr "" -#: ../flask_admin/contrib/sqla/view.py:867 +#: ../flask_admin/contrib/sqla/validators.py:83 +msgid "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." +msgstr "" + +#: ../flask_admin/contrib/sqla/view.py:1134 #, python-format msgid "Integrity error. %(message)s" msgstr "Integrity error. %(message)s" -#: ../flask_admin/form/fields.py:92 +#: ../flask_admin/form/fields.py:98 msgid "Invalid time format" msgstr "Invalid time format" -#: ../flask_admin/form/fields.py:138 +#: ../flask_admin/form/fields.py:147 msgid "Invalid Choice: could not coerce" msgstr "Invalid Choice: could not coerce" -#: ../flask_admin/form/upload.py:189 +#: ../flask_admin/form/fields.py:221 +msgid "Invalid JSON" +msgstr "Invalid JSON" + +#: ../flask_admin/form/upload.py:216 msgid "Invalid file extension" msgstr "Invalid file extension" -#: ../flask_admin/model/base.py:1281 +#: ../flask_admin/form/upload.py:223 ../flask_admin/form/upload.py:293 +#, python-format +msgid "File \"%s\" already exists." +msgstr "" + +#: ../flask_admin/form/validators.py:16 +msgid "This field requires at least one item." +msgstr "" + +#: ../flask_admin/model/base.py:1737 msgid "There are no items in the table." msgstr "There are no items in the table." -#: ../flask_admin/model/base.py:1305 +#: ../flask_admin/model/base.py:1746 #, python-format msgid "Invalid Filter Value: %(value)s" msgstr "Invalid Filter Value: %(value)s" -#: ../flask_admin/model/base.py:1539 +#: ../flask_admin/model/base.py:2136 msgid "Record was successfully created." msgstr "Record was successfully created." -#: ../flask_admin/model/base.py:1578 ../flask_admin/model/base.py:1676 +#: ../flask_admin/model/base.py:2180 ../flask_admin/model/base.py:2232 +#: ../flask_admin/model/base.py:2265 ../flask_admin/model/base.py:2455 +msgid "Record does not exist." +msgstr "" + +#: ../flask_admin/model/base.py:2189 ../flask_admin/model/base.py:2459 msgid "Record was successfully saved." msgstr "Record was successfully saved." -#: ../flask_admin/model/filters.py:99 +#: ../flask_admin/model/base.py:2407 +#, python-format +msgid "Export type \"%(type)s not supported." +msgstr "" + +#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:119 msgid "Yes" msgstr "Yes" -#: ../flask_admin/model/filters.py:100 +#: ../flask_admin/model/filters.py:105 ../flask_admin/model/widgets.py:118 msgid "No" msgstr "No" -#: ../flask_admin/model/filters.py:162 ../flask_admin/model/filters.py:202 -#: ../flask_admin/model/filters.py:247 +#: ../flask_admin/model/filters.py:173 ../flask_admin/model/filters.py:213 +#: ../flask_admin/model/filters.py:258 msgid "between" msgstr "between" -#: ../flask_admin/templates/bootstrap2/admin/actions.html:4 -#: ../flask_admin/templates/bootstrap3/admin/actions.html:4 +#: ../flask_admin/model/template.py:83 ../flask_admin/model/template.py:90 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:7 +msgid "View Record" +msgstr "" + +#: ../flask_admin/model/template.py:97 ../flask_admin/model/template.py:104 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/edit.html:10 +msgid "Edit Record" +msgstr "" + +#: ../flask_admin/model/template.py:111 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Delete Record" +msgstr "" + +#: ../flask_admin/model/widgets.py:62 +msgid "Please select model" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/actions.html:5 msgid "With selected" msgstr "With selected" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:156 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:150 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:216 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:227 msgid "Save" msgstr "Save" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:161 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:155 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:221 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:232 msgid "Cancel" msgstr "Cancel" -#: ../flask_admin/templates/bootstrap2/admin/file/edit.html:5 -#: ../flask_admin/templates/bootstrap3/admin/file/edit.html:5 -#, python-format -msgid "You are editing %(path)s" -msgstr "You are editing %(path)s" +#: ../flask_admin/templates/bootstrap4/admin/lib.html:290 +msgid "Save and Add Another" +msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:9 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:9 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:293 +msgid "Save and Continue Editing" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:10 msgid "Root" msgstr "Root" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:36 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:36 -msgid "Size" -msgstr "Size" +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:42 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:51 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:89 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:98 +#, python-format +msgid "Sort by %(name)s" +msgstr "Sort by %(name)s" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:63 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:63 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:79 +msgid "Rename File" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:90 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\' recursively?" msgstr "Are you sure you want to delete \\'%(name)s\\' recursively?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:72 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:72 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:99 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\'?" msgstr "Are you sure you want to delete \\'%(name)s\\'?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:107 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:107 -msgid "Upload File" -msgstr "Upload File" - -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:112 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:112 -msgid "Create Directory" -msgstr "Create Directory" - -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:129 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:129 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:187 msgid "Please select at least one file." msgstr "Please select at least one file." -#: ../flask_admin/templates/bootstrap2/admin/file/rename.html:5 -#: ../flask_admin/templates/bootstrap3/admin/file/rename.html:5 -#, python-format -msgid "Please provide new name for %(name)s" -msgstr "Please provide new name for %(name)s" - -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:5 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:5 -msgid "Save and Add" -msgstr "Save and Add" - -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:16 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:16 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:16 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:8 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:17 msgid "List" msgstr "List" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:19 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:20 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:20 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:20 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:12 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:18 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 msgid "Create" msgstr "Create" -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:5 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:5 -msgid "Save and Continue" -msgstr "Save and Continue" +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:21 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:26 +msgid "Details" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:28 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:15 +msgid "Filter" +msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:13 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:14 msgid "Delete?" msgstr "Delete?" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:43 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:16 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:35 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Are you sure you want to delete this record?" +msgstr "Are you sure you want to delete this record?" + +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:33 +msgid "New" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:43 msgid "Add" msgstr "Add" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:3 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:3 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:2 msgid "Add Filter" msgstr "Add Filter" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:19 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:26 +msgid "Export" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:49 msgid "Apply" msgstr "Apply" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:19 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:19 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:51 msgid "Reset Filters" msgstr "Reset Filters" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:38 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:45 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:38 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:43 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:80 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:93 +#, python-format +msgid "%(placeholder)s" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:88 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:94 msgid "Search" msgstr "Search" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:20 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:20 -msgid "Create new record" -msgstr "Create new record" +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:102 +msgid "items" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/create.html:10 +msgid "Create New Record" +msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:56 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:56 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:76 msgid "Select all records" msgstr "Select all records" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:67 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:76 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:67 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:76 -#, python-format -msgid "Sort by %(name)s" -msgstr "Sort by %(name)s" - -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:98 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:98 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:119 msgid "Select record" msgstr "Select record" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:105 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:105 -msgid "Edit record" -msgstr "Edit record" +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:195 +msgid "Please select at least one record." +msgstr "Please select at least one record." -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:114 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:114 -msgid "Are you sure you want to delete this record?" -msgstr "Are you sure you want to delete this record?" +#~ msgid "Failed to get model. %(error)s" +#~ msgstr "Failed to get model. %(error)s" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:114 -msgid "Delete record" -msgstr "Delete record" +#~ msgid "At least %d item is required" +#~ msgid_plural "At least %d items are required" +#~ msgstr[0] "At least %d item is required" +#~ msgstr[1] "At least %d items are required" + +#~ msgid "You are editing %(path)s" +#~ msgstr "You are editing %(path)s" + +#~ msgid "Size" +#~ msgstr "Size" + +#~ msgid "Please provide new name for %(name)s" +#~ msgstr "Please provide new name for %(name)s" + +#~ msgid "Save and Add" +#~ msgstr "Save and Add" + +#~ msgid "Save and Continue" +#~ msgstr "Save and Continue" + +#~ msgid "Create new record" +#~ msgstr "Create new record" + +#~ msgid "Edit record" +#~ msgstr "Edit record" + +#~ msgid "Delete record" +#~ msgstr "Delete record" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:159 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:158 -msgid "Please select at least one record." -msgstr "Please select at least one record." diff --git a/flask_admin/translations/es/LC_MESSAGES/admin.mo b/flask_admin/translations/es/LC_MESSAGES/admin.mo index 16f965802e5bb22c222a14183c743ec22f20e1f0..0a1dd8bedae7d0acfdd1588e84f1a1d5b34d7c6f 100644 GIT binary patch delta 1884 zcmYM!Yi!I}7{~GFUt`d!xwuqqFH>4nJKdQ<H>JCjG$by4(MX6}nv^9%c(p-gL^hka zG+CJyi4g3@i;7EPDshSH8}ULAmyQ=2MBUc1La3<3_m??|W@bL;od5Zs^PK0L)Ass( zQ<B|b-yY*{E#D%(zxPw^``>H7nVSB?TzrQC?8E*zcz{_QhB1nBF^-$C8jm?2U?X+^ zK)&jS!_AV`Oko@itDU>E59}=Rj@?AP(1k(l#t^=B?cShlzk$er7IgKoSVO%AOL3`l z3;L)Zz&z%+zbR<o6Ig(kunfCU6Mx2X)bcB!0!QN<S6_#k;4jzSiDRgD;Scx)ORyj> z`(7=o|01kpe%nZ)5dXnZcmaoC#`zpI&_`52;lbGz6r#4Q1S2>VHSiMTV{QD5!0i~u zL#{oIL#bcJr1thM1*Ih8e28j)f;spMHNZ<8hJCIc%Fj+*j><?QYT#9<iQC-s6wagG ziONI{tJ4`O8$$kBl*MV#-u;a9v1U|2EzXswiPxYqwH1|#eW<_=qu%R8ZRJ&r;vK9) zkJ+@PQH)>{R^$2r`Bwl3XwYfyK-Ev820V|-#C6nRyn&oMyNBxEjSA!`k`((F)vwn* zS2P;Wk9r<Pj+2$T_R6GtFd5rDvl*y?Z*jy4-tHsk$9hl$|Bo}V7h_n@@~7ciOyF^x zh>vg<4r4zQ@DkKnS%F&lHXM)1lN3f$$e<#7hYH{eDgz#QSLy@&Xr<+-epRT$HW@X+ z0*vD_)NT0_mHN}D_Z}lju@^|}){7kWq~)^ll{8eK25Lg>-9pp=e_#ckLPef&?fp4n zW2wjS7hLG-dz}|?0_{B*!60}0M~tIxSqnyW|Jx|g$Bv>Ryn=f1HY(+Ps1^7~Qv~x+ zsjEf>wgC0sW-P;<sM~NH*-g9U>W@*G^>KnVZZ7(n-@+91pb&N4N|BF^=7(*xdQ{4q zP=U3eGP4V{1!qwIA2O&+e!#_8!ZH=mCM?GNNY?Ef>Kfj}qy~ONK>=tKt<;aoNIvS& zl)Lr@)P%E<<6)~%1GZre?#5cYjLOU><YUDQqSV)+&eUque7_Zue_e|$G$@cAs0{3P z9S)+-#1T|rCs3(7jXH!EP}l1k>XzI=_3w7=&ruV;N8KimH0Zsc($Ub`Y7ObcfT6y0 zYu+a>y(a&fm-;Etp6&_E^+JhB(O6wHF)5NrOo`Q1#p0<Mp<nwgZ){F=gc`i5saK&5 gzIbg-EWIpz-ItzMa3m+~A2mHEHNWU^Dp>sW8@A549RL6T delta 2082 zcmZA1e`wTo9LMp`ZgVwHce|^0%}w{!X;$v$-7U6UOPjiBkW0dXGQ!*LyLs!p+mBnR zAh#lFu*C8h)kMk?DyYbAflQK?Bq~t~iDFbB{TL-1g#8gw_I$Yy2#xI?pU?ZgpU>z0 zd4E3NjWz9U&i)W68a4d%@mIy);X?Ip{M6oLj6xxtixKo;GtR+>a1}m+A$%DlIDxfz z#aeN*F|G95uvpLGZN_9xj>d8V?_1B!eqsJX#u{JA?0_Ja(O-mqTxsJisOL5!6PnGo z--UJbQ&^1$t)F2L{qNDs`sOkXO+1Z3yoQT0$aa<KDqM;W;4*Y^369wQN2mq9wehQ1 zLqF&xS-cM`@d?|11~q;Zt6AS1rEwQt#0vDxGiCu+VJS9R+fWldib|{xwUeEwquYZH zj-e7dhWwiE_$bFI4B#~z56q|jw-BhNp);;WP1tB{w(%D95N}0Iun~0!w&Jb$w2cp; zLqCVw;W%pk3#bHsx8Hl%)h7BirPN;~>LZ{DUqOms-a?(_2gn%n1uC(#*7K-^FQF<n zgQ`dglPJM5)VLbdxCrWq8!&_$a0L$fsK3to5CI2ISbxG=`g0higrcb1zS{QJqZZhV zs@zkkOW1+jThoJjegKu&E~M&a2=&}v`~7H^h88$rA9xqJe`egqkK6be94?@gsEN0+ zO*U=1ko#r^Q4<g0IvmC@euZoBAB^JtoJT$O;s(qfrlE|lpf1s$sGSF>@13{?Z^!MZ z#GXSXFoLSUtH`f;lMn559QE8W)Fu29HUH13{|nQ&6dlf&BgmRo8rN?#QgyQv^?nbd z-hwgI+wm!Cq90LbIE6aHa&Fc#T#HJ4J1Rbkci<$h#wpZu%X!BY-*jEhKSSeg0te8+ zleiLpMI{hq`&uxH%we{n5`7jm?j=;|KS6C|0v()0Rq!%uVJ|mT<07~iTW|^Mn@$=W zt9elYd<|9N3Dm@&qb5FO<KLiO$MeXqxyT2nX8u5q*%XttDp-L^a0RL&kD-p_dDQ=r zw=t{I9;dMtr%;)#=i7zYg&dc80ri@`ftvUzD#0_T#Ll8Ba{+aSrfu9yM+*i}2}V&H zYD3N2Ud8#>(dZ=5fcsIUI*ks_Aaj{AveA*$qAuN&s04aYuT?K9u|25D?6cqRN8Op% zQHdTxCGZ~Vl777K-r3i0f`DG5lc)jb(2JK)3;u$7-L9er7B0&FR$N(B((PuP9qG86 z%+Ji7@9{m{(c^Yz9*jF~-(V~`kpFw$se;19ZZ|hsy01FckxX<raktk^#obirE+>`F zIEmCiCYDUP@w$Awuf4z@X$*y<p>U%U4mYXYko&N#I~Vk~<R16;71r0?lmFU(x@bXb ze}B5)i6xzMN5)OL{f?WQ%_E&3DL>)~+(=}=NpzEolW(e6>nYw6+Yvi)B)7Zr9cRn` T@=3%<$mSD^r|WW6Rsa46S^4v8 diff --git a/flask_admin/translations/es/LC_MESSAGES/admin.po b/flask_admin/translations/es/LC_MESSAGES/admin.po index f3c89ecd0..a367db535 100644 --- a/flask_admin/translations/es/LC_MESSAGES/admin.po +++ b/flask_admin/translations/es/LC_MESSAGES/admin.po @@ -1,275 +1,264 @@ + msgid "" msgstr "" -"Project-Id-Version: flask-admin\n" +"Project-Id-Version: flask-admin\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-02-07 00:17-0600\n" +"POT-Creation-Date: 2024-09-24 22:09+0100\n" "PO-Revision-Date: 2017-02-13 09:18-0500\n" "Last-Translator: mrjoes <serge.koval@gmail.com>\n" +"Language: es_ES\n" "Language-Team: Spanish\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.1.1\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: flask-admin\n" -"X-Crowdin-Language: es-ES\n" -"X-Crowdin-File: admin.pot\n" -"Language: es_ES\n" +"Generated-By: Babel 2.16.0\n" -#: ../flask_admin/base.py:440 +#: ../flask_admin/base.py:458 msgid "Home" msgstr "Inicio" -#: ../flask_admin/contrib/rediscli.py:127 +#: ../flask_admin/contrib/rediscli.py:113 msgid "Cli: Invalid command." msgstr "CLI: Comando no válido." -#: ../flask_admin/contrib/fileadmin/__init__.py:352 +#: ../flask_admin/contrib/fileadmin/__init__.py:376 msgid "File to upload" msgstr "Archivo a subir" -#: ../flask_admin/contrib/fileadmin/__init__.py:360 +#: ../flask_admin/contrib/fileadmin/__init__.py:384 msgid "File required." msgstr "Se necesita un archivo" -#: ../flask_admin/contrib/fileadmin/__init__.py:365 +#: ../flask_admin/contrib/fileadmin/__init__.py:389 msgid "Invalid file type." msgstr "El tipo de archivo no es válido." -#: ../flask_admin/contrib/fileadmin/__init__.py:376 +#: ../flask_admin/contrib/fileadmin/__init__.py:400 msgid "Content" msgstr "Contenido" -#: ../flask_admin/contrib/fileadmin/__init__.py:390 +#: ../flask_admin/contrib/fileadmin/__init__.py:414 msgid "Invalid name" msgstr "Nombre inválido" -#: ../flask_admin/contrib/fileadmin/__init__.py:398 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:106 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:112 -#: ../flask_admin/tests/sqla/test_translation.py:17 +#: ../flask_admin/contrib/fileadmin/__init__.py:422 +#: ../flask_admin/tests/sqla/test_translation.py:21 msgid "Name" msgstr "Nombre" -#: ../flask_admin/contrib/fileadmin/__init__.py:757 +#: ../flask_admin/contrib/fileadmin/__init__.py:784 #, python-format msgid "File \"%(name)s\" already exists." msgstr "El archivo \"%(name)s\" ya existe." -#: ../flask_admin/contrib/fileadmin/__init__.py:802 -#: ../flask_admin/contrib/fileadmin/__init__.py:885 -#: ../flask_admin/contrib/fileadmin/__init__.py:947 -#: ../flask_admin/contrib/fileadmin/__init__.py:1000 -#: ../flask_admin/contrib/fileadmin/__init__.py:1047 -#: ../flask_admin/contrib/fileadmin/__init__.py:1099 -#: ../flask_admin/model/base.py:2168 +#: ../flask_admin/contrib/fileadmin/__init__.py:829 +#: ../flask_admin/contrib/fileadmin/__init__.py:926 +#: ../flask_admin/contrib/fileadmin/__init__.py:988 +#: ../flask_admin/contrib/fileadmin/__init__.py:1041 +#: ../flask_admin/contrib/fileadmin/__init__.py:1088 +#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/model/base.py:2324 msgid "Permission denied." msgstr "Permiso denegado." -#: ../flask_admin/contrib/fileadmin/__init__.py:881 +#: ../flask_admin/contrib/fileadmin/__init__.py:922 msgid "File uploading is disabled." msgstr "La subida de archivos está deshabilitada." -#: ../flask_admin/contrib/fileadmin/__init__.py:892 +#: ../flask_admin/contrib/fileadmin/__init__.py:933 #, python-format msgid "Successfully saved file: %(name)s" msgstr "Archivo guardado con éxito: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:896 +#: ../flask_admin/contrib/fileadmin/__init__.py:937 #, python-format msgid "Failed to save file: %(error)s" msgstr "Error al guardar el archivo: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:904 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:150 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:150 +#: ../flask_admin/contrib/fileadmin/__init__.py:945 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:150 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:152 msgid "Upload File" msgstr "Subir archivo" -#: ../flask_admin/contrib/fileadmin/__init__.py:943 +#: ../flask_admin/contrib/fileadmin/__init__.py:984 msgid "Directory creation is disabled." msgstr "Creación de carpetas deshabilitada." -#: ../flask_admin/contrib/fileadmin/__init__.py:956 +#: ../flask_admin/contrib/fileadmin/__init__.py:997 #, python-format msgid "Successfully created directory: %(directory)s" msgstr "Directorio creado correctamente: %(directory)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:960 +#: ../flask_admin/contrib/fileadmin/__init__.py:1001 #, python-format msgid "Failed to create directory: %(error)s" msgstr "No se ha podido crear la carpeta: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:970 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:161 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:161 +#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:161 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:163 msgid "Create Directory" msgstr "Crear carpeta" -#: ../flask_admin/contrib/fileadmin/__init__.py:996 +#: ../flask_admin/contrib/fileadmin/__init__.py:1037 msgid "Deletion is disabled." msgstr "El borrado está deshabilitado." -#: ../flask_admin/contrib/fileadmin/__init__.py:1005 +#: ../flask_admin/contrib/fileadmin/__init__.py:1046 msgid "Directory deletion is disabled." msgstr "El borrado de carpetas está deshabilitado." -#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/contrib/fileadmin/__init__.py:1052 #, python-format msgid "Directory \"%(path)s\" was successfully deleted." msgstr "Con éxito se suprimió el directorio \"%(path)s\"." -#: ../flask_admin/contrib/fileadmin/__init__.py:1013 +#: ../flask_admin/contrib/fileadmin/__init__.py:1054 #, python-format msgid "Failed to delete directory: %(error)s" msgstr "No se ha podido borrar la carpeta: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1019 -#: ../flask_admin/contrib/fileadmin/__init__.py:1176 +#: ../flask_admin/contrib/fileadmin/__init__.py:1060 +#: ../flask_admin/contrib/fileadmin/__init__.py:1215 #, python-format msgid "File \"%(name)s\" was successfully deleted." msgstr "El archivo \"%(name)s\" se ha borrado con éxito." -#: ../flask_admin/contrib/fileadmin/__init__.py:1021 -#: ../flask_admin/contrib/fileadmin/__init__.py:1178 +#: ../flask_admin/contrib/fileadmin/__init__.py:1062 +#: ../flask_admin/contrib/fileadmin/__init__.py:1217 #, python-format msgid "Failed to delete file: %(name)s" msgstr "No se ha podido borrar el archivo: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1043 +#: ../flask_admin/contrib/fileadmin/__init__.py:1084 msgid "Renaming is disabled." msgstr "Renombrar está deshabilitado." -#: ../flask_admin/contrib/fileadmin/__init__.py:1051 +#: ../flask_admin/contrib/fileadmin/__init__.py:1092 msgid "Path does not exist." msgstr "La ruta no existe." -#: ../flask_admin/contrib/fileadmin/__init__.py:1061 +#: ../flask_admin/contrib/fileadmin/__init__.py:1102 #, python-format msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\"" msgstr "\"%(src)s\" ha sido renombrado a \"%(dst)s\" correctamente" -#: ../flask_admin/contrib/fileadmin/__init__.py:1064 +#: ../flask_admin/contrib/fileadmin/__init__.py:1105 #, python-format msgid "Failed to rename: %(error)s" msgstr "No se ha podido renombrar: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1078 +#: ../flask_admin/contrib/fileadmin/__init__.py:1119 #, python-format msgid "Rename %(name)s" msgstr "Cambiar el nombre de %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1115 +#: ../flask_admin/contrib/fileadmin/__init__.py:1155 #, python-format msgid "Error saving changes to %(name)s." msgstr "Error al guardar los cambios en %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1119 +#: ../flask_admin/contrib/fileadmin/__init__.py:1159 #, python-format msgid "Changes to %(name)s saved successfully." msgstr "Cambios %(name)s guardado correctamente." -#: ../flask_admin/contrib/fileadmin/__init__.py:1128 +#: ../flask_admin/contrib/fileadmin/__init__.py:1167 #, python-format msgid "Error reading %(name)s." msgstr "Error %(name)s de lectura." -#: ../flask_admin/contrib/fileadmin/__init__.py:1131 -#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/contrib/fileadmin/__init__.py:1170 +#: ../flask_admin/contrib/fileadmin/__init__.py:1179 #, python-format msgid "Unexpected error while reading from %(name)s" msgstr "Error inesperado durante la lectura de %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1137 +#: ../flask_admin/contrib/fileadmin/__init__.py:1176 #, python-format msgid "Cannot edit %(name)s." msgstr "No se puede editar %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1155 +#: ../flask_admin/contrib/fileadmin/__init__.py:1194 #, python-format msgid "Editing %(path)s" msgstr "Edición %(path)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/peewee/view.py:487 -#: ../flask_admin/contrib/pymongo/view.py:384 -#: ../flask_admin/contrib/sqla/view.py:1149 +#: ../flask_admin/contrib/fileadmin/__init__.py:1202 +#: ../flask_admin/contrib/peewee/view.py:510 +#: ../flask_admin/contrib/pymongo/view.py:385 +#: ../flask_admin/contrib/sqla/view.py:1241 msgid "Delete" msgstr "Borrar" -#: ../flask_admin/contrib/fileadmin/__init__.py:1164 +#: ../flask_admin/contrib/fileadmin/__init__.py:1203 msgid "Are you sure you want to delete these files?" msgstr "¿Está seguro de que desea borrar estos archivos?" -#: ../flask_admin/contrib/fileadmin/__init__.py:1167 +#: ../flask_admin/contrib/fileadmin/__init__.py:1206 msgid "File deletion is disabled." msgstr "Eliminación de archivos está deshabilitado." -#: ../flask_admin/contrib/fileadmin/__init__.py:1180 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:22 +#: ../flask_admin/contrib/fileadmin/__init__.py:1219 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:22 msgid "Edit" msgstr "Editar" -#: ../flask_admin/contrib/fileadmin/s3.py:153 +#: ../flask_admin/contrib/fileadmin/s3.py:162 msgid "Cannot operate on non empty directories" msgstr "No puede funcionar en directorios no vacíos" #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 -#: ../flask_admin/contrib/sqla/filters.py:41 +#: ../flask_admin/contrib/sqla/filters.py:42 msgid "equals" msgstr "igual a" #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 -#: ../flask_admin/contrib/sqla/filters.py:49 +#: ../flask_admin/contrib/sqla/filters.py:50 msgid "not equal" msgstr "no es igual a" #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 -#: ../flask_admin/contrib/sqla/filters.py:58 +#: ../flask_admin/contrib/sqla/filters.py:59 msgid "contains" msgstr "contiene" #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 -#: ../flask_admin/contrib/sqla/filters.py:67 +#: ../flask_admin/contrib/sqla/filters.py:68 msgid "not contains" msgstr "no contiene" #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 -#: ../flask_admin/contrib/sqla/filters.py:75 +#: ../flask_admin/contrib/sqla/filters.py:76 msgid "greater than" msgstr "mayor que" #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 -#: ../flask_admin/contrib/sqla/filters.py:83 +#: ../flask_admin/contrib/sqla/filters.py:84 msgid "smaller than" msgstr "menor que" #: ../flask_admin/contrib/peewee/filters.py:88 -#: ../flask_admin/contrib/sqla/filters.py:94 +#: ../flask_admin/contrib/sqla/filters.py:95 msgid "empty" msgstr "vacío" #: ../flask_admin/contrib/peewee/filters.py:102 -#: ../flask_admin/contrib/sqla/filters.py:108 +#: ../flask_admin/contrib/sqla/filters.py:109 msgid "in list" msgstr "en la lista" #: ../flask_admin/contrib/peewee/filters.py:111 -#: ../flask_admin/contrib/sqla/filters.py:118 +#: ../flask_admin/contrib/sqla/filters.py:119 msgid "not in list" msgstr "no en la lista" @@ -282,84 +271,85 @@ msgstr "no en la lista" msgid "not between" msgstr "No entre" -msgid "ObjectId equals" -msgstr "ObjectId es igual a" - -#, python-format -msgid "Failed to get model. %(error)s" -msgstr "Error al obtener el modelo. %(error)s" - -#: ../flask_admin/contrib/peewee/view.py:435 -#: ../flask_admin/contrib/pymongo/view.py:316 -#: ../flask_admin/contrib/sqla/view.py:1078 +#: ../flask_admin/contrib/peewee/view.py:458 +#: ../flask_admin/contrib/pymongo/view.py:317 +#: ../flask_admin/contrib/sqla/view.py:1170 #, python-format msgid "Failed to create record. %(error)s" msgstr "Error al crear el registro. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:454 -#: ../flask_admin/contrib/pymongo/view.py:341 -#: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 -#: ../flask_admin/model/base.py:2313 ../flask_admin/model/base.py:2315 +#: ../flask_admin/contrib/peewee/view.py:477 +#: ../flask_admin/contrib/pymongo/view.py:342 +#: ../flask_admin/contrib/sqla/view.py:1196 ../flask_admin/model/base.py:2463 +#: ../flask_admin/model/base.py:2471 ../flask_admin/model/base.py:2473 #, python-format msgid "Failed to update record. %(error)s" msgstr "Error al actualizar el registro. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:469 -#: ../flask_admin/contrib/pymongo/view.py:366 -#: ../flask_admin/contrib/sqla/view.py:1129 +#: ../flask_admin/contrib/peewee/view.py:492 +#: ../flask_admin/contrib/pymongo/view.py:367 +#: ../flask_admin/contrib/sqla/view.py:1221 #, python-format msgid "Failed to delete record. %(error)s" msgstr "Error al borrar el registro. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:488 -#: ../flask_admin/contrib/pymongo/view.py:385 -#: ../flask_admin/contrib/sqla/view.py:1150 +#: ../flask_admin/contrib/peewee/view.py:511 +#: ../flask_admin/contrib/pymongo/view.py:386 +#: ../flask_admin/contrib/sqla/view.py:1242 msgid "Are you sure you want to delete selected records?" msgstr "¿Está seguro de que desea borrar los elementos seleccionados?" -#: ../flask_admin/contrib/peewee/view.py:505 -#: ../flask_admin/contrib/pymongo/view.py:395 -#: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 +#: ../flask_admin/contrib/peewee/view.py:528 +#: ../flask_admin/contrib/pymongo/view.py:396 +#: ../flask_admin/contrib/sqla/view.py:1258 ../flask_admin/model/base.py:2272 #, python-format msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." msgstr[0] "El elemento se ha borrado correctamente." msgstr[1] "%(count)s elementos se han borrado correctamente." -#: ../flask_admin/contrib/peewee/view.py:511 -#: ../flask_admin/contrib/pymongo/view.py:400 -#: ../flask_admin/contrib/sqla/view.py:1174 +#: ../flask_admin/contrib/peewee/view.py:534 +#: ../flask_admin/contrib/pymongo/view.py:401 +#: ../flask_admin/contrib/sqla/view.py:1266 #, python-format msgid "Failed to delete records. %(error)s" msgstr "No se han podido borrar los elementos seleccionados. %(error)s" -#: ../flask_admin/contrib/sqla/fields.py:126 -#: ../flask_admin/contrib/sqla/fields.py:176 -#: ../flask_admin/contrib/sqla/fields.py:181 ../flask_admin/model/fields.py:173 -#: ../flask_admin/model/fields.py:222 +#: ../flask_admin/contrib/sqla/fields.py:117 +#: ../flask_admin/contrib/sqla/fields.py:167 +#: ../flask_admin/contrib/sqla/fields.py:172 ../flask_admin/model/fields.py:174 +#: ../flask_admin/model/fields.py:223 msgid "Not a valid choice" msgstr "No es una opción válida" -#: ../flask_admin/contrib/sqla/fields.py:186 +#: ../flask_admin/contrib/sqla/fields.py:201 msgid "Key" msgstr "Clave" -#: ../flask_admin/contrib/sqla/fields.py:187 +#: ../flask_admin/contrib/sqla/fields.py:202 msgid "Value" msgstr "Valor" -#: ../flask_admin/contrib/sqla/validators.py:42 +#: ../flask_admin/contrib/sqla/validators.py:28 msgid "Already exists." msgstr "Ya existe." -#: ../flask_admin/contrib/sqla/validators.py:60 +#: ../flask_admin/contrib/sqla/validators.py:59 #, python-format msgid "At least %(num)d item is required" msgid_plural "At least %(num)d items are required" msgstr[0] "Al menos %(num)d item es requerido" msgstr[1] "Al menos %(num)d item son requeridos" -#: ../flask_admin/contrib/sqla/view.py:1057 +#: ../flask_admin/contrib/sqla/validators.py:75 +msgid "Not a valid ISO currency code (e.g. USD, EUR, CNY)." +msgstr "" + +#: ../flask_admin/contrib/sqla/validators.py:83 +msgid "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." +msgstr "" + +#: ../flask_admin/contrib/sqla/view.py:1134 #, python-format msgid "Integrity error. %(message)s" msgstr "Error de integridad. %(message)s" @@ -368,274 +358,242 @@ msgstr "Error de integridad. %(message)s" msgid "Invalid time format" msgstr "El formato de hora no es válido" -#: ../flask_admin/form/fields.py:144 +#: ../flask_admin/form/fields.py:147 msgid "Invalid Choice: could not coerce" msgstr "Elección inválida: no se puede ajustar" -#: ../flask_admin/form/fields.py:208 +#: ../flask_admin/form/fields.py:221 msgid "Invalid JSON" msgstr "JSON no válido" -#: ../flask_admin/form/upload.py:207 +#: ../flask_admin/form/upload.py:216 msgid "Invalid file extension" msgstr "Extensión del archivo no válido" -#: ../flask_admin/form/upload.py:214 ../flask_admin/form/upload.py:281 +#: ../flask_admin/form/upload.py:223 ../flask_admin/form/upload.py:293 #, python-format msgid "File \"%s\" already exists." msgstr "El archivo \"%s\" ya existe." -#: ../flask_admin/model/base.py:1649 +#: ../flask_admin/form/validators.py:16 +msgid "This field requires at least one item." +msgstr "" + +#: ../flask_admin/model/base.py:1737 msgid "There are no items in the table." msgstr "No hay objetos en la tabla." -#: ../flask_admin/model/base.py:1673 +#: ../flask_admin/model/base.py:1746 #, python-format msgid "Invalid Filter Value: %(value)s" msgstr "Valor de filtro no válido: %(value)s" -#: ../flask_admin/model/base.py:1984 +#: ../flask_admin/model/base.py:2136 msgid "Record was successfully created." msgstr "El elemento se ha creado correctamente." -#: ../flask_admin/model/base.py:2028 ../flask_admin/model/base.py:2080 -#: ../flask_admin/model/base.py:2113 ../flask_admin/model/base.py:2297 +#: ../flask_admin/model/base.py:2180 ../flask_admin/model/base.py:2232 +#: ../flask_admin/model/base.py:2265 ../flask_admin/model/base.py:2455 msgid "Record does not exist." msgstr "No existe ningún registro." -#: ../flask_admin/model/base.py:2037 ../flask_admin/model/base.py:2301 +#: ../flask_admin/model/base.py:2189 ../flask_admin/model/base.py:2459 msgid "Record was successfully saved." msgstr "Registro fue guardado con éxito." -#: ../flask_admin/model/base.py:2222 -msgid "Tablib dependency not installed." -msgstr "Tablib dependencia no instalado." - -#: ../flask_admin/model/base.py:2249 +#: ../flask_admin/model/base.py:2407 #, python-format msgid "Export type \"%(type)s not supported." msgstr "Exportación de tipo \"%(type)s no compatible." -#: ../flask_admin/model/filters.py:103 ../flask_admin/model/widgets.py:111 +#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:119 msgid "Yes" msgstr "Si" -#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:110 +#: ../flask_admin/model/filters.py:105 ../flask_admin/model/widgets.py:118 msgid "No" msgstr "No" -#: ../flask_admin/model/filters.py:172 ../flask_admin/model/filters.py:212 -#: ../flask_admin/model/filters.py:257 +#: ../flask_admin/model/filters.py:173 ../flask_admin/model/filters.py:213 +#: ../flask_admin/model/filters.py:258 msgid "between" msgstr "entre" -#: ../flask_admin/model/template.py:81 ../flask_admin/model/template.py:88 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:37 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:8 +#: ../flask_admin/model/template.py:83 ../flask_admin/model/template.py:90 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:7 msgid "View Record" msgstr "Ver registro" -#: ../flask_admin/model/template.py:95 ../flask_admin/model/template.py:102 -#: ../flask_admin/model/template.py:109 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/edit.html:11 +#: ../flask_admin/model/template.py:97 ../flask_admin/model/template.py:104 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/edit.html:10 msgid "Edit Record" msgstr "Editar Registro" -#: ../flask_admin/model/widgets.py:61 +#: ../flask_admin/model/template.py:111 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Delete Record" +msgstr "" + +#: ../flask_admin/model/widgets.py:62 msgid "Please select model" msgstr "Por favor, seleccione el modelo" -#: ../flask_admin/templates/bootstrap2/admin/actions.html:4 -#: ../flask_admin/templates/bootstrap3/admin/actions.html:4 +#: ../flask_admin/templates/bootstrap4/admin/actions.html:5 msgid "With selected" msgstr "Con seleccionados" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:200 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:190 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:216 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:227 msgid "Save" msgstr "Salvar" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:205 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:195 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:221 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:232 msgid "Cancel" msgstr "Cancelar" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:256 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:247 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:290 msgid "Save and Add Another" msgstr "Guardar y agregar otro" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:259 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:250 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:293 msgid "Save and Continue Editing" msgstr "Guardar y continuar editando" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:9 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:9 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:10 msgid "Root" msgstr "Raíz" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:90 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:99 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:89 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:98 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:42 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:51 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:89 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:98 #, python-format msgid "Sort by %(name)s" msgstr "Ordenar por %(name)s" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:77 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:79 msgid "Rename File" msgstr "Renombrar El Archivo" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:88 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:88 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:90 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\' recursively?" msgstr "¿Está seguro de que desea borrar \\'%(name)s\\' de forma recursiva?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:97 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:97 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:99 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\'?" msgstr "¿Está seguro de que desea borrar \\'%(name)s\\'?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:125 -msgid "Size" -msgstr "Tamaño" - -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:185 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:187 msgid "Please select at least one file." msgstr "Por favor, seleccione al menos un archivo." -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:8 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:17 msgid "List" msgstr "Listado" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:12 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:18 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 msgid "Create" msgstr "Crear" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:26 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:26 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:21 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:26 msgid "Details" msgstr "Detalles" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:29 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:28 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:15 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:28 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:15 msgid "Filter" msgstr "Filtrar" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:13 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:14 msgid "Delete?" msgstr "¿Borrar?" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:33 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:16 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:35 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Are you sure you want to delete this record?" +msgstr "¿Está seguro de que quiere borrar este elemento?" + +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:33 msgid "New" msgstr "Nuevo" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:43 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:43 msgid "Add" msgstr "Nuevo" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:3 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:3 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:2 msgid "Add Filter" msgstr "Añadir filtro" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:30 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:19 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:26 msgid "Export" msgstr "Exportar" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:38 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:38 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:49 msgid "Apply" msgstr "Aplicar" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:40 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:51 msgid "Reset Filters" msgstr "Restaurar filtros" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:66 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:64 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:80 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:93 +#, python-format +msgid "%(placeholder)s" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:88 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:94 msgid "Search" msgstr "Buscar" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:74 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:77 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:78 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:79 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:72 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:75 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:76 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:77 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:102 msgid "items" msgstr "artículos" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/create.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/create.html:10 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/create.html:10 msgid "Create New Record" msgstr "Crear Nuevo Registro" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:76 msgid "Select all records" msgstr "Seleccionar todos los registros" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:120 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:119 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:119 msgid "Select record" msgstr "Seleccione registro" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:186 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:195 msgid "Please select at least one record." msgstr "Por favor, seleccione al menos un elemento." -#: ../flask_admin/templates/bootstrap2/admin/model/row_actions.html:34 -#: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 -msgid "Are you sure you want to delete this record?" -msgstr "¿Está seguro de que quiere borrar este elemento?" +#~ msgid "ObjectId equals" +#~ msgstr "ObjectId es igual a" + +#~ msgid "Failed to get model. %(error)s" +#~ msgstr "Error al obtener el modelo. %(error)s" + +#~ msgid "Tablib dependency not installed." +#~ msgstr "Tablib dependencia no instalado." + +#~ msgid "Size" +#~ msgstr "Tamaño" + diff --git a/flask_admin/translations/et/LC_MESSAGES/admin.mo b/flask_admin/translations/et/LC_MESSAGES/admin.mo index 03d1b080744cbed57a9bd63bc74c74d7a2de98ae..ae4c4ad0bec5bf6e7d04ae4ac4b8feaab2673615 100644 GIT binary patch delta 1829 zcmYM!TWC~A9LMqh(U>*SO?GoLyT-UNYMRT&-85<wqxC|N5^oR2iWHQhY|$u09~$Yy z`dC8@v{Nr&2<c0xtyFLkAC#81_@o#VA}YaFX|bXZK~%J;{r;MPE@#hYX7*&}KmYlk z47W|TX782c9XCE1zEym;PFL^$&p^JJhK^w&euc$2gfs9gw&8h9;uB0`JY?2{8@z|H zlm003h&{n_v#dR%QO7{R%>M=~jSSg()PtKbg4-~P89#m)_1qC;BKy+!hq0OdD9*=m z?{mzfUtVA~3*#7JeOpXp4g<@v1~;P??!`sehYN7n_kTf6{LqhwNJ}mK2AqqVup0NG z{_ZI1`LkG$*D!`JFwXiGA)F#?^tPiW`Un-s9#rH#s3Ypd1P-DmK8Le$3@dN~OYoT= z&*#Td`lYCO>by;u)!C+LOv9z9Kl}j8u*>&%VS@f4)Q-MEEp*Y3U&oE~Cs8|J8J?<< zPmma_2X#b!$Yq1v6v$AR{HyUT16pttm6}VaosXjenm{g_<fdA9gGnqRZH?H0I=as= zf&JKoKcE7*?fnxq&r{UK-xiU7711<Gn)<LpR8^Ov0*E1-vIOe6Bx=H?etZp52DZtM zZ};Q7aWLShQ1hyCX<C6dhMKQFOJfC%G-^ltaS5KrX1t2p$!q)&>qv(J%%EyvKc=xC zmBGuXjNU-)@D{RJyNlZSBh<n#k@~ajI~tWV3aJq7tQH$^2_|p{F2pZTI~_qT`<|O> z;3rJrIJV*o)B=q}qqpLHRFQs+@8RdD8XB4UJ!`+w&};V4{}859v|tMLU^i-lK3t5a zP&M*1Ch!jGh+ZRmu@F(!U>tRX9jJiTq2}pA73n^#)%)L1L#g=@HNj;h+cxIM?<1E@ za#QN_`DdXN&qk#<ih6s>QK_y(VzD~Zd@E4_Z9#45pdUYuG1j;5XmsGOsL0--BCY0J zwD2mNhuyw^2({yWRB@d|l4m2R{~H%jJHLTUWw%jh{S>+EA8yKc8EMR_*xG3*!o8>} z9YCGc5GsHxsM?r7y?%eAcK!-g6K_y~gyK^fil9<nfm*oQ_v=v^O8fEEapKbiT?}YP z-QG{*xrWe@Aa`@-fxzu4{3Ew})>z<{hZnki;hx;%@OnDM$J}4VJ6vaEi#r`T5p8Kr zrrMG%t%;VF_EcMAD(%)rGt+l=cDggswZRJaINF<+Ue=t-?JOAxa;0Tw0(ZasZtg+F htHAwUS>qzH1G%qbnZUh`J9mEWMmM9X+wH1a^)EI$yY2u0 delta 2345 zcma*nTWnNC9LMq5whOeBUXg8~&_n43uy-12rIDhx;H8QfFKG?9rN_E;ySwdfl{V3B zqKOpn0;knPgV6+IGz1figosKaJ{TX0CK3&xhN=k>r7`hAl4||_=p;U93{7`GXJ*dK z{O3P2JKgYFQ}VmKv~j~<Kc6B#hf-Dg=dW_UF{-M<46MU!Y(_uciA}f-t8gFI;RjfW zzgP<w7}H9*4d>}Syv~@U@p!19;%)1fa}DMS(${3C&vgi34&@b?i#4`>6Y9M!$be?6 zEkA<Qlp|P-2dy7r8s%?sA@iFl9yIV}4B#xT!~n}xq)k|gEm(#wmf&7nK7yLyD_j3N zuA&@RNU*p8mtlu3KaT1@j>XJxj`OevzrjLG$uwpu7GV}PTH8<q-G>USAGMNQsI7Yv z9ef29&<W(<oa1W=Uc@|{we@+6$bUW+#XM+_*P#Y%v^LxNO_)M`D{6o(s58)si}5jA zKY|Wr54FOhsPVr>1#ro>r?9Ga%B!--zf#msg$8^PNrHJDwU>vHKIRitU|(3zpe8<x z%Gfk2Bk2sH0CQ0NR-yXUp|*HER^ev69tX3@zxMhKDjYmz{ShlE`{|{C>QSftCR@H0 zHNjR?=C-2_VHa|4O)u*GI4ZCqB<p4b_1<%~eLTs7CV17p@D_6Z%u!qav913cM}4Fc zH9?SN5~Jz04x<L%gB$PwYNeA{gELr-mF$NW)`=T2xtj+?`WfmFO=1OJLfzwh@~l+1 z@}*REpjNyC$-3Ez%ESOFfDz;ZnB7=_9%_MyaV;K42Y<j)-TyQ;S}R_I%xTu44$EeA za62|&5;eh5q@(!|b<HlIPP?B@tFa7q`0hfr_oJ@uIF{oH+dhS*y8nJIy*jK#4b+Z$ zu@7~)#?Zkds69N5WYe6-l{k&s<6M@j01Hs#IH<$jf(m2@DpOCR`tQeF<~N6I!!aZ% z^C>FD=TKYoJu3A-+4`SR*YPrH3w}eL1w~6TOb%*-a#Vm#s0DVSGW?WnKY&R-=1snu z@gyqZ8Pp1v@hhZ&HsEsHX3H^DCZ0td#xZ0&%|X-;)O)CmOd`oKXHaM2SJXoOKw>t3 zE+zlkn<ezpDQ!kY97YG9N3HB#)ZU&%1#}UWnOW4~@^f;z7$z5$xf0ZwDn|uai+aBa zwM83I0c|e2VXk7EeW3%D(ueH}QPe=gs1-kB-Cs1ZXWodfJQ#^Y6HYYd4g?df6OA|# zK5kzuG30cI2Hc&A=s?JgPb^pv^Od&libV$!PGTtLIwfVR<(fDh5>9+DrY5($+Iu4X zLVAyzaQdR%ZrEFqv1H=GjMKi<JKQ0!JhLqO?yg=2y{+4E`v-&JxOaPIU;fsx8;rY7 z+zrz-*Ky)l<`!RSXxQ~;7QIj$><WjvoNhPfM!Ma|&Y`Pwh9dDqFdWvLqgfB72E&8i zRMx%zP{Qqtdkxty=hih=)z(+lHafMnH|lx4cRstvYs<OW8_nrYU02;O@mJ11U&Srg zn1a!~cdju7^^4CHwhyxWkP|y~Xdo2naon!psrMrhH=dZ7T|7VKYC8OZl7FS6JP`fQ mbc_Wa^`(S{y(<MTE&u;q>@B<}?S3WWY~cfGN`_anwB>If9!&oL diff --git a/flask_admin/translations/et/LC_MESSAGES/admin.po b/flask_admin/translations/et/LC_MESSAGES/admin.po index 705d32f74..7a271244f 100644 --- a/flask_admin/translations/et/LC_MESSAGES/admin.po +++ b/flask_admin/translations/et/LC_MESSAGES/admin.po @@ -1,275 +1,264 @@ + msgid "" msgstr "" -"Project-Id-Version: flask-admin\n" +"Project-Id-Version: flask-admin\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-02-07 00:17-0600\n" +"POT-Creation-Date: 2024-09-24 22:09+0100\n" "PO-Revision-Date: 2017-02-07 01:19-0500\n" "Last-Translator: mrjoes <serge.koval@gmail.com>\n" +"Language: et_EE\n" "Language-Team: Estonian\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.1.1\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: flask-admin\n" -"X-Crowdin-Language: et\n" -"X-Crowdin-File: admin.pot\n" -"Language: et_EE\n" +"Generated-By: Babel 2.16.0\n" -#: ../flask_admin/base.py:440 +#: ../flask_admin/base.py:458 msgid "Home" msgstr "Esileht" -#: ../flask_admin/contrib/rediscli.py:127 +#: ../flask_admin/contrib/rediscli.py:113 msgid "Cli: Invalid command." msgstr "CLI: Sobimatu käsk." -#: ../flask_admin/contrib/fileadmin/__init__.py:352 +#: ../flask_admin/contrib/fileadmin/__init__.py:376 msgid "File to upload" msgstr "Üleslaaditav fail" -#: ../flask_admin/contrib/fileadmin/__init__.py:360 +#: ../flask_admin/contrib/fileadmin/__init__.py:384 msgid "File required." msgstr "Fail puudub." -#: ../flask_admin/contrib/fileadmin/__init__.py:365 +#: ../flask_admin/contrib/fileadmin/__init__.py:389 msgid "Invalid file type." msgstr "Vale failitüüp." -#: ../flask_admin/contrib/fileadmin/__init__.py:376 +#: ../flask_admin/contrib/fileadmin/__init__.py:400 msgid "Content" msgstr "Sisu" -#: ../flask_admin/contrib/fileadmin/__init__.py:390 +#: ../flask_admin/contrib/fileadmin/__init__.py:414 msgid "Invalid name" msgstr "Lubamatu nimi" -#: ../flask_admin/contrib/fileadmin/__init__.py:398 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:106 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:112 -#: ../flask_admin/tests/sqla/test_translation.py:17 +#: ../flask_admin/contrib/fileadmin/__init__.py:422 +#: ../flask_admin/tests/sqla/test_translation.py:21 msgid "Name" msgstr "Nimi" -#: ../flask_admin/contrib/fileadmin/__init__.py:757 +#: ../flask_admin/contrib/fileadmin/__init__.py:784 #, python-format msgid "File \"%(name)s\" already exists." msgstr "Fail \"%(name)s\" on juba olemas." -#: ../flask_admin/contrib/fileadmin/__init__.py:802 -#: ../flask_admin/contrib/fileadmin/__init__.py:885 -#: ../flask_admin/contrib/fileadmin/__init__.py:947 -#: ../flask_admin/contrib/fileadmin/__init__.py:1000 -#: ../flask_admin/contrib/fileadmin/__init__.py:1047 -#: ../flask_admin/contrib/fileadmin/__init__.py:1099 -#: ../flask_admin/model/base.py:2168 +#: ../flask_admin/contrib/fileadmin/__init__.py:829 +#: ../flask_admin/contrib/fileadmin/__init__.py:926 +#: ../flask_admin/contrib/fileadmin/__init__.py:988 +#: ../flask_admin/contrib/fileadmin/__init__.py:1041 +#: ../flask_admin/contrib/fileadmin/__init__.py:1088 +#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/model/base.py:2324 msgid "Permission denied." msgstr "Õigused puuduvad." -#: ../flask_admin/contrib/fileadmin/__init__.py:881 +#: ../flask_admin/contrib/fileadmin/__init__.py:922 msgid "File uploading is disabled." msgstr "Faili üleslaadimine on keelatud." -#: ../flask_admin/contrib/fileadmin/__init__.py:892 +#: ../flask_admin/contrib/fileadmin/__init__.py:933 #, python-format msgid "Successfully saved file: %(name)s" msgstr "Fail %(name)s edukalt salvestatud" -#: ../flask_admin/contrib/fileadmin/__init__.py:896 +#: ../flask_admin/contrib/fileadmin/__init__.py:937 #, python-format msgid "Failed to save file: %(error)s" msgstr "Faili salvestamine nurjus: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:904 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:150 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:150 +#: ../flask_admin/contrib/fileadmin/__init__.py:945 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:150 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:152 msgid "Upload File" msgstr "Failide üleslaadimine" -#: ../flask_admin/contrib/fileadmin/__init__.py:943 +#: ../flask_admin/contrib/fileadmin/__init__.py:984 msgid "Directory creation is disabled." msgstr "Kataloogide loomine on keelatud." -#: ../flask_admin/contrib/fileadmin/__init__.py:956 +#: ../flask_admin/contrib/fileadmin/__init__.py:997 #, python-format msgid "Successfully created directory: %(directory)s" msgstr "Kataloog %(directory)s edukalt loodud" -#: ../flask_admin/contrib/fileadmin/__init__.py:960 +#: ../flask_admin/contrib/fileadmin/__init__.py:1001 #, python-format msgid "Failed to create directory: %(error)s" msgstr "Kataloogi loomine nurjus: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:970 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:161 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:161 +#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:161 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:163 msgid "Create Directory" msgstr "Kausta loomine" -#: ../flask_admin/contrib/fileadmin/__init__.py:996 +#: ../flask_admin/contrib/fileadmin/__init__.py:1037 msgid "Deletion is disabled." msgstr "Kustutamine on keelatud." -#: ../flask_admin/contrib/fileadmin/__init__.py:1005 +#: ../flask_admin/contrib/fileadmin/__init__.py:1046 msgid "Directory deletion is disabled." msgstr "Kataloogide kustutamine on keelatud." -#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/contrib/fileadmin/__init__.py:1052 #, python-format msgid "Directory \"%(path)s\" was successfully deleted." msgstr "Kataloog \"%(path)s\" on edukalt kustutatud." -#: ../flask_admin/contrib/fileadmin/__init__.py:1013 +#: ../flask_admin/contrib/fileadmin/__init__.py:1054 #, python-format msgid "Failed to delete directory: %(error)s" msgstr "Kataloogi ei saanud kustutada: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1019 -#: ../flask_admin/contrib/fileadmin/__init__.py:1176 +#: ../flask_admin/contrib/fileadmin/__init__.py:1060 +#: ../flask_admin/contrib/fileadmin/__init__.py:1215 #, python-format msgid "File \"%(name)s\" was successfully deleted." msgstr "Fail \"%(name)s\" on edukalt kustutatud." -#: ../flask_admin/contrib/fileadmin/__init__.py:1021 -#: ../flask_admin/contrib/fileadmin/__init__.py:1178 +#: ../flask_admin/contrib/fileadmin/__init__.py:1062 +#: ../flask_admin/contrib/fileadmin/__init__.py:1217 #, python-format msgid "Failed to delete file: %(name)s" msgstr "Faili kustutamine nurjus: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1043 +#: ../flask_admin/contrib/fileadmin/__init__.py:1084 msgid "Renaming is disabled." msgstr "Ümbernimetamine on keelatud." -#: ../flask_admin/contrib/fileadmin/__init__.py:1051 +#: ../flask_admin/contrib/fileadmin/__init__.py:1092 msgid "Path does not exist." msgstr "Asukohta pole olemas." -#: ../flask_admin/contrib/fileadmin/__init__.py:1061 +#: ../flask_admin/contrib/fileadmin/__init__.py:1102 #, python-format msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\"" msgstr "Ümbernimetamine \"%(src)s\" \"%(dst)s\" oli edukas" -#: ../flask_admin/contrib/fileadmin/__init__.py:1064 +#: ../flask_admin/contrib/fileadmin/__init__.py:1105 #, python-format msgid "Failed to rename: %(error)s" msgstr "Ümbernimetamine nurjus: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1078 +#: ../flask_admin/contrib/fileadmin/__init__.py:1119 #, python-format msgid "Rename %(name)s" msgstr "Faili %(name)s ümbernimetamine" -#: ../flask_admin/contrib/fileadmin/__init__.py:1115 +#: ../flask_admin/contrib/fileadmin/__init__.py:1155 #, python-format msgid "Error saving changes to %(name)s." msgstr "Faili %(name)s muutuste salvestamisel ilmnes tõrge." -#: ../flask_admin/contrib/fileadmin/__init__.py:1119 +#: ../flask_admin/contrib/fileadmin/__init__.py:1159 #, python-format msgid "Changes to %(name)s saved successfully." msgstr "Faili %(name)s muudatused on edukalt salvestatud." -#: ../flask_admin/contrib/fileadmin/__init__.py:1128 +#: ../flask_admin/contrib/fileadmin/__init__.py:1167 #, python-format msgid "Error reading %(name)s." msgstr "Tõrge faili %(name)s lugemisel." -#: ../flask_admin/contrib/fileadmin/__init__.py:1131 -#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/contrib/fileadmin/__init__.py:1170 +#: ../flask_admin/contrib/fileadmin/__init__.py:1179 #, python-format msgid "Unexpected error while reading from %(name)s" msgstr "Ootamatu tõrge faili %(name)s lugemisel" -#: ../flask_admin/contrib/fileadmin/__init__.py:1137 +#: ../flask_admin/contrib/fileadmin/__init__.py:1176 #, python-format msgid "Cannot edit %(name)s." msgstr "%(name)s ei saa redigeerida." -#: ../flask_admin/contrib/fileadmin/__init__.py:1155 +#: ../flask_admin/contrib/fileadmin/__init__.py:1194 #, python-format msgid "Editing %(path)s" msgstr "%(path)s redigeerimine" -#: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/peewee/view.py:487 -#: ../flask_admin/contrib/pymongo/view.py:384 -#: ../flask_admin/contrib/sqla/view.py:1149 +#: ../flask_admin/contrib/fileadmin/__init__.py:1202 +#: ../flask_admin/contrib/peewee/view.py:510 +#: ../flask_admin/contrib/pymongo/view.py:385 +#: ../flask_admin/contrib/sqla/view.py:1241 msgid "Delete" msgstr "Kustuta" -#: ../flask_admin/contrib/fileadmin/__init__.py:1164 +#: ../flask_admin/contrib/fileadmin/__init__.py:1203 msgid "Are you sure you want to delete these files?" msgstr "Olete kindel, et soovite neid faile kustutada?" -#: ../flask_admin/contrib/fileadmin/__init__.py:1167 +#: ../flask_admin/contrib/fileadmin/__init__.py:1206 msgid "File deletion is disabled." msgstr "Failide kustutamine on keelatud." -#: ../flask_admin/contrib/fileadmin/__init__.py:1180 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:22 +#: ../flask_admin/contrib/fileadmin/__init__.py:1219 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:22 msgid "Edit" msgstr "Redigeeri" -#: ../flask_admin/contrib/fileadmin/s3.py:153 +#: ../flask_admin/contrib/fileadmin/s3.py:162 msgid "Cannot operate on non empty directories" msgstr "" #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 -#: ../flask_admin/contrib/sqla/filters.py:41 +#: ../flask_admin/contrib/sqla/filters.py:42 msgid "equals" msgstr "võrdub" #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 -#: ../flask_admin/contrib/sqla/filters.py:49 +#: ../flask_admin/contrib/sqla/filters.py:50 msgid "not equal" msgstr "ei võrdu" #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 -#: ../flask_admin/contrib/sqla/filters.py:58 +#: ../flask_admin/contrib/sqla/filters.py:59 msgid "contains" msgstr "sisaldab" #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 -#: ../flask_admin/contrib/sqla/filters.py:67 +#: ../flask_admin/contrib/sqla/filters.py:68 msgid "not contains" msgstr "ei sisalda" #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 -#: ../flask_admin/contrib/sqla/filters.py:75 +#: ../flask_admin/contrib/sqla/filters.py:76 msgid "greater than" msgstr "suurem kui" #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 -#: ../flask_admin/contrib/sqla/filters.py:83 +#: ../flask_admin/contrib/sqla/filters.py:84 msgid "smaller than" msgstr "väiksem kui" #: ../flask_admin/contrib/peewee/filters.py:88 -#: ../flask_admin/contrib/sqla/filters.py:94 +#: ../flask_admin/contrib/sqla/filters.py:95 msgid "empty" msgstr "tühi" #: ../flask_admin/contrib/peewee/filters.py:102 -#: ../flask_admin/contrib/sqla/filters.py:108 +#: ../flask_admin/contrib/sqla/filters.py:109 msgid "in list" msgstr "loendis" #: ../flask_admin/contrib/peewee/filters.py:111 -#: ../flask_admin/contrib/sqla/filters.py:118 +#: ../flask_admin/contrib/sqla/filters.py:119 msgid "not in list" msgstr "pole loendis" @@ -282,84 +271,85 @@ msgstr "pole loendis" msgid "not between" msgstr "pole vahemikus" -msgid "ObjectId equals" -msgstr "" - -#, python-format -msgid "Failed to get model. %(error)s" -msgstr "Mudeli päring ebaõnnestus. %(error)s" - -#: ../flask_admin/contrib/peewee/view.py:435 -#: ../flask_admin/contrib/pymongo/view.py:316 -#: ../flask_admin/contrib/sqla/view.py:1078 +#: ../flask_admin/contrib/peewee/view.py:458 +#: ../flask_admin/contrib/pymongo/view.py:317 +#: ../flask_admin/contrib/sqla/view.py:1170 #, python-format msgid "Failed to create record. %(error)s" msgstr "Kirje loomine nurjus. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:454 -#: ../flask_admin/contrib/pymongo/view.py:341 -#: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 -#: ../flask_admin/model/base.py:2313 ../flask_admin/model/base.py:2315 +#: ../flask_admin/contrib/peewee/view.py:477 +#: ../flask_admin/contrib/pymongo/view.py:342 +#: ../flask_admin/contrib/sqla/view.py:1196 ../flask_admin/model/base.py:2463 +#: ../flask_admin/model/base.py:2471 ../flask_admin/model/base.py:2473 #, python-format msgid "Failed to update record. %(error)s" msgstr "Kirje uuendamine nurjus. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:469 -#: ../flask_admin/contrib/pymongo/view.py:366 -#: ../flask_admin/contrib/sqla/view.py:1129 +#: ../flask_admin/contrib/peewee/view.py:492 +#: ../flask_admin/contrib/pymongo/view.py:367 +#: ../flask_admin/contrib/sqla/view.py:1221 #, python-format msgid "Failed to delete record. %(error)s" msgstr "Kirje kustutamine nurjus. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:488 -#: ../flask_admin/contrib/pymongo/view.py:385 -#: ../flask_admin/contrib/sqla/view.py:1150 +#: ../flask_admin/contrib/peewee/view.py:511 +#: ../flask_admin/contrib/pymongo/view.py:386 +#: ../flask_admin/contrib/sqla/view.py:1242 msgid "Are you sure you want to delete selected records?" msgstr "Kas soovite kindlasti valitud kirjed kustutada?" -#: ../flask_admin/contrib/peewee/view.py:505 -#: ../flask_admin/contrib/pymongo/view.py:395 -#: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 +#: ../flask_admin/contrib/peewee/view.py:528 +#: ../flask_admin/contrib/pymongo/view.py:396 +#: ../flask_admin/contrib/sqla/view.py:1258 ../flask_admin/model/base.py:2272 #, python-format msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." msgstr[0] "Kirje kustutati edukalt." msgstr[1] "%(count)s kirjet kustutati edukalt." -#: ../flask_admin/contrib/peewee/view.py:511 -#: ../flask_admin/contrib/pymongo/view.py:400 -#: ../flask_admin/contrib/sqla/view.py:1174 +#: ../flask_admin/contrib/peewee/view.py:534 +#: ../flask_admin/contrib/pymongo/view.py:401 +#: ../flask_admin/contrib/sqla/view.py:1266 #, python-format msgid "Failed to delete records. %(error)s" msgstr "Kirjete kustutamine nurjus. %(error)s" -#: ../flask_admin/contrib/sqla/fields.py:126 -#: ../flask_admin/contrib/sqla/fields.py:176 -#: ../flask_admin/contrib/sqla/fields.py:181 ../flask_admin/model/fields.py:173 -#: ../flask_admin/model/fields.py:222 +#: ../flask_admin/contrib/sqla/fields.py:117 +#: ../flask_admin/contrib/sqla/fields.py:167 +#: ../flask_admin/contrib/sqla/fields.py:172 ../flask_admin/model/fields.py:174 +#: ../flask_admin/model/fields.py:223 msgid "Not a valid choice" msgstr "Ebasobiv valik" -#: ../flask_admin/contrib/sqla/fields.py:186 +#: ../flask_admin/contrib/sqla/fields.py:201 msgid "Key" msgstr "" -#: ../flask_admin/contrib/sqla/fields.py:187 +#: ../flask_admin/contrib/sqla/fields.py:202 msgid "Value" msgstr "" -#: ../flask_admin/contrib/sqla/validators.py:42 +#: ../flask_admin/contrib/sqla/validators.py:28 msgid "Already exists." msgstr "On juba olemas." -#: ../flask_admin/contrib/sqla/validators.py:60 +#: ../flask_admin/contrib/sqla/validators.py:59 #, python-format msgid "At least %(num)d item is required" msgid_plural "At least %(num)d items are required" msgstr[0] "Vaja vähemalt %(num)d elementi" msgstr[1] "Vaja vähemalt %(num)d elementi" -#: ../flask_admin/contrib/sqla/view.py:1057 +#: ../flask_admin/contrib/sqla/validators.py:75 +msgid "Not a valid ISO currency code (e.g. USD, EUR, CNY)." +msgstr "" + +#: ../flask_admin/contrib/sqla/validators.py:83 +msgid "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." +msgstr "" + +#: ../flask_admin/contrib/sqla/view.py:1134 #, python-format msgid "Integrity error. %(message)s" msgstr "Terviklikkuse viga. %(message)s" @@ -368,274 +358,242 @@ msgstr "Terviklikkuse viga. %(message)s" msgid "Invalid time format" msgstr "Vigane kellaajavorming" -#: ../flask_admin/form/fields.py:144 +#: ../flask_admin/form/fields.py:147 msgid "Invalid Choice: could not coerce" msgstr "Vigane valik: pole teisendatav" -#: ../flask_admin/form/fields.py:208 +#: ../flask_admin/form/fields.py:221 msgid "Invalid JSON" msgstr "Sobimatu JSON" -#: ../flask_admin/form/upload.py:207 +#: ../flask_admin/form/upload.py:216 msgid "Invalid file extension" msgstr "Vigane faililaiend" -#: ../flask_admin/form/upload.py:214 ../flask_admin/form/upload.py:281 +#: ../flask_admin/form/upload.py:223 ../flask_admin/form/upload.py:293 #, python-format msgid "File \"%s\" already exists." msgstr "Fail \"%s\" on juba olemas." -#: ../flask_admin/model/base.py:1649 +#: ../flask_admin/form/validators.py:16 +msgid "This field requires at least one item." +msgstr "" + +#: ../flask_admin/model/base.py:1737 msgid "There are no items in the table." msgstr "Tabel on tühi." -#: ../flask_admin/model/base.py:1673 +#: ../flask_admin/model/base.py:1746 #, python-format msgid "Invalid Filter Value: %(value)s" msgstr "Sobimatu filtriväärtus: %(value)s" -#: ../flask_admin/model/base.py:1984 +#: ../flask_admin/model/base.py:2136 msgid "Record was successfully created." msgstr "Kirje loomine oli edukas." -#: ../flask_admin/model/base.py:2028 ../flask_admin/model/base.py:2080 -#: ../flask_admin/model/base.py:2113 ../flask_admin/model/base.py:2297 +#: ../flask_admin/model/base.py:2180 ../flask_admin/model/base.py:2232 +#: ../flask_admin/model/base.py:2265 ../flask_admin/model/base.py:2455 msgid "Record does not exist." msgstr "Kirje pole olemas." -#: ../flask_admin/model/base.py:2037 ../flask_admin/model/base.py:2301 +#: ../flask_admin/model/base.py:2189 ../flask_admin/model/base.py:2459 msgid "Record was successfully saved." msgstr "Kirje salvestamine oli edukas." -#: ../flask_admin/model/base.py:2222 -msgid "Tablib dependency not installed." -msgstr "" - -#: ../flask_admin/model/base.py:2249 +#: ../flask_admin/model/base.py:2407 #, python-format msgid "Export type \"%(type)s not supported." msgstr "" -#: ../flask_admin/model/filters.py:103 ../flask_admin/model/widgets.py:111 +#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:119 msgid "Yes" msgstr "Jah" -#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:110 +#: ../flask_admin/model/filters.py:105 ../flask_admin/model/widgets.py:118 msgid "No" msgstr "Ei" -#: ../flask_admin/model/filters.py:172 ../flask_admin/model/filters.py:212 -#: ../flask_admin/model/filters.py:257 +#: ../flask_admin/model/filters.py:173 ../flask_admin/model/filters.py:213 +#: ../flask_admin/model/filters.py:258 msgid "between" msgstr "vahemikus" -#: ../flask_admin/model/template.py:81 ../flask_admin/model/template.py:88 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:37 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:8 +#: ../flask_admin/model/template.py:83 ../flask_admin/model/template.py:90 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:7 msgid "View Record" msgstr "Kirje vaade" -#: ../flask_admin/model/template.py:95 ../flask_admin/model/template.py:102 -#: ../flask_admin/model/template.py:109 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/edit.html:11 +#: ../flask_admin/model/template.py:97 ../flask_admin/model/template.py:104 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/edit.html:10 msgid "Edit Record" msgstr "Kirje redigeerimine" -#: ../flask_admin/model/widgets.py:61 +#: ../flask_admin/model/template.py:111 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Delete Record" +msgstr "" + +#: ../flask_admin/model/widgets.py:62 msgid "Please select model" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/actions.html:4 -#: ../flask_admin/templates/bootstrap3/admin/actions.html:4 +#: ../flask_admin/templates/bootstrap4/admin/actions.html:5 msgid "With selected" msgstr "Toiming valikuga" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:200 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:190 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:216 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:227 msgid "Save" msgstr "Salvesta" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:205 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:195 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:221 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:232 msgid "Cancel" msgstr "Loobu" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:256 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:247 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:290 msgid "Save and Add Another" msgstr "Salvesta ja lisa uus" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:259 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:250 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:293 msgid "Save and Continue Editing" msgstr "Salvesta ja jätka muutmist" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:9 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:9 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:10 msgid "Root" msgstr "Juurkataloog" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:90 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:99 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:89 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:98 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:42 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:51 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:89 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:98 #, python-format msgid "Sort by %(name)s" msgstr "Sorteeri %(name)s alusel" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:77 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:79 msgid "Rename File" msgstr "Faili ümbernimetamine" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:88 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:88 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:90 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\' recursively?" msgstr "Kas soovite kindlasti kustutada \\'%(name)s\\' rekursiivselt?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:97 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:97 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:99 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\'?" msgstr "Kas soovite kindlasti kustutada \\'%(name)s\\'?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:125 -msgid "Size" -msgstr "" - -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:185 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:187 msgid "Please select at least one file." msgstr "Palun valige vähemalt üks fail." -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:8 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:17 msgid "List" msgstr "Loend" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:12 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:18 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 msgid "Create" msgstr "Loo" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:26 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:26 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:21 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:26 msgid "Details" msgstr "Detailvaade" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:29 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:28 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:15 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:28 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:15 msgid "Filter" msgstr "Filter" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:13 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:14 msgid "Delete?" msgstr "Kustutada?" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:33 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:16 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:35 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Are you sure you want to delete this record?" +msgstr "Kas soovite kindlasti selle kirje kustutada?" + +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:33 msgid "New" msgstr "Uus" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:43 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:43 msgid "Add" msgstr "Lisamine" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:3 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:3 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:2 msgid "Add Filter" msgstr "Filtri lisamine" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:30 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:19 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:26 msgid "Export" msgstr "Eksport" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:38 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:38 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:49 msgid "Apply" msgstr "Rakenda" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:40 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:51 msgid "Reset Filters" msgstr "Filtrite lähtestamine" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:66 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:64 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:80 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:93 +#, python-format +msgid "%(placeholder)s" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:88 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:94 msgid "Search" msgstr "Otsing" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:74 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:77 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:78 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:79 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:72 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:75 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:76 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:77 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:102 msgid "items" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/create.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/create.html:10 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/create.html:10 msgid "Create New Record" msgstr "Loo Uus Kirje" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:76 msgid "Select all records" msgstr "Kõigi kirjete valimine" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:120 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:119 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:119 msgid "Select record" msgstr "Vali kirje" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:186 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:195 msgid "Please select at least one record." msgstr "Palun valige vähemalt üks kirje." -#: ../flask_admin/templates/bootstrap2/admin/model/row_actions.html:34 -#: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 -msgid "Are you sure you want to delete this record?" -msgstr "Kas soovite kindlasti selle kirje kustutada?" +#~ msgid "ObjectId equals" +#~ msgstr "" + +#~ msgid "Failed to get model. %(error)s" +#~ msgstr "Mudeli päring ebaõnnestus. %(error)s" + +#~ msgid "Tablib dependency not installed." +#~ msgstr "" + +#~ msgid "Size" +#~ msgstr "" + diff --git a/flask_admin/translations/fa/LC_MESSAGES/admin.mo b/flask_admin/translations/fa/LC_MESSAGES/admin.mo index 8affba1e87345dc4281af476d7030a82d3a39be8..cc876f084922b586ce7643c550a26d5e46f6380e 100644 GIT binary patch delta 1847 zcmYMze`wTo9LMp`-7PoIZoAvmZMU_Zl~cFfyu1B4x3!@S6-!-&)JSV0Hx@S1;Xm3R zo_~b6aE5)BP;R0m)21Z!jS@7d{Ud@nF{BHvgnq#sD2QT_)$^4f@VNUvKJWK^zn{<h z^W!_#mFvv@RGjyr;nUBrlHZ1aqQ{^8vy4${7=w5ai*OX5z|+`@pJN<nFp1H8W9o6O za~G~89!G95GdRzfthq~L5sBFa|0hfmNtxBC8@n-#uV4iGU49qpzCB1sW}l0XU<2_u zR^v72J<KDXH`|yw7{xH-n;IIWB+|G5yHNuV;zHbsPva36e~aq)50}qpS)L)T#R^=H zRk#)P+z{&i)3^jLVL9H%DC3(j<rHF_vkleJ8dM>DsLBUWTQrC<Jb>!>3_gidI3I6d zG2V6gS^QZ-T!QLnk+UAN+S?=zKQ^NtT!wS;MHg?z81W9&j7CrcedY3(aUJn()XY0V zkIu*@qy{s9+M=Dv*Bs!YLPkTZzZ%C#XuxsQ(wsxh{2HpD8_3t(=AyIk5aU?Lven^p zsI7YwWB4A{<0(`DIp?pae(s<q{!bz6uS4YLNOL|+5Ou0cPz97DlQJ>XeQ{KW%`U$J zIR<9E%lEi^28VrY6|&9dU#iy11UbPvD@#!Mby*rO(CEQ-`~;Wb&)9`!On*6ULcKm? zsKS211Wu!#t6+m`@KsdDyPZSG*Nkvc0Vh$<UqDSbdzpq#`S+-qK16jKWIq;TJF1`z z>i;p++cJUL(@E5fa@dG}yL^H_JBU|d8s9|~dLCQw0XFOXU&={pBhlwPik-yQaXCgA ztrj<868AdKVgvCsmSH&;-IsE{j#`O*sF_+^ileAAb_tvG{{K!RN}__S-p>})ifl#} z!|ZkO$Ec3JK`r4$7hiGl52&}}Ch9c}&?%ENF;t-~&OX#@JA#WD-+V!%2Y*yTH}dk+ zG`*-jdk2;O2-7%;D&#NJ3<Hd&nH8c6??mM@sDid3i)21P^)rF(_#I}uX%s#6Xis`k ze;h(>!Bx}>M5sa?EJRYK1GNGhks8bv)PTE@b8Ci>gKrMI_!R27ubtOX{r*`+x2(Pi zu^w8I8ZPQ!Rkc@}zsKiYEqL2!`+_&U%$zBoO^2SfZ-oZDTcOniMZ@;DqSx%o@Jse^ z_)sL(6i>9qQ%$i{sx8r4mq^;@BmIHiH80ywBP)FEb~-YcmuzWBcyAO}`Mu+F>-+^d zFLxsMS#H8^FHL)mrIkK!e_3_Fo~h`v{>p>iiOTtYJ6Sbjr>ft#nb?>1Sggc0F4+1X D>TJt~ delta 2348 zcma*oeN5F=9LMo<FQ6a@2ns=R`5_N#3WBKk6vHWmP)XW@E9bm;e>w1SxtDuMX%?<c zGar`gH`Zoz%VjZ_!#}P|t&y9xa{WVYxzMte>yMUct@%%zW$%xitv_l@#^rU+_xC$b z-*e7oyz%Jj!SC`?hYUY4J~R0oPf_ikpZSxGQK%ZHU>)Y*N=(B?aT%`1YCMQ__#w{6 zU#vyx#xzrJ!AW`#XBabRJPNZ3oUmS+cwqiO+M1k<i3Ww3OFe+oaDk1lLcQ0DbZ9zk z{dugR9>G#PY8}N?>en!n@y&G#>i8BG;$1AmLYAwUF2f3J!b)^;79Ozm5!3)*+4yZN zr(T%JWN`&Ph|k*k3#j%(Sjzb3EQPr^jz#FtGNu@3Vm3BdTTmT6g_>9lwUV8vt$PU_ zJc63gN64@FhCc=P6XxMv8_%0c{__cxQqUgPqdIJ`uC(!0=qKKc>Yx>M2A;#|xZTEg zqeI<8t?)Fe|F2OKxM83BS=D3I%d^S9QWPVg4i6(qFmI#w@+8v6TtH3iOY3FSz*kWj z`xTXu3_8&Sb5ZTeQSItbTf79T@e!Pd{W;`cdwq<6gP&M`#QD_IXr&1)M4k3VTVI13 zpaYe;&8S1ziJV*0je0+hn%Dr6b+a4w-XZ&ZXpn*ic+0*pjGRAn+QvV&@h@<nk5nS( z%WPqp%G`F;VcU<2k6;^~!xflH{+D7CuEqgu!co+99Q=!dX1IoY)?z!(#$Bimj$;*m zj~ZYy`y%s@rltfnkvddA9jFXEgSstSP%Gby>fggT_$e~6L37i-P{j$+^{YohrX97i zAlBm^8$X8?)W`5)yp0XGkj9#DH!i{Va4}xP<(U5fUt0J$s(t_)b^kx3&_p1Olk^a_ zpuWLk)_1Um`eo!*lgi!HdnMLZR7T>cmA{M&@KvOVIfIMv67p*%affx?%dk@Szny|o z8B+lFpbpjhs18q|QhV0c&)fP%)HNGJ&a3$y^*!L{k1|+_n)qUC2sMs}`hFP3LG8uo z6gJ{-sQTKHiJA7H_Vy4eei9q-GHPN|d8m~apjKRlTEG)Fz5_MESCCyW@1m~bD5}2; z0rJ0s!VLoJa5mG@-t9mKM^Mklun{u}Y6WeWhMQ3xhmbj$U8qbQL6TvPp(Z$r`k!$T zm8q+?{<E`mqTw9^>adtE19jw}25Lm@`FdmyW;?2*17*qmlXm;6f{{pX!s(5=eZhq5 z^hTTrAGar(7;r*eeeTvoZ(o-iPo}3weHG0+qrH6zCovFpomrK0<lHz75>C87sz+|9 z#@mtcL&i2Y;q>%|+^`pzQjpv@Wz3h-?hbfWS(Q2KI=ks~ZOCzB{lReDYs>1%?+ClW zxa-8-Fpnl0CO^n(^`&&Z=z4dizFr#a40m-pAvfwqLT+U1z`ZfMBJo5p9M+hxWp7Fe zhWowi*&EWj5^hi2Ta@$Ww7Q1s+J)7%4Nh(Ca+Q~O-{x%dT5?x;`*LF`^)-u<f93}K zRjcnS1<9iPYX5y@AlW=)lP`1R%D(a8D|^RJUD@j$oKfkkNe&gvOSzYZ^F?d^l?H$D s8~>RGuei{kx<Pq3G4rPL<o_jNsN`_k(`3T+DgtM0DuRLO-mO6Q-;;(?r2qf` diff --git a/flask_admin/translations/fa/LC_MESSAGES/admin.po b/flask_admin/translations/fa/LC_MESSAGES/admin.po index 9dd90ebe3..52a863e69 100644 --- a/flask_admin/translations/fa/LC_MESSAGES/admin.po +++ b/flask_admin/translations/fa/LC_MESSAGES/admin.po @@ -1,275 +1,264 @@ + msgid "" msgstr "" -"Project-Id-Version: flask-admin\n" +"Project-Id-Version: flask-admin\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-02-07 00:17-0600\n" +"POT-Creation-Date: 2024-09-24 22:09+0100\n" "PO-Revision-Date: 2017-02-07 01:19-0500\n" "Last-Translator: mrjoes <serge.koval@gmail.com>\n" +"Language: fa_IR\n" "Language-Team: Persian\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.1.1\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: flask-admin\n" -"X-Crowdin-Language: fa\n" -"X-Crowdin-File: admin.pot\n" -"Language: fa_IR\n" +"Generated-By: Babel 2.16.0\n" -#: ../flask_admin/base.py:440 +#: ../flask_admin/base.py:458 msgid "Home" msgstr "خانه" -#: ../flask_admin/contrib/rediscli.py:127 +#: ../flask_admin/contrib/rediscli.py:113 msgid "Cli: Invalid command." msgstr "Cli: دستور نامعتبر است." -#: ../flask_admin/contrib/fileadmin/__init__.py:352 +#: ../flask_admin/contrib/fileadmin/__init__.py:376 msgid "File to upload" msgstr "فایلی که باید آپلود شود" -#: ../flask_admin/contrib/fileadmin/__init__.py:360 +#: ../flask_admin/contrib/fileadmin/__init__.py:384 msgid "File required." msgstr "فایل لازم است" -#: ../flask_admin/contrib/fileadmin/__init__.py:365 +#: ../flask_admin/contrib/fileadmin/__init__.py:389 msgid "Invalid file type." msgstr "نوع فایل غیرمجاز است" -#: ../flask_admin/contrib/fileadmin/__init__.py:376 +#: ../flask_admin/contrib/fileadmin/__init__.py:400 msgid "Content" msgstr "محتوا" -#: ../flask_admin/contrib/fileadmin/__init__.py:390 +#: ../flask_admin/contrib/fileadmin/__init__.py:414 msgid "Invalid name" msgstr "نام اشتباه" -#: ../flask_admin/contrib/fileadmin/__init__.py:398 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:106 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:112 -#: ../flask_admin/tests/sqla/test_translation.py:17 +#: ../flask_admin/contrib/fileadmin/__init__.py:422 +#: ../flask_admin/tests/sqla/test_translation.py:21 msgid "Name" msgstr "نام" -#: ../flask_admin/contrib/fileadmin/__init__.py:757 +#: ../flask_admin/contrib/fileadmin/__init__.py:784 #, python-format msgid "File \"%(name)s\" already exists." msgstr "پرونده \"%(name)s\" وجود دارد." -#: ../flask_admin/contrib/fileadmin/__init__.py:802 -#: ../flask_admin/contrib/fileadmin/__init__.py:885 -#: ../flask_admin/contrib/fileadmin/__init__.py:947 -#: ../flask_admin/contrib/fileadmin/__init__.py:1000 -#: ../flask_admin/contrib/fileadmin/__init__.py:1047 -#: ../flask_admin/contrib/fileadmin/__init__.py:1099 -#: ../flask_admin/model/base.py:2168 +#: ../flask_admin/contrib/fileadmin/__init__.py:829 +#: ../flask_admin/contrib/fileadmin/__init__.py:926 +#: ../flask_admin/contrib/fileadmin/__init__.py:988 +#: ../flask_admin/contrib/fileadmin/__init__.py:1041 +#: ../flask_admin/contrib/fileadmin/__init__.py:1088 +#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/model/base.py:2324 msgid "Permission denied." msgstr "خطای دسترسی" -#: ../flask_admin/contrib/fileadmin/__init__.py:881 +#: ../flask_admin/contrib/fileadmin/__init__.py:922 msgid "File uploading is disabled." msgstr "آپلود فایل غیر فعال است" -#: ../flask_admin/contrib/fileadmin/__init__.py:892 +#: ../flask_admin/contrib/fileadmin/__init__.py:933 #, python-format msgid "Successfully saved file: %(name)s" msgstr "فایل با موفقیت ذخیره شده: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:896 +#: ../flask_admin/contrib/fileadmin/__init__.py:937 #, python-format msgid "Failed to save file: %(error)s" msgstr "ذخیره ی فایل بامشکل روبرو شد %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:904 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:150 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:150 +#: ../flask_admin/contrib/fileadmin/__init__.py:945 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:150 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:152 msgid "Upload File" msgstr "آپلود فایل" -#: ../flask_admin/contrib/fileadmin/__init__.py:943 +#: ../flask_admin/contrib/fileadmin/__init__.py:984 msgid "Directory creation is disabled." msgstr "ساخت پوشه غیر فعال است" -#: ../flask_admin/contrib/fileadmin/__init__.py:956 +#: ../flask_admin/contrib/fileadmin/__init__.py:997 #, python-format msgid "Successfully created directory: %(directory)s" msgstr "پوشه با موفقیت ایجاد شده: %(directory)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:960 +#: ../flask_admin/contrib/fileadmin/__init__.py:1001 #, python-format msgid "Failed to create directory: %(error)s" msgstr "ساخت پوشه ی با مشکل روبرو شد %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:970 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:161 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:161 +#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:161 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:163 msgid "Create Directory" msgstr "ایجاد پوشه" -#: ../flask_admin/contrib/fileadmin/__init__.py:996 +#: ../flask_admin/contrib/fileadmin/__init__.py:1037 msgid "Deletion is disabled." msgstr "حذف غیر فعال شده است." -#: ../flask_admin/contrib/fileadmin/__init__.py:1005 +#: ../flask_admin/contrib/fileadmin/__init__.py:1046 msgid "Directory deletion is disabled." msgstr "حذف دایرکتوری غیر فعال شده است." -#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/contrib/fileadmin/__init__.py:1052 #, python-format msgid "Directory \"%(path)s\" was successfully deleted." msgstr "پوشه %(path)s با موفقیت حذف شد." -#: ../flask_admin/contrib/fileadmin/__init__.py:1013 +#: ../flask_admin/contrib/fileadmin/__init__.py:1054 #, python-format msgid "Failed to delete directory: %(error)s" msgstr "حذف پوشه ی با مشکل روبرو شد %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1019 -#: ../flask_admin/contrib/fileadmin/__init__.py:1176 +#: ../flask_admin/contrib/fileadmin/__init__.py:1060 +#: ../flask_admin/contrib/fileadmin/__init__.py:1215 #, python-format msgid "File \"%(name)s\" was successfully deleted." msgstr "فایل \"%(name)s\" با موفقیت حذف شد" -#: ../flask_admin/contrib/fileadmin/__init__.py:1021 -#: ../flask_admin/contrib/fileadmin/__init__.py:1178 +#: ../flask_admin/contrib/fileadmin/__init__.py:1062 +#: ../flask_admin/contrib/fileadmin/__init__.py:1217 #, python-format msgid "Failed to delete file: %(name)s" msgstr "حذف فایل%(name)s با مشکل روبرو شد" -#: ../flask_admin/contrib/fileadmin/__init__.py:1043 +#: ../flask_admin/contrib/fileadmin/__init__.py:1084 msgid "Renaming is disabled." msgstr "تغییر نام غیر فعال است" -#: ../flask_admin/contrib/fileadmin/__init__.py:1051 +#: ../flask_admin/contrib/fileadmin/__init__.py:1092 msgid "Path does not exist." msgstr "مسیر وجود ندارد" -#: ../flask_admin/contrib/fileadmin/__init__.py:1061 +#: ../flask_admin/contrib/fileadmin/__init__.py:1102 #, python-format msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\"" msgstr "با موفقیت از\"%(src)s\" به \"%(dst)s\" تغییر نام داده شد" -#: ../flask_admin/contrib/fileadmin/__init__.py:1064 +#: ../flask_admin/contrib/fileadmin/__init__.py:1105 #, python-format msgid "Failed to rename: %(error)s" msgstr "تغییر نام با مشکل روبرو شد %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1078 +#: ../flask_admin/contrib/fileadmin/__init__.py:1119 #, python-format msgid "Rename %(name)s" msgstr "تغییر نام %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1115 +#: ../flask_admin/contrib/fileadmin/__init__.py:1155 #, python-format msgid "Error saving changes to %(name)s." msgstr "مشکل در ذخیره ی تغییرات %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1119 +#: ../flask_admin/contrib/fileadmin/__init__.py:1159 #, python-format msgid "Changes to %(name)s saved successfully." msgstr "تغییرات%(name)s با موفقیت صورت گرفت" -#: ../flask_admin/contrib/fileadmin/__init__.py:1128 +#: ../flask_admin/contrib/fileadmin/__init__.py:1167 #, python-format msgid "Error reading %(name)s." msgstr "مشکل در خواندن %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1131 -#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/contrib/fileadmin/__init__.py:1170 +#: ../flask_admin/contrib/fileadmin/__init__.py:1179 #, python-format msgid "Unexpected error while reading from %(name)s" msgstr "خطای غیر منتظره در حال خواندن %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1137 +#: ../flask_admin/contrib/fileadmin/__init__.py:1176 #, python-format msgid "Cannot edit %(name)s." msgstr "عدم توانایی در ویرایش %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1155 +#: ../flask_admin/contrib/fileadmin/__init__.py:1194 #, python-format msgid "Editing %(path)s" msgstr "ویرایش %(path)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/peewee/view.py:487 -#: ../flask_admin/contrib/pymongo/view.py:384 -#: ../flask_admin/contrib/sqla/view.py:1149 +#: ../flask_admin/contrib/fileadmin/__init__.py:1202 +#: ../flask_admin/contrib/peewee/view.py:510 +#: ../flask_admin/contrib/pymongo/view.py:385 +#: ../flask_admin/contrib/sqla/view.py:1241 msgid "Delete" msgstr "حذف" -#: ../flask_admin/contrib/fileadmin/__init__.py:1164 +#: ../flask_admin/contrib/fileadmin/__init__.py:1203 msgid "Are you sure you want to delete these files?" msgstr "آیا از حذف این فایل ها اطمینان دارید؟" -#: ../flask_admin/contrib/fileadmin/__init__.py:1167 +#: ../flask_admin/contrib/fileadmin/__init__.py:1206 msgid "File deletion is disabled." msgstr "امکان حذف فایل وجود ندارد" -#: ../flask_admin/contrib/fileadmin/__init__.py:1180 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:22 +#: ../flask_admin/contrib/fileadmin/__init__.py:1219 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:22 msgid "Edit" msgstr "ویرایش" -#: ../flask_admin/contrib/fileadmin/s3.py:153 +#: ../flask_admin/contrib/fileadmin/s3.py:162 msgid "Cannot operate on non empty directories" msgstr "" #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 -#: ../flask_admin/contrib/sqla/filters.py:41 +#: ../flask_admin/contrib/sqla/filters.py:42 msgid "equals" msgstr "برابر با" #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 -#: ../flask_admin/contrib/sqla/filters.py:49 +#: ../flask_admin/contrib/sqla/filters.py:50 msgid "not equal" msgstr "برابر نیست با" #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 -#: ../flask_admin/contrib/sqla/filters.py:58 +#: ../flask_admin/contrib/sqla/filters.py:59 msgid "contains" msgstr "محتوی" #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 -#: ../flask_admin/contrib/sqla/filters.py:67 +#: ../flask_admin/contrib/sqla/filters.py:68 msgid "not contains" msgstr "محتوی نیست" #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 -#: ../flask_admin/contrib/sqla/filters.py:75 +#: ../flask_admin/contrib/sqla/filters.py:76 msgid "greater than" msgstr "بزرگتر از" #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 -#: ../flask_admin/contrib/sqla/filters.py:83 +#: ../flask_admin/contrib/sqla/filters.py:84 msgid "smaller than" msgstr "کوچکتر از" #: ../flask_admin/contrib/peewee/filters.py:88 -#: ../flask_admin/contrib/sqla/filters.py:94 +#: ../flask_admin/contrib/sqla/filters.py:95 msgid "empty" msgstr "خالی باشد" #: ../flask_admin/contrib/peewee/filters.py:102 -#: ../flask_admin/contrib/sqla/filters.py:108 +#: ../flask_admin/contrib/sqla/filters.py:109 msgid "in list" msgstr "در این لیست باشد" #: ../flask_admin/contrib/peewee/filters.py:111 -#: ../flask_admin/contrib/sqla/filters.py:118 +#: ../flask_admin/contrib/sqla/filters.py:119 msgid "not in list" msgstr "در این لیست نباشد" @@ -282,84 +271,85 @@ msgstr "در این لیست نباشد" msgid "not between" msgstr "بین این دو نباشد" -msgid "ObjectId equals" -msgstr "" - -#, python-format -msgid "Failed to get model. %(error)s" -msgstr "خواندن مدل با مشکل روبرو شد. %(error)s" - -#: ../flask_admin/contrib/peewee/view.py:435 -#: ../flask_admin/contrib/pymongo/view.py:316 -#: ../flask_admin/contrib/sqla/view.py:1078 +#: ../flask_admin/contrib/peewee/view.py:458 +#: ../flask_admin/contrib/pymongo/view.py:317 +#: ../flask_admin/contrib/sqla/view.py:1170 #, python-format msgid "Failed to create record. %(error)s" msgstr "ساخت مدل با مشکل روبرو شد %(error)s" -#: ../flask_admin/contrib/peewee/view.py:454 -#: ../flask_admin/contrib/pymongo/view.py:341 -#: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 -#: ../flask_admin/model/base.py:2313 ../flask_admin/model/base.py:2315 +#: ../flask_admin/contrib/peewee/view.py:477 +#: ../flask_admin/contrib/pymongo/view.py:342 +#: ../flask_admin/contrib/sqla/view.py:1196 ../flask_admin/model/base.py:2463 +#: ../flask_admin/model/base.py:2471 ../flask_admin/model/base.py:2473 #, python-format msgid "Failed to update record. %(error)s" msgstr "بروزرسانی مدل با مشکل روبرو شد%(error)s" -#: ../flask_admin/contrib/peewee/view.py:469 -#: ../flask_admin/contrib/pymongo/view.py:366 -#: ../flask_admin/contrib/sqla/view.py:1129 +#: ../flask_admin/contrib/peewee/view.py:492 +#: ../flask_admin/contrib/pymongo/view.py:367 +#: ../flask_admin/contrib/sqla/view.py:1221 #, python-format msgid "Failed to delete record. %(error)s" msgstr "حذف مدل با مشکل روبرو شد %(error)s" -#: ../flask_admin/contrib/peewee/view.py:488 -#: ../flask_admin/contrib/pymongo/view.py:385 -#: ../flask_admin/contrib/sqla/view.py:1150 +#: ../flask_admin/contrib/peewee/view.py:511 +#: ../flask_admin/contrib/pymongo/view.py:386 +#: ../flask_admin/contrib/sqla/view.py:1242 msgid "Are you sure you want to delete selected records?" msgstr "آیا از حذف مدل ها اطمینان دارید" -#: ../flask_admin/contrib/peewee/view.py:505 -#: ../flask_admin/contrib/pymongo/view.py:395 -#: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 +#: ../flask_admin/contrib/peewee/view.py:528 +#: ../flask_admin/contrib/pymongo/view.py:396 +#: ../flask_admin/contrib/sqla/view.py:1258 ../flask_admin/model/base.py:2272 #, python-format msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." msgstr[0] "مدل با موفقیت حذف شد" msgstr[1] "%(count)s رکورد با موفقیت حذف شد." -#: ../flask_admin/contrib/peewee/view.py:511 -#: ../flask_admin/contrib/pymongo/view.py:400 -#: ../flask_admin/contrib/sqla/view.py:1174 +#: ../flask_admin/contrib/peewee/view.py:534 +#: ../flask_admin/contrib/pymongo/view.py:401 +#: ../flask_admin/contrib/sqla/view.py:1266 #, python-format msgid "Failed to delete records. %(error)s" msgstr "حذف مدل ها با مشکل روبرو شد %(error)s" -#: ../flask_admin/contrib/sqla/fields.py:126 -#: ../flask_admin/contrib/sqla/fields.py:176 -#: ../flask_admin/contrib/sqla/fields.py:181 ../flask_admin/model/fields.py:173 -#: ../flask_admin/model/fields.py:222 +#: ../flask_admin/contrib/sqla/fields.py:117 +#: ../flask_admin/contrib/sqla/fields.py:167 +#: ../flask_admin/contrib/sqla/fields.py:172 ../flask_admin/model/fields.py:174 +#: ../flask_admin/model/fields.py:223 msgid "Not a valid choice" msgstr "انتخاب مناسبی نیست" -#: ../flask_admin/contrib/sqla/fields.py:186 +#: ../flask_admin/contrib/sqla/fields.py:201 msgid "Key" msgstr "" -#: ../flask_admin/contrib/sqla/fields.py:187 +#: ../flask_admin/contrib/sqla/fields.py:202 msgid "Value" msgstr "" -#: ../flask_admin/contrib/sqla/validators.py:42 +#: ../flask_admin/contrib/sqla/validators.py:28 msgid "Already exists." msgstr "قبلا وجود داشته است" -#: ../flask_admin/contrib/sqla/validators.py:60 +#: ../flask_admin/contrib/sqla/validators.py:59 #, python-format msgid "At least %(num)d item is required" msgid_plural "At least %(num)d items are required" msgstr[0] "" msgstr[1] "" -#: ../flask_admin/contrib/sqla/view.py:1057 +#: ../flask_admin/contrib/sqla/validators.py:75 +msgid "Not a valid ISO currency code (e.g. USD, EUR, CNY)." +msgstr "" + +#: ../flask_admin/contrib/sqla/validators.py:83 +msgid "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." +msgstr "" + +#: ../flask_admin/contrib/sqla/view.py:1134 #, python-format msgid "Integrity error. %(message)s" msgstr "خطای یکپارچگی داده. %(message)s" @@ -368,274 +358,242 @@ msgstr "خطای یکپارچگی داده. %(message)s" msgid "Invalid time format" msgstr "قالب زمان اشتباه است" -#: ../flask_admin/form/fields.py:144 +#: ../flask_admin/form/fields.py:147 msgid "Invalid Choice: could not coerce" msgstr "انتخاب اشتباه" -#: ../flask_admin/form/fields.py:208 +#: ../flask_admin/form/fields.py:221 msgid "Invalid JSON" msgstr "JSON نامعتبر است" -#: ../flask_admin/form/upload.py:207 +#: ../flask_admin/form/upload.py:216 msgid "Invalid file extension" msgstr "پسوند فایل غیرمجاز است" -#: ../flask_admin/form/upload.py:214 ../flask_admin/form/upload.py:281 +#: ../flask_admin/form/upload.py:223 ../flask_admin/form/upload.py:293 #, python-format msgid "File \"%s\" already exists." msgstr "فایل \"%s\" قبلا وجود داشته است" -#: ../flask_admin/model/base.py:1649 +#: ../flask_admin/form/validators.py:16 +msgid "This field requires at least one item." +msgstr "" + +#: ../flask_admin/model/base.py:1737 msgid "There are no items in the table." msgstr "هیچ موردی در این جدول وجود ندارد." -#: ../flask_admin/model/base.py:1673 +#: ../flask_admin/model/base.py:1746 #, python-format msgid "Invalid Filter Value: %(value)s" msgstr "مقدار فیلتر معتبر نیست: %(value)s" -#: ../flask_admin/model/base.py:1984 +#: ../flask_admin/model/base.py:2136 msgid "Record was successfully created." msgstr "مدل با موفقیت ساخته شد" -#: ../flask_admin/model/base.py:2028 ../flask_admin/model/base.py:2080 -#: ../flask_admin/model/base.py:2113 ../flask_admin/model/base.py:2297 +#: ../flask_admin/model/base.py:2180 ../flask_admin/model/base.py:2232 +#: ../flask_admin/model/base.py:2265 ../flask_admin/model/base.py:2455 msgid "Record does not exist." msgstr "رکورد وجود ندارد." -#: ../flask_admin/model/base.py:2037 ../flask_admin/model/base.py:2301 +#: ../flask_admin/model/base.py:2189 ../flask_admin/model/base.py:2459 msgid "Record was successfully saved." msgstr "مدل با موفقیت ذخیره شد" -#: ../flask_admin/model/base.py:2222 -msgid "Tablib dependency not installed." -msgstr "" - -#: ../flask_admin/model/base.py:2249 +#: ../flask_admin/model/base.py:2407 #, python-format msgid "Export type \"%(type)s not supported." msgstr "" -#: ../flask_admin/model/filters.py:103 ../flask_admin/model/widgets.py:111 +#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:119 msgid "Yes" msgstr "بله" -#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:110 +#: ../flask_admin/model/filters.py:105 ../flask_admin/model/widgets.py:118 msgid "No" msgstr "خیر" -#: ../flask_admin/model/filters.py:172 ../flask_admin/model/filters.py:212 -#: ../flask_admin/model/filters.py:257 +#: ../flask_admin/model/filters.py:173 ../flask_admin/model/filters.py:213 +#: ../flask_admin/model/filters.py:258 msgid "between" msgstr "بین این دو باشد" -#: ../flask_admin/model/template.py:81 ../flask_admin/model/template.py:88 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:37 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:8 +#: ../flask_admin/model/template.py:83 ../flask_admin/model/template.py:90 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:7 msgid "View Record" msgstr "مشاهده سابقه" -#: ../flask_admin/model/template.py:95 ../flask_admin/model/template.py:102 -#: ../flask_admin/model/template.py:109 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/edit.html:11 +#: ../flask_admin/model/template.py:97 ../flask_admin/model/template.py:104 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/edit.html:10 msgid "Edit Record" msgstr "ویرایش رکورد" -#: ../flask_admin/model/widgets.py:61 +#: ../flask_admin/model/template.py:111 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Delete Record" +msgstr "" + +#: ../flask_admin/model/widgets.py:62 msgid "Please select model" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/actions.html:4 -#: ../flask_admin/templates/bootstrap3/admin/actions.html:4 +#: ../flask_admin/templates/bootstrap4/admin/actions.html:5 msgid "With selected" msgstr "با انتخاب شده ها" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:200 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:190 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:216 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:227 msgid "Save" msgstr "ذخیره" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:205 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:195 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:221 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:232 msgid "Cancel" msgstr "لغو" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:256 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:247 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:290 msgid "Save and Add Another" msgstr "ذخیره و اضافه یک ردیف جدید" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:259 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:250 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:293 msgid "Save and Continue Editing" msgstr "ذخیره و ادامه ویرایش" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:9 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:9 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:10 msgid "Root" msgstr "ریشه" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:90 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:99 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:89 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:98 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:42 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:51 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:89 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:98 #, python-format msgid "Sort by %(name)s" msgstr "مرتب سازی بر اساس %(name)s" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:77 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:79 msgid "Rename File" msgstr "تغییر نام پرونده" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:88 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:88 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:90 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\' recursively?" msgstr "آیا از حذف محتویات \\'%(name)s\\' اطمینان دارید؟" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:97 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:97 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:99 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\'?" msgstr "آیا از حذف \\'%(name)s\\'اطمینان دارید؟" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:125 -msgid "Size" -msgstr "" - -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:185 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:187 msgid "Please select at least one file." msgstr "حداقل یک فایل انتخاب کنید" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:8 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:17 msgid "List" msgstr "لیست" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:12 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:18 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 msgid "Create" msgstr "ایجاد" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:26 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:26 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:21 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:26 msgid "Details" msgstr "جزییات" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:29 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:28 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:15 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:28 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:15 msgid "Filter" msgstr "فیلتر" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:13 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:14 msgid "Delete?" msgstr "حذف؟" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:33 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:16 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:35 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Are you sure you want to delete this record?" +msgstr "آیا از حذف این موارد اطمینان دارید؟" + +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:33 msgid "New" msgstr "تازه" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:43 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:43 msgid "Add" msgstr "اضافه" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:3 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:3 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:2 msgid "Add Filter" msgstr "اضافه کردن فیلتر" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:30 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:19 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:26 msgid "Export" msgstr "خروجی گرفتن" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:38 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:38 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:49 msgid "Apply" msgstr "اعمال" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:40 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:51 msgid "Reset Filters" msgstr "برگرداندن فیلتر ها به حالت اول" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:66 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:64 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:80 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:93 +#, python-format +msgid "%(placeholder)s" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:88 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:94 msgid "Search" msgstr "جستجو" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:74 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:77 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:78 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:79 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:72 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:75 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:76 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:77 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:102 msgid "items" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/create.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/create.html:10 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/create.html:10 msgid "Create New Record" msgstr "ایجاد رکورد جدید" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:76 msgid "Select all records" msgstr "انتخاب همه رکوردها" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:120 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:119 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:119 msgid "Select record" msgstr "انتخاب رکورد" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:186 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:195 msgid "Please select at least one record." msgstr "حداقل یک پوشه انتخاب کنید" -#: ../flask_admin/templates/bootstrap2/admin/model/row_actions.html:34 -#: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 -msgid "Are you sure you want to delete this record?" -msgstr "آیا از حذف این موارد اطمینان دارید؟" +#~ msgid "ObjectId equals" +#~ msgstr "" + +#~ msgid "Failed to get model. %(error)s" +#~ msgstr "خواندن مدل با مشکل روبرو شد. %(error)s" + +#~ msgid "Tablib dependency not installed." +#~ msgstr "" + +#~ msgid "Size" +#~ msgstr "" + diff --git a/flask_admin/translations/fi/LC_MESSAGES/admin.mo b/flask_admin/translations/fi/LC_MESSAGES/admin.mo index c8332a89e07b8706b36914b0dbe44a49ba12267c..5ee947e91eba35802f69a194fd3b30384d44f003 100644 GIT binary patch delta 1807 zcmYMzYi!e17{~FaY;5ah={hz>x8e$7U|Y-DF_BFWr`Zy4EQ^W~mCH67tgHcaGZ@9n z3l$S)&?ER_!x(wtB{7SXERd*CiI;dy7Bw=BKo%1NG58J_uiu}X#HRg!&N)5*b9<gM z-7(Xa|Ea3@i18WV7vq;GQtkiGni4ZLt;KTe#4z^YT)ZFKaR8Gzj%oZ16ZogMvDB=K z`rSyAjbn{j-i}jPM#Jf=4R!(f+7%w^_zzZMNtsy$Yf<fusD3GAAX|+quooL}zxNmx zQ-2pL@I%yiUtult+c^r0X}E&dV>D>C1lOVJ1E>KH`u5lHI_jTeJzmCZv4Z2#drheR z8?g~{7{!;c4&TOk_=RMC`+<T6x`^6Y3Cq-qL#U8cVH{gf1NY%IxCa;DeyqY5efw)T zpZZDEIG=jI#5vTbQ2oEfd^Lq%e8XQDr(VhE+DRHU!Ck2KUAPesp>{lt%7t0vRSSl$ zhN1@fS~CwVpxt{jYJ<0-7O)}2`BSznJQR~%n8e4i8Q(;O<~xkz@0h?S=cfs~y>}pg z*;Z7t4xw^m4-!?|hf3B1s0BQOtl6H^`K#j?4I1#c|6>9PtG(mfKlbfYI2s^lQ19hf zwH7|YLnrYxYMi5Z3%-geoWVA%CWGaA?-O|nx)uf0fU~#|1DuayU584V4%C7+p?0_p zwc|n5#CuUYJAfMJAS!teV-rqd5-)heB#8Ru*HX~+=|bkV`%tmXp|bZ7Di<bw{VXn{ zUPR(36wThv-lx1LPzyMR8fPw(=+?BLLV71I()}Ny&_aVl`q~*}k@h|6=q{mF8Y2_s zQshNTpcb+Lm*YdI4U8eL*juREa|Vf)okyMIWmHa-*D5)Q|9lF%77I}w>QOJOLJio3 zTKPSwl|Sa&k0D{T30#NoV;mJfg=8`6-ltJVe>-w`_9*IBjA9w{+Y7#73>m{-K`r1E z>LfnFl{k$$%6W{cqhF1RZ3h2~HR`=d??<Q;`v#R8KcaGI29>10Vz>U7^&PZ*B~>Zv zdenHAcw0~dtU*oGjq1OtuFzEaWWY_89dYjkgKl5&1D7d3U)WLcb)caq`|z;!_UAIz zyPNNDyg&X(|4?>EeDHzY*};r^FqCtbLch84@N#!!c+~wIzSnhC_PMdjqmkCOWU4*c z+7@qZ?MSsZr_%1$$j+i|-Rs>Ok<P$P?qXzbaeCE?RAFn?M8MrpJzh9l9SFFR1%DJ` ywVUUJdPXwC!<ixG&E~T1*=U1172WAp*8T0a*C*Wb^)I`=*mgG=+v1{&I{yU%>&lz} delta 2504 zcma*nYiv|S7{>8wODVOq3oWn|iak&+1=-S4pn|9rC;|dDR7kvpuw_TOu-$FDr$}p{ z_=R`@#her(LIR4S(TGW_5)GQDgv4l+1Qk$G(L|#}Lqb$OApW0r)DN0S)7{_9oHH}; zyfd@k&Nw@#>s;Z0Zo^+IpAtTYvQ+!$Z)%P)YKq`>ScM^+i`lpgXX8qY;0~<9H*hLm za25|TrjGg|9H{qjxG`NOpfHJs7n~>iADGKXUlYph?-0fz)UU^(IL)=!qTXAK3~1_I z{XVRqp2Skz?>vSBsDFuh%x}(9(7-=q7_Z`346|HCIvdC1Je+_Q$Kj){{xWKUQ?C6I zmQfGq5iH(>qw#K6--PPljit<Qj#8M6r?D6_2OBdAORxZIoQqHctwIIXidxBL)Yff5 z5BH)1dK39KpYt^Wf51Y#>e>tQ$$t?Ir4+Qs)u;h$oO4}!EoRbQhZ<lp>I~e2!*HW( z--aIb0JXwi)cBvF0{F>2&tz50sh1Uyf2F9E1`W6iNrE|m+RK-aKIR=%U>`d_K}~!X zm9bw?8Odc31vmuNuME|%3bn<vFoL(?4cHzc|Jv(=G<f)~^E;eMJ)2$%Xgcb&-{R^E zQ4`doGPeeG2pf@eYc`<XPoo0sK(cPOq2Al+o_BXq&;(Dp7Y-xm&-A+Xw_N-C_)rF^ zL=CW(Wl}UvNUWv<HO|9054*7vKgAiC!#>El&Q{cQ?0SxZ2E2eH@e)qLeDbS9G!u0g zSD^xHL9MtGm4U6O0Cu2Ox(_wpGpO70qN|_8Db&xPwqOAJi(O_qg}xP`_PmKN-S4fa zv#|?xJC2|xID_NyYt$jj=49!4IV$j#sIBXC9(JBWEhK|GuID8<LHB<N1r3lw-P<Qo zXW|%+!LM){UO|F45z<6f&3sgfSD_ZL-T4@*-)>Yuy;zQ4pca<Ri6wRu#uDZ?5egh& zvlJEKU8ofMsKc}wb&4N!?b}h;@e$PfJ5gKkJZhYysEJOX7IX%+pexAkno>IHc{S?% znK}x$;%fA8H)_Dwkv`@GYR|qw4G`j2NCB0h0xU;mrV91`BKLePk~Cvcfo*Z^J5U*X zVl?@$rf`S`ZNX{O-emG~=HWEdp{Yk5rUy_19YkHPS6uxy)D|2^oskbQ7f+#X#W~mh zqw^x_@cv$MWB<Jz$cAaaBGf%Cc1}bMRE?VWW>m*zV|wNc+?FvhnoOpAFV$k(qQ3P~ zNiWIAHn;d4UM${b*ZHZoxJ?H~bM_3hel(s)2g?V2Fr{vDORCK`{dj&yi}l7$D3_Dd zjNp6e_7=TiV?j9geC~Sdd(EksO$2Y}j_A3Z`%%Ww+iizg7Ek+TMYP$P754t%WL`LQ zN8<*jToUtaYkQQrzRznes!!Nx+Inf5;E@}qVerLBbd&X>$(UCg<HMXyw#_vB)wm#) z^yA5P>(#~L6xIjx^QUCRJ8iHb|MAjjV<O(@#cYdB#%yw3M_<J8WZI7=5;j&5{FZ-j zRy5Hb)E6{l$9>zJ4xTR9GqkEEQaL?RS>sh!&QW<*ur#zj=nd5dzlK_~sw-ynY#eeV zW72|a%xH1p{+xyVDeZZ+Ff(KFwWqYV=#PTBxR;JblkH@LsC%9rW;2KP<+R=UzD=ae zig<IpFR$Tn>A&(iGu-r_dEFPjTJd)duPw2AM@F(5;+?_qkq5jx|1Yz#;%N42Qfq_v Mir2W@jvY1sPpR&OX8-^I diff --git a/flask_admin/translations/fi/LC_MESSAGES/admin.po b/flask_admin/translations/fi/LC_MESSAGES/admin.po index 837264fc8..a3f8c5439 100644 --- a/flask_admin/translations/fi/LC_MESSAGES/admin.po +++ b/flask_admin/translations/fi/LC_MESSAGES/admin.po @@ -1,275 +1,264 @@ + msgid "" msgstr "" -"Project-Id-Version: flask-admin\n" +"Project-Id-Version: flask-admin\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-02-07 00:17-0600\n" +"POT-Creation-Date: 2024-09-24 22:09+0100\n" "PO-Revision-Date: 2017-02-07 01:19-0500\n" "Last-Translator: mrjoes <serge.koval@gmail.com>\n" +"Language: fi_FI\n" "Language-Team: Finnish\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.1.1\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: flask-admin\n" -"X-Crowdin-Language: fi\n" -"X-Crowdin-File: admin.pot\n" -"Language: fi_FI\n" +"Generated-By: Babel 2.16.0\n" -#: ../flask_admin/base.py:440 +#: ../flask_admin/base.py:458 msgid "Home" msgstr "Etusivu" -#: ../flask_admin/contrib/rediscli.py:127 +#: ../flask_admin/contrib/rediscli.py:113 msgid "Cli: Invalid command." msgstr "CLI: Virheellinen komento." -#: ../flask_admin/contrib/fileadmin/__init__.py:352 +#: ../flask_admin/contrib/fileadmin/__init__.py:376 msgid "File to upload" msgstr "Ladattava tiedosto" -#: ../flask_admin/contrib/fileadmin/__init__.py:360 +#: ../flask_admin/contrib/fileadmin/__init__.py:384 msgid "File required." msgstr "Tarvittava tiedosto." -#: ../flask_admin/contrib/fileadmin/__init__.py:365 +#: ../flask_admin/contrib/fileadmin/__init__.py:389 msgid "Invalid file type." msgstr "Virheellinen tiedostotyyppi." -#: ../flask_admin/contrib/fileadmin/__init__.py:376 +#: ../flask_admin/contrib/fileadmin/__init__.py:400 msgid "Content" msgstr "Sisältö" -#: ../flask_admin/contrib/fileadmin/__init__.py:390 +#: ../flask_admin/contrib/fileadmin/__init__.py:414 msgid "Invalid name" msgstr "Nimi ei kelpaa" -#: ../flask_admin/contrib/fileadmin/__init__.py:398 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:106 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:112 -#: ../flask_admin/tests/sqla/test_translation.py:17 +#: ../flask_admin/contrib/fileadmin/__init__.py:422 +#: ../flask_admin/tests/sqla/test_translation.py:21 msgid "Name" msgstr "Nimi" -#: ../flask_admin/contrib/fileadmin/__init__.py:757 +#: ../flask_admin/contrib/fileadmin/__init__.py:784 #, python-format msgid "File \"%(name)s\" already exists." msgstr "Tiedosto \"%(name)s\" on jo olemassa." -#: ../flask_admin/contrib/fileadmin/__init__.py:802 -#: ../flask_admin/contrib/fileadmin/__init__.py:885 -#: ../flask_admin/contrib/fileadmin/__init__.py:947 -#: ../flask_admin/contrib/fileadmin/__init__.py:1000 -#: ../flask_admin/contrib/fileadmin/__init__.py:1047 -#: ../flask_admin/contrib/fileadmin/__init__.py:1099 -#: ../flask_admin/model/base.py:2168 +#: ../flask_admin/contrib/fileadmin/__init__.py:829 +#: ../flask_admin/contrib/fileadmin/__init__.py:926 +#: ../flask_admin/contrib/fileadmin/__init__.py:988 +#: ../flask_admin/contrib/fileadmin/__init__.py:1041 +#: ../flask_admin/contrib/fileadmin/__init__.py:1088 +#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/model/base.py:2324 msgid "Permission denied." msgstr "Käyttö estetty." -#: ../flask_admin/contrib/fileadmin/__init__.py:881 +#: ../flask_admin/contrib/fileadmin/__init__.py:922 msgid "File uploading is disabled." msgstr "Tiedostojen lataaminen on poistettu käytöstä." -#: ../flask_admin/contrib/fileadmin/__init__.py:892 +#: ../flask_admin/contrib/fileadmin/__init__.py:933 #, python-format msgid "Successfully saved file: %(name)s" msgstr "Onnistuneesti tallennettu tiedosto: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:896 +#: ../flask_admin/contrib/fileadmin/__init__.py:937 #, python-format msgid "Failed to save file: %(error)s" msgstr "Tiedostoa ei voi tallentaa: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:904 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:150 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:150 +#: ../flask_admin/contrib/fileadmin/__init__.py:945 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:150 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:152 msgid "Upload File" msgstr "Lataa tiedosto" -#: ../flask_admin/contrib/fileadmin/__init__.py:943 +#: ../flask_admin/contrib/fileadmin/__init__.py:984 msgid "Directory creation is disabled." msgstr "Hakemiston luominen on poistettu käytöstä." -#: ../flask_admin/contrib/fileadmin/__init__.py:956 +#: ../flask_admin/contrib/fileadmin/__init__.py:997 #, python-format msgid "Successfully created directory: %(directory)s" msgstr "Onnistuneesti perustettu hakemistoon: %(directory)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:960 +#: ../flask_admin/contrib/fileadmin/__init__.py:1001 #, python-format msgid "Failed to create directory: %(error)s" msgstr "Ei voi luoda hakemiston: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:970 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:161 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:161 +#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:161 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:163 msgid "Create Directory" msgstr "Luo hakemisto" -#: ../flask_admin/contrib/fileadmin/__init__.py:996 +#: ../flask_admin/contrib/fileadmin/__init__.py:1037 msgid "Deletion is disabled." msgstr "Poistaminen on poistettu käytöstä." -#: ../flask_admin/contrib/fileadmin/__init__.py:1005 +#: ../flask_admin/contrib/fileadmin/__init__.py:1046 msgid "Directory deletion is disabled." msgstr "Kansion poistaminen on poistettu käytöstä." -#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/contrib/fileadmin/__init__.py:1052 #, python-format msgid "Directory \"%(path)s\" was successfully deleted." msgstr "Hakemisto \"%(path)s\" poistaminen onnistui." -#: ../flask_admin/contrib/fileadmin/__init__.py:1013 +#: ../flask_admin/contrib/fileadmin/__init__.py:1054 #, python-format msgid "Failed to delete directory: %(error)s" msgstr "Ei voinut poistaa hakemistoa: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1019 -#: ../flask_admin/contrib/fileadmin/__init__.py:1176 +#: ../flask_admin/contrib/fileadmin/__init__.py:1060 +#: ../flask_admin/contrib/fileadmin/__init__.py:1215 #, python-format msgid "File \"%(name)s\" was successfully deleted." msgstr "Poistettiin tiedoston \"%(name)s\"." -#: ../flask_admin/contrib/fileadmin/__init__.py:1021 -#: ../flask_admin/contrib/fileadmin/__init__.py:1178 +#: ../flask_admin/contrib/fileadmin/__init__.py:1062 +#: ../flask_admin/contrib/fileadmin/__init__.py:1217 #, python-format msgid "Failed to delete file: %(name)s" msgstr "Tiedoston poistaminen epäonnistui: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1043 +#: ../flask_admin/contrib/fileadmin/__init__.py:1084 msgid "Renaming is disabled." msgstr "Uudelleennimeäminen ei ole käytettävissä." -#: ../flask_admin/contrib/fileadmin/__init__.py:1051 +#: ../flask_admin/contrib/fileadmin/__init__.py:1092 msgid "Path does not exist." msgstr "Polkua ei ole." -#: ../flask_admin/contrib/fileadmin/__init__.py:1061 +#: ../flask_admin/contrib/fileadmin/__init__.py:1102 #, python-format msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\"" msgstr "Onnistuneesti nimetty \"%(src)s\" \"%(dst)s\"" -#: ../flask_admin/contrib/fileadmin/__init__.py:1064 +#: ../flask_admin/contrib/fileadmin/__init__.py:1105 #, python-format msgid "Failed to rename: %(error)s" msgstr "Uudelleennimeäminen epäonnistui: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1078 +#: ../flask_admin/contrib/fileadmin/__init__.py:1119 #, python-format msgid "Rename %(name)s" msgstr "Nimeä %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1115 +#: ../flask_admin/contrib/fileadmin/__init__.py:1155 #, python-format msgid "Error saving changes to %(name)s." msgstr "Virhe tallennettaessa muutoksia %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1119 +#: ../flask_admin/contrib/fileadmin/__init__.py:1159 #, python-format msgid "Changes to %(name)s saved successfully." msgstr "Muutokset tallennettu %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1128 +#: ../flask_admin/contrib/fileadmin/__init__.py:1167 #, python-format msgid "Error reading %(name)s." msgstr "Virhe käsittelyssä %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1131 -#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/contrib/fileadmin/__init__.py:1170 +#: ../flask_admin/contrib/fileadmin/__init__.py:1179 #, python-format msgid "Unexpected error while reading from %(name)s" msgstr "Odottamaton virhe luettaessa %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1137 +#: ../flask_admin/contrib/fileadmin/__init__.py:1176 #, python-format msgid "Cannot edit %(name)s." msgstr "Ei voi muokata %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1155 +#: ../flask_admin/contrib/fileadmin/__init__.py:1194 #, python-format msgid "Editing %(path)s" msgstr "Muokkaus %(path)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/peewee/view.py:487 -#: ../flask_admin/contrib/pymongo/view.py:384 -#: ../flask_admin/contrib/sqla/view.py:1149 +#: ../flask_admin/contrib/fileadmin/__init__.py:1202 +#: ../flask_admin/contrib/peewee/view.py:510 +#: ../flask_admin/contrib/pymongo/view.py:385 +#: ../flask_admin/contrib/sqla/view.py:1241 msgid "Delete" msgstr "Poista" -#: ../flask_admin/contrib/fileadmin/__init__.py:1164 +#: ../flask_admin/contrib/fileadmin/__init__.py:1203 msgid "Are you sure you want to delete these files?" msgstr "Oletko varma, että haluat poistaa nämä tiedostot?" -#: ../flask_admin/contrib/fileadmin/__init__.py:1167 +#: ../flask_admin/contrib/fileadmin/__init__.py:1206 msgid "File deletion is disabled." msgstr "Tiedoston poistaminen on poistettu käytöstä." -#: ../flask_admin/contrib/fileadmin/__init__.py:1180 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:22 +#: ../flask_admin/contrib/fileadmin/__init__.py:1219 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:22 msgid "Edit" msgstr "Muokkaa" -#: ../flask_admin/contrib/fileadmin/s3.py:153 +#: ../flask_admin/contrib/fileadmin/s3.py:162 msgid "Cannot operate on non empty directories" msgstr "" #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 -#: ../flask_admin/contrib/sqla/filters.py:41 +#: ../flask_admin/contrib/sqla/filters.py:42 msgid "equals" msgstr "vastaa" #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 -#: ../flask_admin/contrib/sqla/filters.py:49 +#: ../flask_admin/contrib/sqla/filters.py:50 msgid "not equal" msgstr "eri suuri" #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 -#: ../flask_admin/contrib/sqla/filters.py:58 +#: ../flask_admin/contrib/sqla/filters.py:59 msgid "contains" msgstr "sisältää" #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 -#: ../flask_admin/contrib/sqla/filters.py:67 +#: ../flask_admin/contrib/sqla/filters.py:68 msgid "not contains" msgstr "ei sisällä" #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 -#: ../flask_admin/contrib/sqla/filters.py:75 +#: ../flask_admin/contrib/sqla/filters.py:76 msgid "greater than" msgstr "suurempi kuin" #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 -#: ../flask_admin/contrib/sqla/filters.py:83 +#: ../flask_admin/contrib/sqla/filters.py:84 msgid "smaller than" msgstr "pienempi kuin" #: ../flask_admin/contrib/peewee/filters.py:88 -#: ../flask_admin/contrib/sqla/filters.py:94 +#: ../flask_admin/contrib/sqla/filters.py:95 msgid "empty" msgstr "tyhjä" #: ../flask_admin/contrib/peewee/filters.py:102 -#: ../flask_admin/contrib/sqla/filters.py:108 +#: ../flask_admin/contrib/sqla/filters.py:109 msgid "in list" msgstr "-luettelosta" #: ../flask_admin/contrib/peewee/filters.py:111 -#: ../flask_admin/contrib/sqla/filters.py:118 +#: ../flask_admin/contrib/sqla/filters.py:119 msgid "not in list" msgstr "ei luettelossa" @@ -282,84 +271,85 @@ msgstr "ei luettelossa" msgid "not between" msgstr "ei välillä" -msgid "ObjectId equals" -msgstr "" - -#, python-format -msgid "Failed to get model. %(error)s" -msgstr "Ei saanut malli. %(error)s" - -#: ../flask_admin/contrib/peewee/view.py:435 -#: ../flask_admin/contrib/pymongo/view.py:316 -#: ../flask_admin/contrib/sqla/view.py:1078 +#: ../flask_admin/contrib/peewee/view.py:458 +#: ../flask_admin/contrib/pymongo/view.py:317 +#: ../flask_admin/contrib/sqla/view.py:1170 #, python-format msgid "Failed to create record. %(error)s" msgstr "Tietueen luominen epäonnistui. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:454 -#: ../flask_admin/contrib/pymongo/view.py:341 -#: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 -#: ../flask_admin/model/base.py:2313 ../flask_admin/model/base.py:2315 +#: ../flask_admin/contrib/peewee/view.py:477 +#: ../flask_admin/contrib/pymongo/view.py:342 +#: ../flask_admin/contrib/sqla/view.py:1196 ../flask_admin/model/base.py:2463 +#: ../flask_admin/model/base.py:2471 ../flask_admin/model/base.py:2473 #, python-format msgid "Failed to update record. %(error)s" msgstr "Tietueen luominen epäonnistui. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:469 -#: ../flask_admin/contrib/pymongo/view.py:366 -#: ../flask_admin/contrib/sqla/view.py:1129 +#: ../flask_admin/contrib/peewee/view.py:492 +#: ../flask_admin/contrib/pymongo/view.py:367 +#: ../flask_admin/contrib/sqla/view.py:1221 #, python-format msgid "Failed to delete record. %(error)s" msgstr "Tietueen poistaminen epäonnistui. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:488 -#: ../flask_admin/contrib/pymongo/view.py:385 -#: ../flask_admin/contrib/sqla/view.py:1150 +#: ../flask_admin/contrib/peewee/view.py:511 +#: ../flask_admin/contrib/pymongo/view.py:386 +#: ../flask_admin/contrib/sqla/view.py:1242 msgid "Are you sure you want to delete selected records?" msgstr "Oletko varma, että haluat poistaa valitut tietueet?" -#: ../flask_admin/contrib/peewee/view.py:505 -#: ../flask_admin/contrib/pymongo/view.py:395 -#: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 +#: ../flask_admin/contrib/peewee/view.py:528 +#: ../flask_admin/contrib/pymongo/view.py:396 +#: ../flask_admin/contrib/sqla/view.py:1258 ../flask_admin/model/base.py:2272 #, python-format msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." msgstr[0] "Tietueen poistaminen onnistui." msgstr[1] "%(count)s tietueet on poistettu." -#: ../flask_admin/contrib/peewee/view.py:511 -#: ../flask_admin/contrib/pymongo/view.py:400 -#: ../flask_admin/contrib/sqla/view.py:1174 +#: ../flask_admin/contrib/peewee/view.py:534 +#: ../flask_admin/contrib/pymongo/view.py:401 +#: ../flask_admin/contrib/sqla/view.py:1266 #, python-format msgid "Failed to delete records. %(error)s" msgstr "Tietueen poistaminen epäonnistui. %(error)s" -#: ../flask_admin/contrib/sqla/fields.py:126 -#: ../flask_admin/contrib/sqla/fields.py:176 -#: ../flask_admin/contrib/sqla/fields.py:181 ../flask_admin/model/fields.py:173 -#: ../flask_admin/model/fields.py:222 +#: ../flask_admin/contrib/sqla/fields.py:117 +#: ../flask_admin/contrib/sqla/fields.py:167 +#: ../flask_admin/contrib/sqla/fields.py:172 ../flask_admin/model/fields.py:174 +#: ../flask_admin/model/fields.py:223 msgid "Not a valid choice" msgstr "Ei ole kelvollinen valinta" -#: ../flask_admin/contrib/sqla/fields.py:186 +#: ../flask_admin/contrib/sqla/fields.py:201 msgid "Key" msgstr "" -#: ../flask_admin/contrib/sqla/fields.py:187 +#: ../flask_admin/contrib/sqla/fields.py:202 msgid "Value" msgstr "" -#: ../flask_admin/contrib/sqla/validators.py:42 +#: ../flask_admin/contrib/sqla/validators.py:28 msgid "Already exists." msgstr "On jo olemassa." -#: ../flask_admin/contrib/sqla/validators.py:60 +#: ../flask_admin/contrib/sqla/validators.py:59 #, python-format msgid "At least %(num)d item is required" msgid_plural "At least %(num)d items are required" msgstr[0] "" msgstr[1] "" -#: ../flask_admin/contrib/sqla/view.py:1057 +#: ../flask_admin/contrib/sqla/validators.py:75 +msgid "Not a valid ISO currency code (e.g. USD, EUR, CNY)." +msgstr "" + +#: ../flask_admin/contrib/sqla/validators.py:83 +msgid "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." +msgstr "" + +#: ../flask_admin/contrib/sqla/view.py:1134 #, python-format msgid "Integrity error. %(message)s" msgstr "Virhe eheydessä. %(message)s" @@ -368,274 +358,242 @@ msgstr "Virhe eheydessä. %(message)s" msgid "Invalid time format" msgstr "Virheellinen aikaformaatti" -#: ../flask_admin/form/fields.py:144 +#: ../flask_admin/form/fields.py:147 msgid "Invalid Choice: could not coerce" msgstr "Virheellinen valinta: ei voitu pakottaa" -#: ../flask_admin/form/fields.py:208 +#: ../flask_admin/form/fields.py:221 msgid "Invalid JSON" msgstr "Virheellinen JSON" -#: ../flask_admin/form/upload.py:207 +#: ../flask_admin/form/upload.py:216 msgid "Invalid file extension" msgstr "Virheellinen tunniste" -#: ../flask_admin/form/upload.py:214 ../flask_admin/form/upload.py:281 +#: ../flask_admin/form/upload.py:223 ../flask_admin/form/upload.py:293 #, python-format msgid "File \"%s\" already exists." msgstr "Tiedosto \"%s\" on jo olemassa." -#: ../flask_admin/model/base.py:1649 +#: ../flask_admin/form/validators.py:16 +msgid "This field requires at least one item." +msgstr "" + +#: ../flask_admin/model/base.py:1737 msgid "There are no items in the table." msgstr "Näytettäviä kohteita ei ole taulukossa." -#: ../flask_admin/model/base.py:1673 +#: ../flask_admin/model/base.py:1746 #, python-format msgid "Invalid Filter Value: %(value)s" msgstr "Virheellinen suodattimen arvo: %(value)s" -#: ../flask_admin/model/base.py:1984 +#: ../flask_admin/model/base.py:2136 msgid "Record was successfully created." msgstr "Tietue on luotu." -#: ../flask_admin/model/base.py:2028 ../flask_admin/model/base.py:2080 -#: ../flask_admin/model/base.py:2113 ../flask_admin/model/base.py:2297 +#: ../flask_admin/model/base.py:2180 ../flask_admin/model/base.py:2232 +#: ../flask_admin/model/base.py:2265 ../flask_admin/model/base.py:2455 msgid "Record does not exist." msgstr "Tietuetta ei ole." -#: ../flask_admin/model/base.py:2037 ../flask_admin/model/base.py:2301 +#: ../flask_admin/model/base.py:2189 ../flask_admin/model/base.py:2459 msgid "Record was successfully saved." msgstr "Tietueen tallentaminen onnistui." -#: ../flask_admin/model/base.py:2222 -msgid "Tablib dependency not installed." -msgstr "" - -#: ../flask_admin/model/base.py:2249 +#: ../flask_admin/model/base.py:2407 #, python-format msgid "Export type \"%(type)s not supported." msgstr "" -#: ../flask_admin/model/filters.py:103 ../flask_admin/model/widgets.py:111 +#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:119 msgid "Yes" msgstr "Kyllä" -#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:110 +#: ../flask_admin/model/filters.py:105 ../flask_admin/model/widgets.py:118 msgid "No" msgstr "Ei" -#: ../flask_admin/model/filters.py:172 ../flask_admin/model/filters.py:212 -#: ../flask_admin/model/filters.py:257 +#: ../flask_admin/model/filters.py:173 ../flask_admin/model/filters.py:213 +#: ../flask_admin/model/filters.py:258 msgid "between" msgstr "välillä" -#: ../flask_admin/model/template.py:81 ../flask_admin/model/template.py:88 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:37 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:8 +#: ../flask_admin/model/template.py:83 ../flask_admin/model/template.py:90 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:7 msgid "View Record" msgstr "Näytä tietue" -#: ../flask_admin/model/template.py:95 ../flask_admin/model/template.py:102 -#: ../flask_admin/model/template.py:109 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/edit.html:11 +#: ../flask_admin/model/template.py:97 ../flask_admin/model/template.py:104 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/edit.html:10 msgid "Edit Record" msgstr "Tietueen Muokkaaminen" -#: ../flask_admin/model/widgets.py:61 +#: ../flask_admin/model/template.py:111 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Delete Record" +msgstr "" + +#: ../flask_admin/model/widgets.py:62 msgid "Please select model" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/actions.html:4 -#: ../flask_admin/templates/bootstrap3/admin/actions.html:4 +#: ../flask_admin/templates/bootstrap4/admin/actions.html:5 msgid "With selected" msgstr "Valittu" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:200 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:190 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:216 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:227 msgid "Save" msgstr "Tallenna" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:205 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:195 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:221 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:232 msgid "Cancel" msgstr "Peruuta" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:256 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:247 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:290 msgid "Save and Add Another" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:259 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:250 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:293 msgid "Save and Continue Editing" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:9 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:9 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:10 msgid "Root" msgstr "Root" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:90 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:99 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:89 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:98 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:42 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:51 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:89 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:98 #, python-format msgid "Sort by %(name)s" msgstr "Lajittele %(name)s" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:77 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:79 msgid "Rename File" msgstr "Nimeä tiedosto uudelleen" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:88 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:88 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:90 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\' recursively?" msgstr "Oletko varma, että haluat poistaa \\'%(name)s\\' rekursiivisesti?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:97 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:97 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:99 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\'?" msgstr "Oletko varma, että haluat poistaa \\'%(name)s\\'?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:125 -msgid "Size" -msgstr "" - -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:185 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:187 msgid "Please select at least one file." msgstr "Valitse vähintään yksi tiedosto." -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:8 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:17 msgid "List" msgstr "Luettelo" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:12 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:18 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 msgid "Create" msgstr "Luo" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:26 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:26 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:21 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:26 msgid "Details" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:29 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:28 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:15 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:28 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:15 msgid "Filter" msgstr "Suodata" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:13 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:14 msgid "Delete?" msgstr "Poista?" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:33 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:16 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:35 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Are you sure you want to delete this record?" +msgstr "Oletko varma, että haluat poistaa tämän tietueen?" + +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:33 msgid "New" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:43 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:43 msgid "Add" msgstr "Lisää" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:3 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:3 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:2 msgid "Add Filter" msgstr "Lisää suodatin" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:30 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:19 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:26 msgid "Export" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:38 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:38 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:49 msgid "Apply" msgstr "Sovelletaan" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:40 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:51 msgid "Reset Filters" msgstr "Palauta suodattimet" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:66 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:64 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:80 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:93 +#, python-format +msgid "%(placeholder)s" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:88 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:94 msgid "Search" msgstr "Etsi" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:74 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:77 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:78 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:79 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:72 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:75 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:76 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:77 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:102 msgid "items" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/create.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/create.html:10 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/create.html:10 msgid "Create New Record" msgstr "Luo Uusi Tietue" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:76 msgid "Select all records" msgstr "Valitse kaikki tietueet" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:120 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:119 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:119 msgid "Select record" msgstr "Valitse tietue" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:186 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:195 msgid "Please select at least one record." msgstr "Valitse vähintään yksi tietue." -#: ../flask_admin/templates/bootstrap2/admin/model/row_actions.html:34 -#: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 -msgid "Are you sure you want to delete this record?" -msgstr "Oletko varma, että haluat poistaa tämän tietueen?" +#~ msgid "ObjectId equals" +#~ msgstr "" + +#~ msgid "Failed to get model. %(error)s" +#~ msgstr "Ei saanut malli. %(error)s" + +#~ msgid "Tablib dependency not installed." +#~ msgstr "" + +#~ msgid "Size" +#~ msgstr "" + diff --git a/flask_admin/translations/fr/LC_MESSAGES/admin.mo b/flask_admin/translations/fr/LC_MESSAGES/admin.mo index b1b397e4b8427abf1cb5358eecfd7332607ad5e0..06d895af67b6eda1689ede78442928be577a6067 100644 GIT binary patch delta 1834 zcmYM!e`u9e9LMqRGpC!gyWP9#ZeH)!v*zw-+uiP+oBLrSRNN5V43#hwl>9MSGg$+j z^v5*<QOkim{h*X#{|u#p<YSujhe!|^(l8JrEK(AKL?bZ_f6VtM4|I9%^E&6;=Q-zl z&iS5uuIpiY?$^@%4~<Vh-z49)(^UKa^ZpDoH66ktJd7oH6sO|^cHk*Y<1Nf$qQI;H zS339LGV0^VBX$etnC0v)g<2YB7XH^@S)|E&P!F!cD87O*?04;ZP|xi}I<oz)K8B6d z$MHG5;=G6X)aT4Jn}rFCGQOoK#A#^5DqMvccnE871fRz-SHFPj_@-+wU|FiE*Wo<u z!%7@Ly>|fh`~<#$mvAorg9*mBDB%=iy|WY5(Q;HETTzh@qPA!VeH=w~d=j6*Ni4^! zSc-RD`wV_8qh5yUr`FkkIqhwhLLRoFUTnwNxWd&pp-+7nHKPwu1D$p4KVUEQJE)m= zMV{u!1|$X>L~YRsa@i<11#&dP`m6964H|G9wKQL&W_|?~&{gEJJKU5Dk1&nJEL%Ok zh}ydC=;J|bz|T<u{N(%{)z4q3i9ar8{gp&{q%`?qMX0PULj^DwnUwjc=hCPSTV4BN zBn_<3wXbvSTkt)PtwO!`h^Upk)44IW#Zm92aum8LWUvi)V=JC?^&75U!7{9*eGRI^ zW9Z{?%;H5%-~;!2IUBACRHBx?29-ODPy??+^3QUwQ}8M5K&`+i>O6mpTH?#tgj1*v zo7g9vmW8OT=)-4mBevrR>bWnl5x;WY#1`u1M5F#zU`FTv?WYBsKpmrB+yfpNrkQ1N zK5j+@v>zAa8LY$m$SPYkQ4ympKp%Thfow;u*iNj%-N?Z93D)ZTe@{Uj{EZcu$8?m0 zK5Fkfk;{6xDK|Eul4l#L;{jKH3)Rmqq$}Hp#AaitB>fWge{v0VN(vYxsq>$r(2Gk^ z$Llb%?RFY9qi<1x{fz4PK5AxBHeAUVN4-~#TETAARt{hahfxE5ilm2~!v%N=b2=va zw^4*?)IZd#s3m$A6~Jj^O#2Si!FALM+(WI%zo-GHP{+BDOp_5*wwI!gT@@<%nouj% zkz_ua>2ez6Yp54?B*VIby<YfZ;hSEtwdl8S%dAN+Xp77b-iQo_e@1$!lpG3fl&lYy zMPCk%L_dl(x1=*2>E;%{xw$jbQJ={MOJe=gHg>NLPQ+gF76pIAhVruu8#CdC(n&8| xGyAp|ZY!_xg7xu8_)UCQUeJ|D1;dGV!oqo{yx@HDSa7gnXE0UK9}HIZJ^}uNyi5Q9 delta 2373 zcma*ne@vBC9LMo<K?o25@duy;M@2}3D~O4jW-LW4O{UeHHQj~#U{^2qUU)7hZG~%P zB{i#Otd?tKwVAE?&m}WkxrLjpw#-)3X|?HUbJ?mtTpP>H-XA$zf7Bn|ae1BZd7ks@ zd(OGnmVCTo@TbxV!-h{U-%7skW-I#lQ-6yws%pRjY{Ft(jybpvm*Pfjz!$Iyk7GUl z=B&swW;Jme=ITA1X3U@oDAZAL*m-9Bff+;En&SNN24z@6T!oWyfvaytz1NO(XgXZn zjbY*hR^uDaPjLeAk2sO>%_R!z_;)PB>o^O`SgvNe6l?HqoQodL#vvCUK@ISotG|kK zh|4B2S-cZx;uaV0LbV^pYQ{ImD9poiSb<rE#>~J<EW#FN8>*uRQ4{M$tz<W9>z+W1 zucIdP3G!zy@NYU^#!|fQ>Psh)|0z^dQ_vnaqdIJHE_d~<m__|+R0r*-Gw?7@#htEx z4_e{?wZaip|7TGXxZ<8?v8wgNbBf5nQq)U@I(!L9f_V$ImmeT)%;%_yedGKdHSl>< z#{NKMB%e++!4g!vIjD9`s4ZTM4Y&qx$NpmSuf0A<g~d_l&sa~KLn}>aA?mc><>FPS z0Xk5b+lo4boyfU0J5cZYsEG|ASvPx7@4e`r4-Zn%00-O)hmiAUMqK@8uKr8h8zPmc z4z{vP-GXjp@n$!w-Lu$+FJlXy!#l8qeNfznil4-FI5<K<9fruK#eA&8`KWum5p@`! zM!okYYDI@oTXY0<_)elGa1prx<_cQ;3zd;FUe@n~MQy<rT%h~^90hfF40ZiZAd56- zu^cbs5)5&I^xiV8!Bz}ow{sX55uZdlHe=X`^XOD=!TC6Zx}HaIf$sl#3R-Caqp9QN zs2N7E75AeWo<WX<xrQXo6ms$`TGYf^Q5kB-S=fOZxDS=lcTnxW!dvkIR_OkZQPAO- zLZ0c{Sk$3fiaJCqTzn5|fHf}Ofa-9QvkO^^@sY)wA=D{<8}-BWHEQBlQMWFSACp1t zT^)t>xC(V|UqKzN4^a(H;f)!i1{g!FcruN3c*{}kYEY?NgWB_*Sc_@YfCo_5@i=lW z&526#-%R0KDs<g)8AUU0Mx}fk>X&gJDwQLs3H^e~%ovh9a~;)T1*0f)^{D5KsEI5_ z4ZPC13UzDNRxKI7$D658gKpF*j-yh$3zdnz&eu>4->=H-%iR;IjU*Duv`wbGzDU}$ z$%IYt^?Fk20UM3=d0pvbU(E9}d3mW&&FbB$WMA5*2U4D$J@+;_&!<7!`u!<A@}lA3 zvHXkq+r6~yNk+YRP*pHJv$^1ODEmHdAgC>zTfCuj2c52sTCcZ168D393wx$?#Jz~` zS>KEEXuM(OXkmLOJNCF2T${ANI?@@Bb=s(x@)A)m(KT>m%vi!tN8)jf`FznM*^zjE zaH(ihPAu*9_`#y$S0^{MG&C-3Xl${KjmuPC9Q;tcJ!mUg8SE|T&2A1a%KTk&`ld7R zMd_b6mx0VjQ)@$ZZBHuc`?1crXQOq=&a{_^^;rVaGWuTJ3kL_Mm1lmPwkzvKX10~r z{U<Zelt1;qnaQolgeGiKYL3k~IDcKlMn?}TF_A=<XCD|(Rie)G(>4|Ht;^Er;c&2d UW-8|)(&PoFW<Kij6t2AgACJ0M-2eap diff --git a/flask_admin/translations/fr/LC_MESSAGES/admin.po b/flask_admin/translations/fr/LC_MESSAGES/admin.po index 93258f465..9189a55ab 100644 --- a/flask_admin/translations/fr/LC_MESSAGES/admin.po +++ b/flask_admin/translations/fr/LC_MESSAGES/admin.po @@ -1,275 +1,264 @@ + msgid "" msgstr "" -"Project-Id-Version: flask-admin\n" +"Project-Id-Version: flask-admin\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-02-07 00:17-0600\n" +"POT-Creation-Date: 2024-09-24 22:09+0100\n" "PO-Revision-Date: 2017-02-07 01:19-0500\n" "Last-Translator: mrjoes <serge.koval@gmail.com>\n" +"Language: fr_FR\n" "Language-Team: French\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.1.1\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: flask-admin\n" -"X-Crowdin-Language: fr\n" -"X-Crowdin-File: admin.pot\n" -"Language: fr_FR\n" +"Generated-By: Babel 2.16.0\n" -#: ../flask_admin/base.py:440 +#: ../flask_admin/base.py:458 msgid "Home" msgstr "Accueil" -#: ../flask_admin/contrib/rediscli.py:127 +#: ../flask_admin/contrib/rediscli.py:113 msgid "Cli: Invalid command." msgstr "CLI : Commande non valide." -#: ../flask_admin/contrib/fileadmin/__init__.py:352 +#: ../flask_admin/contrib/fileadmin/__init__.py:376 msgid "File to upload" msgstr "Fichier à déposer" -#: ../flask_admin/contrib/fileadmin/__init__.py:360 +#: ../flask_admin/contrib/fileadmin/__init__.py:384 msgid "File required." msgstr "Fichier requis." -#: ../flask_admin/contrib/fileadmin/__init__.py:365 +#: ../flask_admin/contrib/fileadmin/__init__.py:389 msgid "Invalid file type." msgstr "Type de fichier invalide." -#: ../flask_admin/contrib/fileadmin/__init__.py:376 +#: ../flask_admin/contrib/fileadmin/__init__.py:400 msgid "Content" msgstr "Contenu" -#: ../flask_admin/contrib/fileadmin/__init__.py:390 +#: ../flask_admin/contrib/fileadmin/__init__.py:414 msgid "Invalid name" msgstr "Nom invalide" -#: ../flask_admin/contrib/fileadmin/__init__.py:398 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:106 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:112 -#: ../flask_admin/tests/sqla/test_translation.py:17 +#: ../flask_admin/contrib/fileadmin/__init__.py:422 +#: ../flask_admin/tests/sqla/test_translation.py:21 msgid "Name" msgstr "Nom" -#: ../flask_admin/contrib/fileadmin/__init__.py:757 +#: ../flask_admin/contrib/fileadmin/__init__.py:784 #, python-format msgid "File \"%(name)s\" already exists." msgstr "Le fichier \"%(name)s\" existe déjà." -#: ../flask_admin/contrib/fileadmin/__init__.py:802 -#: ../flask_admin/contrib/fileadmin/__init__.py:885 -#: ../flask_admin/contrib/fileadmin/__init__.py:947 -#: ../flask_admin/contrib/fileadmin/__init__.py:1000 -#: ../flask_admin/contrib/fileadmin/__init__.py:1047 -#: ../flask_admin/contrib/fileadmin/__init__.py:1099 -#: ../flask_admin/model/base.py:2168 +#: ../flask_admin/contrib/fileadmin/__init__.py:829 +#: ../flask_admin/contrib/fileadmin/__init__.py:926 +#: ../flask_admin/contrib/fileadmin/__init__.py:988 +#: ../flask_admin/contrib/fileadmin/__init__.py:1041 +#: ../flask_admin/contrib/fileadmin/__init__.py:1088 +#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/model/base.py:2324 msgid "Permission denied." msgstr "Autorisation refusée." -#: ../flask_admin/contrib/fileadmin/__init__.py:881 +#: ../flask_admin/contrib/fileadmin/__init__.py:922 msgid "File uploading is disabled." msgstr "Dépose de fichier désactivée." -#: ../flask_admin/contrib/fileadmin/__init__.py:892 +#: ../flask_admin/contrib/fileadmin/__init__.py:933 #, python-format msgid "Successfully saved file: %(name)s" msgstr "Fichier enregistré avec succès : %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:896 +#: ../flask_admin/contrib/fileadmin/__init__.py:937 #, python-format msgid "Failed to save file: %(error)s" msgstr "Échec dans la sauvegarde du fichier: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:904 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:150 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:150 +#: ../flask_admin/contrib/fileadmin/__init__.py:945 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:150 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:152 msgid "Upload File" msgstr "Déposer un fichier" -#: ../flask_admin/contrib/fileadmin/__init__.py:943 +#: ../flask_admin/contrib/fileadmin/__init__.py:984 msgid "Directory creation is disabled." msgstr "La création de répertoire est désactivée." -#: ../flask_admin/contrib/fileadmin/__init__.py:956 +#: ../flask_admin/contrib/fileadmin/__init__.py:997 #, python-format msgid "Successfully created directory: %(directory)s" msgstr "Répertoire est créé avec succès : %(directory)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:960 +#: ../flask_admin/contrib/fileadmin/__init__.py:1001 #, python-format msgid "Failed to create directory: %(error)s" msgstr "Échec dans la création du fichier: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:970 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:161 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:161 +#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:161 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:163 msgid "Create Directory" msgstr "Créer un répertoire" -#: ../flask_admin/contrib/fileadmin/__init__.py:996 +#: ../flask_admin/contrib/fileadmin/__init__.py:1037 msgid "Deletion is disabled." msgstr "La suppression est désactivée." -#: ../flask_admin/contrib/fileadmin/__init__.py:1005 +#: ../flask_admin/contrib/fileadmin/__init__.py:1046 msgid "Directory deletion is disabled." msgstr "La suppression de répertoire est désactivée." -#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/contrib/fileadmin/__init__.py:1052 #, python-format msgid "Directory \"%(path)s\" was successfully deleted." msgstr "Répertoire «%(path)s » a été supprimé avec succès." -#: ../flask_admin/contrib/fileadmin/__init__.py:1013 +#: ../flask_admin/contrib/fileadmin/__init__.py:1054 #, python-format msgid "Failed to delete directory: %(error)s" msgstr "Échec dans la suppression du répertoire: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1019 -#: ../flask_admin/contrib/fileadmin/__init__.py:1176 +#: ../flask_admin/contrib/fileadmin/__init__.py:1060 +#: ../flask_admin/contrib/fileadmin/__init__.py:1215 #, python-format msgid "File \"%(name)s\" was successfully deleted." msgstr "Le fichier \"%(name)s\" a bien été supprimé." -#: ../flask_admin/contrib/fileadmin/__init__.py:1021 -#: ../flask_admin/contrib/fileadmin/__init__.py:1178 +#: ../flask_admin/contrib/fileadmin/__init__.py:1062 +#: ../flask_admin/contrib/fileadmin/__init__.py:1217 #, python-format msgid "Failed to delete file: %(name)s" msgstr "Échec dans la suppression du fichier: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1043 +#: ../flask_admin/contrib/fileadmin/__init__.py:1084 msgid "Renaming is disabled." msgstr "Le renommage est désactivé." -#: ../flask_admin/contrib/fileadmin/__init__.py:1051 +#: ../flask_admin/contrib/fileadmin/__init__.py:1092 msgid "Path does not exist." msgstr "Le chemin n'existe pas." -#: ../flask_admin/contrib/fileadmin/__init__.py:1061 +#: ../flask_admin/contrib/fileadmin/__init__.py:1102 #, python-format msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\"" msgstr "\"%(src)s\" a bien été renommé en \"%(dst)s\"" -#: ../flask_admin/contrib/fileadmin/__init__.py:1064 +#: ../flask_admin/contrib/fileadmin/__init__.py:1105 #, python-format msgid "Failed to rename: %(error)s" msgstr "Échec dans le renommage: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1078 +#: ../flask_admin/contrib/fileadmin/__init__.py:1119 #, python-format msgid "Rename %(name)s" msgstr "Renommer %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1115 +#: ../flask_admin/contrib/fileadmin/__init__.py:1155 #, python-format msgid "Error saving changes to %(name)s." msgstr "Erreur d'enregistrement des modifications dans %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1119 +#: ../flask_admin/contrib/fileadmin/__init__.py:1159 #, python-format msgid "Changes to %(name)s saved successfully." msgstr "Changements à %(name)s enregistré avec succès." -#: ../flask_admin/contrib/fileadmin/__init__.py:1128 +#: ../flask_admin/contrib/fileadmin/__init__.py:1167 #, python-format msgid "Error reading %(name)s." msgstr "Erreur lecture %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1131 -#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/contrib/fileadmin/__init__.py:1170 +#: ../flask_admin/contrib/fileadmin/__init__.py:1179 #, python-format msgid "Unexpected error while reading from %(name)s" msgstr "Erreur inattendue lors de la lecture de %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1137 +#: ../flask_admin/contrib/fileadmin/__init__.py:1176 #, python-format msgid "Cannot edit %(name)s." msgstr "Impossible de modifier %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1155 +#: ../flask_admin/contrib/fileadmin/__init__.py:1194 #, python-format msgid "Editing %(path)s" msgstr "Montage %(path)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/peewee/view.py:487 -#: ../flask_admin/contrib/pymongo/view.py:384 -#: ../flask_admin/contrib/sqla/view.py:1149 +#: ../flask_admin/contrib/fileadmin/__init__.py:1202 +#: ../flask_admin/contrib/peewee/view.py:510 +#: ../flask_admin/contrib/pymongo/view.py:385 +#: ../flask_admin/contrib/sqla/view.py:1241 msgid "Delete" msgstr "Supprimer" -#: ../flask_admin/contrib/fileadmin/__init__.py:1164 +#: ../flask_admin/contrib/fileadmin/__init__.py:1203 msgid "Are you sure you want to delete these files?" msgstr "Êtes-vous bien sûr de vouloir supprimer ces fichiers?" -#: ../flask_admin/contrib/fileadmin/__init__.py:1167 +#: ../flask_admin/contrib/fileadmin/__init__.py:1206 msgid "File deletion is disabled." msgstr "Suppression des fichiers est désactivée." -#: ../flask_admin/contrib/fileadmin/__init__.py:1180 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:22 +#: ../flask_admin/contrib/fileadmin/__init__.py:1219 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:22 msgid "Edit" msgstr "Editer" -#: ../flask_admin/contrib/fileadmin/s3.py:153 +#: ../flask_admin/contrib/fileadmin/s3.py:162 msgid "Cannot operate on non empty directories" msgstr "" #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 -#: ../flask_admin/contrib/sqla/filters.py:41 +#: ../flask_admin/contrib/sqla/filters.py:42 msgid "equals" msgstr "vaut" #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 -#: ../flask_admin/contrib/sqla/filters.py:49 +#: ../flask_admin/contrib/sqla/filters.py:50 msgid "not equal" msgstr "est différent de" #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 -#: ../flask_admin/contrib/sqla/filters.py:58 +#: ../flask_admin/contrib/sqla/filters.py:59 msgid "contains" msgstr "contient" #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 -#: ../flask_admin/contrib/sqla/filters.py:67 +#: ../flask_admin/contrib/sqla/filters.py:68 msgid "not contains" msgstr "ne contient pas" #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 -#: ../flask_admin/contrib/sqla/filters.py:75 +#: ../flask_admin/contrib/sqla/filters.py:76 msgid "greater than" msgstr "plus grand que" #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 -#: ../flask_admin/contrib/sqla/filters.py:83 +#: ../flask_admin/contrib/sqla/filters.py:84 msgid "smaller than" msgstr "plus petit que" #: ../flask_admin/contrib/peewee/filters.py:88 -#: ../flask_admin/contrib/sqla/filters.py:94 +#: ../flask_admin/contrib/sqla/filters.py:95 msgid "empty" msgstr "vide" #: ../flask_admin/contrib/peewee/filters.py:102 -#: ../flask_admin/contrib/sqla/filters.py:108 +#: ../flask_admin/contrib/sqla/filters.py:109 msgid "in list" msgstr "dans la liste" #: ../flask_admin/contrib/peewee/filters.py:111 -#: ../flask_admin/contrib/sqla/filters.py:118 +#: ../flask_admin/contrib/sqla/filters.py:119 msgid "not in list" msgstr "pas dans la liste" @@ -282,84 +271,85 @@ msgstr "pas dans la liste" msgid "not between" msgstr "pas entre" -msgid "ObjectId equals" -msgstr "" - -#, python-format -msgid "Failed to get model. %(error)s" -msgstr "Impossible d'obtenir le modèle. %(error)s" - -#: ../flask_admin/contrib/peewee/view.py:435 -#: ../flask_admin/contrib/pymongo/view.py:316 -#: ../flask_admin/contrib/sqla/view.py:1078 +#: ../flask_admin/contrib/peewee/view.py:458 +#: ../flask_admin/contrib/pymongo/view.py:317 +#: ../flask_admin/contrib/sqla/view.py:1170 #, python-format msgid "Failed to create record. %(error)s" msgstr "Échec dans la création de l'objet. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:454 -#: ../flask_admin/contrib/pymongo/view.py:341 -#: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 -#: ../flask_admin/model/base.py:2313 ../flask_admin/model/base.py:2315 +#: ../flask_admin/contrib/peewee/view.py:477 +#: ../flask_admin/contrib/pymongo/view.py:342 +#: ../flask_admin/contrib/sqla/view.py:1196 ../flask_admin/model/base.py:2463 +#: ../flask_admin/model/base.py:2471 ../flask_admin/model/base.py:2473 #, python-format msgid "Failed to update record. %(error)s" msgstr "Échec dans la mise à jour de l'objet. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:469 -#: ../flask_admin/contrib/pymongo/view.py:366 -#: ../flask_admin/contrib/sqla/view.py:1129 +#: ../flask_admin/contrib/peewee/view.py:492 +#: ../flask_admin/contrib/pymongo/view.py:367 +#: ../flask_admin/contrib/sqla/view.py:1221 #, python-format msgid "Failed to delete record. %(error)s" msgstr "Échec dans la suppression de l'objet: %(error)s" -#: ../flask_admin/contrib/peewee/view.py:488 -#: ../flask_admin/contrib/pymongo/view.py:385 -#: ../flask_admin/contrib/sqla/view.py:1150 +#: ../flask_admin/contrib/peewee/view.py:511 +#: ../flask_admin/contrib/pymongo/view.py:386 +#: ../flask_admin/contrib/sqla/view.py:1242 msgid "Are you sure you want to delete selected records?" msgstr "Êtes-vous bien sûr de vouloir supprimer ces objets?" -#: ../flask_admin/contrib/peewee/view.py:505 -#: ../flask_admin/contrib/pymongo/view.py:395 -#: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 +#: ../flask_admin/contrib/peewee/view.py:528 +#: ../flask_admin/contrib/pymongo/view.py:396 +#: ../flask_admin/contrib/sqla/view.py:1258 ../flask_admin/model/base.py:2272 #, python-format msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." msgstr[0] "L'objet a bien été détruit." msgstr[1] "Les %(count)s objets ont bien été détruits." -#: ../flask_admin/contrib/peewee/view.py:511 -#: ../flask_admin/contrib/pymongo/view.py:400 -#: ../flask_admin/contrib/sqla/view.py:1174 +#: ../flask_admin/contrib/peewee/view.py:534 +#: ../flask_admin/contrib/pymongo/view.py:401 +#: ../flask_admin/contrib/sqla/view.py:1266 #, python-format msgid "Failed to delete records. %(error)s" msgstr "Échec dans la suppression des objets: %(error)s" -#: ../flask_admin/contrib/sqla/fields.py:126 -#: ../flask_admin/contrib/sqla/fields.py:176 -#: ../flask_admin/contrib/sqla/fields.py:181 ../flask_admin/model/fields.py:173 -#: ../flask_admin/model/fields.py:222 +#: ../flask_admin/contrib/sqla/fields.py:117 +#: ../flask_admin/contrib/sqla/fields.py:167 +#: ../flask_admin/contrib/sqla/fields.py:172 ../flask_admin/model/fields.py:174 +#: ../flask_admin/model/fields.py:223 msgid "Not a valid choice" msgstr "Choix incorrect" -#: ../flask_admin/contrib/sqla/fields.py:186 +#: ../flask_admin/contrib/sqla/fields.py:201 msgid "Key" msgstr "" -#: ../flask_admin/contrib/sqla/fields.py:187 +#: ../flask_admin/contrib/sqla/fields.py:202 msgid "Value" msgstr "" -#: ../flask_admin/contrib/sqla/validators.py:42 +#: ../flask_admin/contrib/sqla/validators.py:28 msgid "Already exists." msgstr "Existe déjà." -#: ../flask_admin/contrib/sqla/validators.py:60 +#: ../flask_admin/contrib/sqla/validators.py:59 #, python-format msgid "At least %(num)d item is required" msgid_plural "At least %(num)d items are required" msgstr[0] "Au moins %(num)d items sont obligatoires" msgstr[1] "Au moins %(num)d objets sont requis" -#: ../flask_admin/contrib/sqla/view.py:1057 +#: ../flask_admin/contrib/sqla/validators.py:75 +msgid "Not a valid ISO currency code (e.g. USD, EUR, CNY)." +msgstr "" + +#: ../flask_admin/contrib/sqla/validators.py:83 +msgid "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." +msgstr "" + +#: ../flask_admin/contrib/sqla/view.py:1134 #, python-format msgid "Integrity error. %(message)s" msgstr "Erreur d'intégrité. %(message)s" @@ -368,274 +358,242 @@ msgstr "Erreur d'intégrité. %(message)s" msgid "Invalid time format" msgstr "Format temporel invalide" -#: ../flask_admin/form/fields.py:144 +#: ../flask_admin/form/fields.py:147 msgid "Invalid Choice: could not coerce" msgstr "Choix non accepté: ne peut pas forcer la valeur" -#: ../flask_admin/form/fields.py:208 +#: ../flask_admin/form/fields.py:221 msgid "Invalid JSON" msgstr "JSON non valide" -#: ../flask_admin/form/upload.py:207 +#: ../flask_admin/form/upload.py:216 msgid "Invalid file extension" msgstr "Extension de fichier invalide" -#: ../flask_admin/form/upload.py:214 ../flask_admin/form/upload.py:281 +#: ../flask_admin/form/upload.py:223 ../flask_admin/form/upload.py:293 #, python-format msgid "File \"%s\" already exists." msgstr "Le fichier \"%s\" existe déjà dans le répertoire de destination." -#: ../flask_admin/model/base.py:1649 +#: ../flask_admin/form/validators.py:16 +msgid "This field requires at least one item." +msgstr "" + +#: ../flask_admin/model/base.py:1737 msgid "There are no items in the table." msgstr "Il n'y a aucun élément dans le tableau." -#: ../flask_admin/model/base.py:1673 +#: ../flask_admin/model/base.py:1746 #, python-format msgid "Invalid Filter Value: %(value)s" msgstr "Valeur de filtre non valide : %(value)s" -#: ../flask_admin/model/base.py:1984 +#: ../flask_admin/model/base.py:2136 msgid "Record was successfully created." msgstr "L'objet a bien été créé." -#: ../flask_admin/model/base.py:2028 ../flask_admin/model/base.py:2080 -#: ../flask_admin/model/base.py:2113 ../flask_admin/model/base.py:2297 +#: ../flask_admin/model/base.py:2180 ../flask_admin/model/base.py:2232 +#: ../flask_admin/model/base.py:2265 ../flask_admin/model/base.py:2455 msgid "Record does not exist." msgstr "Aucun enregistrement n'existe." -#: ../flask_admin/model/base.py:2037 ../flask_admin/model/base.py:2301 +#: ../flask_admin/model/base.py:2189 ../flask_admin/model/base.py:2459 msgid "Record was successfully saved." msgstr "A été enregistrée avec succès." -#: ../flask_admin/model/base.py:2222 -msgid "Tablib dependency not installed." -msgstr "La dépendance Tablib n'est pas installé." - -#: ../flask_admin/model/base.py:2249 +#: ../flask_admin/model/base.py:2407 #, python-format msgid "Export type \"%(type)s not supported." msgstr "" -#: ../flask_admin/model/filters.py:103 ../flask_admin/model/widgets.py:111 +#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:119 msgid "Yes" msgstr "Oui" -#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:110 +#: ../flask_admin/model/filters.py:105 ../flask_admin/model/widgets.py:118 msgid "No" msgstr "Non" -#: ../flask_admin/model/filters.py:172 ../flask_admin/model/filters.py:212 -#: ../flask_admin/model/filters.py:257 +#: ../flask_admin/model/filters.py:173 ../flask_admin/model/filters.py:213 +#: ../flask_admin/model/filters.py:258 msgid "between" msgstr "entre" -#: ../flask_admin/model/template.py:81 ../flask_admin/model/template.py:88 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:37 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:8 +#: ../flask_admin/model/template.py:83 ../flask_admin/model/template.py:90 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:7 msgid "View Record" msgstr "Afficher L'enregistrement" -#: ../flask_admin/model/template.py:95 ../flask_admin/model/template.py:102 -#: ../flask_admin/model/template.py:109 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/edit.html:11 +#: ../flask_admin/model/template.py:97 ../flask_admin/model/template.py:104 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/edit.html:10 msgid "Edit Record" msgstr "Modifier enregistrement" -#: ../flask_admin/model/widgets.py:61 +#: ../flask_admin/model/template.py:111 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Delete Record" +msgstr "" + +#: ../flask_admin/model/widgets.py:62 msgid "Please select model" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/actions.html:4 -#: ../flask_admin/templates/bootstrap3/admin/actions.html:4 +#: ../flask_admin/templates/bootstrap4/admin/actions.html:5 msgid "With selected" msgstr "Avec la sélection" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:200 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:190 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:216 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:227 msgid "Save" msgstr "Enregistrer" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:205 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:195 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:221 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:232 msgid "Cancel" msgstr "Annuler" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:256 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:247 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:290 msgid "Save and Add Another" msgstr "Enregistrer et en ajouter un autre" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:259 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:250 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:293 msgid "Save and Continue Editing" msgstr "Enregistrer et continuer à éditer" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:9 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:9 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:10 msgid "Root" msgstr "Racine" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:90 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:99 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:89 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:98 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:42 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:51 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:89 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:98 #, python-format msgid "Sort by %(name)s" msgstr "Trier par %(name)s" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:77 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:79 msgid "Rename File" msgstr "Renommer Le Fichier" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:88 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:88 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:90 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\' recursively?" msgstr "Êtes-vous bien sûr de vouloir supprimer \\'%(name)s\\' récursivement?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:97 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:97 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:99 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\'?" msgstr "Êtes-vous bien sûr de vouloir supprimer \\'%(name)s\\'?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:125 -msgid "Size" -msgstr "" - -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:185 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:187 msgid "Please select at least one file." msgstr "Veuillez sélectionner au moins un fichier." -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:8 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:17 msgid "List" msgstr "Liste" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:12 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:18 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 msgid "Create" msgstr "Créer" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:26 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:26 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:21 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:26 msgid "Details" msgstr "Détails" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:29 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:28 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:15 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:28 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:15 msgid "Filter" msgstr "Filtre" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:13 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:14 msgid "Delete?" msgstr "Supprimer?" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:33 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:16 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:35 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Are you sure you want to delete this record?" +msgstr "Êtes-vous bien sûr de vouloir supprimer cet objet?" + +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:33 msgid "New" msgstr "Nouveau" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:43 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:43 msgid "Add" msgstr "Ajouter" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:3 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:3 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:2 msgid "Add Filter" msgstr "Ajouter un filtre" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:30 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:19 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:26 msgid "Export" msgstr "Export" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:38 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:38 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:49 msgid "Apply" msgstr "Appliquer" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:40 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:51 msgid "Reset Filters" msgstr "Filtres réinitialisés" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:66 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:64 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:80 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:93 +#, python-format +msgid "%(placeholder)s" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:88 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:94 msgid "Search" msgstr "Chercher" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:74 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:77 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:78 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:79 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:72 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:75 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:76 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:77 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:102 msgid "items" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/create.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/create.html:10 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/create.html:10 msgid "Create New Record" msgstr "Créer Nouvel Enregistrement" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:76 msgid "Select all records" msgstr "Sélectionner tous les enregistrements" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:120 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:119 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:119 msgid "Select record" msgstr "Sélectionner l'enregistrement" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:186 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:195 msgid "Please select at least one record." msgstr "Veuillez choisir au moins un modèle." -#: ../flask_admin/templates/bootstrap2/admin/model/row_actions.html:34 -#: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 -msgid "Are you sure you want to delete this record?" -msgstr "Êtes-vous bien sûr de vouloir supprimer cet objet?" +#~ msgid "ObjectId equals" +#~ msgstr "" + +#~ msgid "Failed to get model. %(error)s" +#~ msgstr "Impossible d'obtenir le modèle. %(error)s" + +#~ msgid "Tablib dependency not installed." +#~ msgstr "La dépendance Tablib n'est pas installé." + +#~ msgid "Size" +#~ msgstr "" + diff --git a/flask_admin/translations/he/LC_MESSAGES/admin.mo b/flask_admin/translations/he/LC_MESSAGES/admin.mo index e6733d181d135e305a8d0610f6040bacad292fb9..a537aa0ef194502cc001bce2141650c83ea50d0c 100644 GIT binary patch delta 1834 zcmYM!e`wTo9LMp`%{9HPdAF<Wyw2^u_Cwvz?k+2@U!t2rYa7FU5YZajoVDiItWm=n zmtd?vGOf>M#O9EUHv5U31d$q6gjlUSsc#lo5kVA{&>tEo^?bPxbbRmo_<Y{?`F?)A zKi@mO=1eAgCQ>+I_;mAK%C~NTYX5(3D>6o*+p!qeVhCICGJFs-*p2l#g(*CNb$G#9 zz0jET)bB$=W(v!V$(sEXRuFi9K45-AE_05X8vcu6ELvnt8Aeg@YE-)<(vew>4cLYW z9Chx+Lh47b1V2LcH-}NiH$PBVM&KM?hq0hBSK}H~y&Kixb1puM*HHfq<M<a=VF}x# z=W0;xTd^7kForMVRd^5=<L8p`&G!`4(Ql}g6){cCxD=I=2zq!us^fON9EY$1M=^rq zE<S@-P(Os~=eY9=ETEo8wf`EkS5o-Z1umjTJxuRfNeVT<J*ap;w&L@s6@Q013;!UG znqcXCD$0?|)N<1VGR`|t3v5J9pt+R&r))a7DJT6{k56MQzJW^3H|XJctiu@lrvW!O zHzGfohfs%g3+ikPAz3vesKdG)HGwf?&gKQ}zZy;wP>1{75APyrHHTgNQy0(U(Ew-0 z)u)-Y4&R%o1svn10rJ?1r?C+;oZO8#iY@pRuEokM`>>NjCz5{i2WsojV;bWm(!(~? zN(NB_jGzY2qEa#8;)hTR`T%uSK1S`>&$tr9<XiO&YP{@b3hHPp(#DM8GMvO4@dzpv ze>)R2R{bul!6&f+Uv-{D4WxskcGb>%@mlKJQO~`OOgw8&QqTiukugjxIzOQXTu!|S zweo)FFlvWJQ9HB`_53Mh)650b0zymXcP533x1-`csN6q`g?j&Ax>Vr(M4jd-ti-oa zhw22bz;99SvtDLxZ4K)Gp&8%CAy=>BC8w!rLiN*un($M|+{`p;LGMY%Hy=_^E{-FY zImJ!?bbq2c(x1Z(5JTmz)wvC|l{46cc~lCc{Ap;QTGWCXQLo|M&ihdl=)es+Oq(fa zO9q_VoMWiBVjQ&-`<(BfCU_V%z}(VY&BA8_Hos`X9t{TVNbs2LE&egLspQK*qNVTg zVbj(%&}-TTxrV(i?}@H0eVe?VM+W<PdhMg71NQgQv$i<2(%u}}X@3blVAqG+?PPdQ zS$b7{GE<*k<)zcNBr~<ilwDW$@Pf`eTkL_d#{#$7cw}o~>ZXQdZdW8*U@ulgZEN|# zTv0_hkXsjB9LNnW*-^0EANObd1O6-iv_Ebr>^1(Bzx&e7^LP8N5t{WUY$~43eG;Dz X*cU5T+qudayQgZ0^%8w{SEBhpJC5cX delta 2531 zcmb8veN0tl9Ki91SG^)|0To4*<12zdyp)JJ4F#h_Wl(LUvt7JTcIk5Ng?mtGx$8gG ztem<dxd2~kuCTYcE?ZX1R`xQR%iOAywU}dWw%Kx4oAaOS`-7+2T3g1r_w)RI=bY!| z_dMs0)LmE^AIVMaQ~Y)DDdcl3MWVm|$|fi!sdAizRhW&-F%6rs4qLGtpTjDA7t8P` z<BW+)H4?AEbh!_wDiv2QjbakVjpxTNs2j+$D%&^yKtB43XJZcDX7cqY_cb9MsumMJ zf)&Iz7U3b|`<P1n17<M38l@o}|BU%~6X#$)%axhd;e5Oc7of(u_^gTFL>b^Klm89p z5$9(xS-cZx;zK6hhVpzL7BRj$Nuvb6#Tl49S*Zdn#4M~eu0iSOew2xIp{!&F%GT{f z3;R(f^d9oBzUONi{)oAF)8unAsec}cA{w&CH7Fg{8kd`VJtmWHMCqUj<qT}ZDfpPl z??Q{%MOoo6O8*|p1g@Ct$*gJ}@w_bRFD2?CAsy~RilC07?B(moGwLIhiG6AO8fD<` zP%3s6r6N8$kqP=yo|}jATouX|FTrxW8y90wHuaaievyQQr;V4ej5v*_WJ1*_r+tNq z8&C#lL8;tkltb8#oLkj_a(@hEV!cS!)h?9#_L%E^aT+qffVtrn<ou~&lRsthpW{18 zl+wieS*BFzFp^TkC<A?h593)}jb+ro6{FaUr?DRWly48lTWN4$)kTy&yMo1-Meo(P z1T74qtn3+-fn4NY_46fLc*5k*p{(#5ltVaT;@?p!n$AI3gf&PUSDR?a1a>3$r~@d6 z=2e`7r|=HEh%)dr-qHCu3uO;i8Es=fmXiMzEAX1pnm#_!4JZ?^ak0Gr2ge$e2BqVx zC>>1UWXZ}_qCBt}DUNy?Wuk+)5Z^+n%mw2pj#Uz+f?2%F@_aqAE2;x!VLNd)<Eta) z!YOm%Jj$W^73I)eM>)l*y!?{)p~RWUIaRsFxj2is8pjSN%2sYh`F(i`rLrebw&r7u z%P-m`8gJkvenlici4;MNpmca0Wkpj7sHR$qvf>uwgD910M;5KNqipGZWbSGZ<tO`X zl!>1~>Hmva)W3$tWfF2YW>Rml2`%hF*^1|}0Y5}pK|0fy*Q)?!LKaFTmZA*MWL$?b z(N>hRvk|4D?Z!ya((%L-B&5ULD6ivQloAdYkK@=1PzE|vlvtL&D`{cCwj+)eiR$iv zqpgT-*?e?o)akW?p>Dm!iFAi_%sn~bV7hh!p>WJyH}Py~<Bn*g+fn0KPH$9Oa~CWU zOJelkSh1d{+@XVRzHijGRXbK^B&fsg2fk^E8@_W%Ics&VY7WI5wLZ|P)q1_%J)e=E zy`jB>A@2!Vx~nI^SeG+8^IF0>5Ytvnhq+|BX`6hlJg`k$0Xt~b2l+7Oqq<wQ{h3@H zv7M0JqpikZh{jfTRc2{Q=yC0KWbQ2rw1-3OR!~Q^9n|)g-mw{n?3fb>hjp;Ry`H%# zB@pg$Te8~HLXPf?xi4iM%&Dp^udFVwthFjDmq~kxdvEqucR0J-E%tY%)KuJ_81%=J zi&x)bMGNxIOlTM{X<{@lC+UCGG;wW;KgoaC>+@W1(DIIY1Kx3OF!9S&H+hBB)jQw~ zk$J&8>>W@v4oQ8LH|Xsf`?9=!-Z9ccUZ47B!C#vm|F?oCN@g5Ms`#tAw^s7c3hGkZ fq~<pZhOGPktLQJ!d@}6;s;=GA!VXh*w{YzrdA+2` diff --git a/flask_admin/translations/he/LC_MESSAGES/admin.po b/flask_admin/translations/he/LC_MESSAGES/admin.po index a7a4b1f0b..6d6ec1e20 100644 --- a/flask_admin/translations/he/LC_MESSAGES/admin.po +++ b/flask_admin/translations/he/LC_MESSAGES/admin.po @@ -1,275 +1,265 @@ + msgid "" msgstr "" -"Project-Id-Version: flask-admin\n" +"Project-Id-Version: flask-admin\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-02-07 00:17-0600\n" +"POT-Creation-Date: 2024-09-24 22:09+0100\n" "PO-Revision-Date: 2017-02-07 01:19-0500\n" "Last-Translator: mrjoes <serge.koval@gmail.com>\n" +"Language: he_IL\n" "Language-Team: Hebrew\n" +"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 " +"|| n%100==4 ? 2 : 3;\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.1.1\n" -"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3;\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: flask-admin\n" -"X-Crowdin-Language: he\n" -"X-Crowdin-File: admin.pot\n" -"Language: he_IL\n" +"Generated-By: Babel 2.16.0\n" -#: ../flask_admin/base.py:440 +#: ../flask_admin/base.py:458 msgid "Home" msgstr "הבית" -#: ../flask_admin/contrib/rediscli.py:127 +#: ../flask_admin/contrib/rediscli.py:113 msgid "Cli: Invalid command." msgstr "Cli: פקודה לא חוקית." -#: ../flask_admin/contrib/fileadmin/__init__.py:352 +#: ../flask_admin/contrib/fileadmin/__init__.py:376 msgid "File to upload" msgstr "קובץ לטעינה" -#: ../flask_admin/contrib/fileadmin/__init__.py:360 +#: ../flask_admin/contrib/fileadmin/__init__.py:384 msgid "File required." msgstr "קובץ הדרוש." -#: ../flask_admin/contrib/fileadmin/__init__.py:365 +#: ../flask_admin/contrib/fileadmin/__init__.py:389 msgid "Invalid file type." msgstr "סוג קובץ לא חוקי." -#: ../flask_admin/contrib/fileadmin/__init__.py:376 +#: ../flask_admin/contrib/fileadmin/__init__.py:400 msgid "Content" msgstr "תוכן" -#: ../flask_admin/contrib/fileadmin/__init__.py:390 +#: ../flask_admin/contrib/fileadmin/__init__.py:414 msgid "Invalid name" msgstr "שם לא חוקי" -#: ../flask_admin/contrib/fileadmin/__init__.py:398 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:106 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:112 -#: ../flask_admin/tests/sqla/test_translation.py:17 +#: ../flask_admin/contrib/fileadmin/__init__.py:422 +#: ../flask_admin/tests/sqla/test_translation.py:21 msgid "Name" msgstr "שם" -#: ../flask_admin/contrib/fileadmin/__init__.py:757 +#: ../flask_admin/contrib/fileadmin/__init__.py:784 #, python-format msgid "File \"%(name)s\" already exists." msgstr "קובץ \"%(name)s\" כבר קיים." -#: ../flask_admin/contrib/fileadmin/__init__.py:802 -#: ../flask_admin/contrib/fileadmin/__init__.py:885 -#: ../flask_admin/contrib/fileadmin/__init__.py:947 -#: ../flask_admin/contrib/fileadmin/__init__.py:1000 -#: ../flask_admin/contrib/fileadmin/__init__.py:1047 -#: ../flask_admin/contrib/fileadmin/__init__.py:1099 -#: ../flask_admin/model/base.py:2168 +#: ../flask_admin/contrib/fileadmin/__init__.py:829 +#: ../flask_admin/contrib/fileadmin/__init__.py:926 +#: ../flask_admin/contrib/fileadmin/__init__.py:988 +#: ../flask_admin/contrib/fileadmin/__init__.py:1041 +#: ../flask_admin/contrib/fileadmin/__init__.py:1088 +#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/model/base.py:2324 msgid "Permission denied." msgstr ". נדחית." -#: ../flask_admin/contrib/fileadmin/__init__.py:881 +#: ../flask_admin/contrib/fileadmin/__init__.py:922 msgid "File uploading is disabled." msgstr "העלאת קובץ אינו זמין." -#: ../flask_admin/contrib/fileadmin/__init__.py:892 +#: ../flask_admin/contrib/fileadmin/__init__.py:933 #, python-format msgid "Successfully saved file: %(name)s" msgstr "הקובץ שנשמר בהצלחה: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:896 +#: ../flask_admin/contrib/fileadmin/__init__.py:937 #, python-format msgid "Failed to save file: %(error)s" msgstr "שמירת הקובץ נכשלה: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:904 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:150 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:150 +#: ../flask_admin/contrib/fileadmin/__init__.py:945 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:150 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:152 msgid "Upload File" msgstr "העלאת קובץ" -#: ../flask_admin/contrib/fileadmin/__init__.py:943 +#: ../flask_admin/contrib/fileadmin/__init__.py:984 msgid "Directory creation is disabled." msgstr "מדריך יצירה אינו זמין." -#: ../flask_admin/contrib/fileadmin/__init__.py:956 +#: ../flask_admin/contrib/fileadmin/__init__.py:997 #, python-format msgid "Successfully created directory: %(directory)s" msgstr "מדריך שנוצרו בהצלחה: %(directory)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:960 +#: ../flask_admin/contrib/fileadmin/__init__.py:1001 #, python-format msgid "Failed to create directory: %(error)s" msgstr "יצירת ספריה נכשלה: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:970 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:161 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:161 +#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:161 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:163 msgid "Create Directory" msgstr "ליצור ספריה" -#: ../flask_admin/contrib/fileadmin/__init__.py:996 +#: ../flask_admin/contrib/fileadmin/__init__.py:1037 msgid "Deletion is disabled." msgstr "מחיקה אינה זמינה." -#: ../flask_admin/contrib/fileadmin/__init__.py:1005 +#: ../flask_admin/contrib/fileadmin/__init__.py:1046 msgid "Directory deletion is disabled." msgstr "מדריך המחיקה אינה זמינה." -#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/contrib/fileadmin/__init__.py:1052 #, python-format msgid "Directory \"%(path)s\" was successfully deleted." msgstr "מדריך \"%(path)s\" נמחק בהצלחה." -#: ../flask_admin/contrib/fileadmin/__init__.py:1013 +#: ../flask_admin/contrib/fileadmin/__init__.py:1054 #, python-format msgid "Failed to delete directory: %(error)s" msgstr "מחיקת ספריה נכשלה: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1019 -#: ../flask_admin/contrib/fileadmin/__init__.py:1176 +#: ../flask_admin/contrib/fileadmin/__init__.py:1060 +#: ../flask_admin/contrib/fileadmin/__init__.py:1215 #, python-format msgid "File \"%(name)s\" was successfully deleted." msgstr "קובץ \"%(name)s\" נמחק בהצלחה." -#: ../flask_admin/contrib/fileadmin/__init__.py:1021 -#: ../flask_admin/contrib/fileadmin/__init__.py:1178 +#: ../flask_admin/contrib/fileadmin/__init__.py:1062 +#: ../flask_admin/contrib/fileadmin/__init__.py:1217 #, python-format msgid "Failed to delete file: %(name)s" msgstr "מחיקת הקובץ נכשלה: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1043 +#: ../flask_admin/contrib/fileadmin/__init__.py:1084 msgid "Renaming is disabled." msgstr "שינוי שם אינו זמין." -#: ../flask_admin/contrib/fileadmin/__init__.py:1051 +#: ../flask_admin/contrib/fileadmin/__init__.py:1092 msgid "Path does not exist." msgstr "הנתיב אינו קיים." -#: ../flask_admin/contrib/fileadmin/__init__.py:1061 +#: ../flask_admin/contrib/fileadmin/__init__.py:1102 #, python-format msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\"" msgstr "בהצלחה ששמם \"%(src)s\" ל \"%(dst)s\"" -#: ../flask_admin/contrib/fileadmin/__init__.py:1064 +#: ../flask_admin/contrib/fileadmin/__init__.py:1105 #, python-format msgid "Failed to rename: %(error)s" msgstr "לא ניתן לשנות שם: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1078 +#: ../flask_admin/contrib/fileadmin/__init__.py:1119 #, python-format msgid "Rename %(name)s" msgstr "שינוי שם %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1115 +#: ../flask_admin/contrib/fileadmin/__init__.py:1155 #, python-format msgid "Error saving changes to %(name)s." msgstr "שגיאה בעת שמירת שינויים %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1119 +#: ../flask_admin/contrib/fileadmin/__init__.py:1159 #, python-format msgid "Changes to %(name)s saved successfully." msgstr "שינויים %(name)s שנשמרו בהצלחה." -#: ../flask_admin/contrib/fileadmin/__init__.py:1128 +#: ../flask_admin/contrib/fileadmin/__init__.py:1167 #, python-format msgid "Error reading %(name)s." msgstr "שגיאה בקריאה %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1131 -#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/contrib/fileadmin/__init__.py:1170 +#: ../flask_admin/contrib/fileadmin/__init__.py:1179 #, python-format msgid "Unexpected error while reading from %(name)s" msgstr "שגיאה לא צפויה במהלך הקריאה מתוך %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1137 +#: ../flask_admin/contrib/fileadmin/__init__.py:1176 #, python-format msgid "Cannot edit %(name)s." msgstr "לא ניתן לערוך %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1155 +#: ../flask_admin/contrib/fileadmin/__init__.py:1194 #, python-format msgid "Editing %(path)s" msgstr "עריכת %(path)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/peewee/view.py:487 -#: ../flask_admin/contrib/pymongo/view.py:384 -#: ../flask_admin/contrib/sqla/view.py:1149 +#: ../flask_admin/contrib/fileadmin/__init__.py:1202 +#: ../flask_admin/contrib/peewee/view.py:510 +#: ../flask_admin/contrib/pymongo/view.py:385 +#: ../flask_admin/contrib/sqla/view.py:1241 msgid "Delete" msgstr "מחק" -#: ../flask_admin/contrib/fileadmin/__init__.py:1164 +#: ../flask_admin/contrib/fileadmin/__init__.py:1203 msgid "Are you sure you want to delete these files?" msgstr "האם אתה בטוח שברצונך למחוק את הקבצים הללו?" -#: ../flask_admin/contrib/fileadmin/__init__.py:1167 +#: ../flask_admin/contrib/fileadmin/__init__.py:1206 msgid "File deletion is disabled." msgstr "מחיקת קבצים אינו זמין." -#: ../flask_admin/contrib/fileadmin/__init__.py:1180 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:22 +#: ../flask_admin/contrib/fileadmin/__init__.py:1219 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:22 msgid "Edit" msgstr "עריכה" -#: ../flask_admin/contrib/fileadmin/s3.py:153 +#: ../flask_admin/contrib/fileadmin/s3.py:162 msgid "Cannot operate on non empty directories" msgstr "" #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 -#: ../flask_admin/contrib/sqla/filters.py:41 +#: ../flask_admin/contrib/sqla/filters.py:42 msgid "equals" msgstr "שווה ל-" #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 -#: ../flask_admin/contrib/sqla/filters.py:49 +#: ../flask_admin/contrib/sqla/filters.py:50 msgid "not equal" msgstr "לא שווה" #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 -#: ../flask_admin/contrib/sqla/filters.py:58 +#: ../flask_admin/contrib/sqla/filters.py:59 msgid "contains" msgstr "מכיל" #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 -#: ../flask_admin/contrib/sqla/filters.py:67 +#: ../flask_admin/contrib/sqla/filters.py:68 msgid "not contains" msgstr "לא מכיל" #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 -#: ../flask_admin/contrib/sqla/filters.py:75 +#: ../flask_admin/contrib/sqla/filters.py:76 msgid "greater than" msgstr "גדול מ-" #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 -#: ../flask_admin/contrib/sqla/filters.py:83 +#: ../flask_admin/contrib/sqla/filters.py:84 msgid "smaller than" msgstr "קטן יותר" #: ../flask_admin/contrib/peewee/filters.py:88 -#: ../flask_admin/contrib/sqla/filters.py:94 +#: ../flask_admin/contrib/sqla/filters.py:95 msgid "empty" msgstr "ריק" #: ../flask_admin/contrib/peewee/filters.py:102 -#: ../flask_admin/contrib/sqla/filters.py:108 +#: ../flask_admin/contrib/sqla/filters.py:109 msgid "in list" msgstr "ברשימה" #: ../flask_admin/contrib/peewee/filters.py:111 -#: ../flask_admin/contrib/sqla/filters.py:118 +#: ../flask_admin/contrib/sqla/filters.py:119 msgid "not in list" msgstr "לא ברשימה" @@ -282,44 +272,37 @@ msgstr "לא ברשימה" msgid "not between" msgstr "לא בין" -msgid "ObjectId equals" -msgstr "" - -#, python-format -msgid "Failed to get model. %(error)s" -msgstr "מודל נכשלה. %(error)s" - -#: ../flask_admin/contrib/peewee/view.py:435 -#: ../flask_admin/contrib/pymongo/view.py:316 -#: ../flask_admin/contrib/sqla/view.py:1078 +#: ../flask_admin/contrib/peewee/view.py:458 +#: ../flask_admin/contrib/pymongo/view.py:317 +#: ../flask_admin/contrib/sqla/view.py:1170 #, python-format msgid "Failed to create record. %(error)s" msgstr "יצירת רשומה נכשלה. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:454 -#: ../flask_admin/contrib/pymongo/view.py:341 -#: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 -#: ../flask_admin/model/base.py:2313 ../flask_admin/model/base.py:2315 +#: ../flask_admin/contrib/peewee/view.py:477 +#: ../flask_admin/contrib/pymongo/view.py:342 +#: ../flask_admin/contrib/sqla/view.py:1196 ../flask_admin/model/base.py:2463 +#: ../flask_admin/model/base.py:2471 ../flask_admin/model/base.py:2473 #, python-format msgid "Failed to update record. %(error)s" msgstr "יצירת רשומה נכשלה. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:469 -#: ../flask_admin/contrib/pymongo/view.py:366 -#: ../flask_admin/contrib/sqla/view.py:1129 +#: ../flask_admin/contrib/peewee/view.py:492 +#: ../flask_admin/contrib/pymongo/view.py:367 +#: ../flask_admin/contrib/sqla/view.py:1221 #, python-format msgid "Failed to delete record. %(error)s" msgstr "לא ניתן למחוק רשומה. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:488 -#: ../flask_admin/contrib/pymongo/view.py:385 -#: ../flask_admin/contrib/sqla/view.py:1150 +#: ../flask_admin/contrib/peewee/view.py:511 +#: ../flask_admin/contrib/pymongo/view.py:386 +#: ../flask_admin/contrib/sqla/view.py:1242 msgid "Are you sure you want to delete selected records?" msgstr "האם אתה בטוח שברצונך למחוק את הרשומות שנבחרו?" -#: ../flask_admin/contrib/peewee/view.py:505 -#: ../flask_admin/contrib/pymongo/view.py:395 -#: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 +#: ../flask_admin/contrib/peewee/view.py:528 +#: ../flask_admin/contrib/pymongo/view.py:396 +#: ../flask_admin/contrib/sqla/view.py:1258 ../flask_admin/model/base.py:2272 #, python-format msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." @@ -328,33 +311,33 @@ msgstr[1] "%(count)s רשומות נמחקו בהצלחה." msgstr[2] "%(count)s רשומות נמחקו בהצלחה." msgstr[3] "%(count)s רשומות נמחקו בהצלחה." -#: ../flask_admin/contrib/peewee/view.py:511 -#: ../flask_admin/contrib/pymongo/view.py:400 -#: ../flask_admin/contrib/sqla/view.py:1174 +#: ../flask_admin/contrib/peewee/view.py:534 +#: ../flask_admin/contrib/pymongo/view.py:401 +#: ../flask_admin/contrib/sqla/view.py:1266 #, python-format msgid "Failed to delete records. %(error)s" msgstr "לא ניתן למחוק רשומה. %(error)s" -#: ../flask_admin/contrib/sqla/fields.py:126 -#: ../flask_admin/contrib/sqla/fields.py:176 -#: ../flask_admin/contrib/sqla/fields.py:181 ../flask_admin/model/fields.py:173 -#: ../flask_admin/model/fields.py:222 +#: ../flask_admin/contrib/sqla/fields.py:117 +#: ../flask_admin/contrib/sqla/fields.py:167 +#: ../flask_admin/contrib/sqla/fields.py:172 ../flask_admin/model/fields.py:174 +#: ../flask_admin/model/fields.py:223 msgid "Not a valid choice" msgstr "לא אפשרו" -#: ../flask_admin/contrib/sqla/fields.py:186 +#: ../flask_admin/contrib/sqla/fields.py:201 msgid "Key" msgstr "" -#: ../flask_admin/contrib/sqla/fields.py:187 +#: ../flask_admin/contrib/sqla/fields.py:202 msgid "Value" msgstr "" -#: ../flask_admin/contrib/sqla/validators.py:42 +#: ../flask_admin/contrib/sqla/validators.py:28 msgid "Already exists." msgstr "כבר קיים." -#: ../flask_admin/contrib/sqla/validators.py:60 +#: ../flask_admin/contrib/sqla/validators.py:59 #, python-format msgid "At least %(num)d item is required" msgid_plural "At least %(num)d items are required" @@ -363,7 +346,15 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: ../flask_admin/contrib/sqla/view.py:1057 +#: ../flask_admin/contrib/sqla/validators.py:75 +msgid "Not a valid ISO currency code (e.g. USD, EUR, CNY)." +msgstr "" + +#: ../flask_admin/contrib/sqla/validators.py:83 +msgid "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." +msgstr "" + +#: ../flask_admin/contrib/sqla/view.py:1134 #, python-format msgid "Integrity error. %(message)s" msgstr "שגיאה שלמות. %(message)s" @@ -372,274 +363,242 @@ msgstr "שגיאה שלמות. %(message)s" msgid "Invalid time format" msgstr "תבנית השעה לא חוקי" -#: ../flask_admin/form/fields.py:144 +#: ../flask_admin/form/fields.py:147 msgid "Invalid Choice: could not coerce" msgstr "בחירה לא חוקית: לא יכול לאלץ" -#: ../flask_admin/form/fields.py:208 +#: ../flask_admin/form/fields.py:221 msgid "Invalid JSON" msgstr "JSON לא חוקי" -#: ../flask_admin/form/upload.py:207 +#: ../flask_admin/form/upload.py:216 msgid "Invalid file extension" msgstr "סיומת קובץ לא חוקי" -#: ../flask_admin/form/upload.py:214 ../flask_admin/form/upload.py:281 +#: ../flask_admin/form/upload.py:223 ../flask_admin/form/upload.py:293 #, python-format msgid "File \"%s\" already exists." msgstr "קובץ \"%s\" כבר קיים." -#: ../flask_admin/model/base.py:1649 +#: ../flask_admin/form/validators.py:16 +msgid "This field requires at least one item." +msgstr "" + +#: ../flask_admin/model/base.py:1737 msgid "There are no items in the table." msgstr "לא קיימים פריטים בטבלה." -#: ../flask_admin/model/base.py:1673 +#: ../flask_admin/model/base.py:1746 #, python-format msgid "Invalid Filter Value: %(value)s" msgstr "ערך לא חוקי מסנן: %(value)s" -#: ../flask_admin/model/base.py:1984 +#: ../flask_admin/model/base.py:2136 msgid "Record was successfully created." msgstr "הרשומה נוצרה בהצלחה." -#: ../flask_admin/model/base.py:2028 ../flask_admin/model/base.py:2080 -#: ../flask_admin/model/base.py:2113 ../flask_admin/model/base.py:2297 +#: ../flask_admin/model/base.py:2180 ../flask_admin/model/base.py:2232 +#: ../flask_admin/model/base.py:2265 ../flask_admin/model/base.py:2455 msgid "Record does not exist." msgstr "רשומה אינה קיימת." -#: ../flask_admin/model/base.py:2037 ../flask_admin/model/base.py:2301 +#: ../flask_admin/model/base.py:2189 ../flask_admin/model/base.py:2459 msgid "Record was successfully saved." msgstr "הרשומה נשמרה בהצלחה." -#: ../flask_admin/model/base.py:2222 -msgid "Tablib dependency not installed." -msgstr "" - -#: ../flask_admin/model/base.py:2249 +#: ../flask_admin/model/base.py:2407 #, python-format msgid "Export type \"%(type)s not supported." msgstr "" -#: ../flask_admin/model/filters.py:103 ../flask_admin/model/widgets.py:111 +#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:119 msgid "Yes" msgstr "כן" -#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:110 +#: ../flask_admin/model/filters.py:105 ../flask_admin/model/widgets.py:118 msgid "No" msgstr "לא" -#: ../flask_admin/model/filters.py:172 ../flask_admin/model/filters.py:212 -#: ../flask_admin/model/filters.py:257 +#: ../flask_admin/model/filters.py:173 ../flask_admin/model/filters.py:213 +#: ../flask_admin/model/filters.py:258 msgid "between" msgstr "לא" -#: ../flask_admin/model/template.py:81 ../flask_admin/model/template.py:88 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:37 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:8 +#: ../flask_admin/model/template.py:83 ../flask_admin/model/template.py:90 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:7 msgid "View Record" msgstr "רשומת התצוגה" -#: ../flask_admin/model/template.py:95 ../flask_admin/model/template.py:102 -#: ../flask_admin/model/template.py:109 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/edit.html:11 +#: ../flask_admin/model/template.py:97 ../flask_admin/model/template.py:104 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/edit.html:10 msgid "Edit Record" msgstr "לערוך רשומה" -#: ../flask_admin/model/widgets.py:61 +#: ../flask_admin/model/template.py:111 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Delete Record" +msgstr "" + +#: ../flask_admin/model/widgets.py:62 msgid "Please select model" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/actions.html:4 -#: ../flask_admin/templates/bootstrap3/admin/actions.html:4 +#: ../flask_admin/templates/bootstrap4/admin/actions.html:5 msgid "With selected" msgstr "עם נבחרת" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:200 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:190 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:216 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:227 msgid "Save" msgstr "שמור" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:205 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:195 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:221 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:232 msgid "Cancel" msgstr "ביטול" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:256 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:247 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:290 msgid "Save and Add Another" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:259 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:250 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:293 msgid "Save and Continue Editing" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:9 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:9 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:10 msgid "Root" msgstr "שורש" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:90 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:99 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:89 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:98 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:42 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:51 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:89 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:98 #, python-format msgid "Sort by %(name)s" msgstr "מיין לפי %(name)s" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:77 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:79 msgid "Rename File" msgstr "שינוי שם של קובץ" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:88 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:88 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:90 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\' recursively?" msgstr "האם אתה בטוח שברצונך למחוק את \\'%(name)s\\' באופן רקורסיבי?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:97 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:97 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:99 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\'?" msgstr "האם אתה בטוח שברצונך למחוק את \\'%(name)s\\'?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:125 -msgid "Size" -msgstr "" - -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:185 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:187 msgid "Please select at least one file." msgstr "נא בחר קובץ אחד לפחות." -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:8 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:17 msgid "List" msgstr "הרשימה" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:12 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:18 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 msgid "Create" msgstr "צור" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:26 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:26 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:21 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:26 msgid "Details" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:29 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:28 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:15 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:28 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:15 msgid "Filter" msgstr "מסנן" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:13 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:14 msgid "Delete?" msgstr "מחק?" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:33 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:16 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:35 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Are you sure you want to delete this record?" +msgstr "האם אתה בטוח שברצונך למחוק רשומה זו?" + +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:33 msgid "New" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:43 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:43 msgid "Add" msgstr "להוסיף" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:3 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:3 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:2 msgid "Add Filter" msgstr "להוסיף מסנן" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:30 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:19 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:26 msgid "Export" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:38 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:38 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:49 msgid "Apply" msgstr "החל" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:40 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:51 msgid "Reset Filters" msgstr "איפוס מסננים" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:66 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:64 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:80 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:93 +#, python-format +msgid "%(placeholder)s" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:88 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:94 msgid "Search" msgstr "חיפוש" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:74 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:77 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:78 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:79 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:72 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:75 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:76 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:77 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:102 msgid "items" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/create.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/create.html:10 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/create.html:10 msgid "Create New Record" msgstr "יצירת רשומה חדשה" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:76 msgid "Select all records" msgstr "בחר כל הרשומות" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:120 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:119 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:119 msgid "Select record" msgstr "בחר רשומה" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:186 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:195 msgid "Please select at least one record." msgstr "נא בחר רשומה אחת לפחות." -#: ../flask_admin/templates/bootstrap2/admin/model/row_actions.html:34 -#: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 -msgid "Are you sure you want to delete this record?" -msgstr "האם אתה בטוח שברצונך למחוק רשומה זו?" +#~ msgid "ObjectId equals" +#~ msgstr "" + +#~ msgid "Failed to get model. %(error)s" +#~ msgstr "מודל נכשלה. %(error)s" + +#~ msgid "Tablib dependency not installed." +#~ msgstr "" + +#~ msgid "Size" +#~ msgstr "" + diff --git a/flask_admin/translations/hu/LC_MESSAGES/admin.mo b/flask_admin/translations/hu/LC_MESSAGES/admin.mo index b42cf2c99fca110e012b94f94a3c6356e1cb6b5e..78341ff323346575a170c8e033f1f8633d2d17a2 100644 GIT binary patch delta 1834 zcmYMzZ)j6j7{~GFww<kQ(<Y5tlh&Eey3QskNw9U%_Jte875~%?6%j$%l!`5@WiToO zuP^7{PVOc;rPIAAOa)=r;fvv5uePbwF%=xj*b9s33Kjn$Y%BZz<^e;J&pl7>J?A;k zdGgh=$qxUIy0R~fS0A57KI=*~digpy!%U$=Scyll7Ej_Ucn*vBEoN~N^O!6*%it>K zZtP|}hTLM4INQv($6T}!m|5|E!174QR-kU|#VBsT81}jNZq$8yk%{b6Hy*_{#$z}i zZ#ti18ROYA&8jeoQP#KDxu_?w1e>rIweS!w#9@35N8R{G)Wr8(yqvNuVBCrgxCURv zov7#bq3%D2i|{HY@EImq-=d^bgK6hd)I>d~M7E<cA3z<^5T@`jYU1-)jn{Av-oZM2 z?BX-{G0r%Sny1B?L0@N^=b{ALQ4hX}vv8#wZ^abjk5D`M9JSCz7azyfjHggL?~1(W zk<CaBHh?;!VdQOx`BEY$Bh+6PrwM4mF;r>3NA3J3Dxo{b+ot$ZFZ_#Htf6da>_i>i z4ou;G%-~s60=JxZQS&@RZG5_h`m2dbXleSxDp6e>M<tLzHf1T)eOc6m?Jm9?X#-p1 z;u~Fj8;*D!6>`kx(Ye}SHL|ufq2|r`Txcg<s3z*i794Toi>NccjXn4`DzR?LqN7-a zYN|n0&m2c><U7<(f55qT)j5Gmcp8<MUqNT6`{SrU8dbUuR3aas5<7sJ@I2})FQIzi zy7K|HGWOV}c9y|B7Ev4QcjM!z`>wo*`}WM;(9Ep*yS<0n(J<=4uTd5F6_wCKRFBMM zb^RL($Y!h;$-&-7^}@%fBRhuL@hMbuo<UXW7i`i0e}W555TOhyOkon2qvD%U4-BGu z;{d8@kD!|9sPjwI0;8z=FCn?w@2Cn+;Tss|JlL~!VutnYT`qcY5AwEgzR1b$p%R!z zO&DX_YMw0Wj5|>~>_$~$H8$f;_xlLyxnroxTtLnDGv@F%`YLrb+f~UrP)D#4+i?%- zfeWZJ{RwGkyMd~}T~s3XQ6+was?a|!Uc&0?nJQGG3Di7IF5cEa>nYGlK&9$&H*9GL zTg&%);cpcmdcpR}Kf`TR*Sug!q&eu141|A0RxqeN6in1^3c90fgA>uCvBKhPu9z(> zP8AAEbH#KnAG{UoE8X(W`rw<`+upKZGB#9}?`X?~TkCdt;q&-qFZiUsF)W=^<%Pxi ibV;xyQ3%c?{IDx|&<n;JJ`4QD!Qe^breNK?mHz=*2)&H} delta 2351 zcma*ne`wTo9LMp`ZS%)|xXp7v+;r}nZf;9AH-Amrl*F8~%q?{lHN>0u%}#IkV|PnW zi?jM8T1o1c5!p|}3ZwexW<-*Kl3+zz6h&H~L<tQm@Q;LGJzwqv5d?YM-Q)B5d_O<m zpZDG9(pTHkKl*cq4X-$#nS73BtM<=p{v>16)QEZ5f<@Sl6L38)$Bo#C&teOHi1TsO zS~1y}HPkzBqWWQ}F=^vbsH5SS^~>=G<~lOg6y=T&D92*zvv4Xdu<ff*{W_5eO}DK- zgiX{VSdA}RKf)a9KVUxVo68h5@l`CxF}wxKIj(lP9Bc4)tVI`R<1@DY9%_NFZTmHx zL%lqo&0-tQzz1yo5!Co$tY&@l0fh$q4l6LLz?e#$iG|o|?LbY`gW6aeb&}nvt9uL` zJdE1V3FK`q@KuIa(2rxb-9Lr+Potrlg6?<`YQk1)yKP^ES+uV~P0)$Tfd{b!ciQ%S z=ur1iCmcb||1D|*zuM<noa%1sa|(&SLKLS#6COZ<U|vJr<vYk2a|*Sw^VV-r3xAJ_ z*l(za<T8miSd1Ds2Q{t*b;V1u5!d2894sRKy6Yn}IC$Fn6V9hTfl=DfLR7Y|wDmhs z3v{C*w*{4ieMsJ#9jN{Z)W%Xs)XhFrzy0?4aGHV^c+qxv3&}q-V%tyJ_D^xhM<|i} zGJPCV5$Hz_Z=OIca1eFES5Qg#Io9FtwmzNvP;Rv2I!yOc&<@{3-PyaS0q0Rk`6nvr zX0w`3wi0#nwKyGntP#}4pF(Z$AnMojlC6)RBKk3E{!wIuX;Z>QYr<uyJMZ92$<k|0 z;H}h$P$xW&HFyg3NAnBn#1#xueJ!eg3e|qp`ju_huJkjWhYkAu-$Owi_o6~`47J0v zsO0(s_4CT-xJ1#^BSA53sNCtoNf<{(AcacmCsC1m9W~!c)cBv#!RuJb`lgaq^k4~U zKqo4xf~X{V7?s5l+n%uQLM^lx$yak2HU4cRDCP_*2QFeg>Q6-*Z$P4NR$y9pvXMd; zrjbpVb4awz71YMYP!s$4QnEFna$yDP<Q=F8Z9rYkPW$`-@-{E<rG<~94ssSX?-w(O ze=~(kG$`5p%%YICqk~&eca_E^_y%g=1yp3NqH^LIDgwT$@dc)$Hduzbl4?}{2HU;> zZ{%FnGJ68sVFPNy&9+0p)}yG9K5FZSsxm_p_xa`qB9Um)iN@T4K+<)h5hudO?T;l> zPB1j!Zc9c7LT(~6d2-BGvu1ZJI*@ddshI1`uC1312?ivc#9&O1++dTpEB8|Fb~owt zM}uzIo0V6Vxj*lmFZ(Vx<;^XqE$Zsq!KCYgjvF5ggcIJK1^v^y!)_qqIte$-qw#^6 z_X|3G*`YnI_t%u?ssnxDP@fZYV{RnqMz*DHtQm?Vl7VnoYd&4rn;i%bdY20~O$a63 z{)D%<==rHFt&PnK8=G65=H}Z}Ug}*e+U|7}ul9zD<JpUv7H7taW4^l8HyMJ6|FfG6 z!I9FcOixL^&mVSoo<24Z2|0oBQ-zznttAzit)=s_ZUkhgd{N=Q1LB=1fBZk=(Kda* iFMCsHk9VfxkhA&!0&-tvEazTD<de!?8xd#5`o94Kr%Lz$ diff --git a/flask_admin/translations/hu/LC_MESSAGES/admin.po b/flask_admin/translations/hu/LC_MESSAGES/admin.po index 037b1c241..d2180e783 100644 --- a/flask_admin/translations/hu/LC_MESSAGES/admin.po +++ b/flask_admin/translations/hu/LC_MESSAGES/admin.po @@ -1,278 +1,267 @@ + msgid "" msgstr "" -"Project-Id-Version: flask-admin\n" +"Project-Id-Version: flask-admin\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-02-07 00:17-0600\n" +"POT-Creation-Date: 2024-09-24 22:09+0100\n" "PO-Revision-Date: 2017-02-07 01:19-0500\n" "Last-Translator: mrjoes <serge.koval@gmail.com>\n" +"Language: hu_HU\n" "Language-Team: Hungarian\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.1.1\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: flask-admin\n" -"X-Crowdin-Language: hu\n" -"X-Crowdin-File: admin.pot\n" -"Language: hu_HU\n" +"Generated-By: Babel 2.16.0\n" -#: ../flask_admin/base.py:440 +#: ../flask_admin/base.py:458 msgid "Home" msgstr "Kezdőlap" -#: ../flask_admin/contrib/rediscli.py:127 +#: ../flask_admin/contrib/rediscli.py:113 msgid "Cli: Invalid command." msgstr "CLI: Érvénytelen parancs." -#: ../flask_admin/contrib/fileadmin/__init__.py:352 +#: ../flask_admin/contrib/fileadmin/__init__.py:376 msgid "File to upload" msgstr "Feltöltendő fájl" -#: ../flask_admin/contrib/fileadmin/__init__.py:360 +#: ../flask_admin/contrib/fileadmin/__init__.py:384 msgid "File required." msgstr "Fájl szükséges." -#: ../flask_admin/contrib/fileadmin/__init__.py:365 +#: ../flask_admin/contrib/fileadmin/__init__.py:389 msgid "Invalid file type." msgstr "Érvénytelen fájltípus." -#: ../flask_admin/contrib/fileadmin/__init__.py:376 +#: ../flask_admin/contrib/fileadmin/__init__.py:400 msgid "Content" msgstr "Tartalom" -#: ../flask_admin/contrib/fileadmin/__init__.py:390 +#: ../flask_admin/contrib/fileadmin/__init__.py:414 msgid "Invalid name" msgstr "Érvénytelen név" -#: ../flask_admin/contrib/fileadmin/__init__.py:398 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:106 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:112 -#: ../flask_admin/tests/sqla/test_translation.py:17 +#: ../flask_admin/contrib/fileadmin/__init__.py:422 +#: ../flask_admin/tests/sqla/test_translation.py:21 msgid "Name" msgstr "Név" -#: ../flask_admin/contrib/fileadmin/__init__.py:757 +#: ../flask_admin/contrib/fileadmin/__init__.py:784 #, python-format msgid "File \"%(name)s\" already exists." msgstr "\"%(name)s\" fájl már létezik." -#: ../flask_admin/contrib/fileadmin/__init__.py:802 -#: ../flask_admin/contrib/fileadmin/__init__.py:885 -#: ../flask_admin/contrib/fileadmin/__init__.py:947 -#: ../flask_admin/contrib/fileadmin/__init__.py:1000 -#: ../flask_admin/contrib/fileadmin/__init__.py:1047 -#: ../flask_admin/contrib/fileadmin/__init__.py:1099 -#: ../flask_admin/model/base.py:2168 +#: ../flask_admin/contrib/fileadmin/__init__.py:829 +#: ../flask_admin/contrib/fileadmin/__init__.py:926 +#: ../flask_admin/contrib/fileadmin/__init__.py:988 +#: ../flask_admin/contrib/fileadmin/__init__.py:1041 +#: ../flask_admin/contrib/fileadmin/__init__.py:1088 +#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/model/base.py:2324 msgid "Permission denied." msgstr "Engedély megtagadva." -#: ../flask_admin/contrib/fileadmin/__init__.py:881 +#: ../flask_admin/contrib/fileadmin/__init__.py:922 msgid "File uploading is disabled." msgstr "Fájl feltöltése le van tiltva." -#: ../flask_admin/contrib/fileadmin/__init__.py:892 +#: ../flask_admin/contrib/fileadmin/__init__.py:933 #, python-format msgid "Successfully saved file: %(name)s" msgstr "Sikeresen mentett fájl: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:896 +#: ../flask_admin/contrib/fileadmin/__init__.py:937 #, python-format msgid "Failed to save file: %(error)s" msgstr "Nem sikerült menteni a fájlt: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:904 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:150 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:150 +#: ../flask_admin/contrib/fileadmin/__init__.py:945 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:150 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:152 msgid "Upload File" msgstr "Fájl feltöltése" -#: ../flask_admin/contrib/fileadmin/__init__.py:943 +#: ../flask_admin/contrib/fileadmin/__init__.py:984 msgid "Directory creation is disabled." msgstr "Könyvtár létrehozása le van tiltva." -#: ../flask_admin/contrib/fileadmin/__init__.py:956 +#: ../flask_admin/contrib/fileadmin/__init__.py:997 #, python-format msgid "Successfully created directory: %(directory)s" msgstr "Sikeresen létrehozott könyvtár: %(directory)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:960 +#: ../flask_admin/contrib/fileadmin/__init__.py:1001 #, python-format msgid "Failed to create directory: %(error)s" msgstr "Nem sikerült létrehozni a könyvtár: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:970 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:161 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:161 +#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:161 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:163 msgid "Create Directory" msgstr "Könyvtár létrehozása" -#: ../flask_admin/contrib/fileadmin/__init__.py:996 +#: ../flask_admin/contrib/fileadmin/__init__.py:1037 msgid "Deletion is disabled." msgstr "Törlés le van tiltva." -#: ../flask_admin/contrib/fileadmin/__init__.py:1005 +#: ../flask_admin/contrib/fileadmin/__init__.py:1046 msgid "Directory deletion is disabled." msgstr "Könyvtár törlése le van tiltva." -#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/contrib/fileadmin/__init__.py:1052 #, python-format msgid "Directory \"%(path)s\" was successfully deleted." msgstr "A \"%(path)s\" könyvtár sikeresen törölve." -#: ../flask_admin/contrib/fileadmin/__init__.py:1013 +#: ../flask_admin/contrib/fileadmin/__init__.py:1054 #, python-format msgid "Failed to delete directory: %(error)s" msgstr "Nem sikerült törölni a könyvtárat: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1019 -#: ../flask_admin/contrib/fileadmin/__init__.py:1176 +#: ../flask_admin/contrib/fileadmin/__init__.py:1060 +#: ../flask_admin/contrib/fileadmin/__init__.py:1215 #, python-format msgid "File \"%(name)s\" was successfully deleted." msgstr "Sikeresen törölte a fájl \"%(name)s\"." -#: ../flask_admin/contrib/fileadmin/__init__.py:1021 -#: ../flask_admin/contrib/fileadmin/__init__.py:1178 +#: ../flask_admin/contrib/fileadmin/__init__.py:1062 +#: ../flask_admin/contrib/fileadmin/__init__.py:1217 #, python-format msgid "Failed to delete file: %(name)s" msgstr "Nem sikerült törölni a fájlt: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1043 +#: ../flask_admin/contrib/fileadmin/__init__.py:1084 msgid "Renaming is disabled." msgstr "Átnevezése le van tiltva." -#: ../flask_admin/contrib/fileadmin/__init__.py:1051 +#: ../flask_admin/contrib/fileadmin/__init__.py:1092 msgid "Path does not exist." msgstr "Elérési út nem létezik." -#: ../flask_admin/contrib/fileadmin/__init__.py:1061 +#: ../flask_admin/contrib/fileadmin/__init__.py:1102 #, python-format msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\"" msgstr "Sikeresen átnevezve \"%(src)s\", \"%(dst)s\"" -#: ../flask_admin/contrib/fileadmin/__init__.py:1064 +#: ../flask_admin/contrib/fileadmin/__init__.py:1105 #, python-format msgid "Failed to rename: %(error)s" msgstr "Nem sikerült átnevezni a: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1078 +#: ../flask_admin/contrib/fileadmin/__init__.py:1119 #, python-format msgid "Rename %(name)s" msgstr "Nevezze át a %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1115 +#: ../flask_admin/contrib/fileadmin/__init__.py:1155 #, python-format msgid "Error saving changes to %(name)s." msgstr "Hiba a módosítások mentése a %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1119 +#: ../flask_admin/contrib/fileadmin/__init__.py:1159 #, python-format msgid "Changes to %(name)s saved successfully." msgstr "Módosítások mentése sikeres %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1128 +#: ../flask_admin/contrib/fileadmin/__init__.py:1167 #, python-format msgid "Error reading %(name)s." msgstr "Hiba olvasó %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1131 -#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/contrib/fileadmin/__init__.py:1170 +#: ../flask_admin/contrib/fileadmin/__init__.py:1179 #, python-format msgid "Unexpected error while reading from %(name)s" msgstr "Váratlan hiba a következő olvasásakor, a %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1137 +#: ../flask_admin/contrib/fileadmin/__init__.py:1176 #, python-format msgid "Cannot edit %(name)s." msgstr "Nem lehet szerkeszteni a %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1155 +#: ../flask_admin/contrib/fileadmin/__init__.py:1194 #, python-format msgid "Editing %(path)s" msgstr "%(path)s szerkesztése" -#: ../flask_admin/contrib/fileadmin/__init__.py:1163s -#: ../flask_admin/contrib/peewee/view.py:487 -#: ../flask_admin/contrib/pymongo/view.py:384 -#: ../flask_admin/contrib/sqla/view.py:1149 +#: ../flask_admin/contrib/fileadmin/__init__.py:1202 +#: ../flask_admin/contrib/peewee/view.py:510 +#: ../flask_admin/contrib/pymongo/view.py:385 +#: ../flask_admin/contrib/sqla/view.py:1241 msgid "Delete" msgstr "Törlése" -#: ../flask_admin/contrib/fileadmin/__init__.py:1164 +#: ../flask_admin/contrib/fileadmin/__init__.py:1203 msgid "Are you sure you want to delete these files?" msgstr "Biztosan törli ezeket a fájlokat?" -#: ../flask_admin/contrib/fileadmin/__init__.py:1167 +#: ../flask_admin/contrib/fileadmin/__init__.py:1206 msgid "File deletion is disabled." msgstr "Fájltörlés le van tiltva." -#: ../flask_admin/contrib/fileadmin/__init__.py:1180 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:22 +#: ../flask_admin/contrib/fileadmin/__init__.py:1219 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:22 msgid "Edit" msgstr "Szerkesztése" -#: ../flask_admin/contrib/fileadmin/s3.py:153 +#: ../flask_admin/contrib/fileadmin/s3.py:162 msgid "Cannot operate on non empty directories" msgstr "" -s + #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 -#: ../flask_admin/contrib/sqla/filters.py:41 +#: ../flask_admin/contrib/sqla/filters.py:42 msgid "equals" msgstr "egyenlő" -s + #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 -#: ../flask_admin/contrib/sqla/filters.py:49 +#: ../flask_admin/contrib/sqla/filters.py:50 msgid "not equal" msgstr "nem egyenlő" -s + #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 -#: ../flask_admin/contrib/sqla/filters.py:58 +#: ../flask_admin/contrib/sqla/filters.py:59 msgid "contains" msgstr "tartalmaz" -s + #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 -#: ../flask_admin/contrib/sqla/filters.py:67 +#: ../flask_admin/contrib/sqla/filters.py:68 msgid "not contains" msgstr "nem tartalmaz" -s + #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 -#: ../flask_admin/contrib/sqla/filters.py:75 +#: ../flask_admin/contrib/sqla/filters.py:76 msgid "greater than" msgstr "nagyobb, mint" -s + #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 -#: ../flask_admin/contrib/sqla/filters.py:83 +#: ../flask_admin/contrib/sqla/filters.py:84 msgid "smaller than" msgstr "kisebb, mint" -s + #: ../flask_admin/contrib/peewee/filters.py:88 -#: ../flask_admin/contrib/sqla/filters.py:94 +#: ../flask_admin/contrib/sqla/filters.py:95 msgid "empty" msgstr "üres" -s + #: ../flask_admin/contrib/peewee/filters.py:102 -#: ../flask_admin/contrib/sqla/filters.py:108 +#: ../flask_admin/contrib/sqla/filters.py:109 msgid "in list" msgstr "a lista" -s + #: ../flask_admin/contrib/peewee/filters.py:111 -#: ../flask_admin/contrib/sqla/filters.py:118 +#: ../flask_admin/contrib/sqla/filters.py:119 msgid "not in list" msgstr "listán nem szereplő" -s + #: ../flask_admin/contrib/peewee/filters.py:207 #: ../flask_admin/contrib/peewee/filters.py:244 #: ../flask_admin/contrib/peewee/filters.py:281 @@ -281,85 +270,86 @@ s #: ../flask_admin/contrib/sqla/filters.py:287 msgid "not between" msgstr "nem között" -s -msgid "ObjectId equals" -msgstr "" -s -#, python-format -msgid "Failed to get model. %(error)s" -msgstr "Nem sikerült lekérni a modell. %(error)s" -s -#: ../flask_admin/contrib/peewee/view.py:435 -#: ../flask_admin/contrib/pymongo/view.py:316 -#: ../flask_admin/contrib/sqla/view.py:1078 + +#: ../flask_admin/contrib/peewee/view.py:458 +#: ../flask_admin/contrib/pymongo/view.py:317 +#: ../flask_admin/contrib/sqla/view.py:1170 #, python-format msgid "Failed to create record. %(error)s" msgstr "Nem sikerült létrehozni a rekord. %(error)s" -s -#: ../flask_admin/contrib/peewee/view.py:454 -#: ../flask_admin/contrib/pymongo/view.py:341 -#: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 -#: ../flask_admin/model/base.py:2313 ../flask_admin/model/base.py:2315 + +#: ../flask_admin/contrib/peewee/view.py:477 +#: ../flask_admin/contrib/pymongo/view.py:342 +#: ../flask_admin/contrib/sqla/view.py:1196 ../flask_admin/model/base.py:2463 +#: ../flask_admin/model/base.py:2471 ../flask_admin/model/base.py:2473 #, python-format msgid "Failed to update record. %(error)s" msgstr "Nem sikerült létrehozni a rekord. %(error)s" -s -#: ../flask_admin/contrib/peewee/view.py:469 -#: ../flask_admin/contrib/pymongo/view.py:366 -#: ../flask_admin/contrib/sqla/view.py:1129 + +#: ../flask_admin/contrib/peewee/view.py:492 +#: ../flask_admin/contrib/pymongo/view.py:367 +#: ../flask_admin/contrib/sqla/view.py:1221 #, python-format msgid "Failed to delete record. %(error)s" msgstr "Nem sikerült törölni a rekordot. %(error)s" -s -#: ../flask_admin/contrib/peewee/view.py:488 -#: ../flask_admin/contrib/pymongo/view.py:385 -#: ../flask_admin/contrib/sqla/view.py:1150 + +#: ../flask_admin/contrib/peewee/view.py:511 +#: ../flask_admin/contrib/pymongo/view.py:386 +#: ../flask_admin/contrib/sqla/view.py:1242 msgid "Are you sure you want to delete selected records?" msgstr "Biztosan törli a kijelölt rekordokat?" -s -#: ../flask_admin/contrib/peewee/view.py:505 -#: ../flask_admin/contrib/pymongo/view.py:395 -#: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 + +#: ../flask_admin/contrib/peewee/view.py:528 +#: ../flask_admin/contrib/pymongo/view.py:396 +#: ../flask_admin/contrib/sqla/view.py:1258 ../flask_admin/model/base.py:2272 #, python-format msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." msgstr[0] "Rekord törlésének sikerességét." msgstr[1] "%(count)s rekordok törlése sikeres volt." -s -#: ../flask_admin/contrib/peewee/view.py:511 -#: ../flask_admin/contrib/pymongo/view.py:400 -#: ../flask_admin/contrib/sqla/view.py:1174 + +#: ../flask_admin/contrib/peewee/view.py:534 +#: ../flask_admin/contrib/pymongo/view.py:401 +#: ../flask_admin/contrib/sqla/view.py:1266 #, python-format msgid "Failed to delete records. %(error)s" msgstr "Nem sikerült törölni a rekordot. %(error)s" -#: ../flask_admin/contrib/sqla/fields.py:126 -#: ../flask_admin/contrib/sqla/fields.py:176 -#: ../flask_admin/contrib/sqla/fields.py:181 ../flask_admin/model/fields.py:173 -#: ../flask_admin/model/fields.py:222 +#: ../flask_admin/contrib/sqla/fields.py:117 +#: ../flask_admin/contrib/sqla/fields.py:167 +#: ../flask_admin/contrib/sqla/fields.py:172 ../flask_admin/model/fields.py:174 +#: ../flask_admin/model/fields.py:223 msgid "Not a valid choice" msgstr "Nem egy érvényes választás" -#: ../flask_admin/contrib/sqla/fields.py:186 +#: ../flask_admin/contrib/sqla/fields.py:201 msgid "Key" msgstr "" -#: ../flask_admin/contrib/sqla/fields.py:187 +#: ../flask_admin/contrib/sqla/fields.py:202 msgid "Value" msgstr "" -#: ../flask_admin/contrib/sqla/validators.py:42 +#: ../flask_admin/contrib/sqla/validators.py:28 msgid "Already exists." msgstr "Már létezik." -#: ../flask_admin/contrib/sqla/validators.py:60 +#: ../flask_admin/contrib/sqla/validators.py:59 #, python-format msgid "At least %(num)d item is required" msgid_plural "At least %(num)d items are required" msgstr[0] "Legalább %(num)d tétel szükség" msgstr[1] "Legalább %(num)d elemek szükségesek" -#: ../flask_admin/contrib/sqla/view.py:1057 +#: ../flask_admin/contrib/sqla/validators.py:75 +msgid "Not a valid ISO currency code (e.g. USD, EUR, CNY)." +msgstr "" + +#: ../flask_admin/contrib/sqla/validators.py:83 +msgid "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." +msgstr "" + +#: ../flask_admin/contrib/sqla/view.py:1134 #, python-format msgid "Integrity error. %(message)s" msgstr "Integritási hiba. %(message)s" @@ -368,274 +358,242 @@ msgstr "Integritási hiba. %(message)s" msgid "Invalid time format" msgstr "Érvénytelen időformátum" -#: ../flask_admin/form/fields.py:144 +#: ../flask_admin/form/fields.py:147 msgid "Invalid Choice: could not coerce" msgstr "Érvénytelen időformátum" -#: ../flask_admin/form/fields.py:208 +#: ../flask_admin/form/fields.py:221 msgid "Invalid JSON" msgstr "Érvénytelen JSON" -#: ../flask_admin/form/upload.py:207 +#: ../flask_admin/form/upload.py:216 msgid "Invalid file extension" msgstr "Érvénytelen fájlkiterjesztés" -#: ../flask_admin/form/upload.py:214 ../flask_admin/form/upload.py:281 +#: ../flask_admin/form/upload.py:223 ../flask_admin/form/upload.py:293 #, python-format msgid "File \"%s\" already exists." msgstr "\"%s\" fájl már létezik." -#: ../flask_admin/model/base.py:1649 +#: ../flask_admin/form/validators.py:16 +msgid "This field requires at least one item." +msgstr "" + +#: ../flask_admin/model/base.py:1737 msgid "There are no items in the table." msgstr "Vannak olyan cikkek, a táblázatban." -#: ../flask_admin/model/base.py:1673 +#: ../flask_admin/model/base.py:1746 #, python-format msgid "Invalid Filter Value: %(value)s" msgstr "Érvénytelen szűrőérték: %(value)s" -#: ../flask_admin/model/base.py:1984 +#: ../flask_admin/model/base.py:2136 msgid "Record was successfully created." msgstr "Rekord létrehozása sikeresen megtörtént." -#: ../flask_admin/model/base.py:2028 ../flask_admin/model/base.py:2080 -#: ../flask_admin/model/base.py:2113 ../flask_admin/model/base.py:2297 +#: ../flask_admin/model/base.py:2180 ../flask_admin/model/base.py:2232 +#: ../flask_admin/model/base.py:2265 ../flask_admin/model/base.py:2455 msgid "Record does not exist." msgstr "Nem létezik rekord." -#: ../flask_admin/model/base.py:2037 ../flask_admin/model/base.py:2301 +#: ../flask_admin/model/base.py:2189 ../flask_admin/model/base.py:2459 msgid "Record was successfully saved." msgstr "Rekord mentése sikeres." -#: ../flask_admin/model/base.py:2222 -msgid "Tablib dependency not installed." -msgstr "" - -#: ../flask_admin/model/base.py:2249 +#: ../flask_admin/model/base.py:2407 #, python-format msgid "Export type \"%(type)s not supported." msgstr "" -#: ../flask_admin/model/filters.py:103 ../flask_admin/model/widgets.py:111 +#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:119 msgid "Yes" msgstr "igen" -#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:110 +#: ../flask_admin/model/filters.py:105 ../flask_admin/model/widgets.py:118 msgid "No" msgstr "nem" -#: ../flask_admin/model/filters.py:172 ../flask_admin/model/filters.py:212 -#: ../flask_admin/model/filters.py:257 +#: ../flask_admin/model/filters.py:173 ../flask_admin/model/filters.py:213 +#: ../flask_admin/model/filters.py:258 msgid "between" msgstr "között" -#: ../flask_admin/model/template.py:81 ../flask_admin/model/template.py:88 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:37 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:8 +#: ../flask_admin/model/template.py:83 ../flask_admin/model/template.py:90 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:7 msgid "View Record" msgstr "Bejegyzések" -#: ../flask_admin/model/template.py:95 ../flask_admin/model/template.py:102 -#: ../flask_admin/model/template.py:109 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/edit.html:11 +#: ../flask_admin/model/template.py:97 ../flask_admin/model/template.py:104 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/edit.html:10 msgid "Edit Record" msgstr "-Rekord Szerkesztése" -#: ../flask_admin/model/widgets.py:61 +#: ../flask_admin/model/template.py:111 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Delete Record" +msgstr "" + +#: ../flask_admin/model/widgets.py:62 msgid "Please select model" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/actions.html:4 -#: ../flask_admin/templates/bootstrap3/admin/actions.html:4 +#: ../flask_admin/templates/bootstrap4/admin/actions.html:5 msgid "With selected" msgstr "A kiválasztott" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:200 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:190 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:216 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:227 msgid "Save" msgstr "Mentés" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:205 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:195 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:221 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:232 msgid "Cancel" msgstr "Mégse" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:256 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:247 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:290 msgid "Save and Add Another" msgstr "Mentés és új hozzáadása" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:259 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:250 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:293 msgid "Save and Continue Editing" msgstr "Mentés és szerkesztés folytatása" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:9 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:9 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:10 msgid "Root" msgstr "Gyökér" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:90 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:99 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:89 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:98 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:42 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:51 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:89 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:98 #, python-format msgid "Sort by %(name)s" msgstr "%(name)s rendezés" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:77 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:79 msgid "Rename File" msgstr "Fájl átnevezése" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:88 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:88 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:90 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\' recursively?" msgstr "Biztos, hogy törli a \\'%(name)s\\' rekurzív?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:97 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:97 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:99 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\'?" msgstr "Biztos, hogy törli a \\'%(name)s\\'?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:125 -msgid "Size" -msgstr "" - -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:185 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:187 msgid "Please select at least one file." msgstr "Jelöljön ki legalább egy fájlt." -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:8 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:17 msgid "List" msgstr "Lista" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:12 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:18 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 msgid "Create" msgstr "Létrehozása" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:26 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:26 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:21 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:26 msgid "Details" msgstr "Részletek" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:29 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:28 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:15 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:28 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:15 msgid "Filter" msgstr "Szűrő" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:13 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:14 msgid "Delete?" msgstr "Törlése?" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:33 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:16 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:35 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Are you sure you want to delete this record?" +msgstr "Biztosan törli ezt a rekordot?" + +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:33 msgid "New" msgstr "Új" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:43 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:43 msgid "Add" msgstr "Add hozzá" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:3 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:3 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:2 msgid "Add Filter" msgstr "Szűrő hozzáadása" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:30 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:19 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:26 msgid "Export" msgstr "Exportálás" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:38 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:38 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:49 msgid "Apply" msgstr "Alkalmazása" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:40 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:51 msgid "Reset Filters" msgstr "Reset szűrők" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:66 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:64 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:80 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:93 +#, python-format +msgid "%(placeholder)s" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:88 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:94 msgid "Search" msgstr "Keresés" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:74 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:77 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:78 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:79 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:72 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:75 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:76 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:77 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:102 msgid "items" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/create.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/create.html:10 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/create.html:10 msgid "Create New Record" msgstr "Új Rekord Létrehozása" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:76 msgid "Select all records" msgstr "Válassza az összes rekord" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:120 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:119 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:119 msgid "Select record" msgstr "Rekord kijelölése" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:186 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:195 msgid "Please select at least one record." msgstr "Jelöljön ki legalább egy bejegyzést." -#: ../flask_admin/templates/bootstrap2/admin/model/row_actions.html:34 -#: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 -msgid "Are you sure you want to delete this record?" -msgstr "Biztosan törli ezt a rekordot?" +#~ msgid "ObjectId equals" +#~ msgstr "" + +#~ msgid "Failed to get model. %(error)s" +#~ msgstr "Nem sikerült lekérni a modell. %(error)s" + +#~ msgid "Tablib dependency not installed." +#~ msgstr "" + +#~ msgid "Size" +#~ msgstr "" + diff --git a/flask_admin/translations/it/LC_MESSAGES/admin.mo b/flask_admin/translations/it/LC_MESSAGES/admin.mo index 86fe1b399209c6aa7d98aeb4d4f0909808594084..860bdec769352a8f4199b31156826f6e88ac615c 100644 GIT binary patch delta 1867 zcmYM!e@xVM9LMqZ9cTO!jzf`<A0DPKJP!{<@`TZX`~xQ&Z7eJnwbsV6Yr{WlZ6~uI z%k7-`)wZnZT=a*lrt8+GZVt;F@`ucVK@1{fgGpIwe_(C?(eu@Pw%Box&*$^~eBYn< z=hq!;IUG;U7Y9xme+m98_<uV~wg3O-9y3$Z&zOgIFo^eX4L-s+`m@cV*oqB!5Vzx} z&N19eeHD4dT64@w%#zkYp_Yc{okN)ib{^?#Bd8Zfu?WX8gul4<2dI93BLU5FGxZHv zPqhj+VVCm_3{X#DKI7X73JQD%OYs6$<0xw272JaNaVwUv44bh9Rqsa)@Q!OA#wVzc zVmbbXRhXThd9Mc5zZ2^i-(I6oh8}LjudonrI;T;AmQe}$*Jfsri`ue63}XZpct7&7 z1YaBQO)SRauKhDyNBtruwYT3>(30GA-a@tih<=<x1(?D0c+b^+1(|`@qgG@WD)0f+ zzzO&K2zF5)My<qOs52BQWc`_xRWn`fT@-m{9jJt!bv}n0xDT~bgQ%4_ic0K5)O*9I zt^69JcpW470JWu+j2gzLa67&nWc`&uiUytLk5TorsDNLfR^l@1kX=R2ncYD3A4erJ zi7blEqWaxM#kud=A0fxba>-8Z>rnkSB`KtQWP=KPg`-VhyN>EGfeN^Qx@LEA8*XOW zJFyE@A41LOOWcn$sP}5v4;|8aRKFhFjY)i5UZSAPen2hxENbQp$jAQROM(2XKL^?J zP=~ApmGCZ%U>nxqL03QNo?k=78$)upY1A25!JWGQIc&TJXhj8j1{G)!Yw<K{X5YE` zpQxFXa>CTF9ksU!tifZbINzWWy@O5Y<8JHhG^5_@#$w(7w<xgsmcn{GgWA(usEj93 z11zHk$YI@-*bdZI^`d4pfPCyd*M1f?;008?G3Ra6N>Ae&#<w{Nx@L>00hf@m>>(<# zAW?Mx!&r%}$fWEA)D|6b&)>x!>gQ0`aTOJ>j2{(kK?F6CI4W)*CfNo{P|#@}Lf*0W zQ3IWG?ITDob_2OdHjf(kchpk*$ZiKlQNMgII)^Yu{d3I6Dbz|VqE>FD+y?&3<R2Qe z0(tzL>ADr54p#`3*hbWgVN?ROsDRC=v(t{cE&EW1v==qwS5N~DR;0IOmj}|X=0EhM zUoRN-c~1sY-cs<Q_es%5p~j|YEFNua3O6?HiNzza2CqFdko8h$k9R)ww6DecHFPM@ i&|Du&_ZMFaq&rKK{`5~}t3Gd{{G|6m#kXE}W!t~`z`cL~ delta 2091 zcmYk+du)?c7{~F`tpmr#x)#`d?i~|`x^^8SY-4k>a1j;aGBFxWrX77Ziltp$r;Y?W z`D4+jU{WgyMgxf#OoS*UN;Ig!e->km7Yqmy6G9>ZA{vcG{=x6h9;3^)&wEbKdCqg5 zbKXw(?C#B+3wU#epA>%${JmbR)_*^3bB$3~5a(eB`mhg6a3l8M5C-vi?7$DP4X;>h zZ!l&Z?e#cE<8YBN8I$Fqm5#TqUl%?we<5>?ue30s8Y^kvh<<Fh{R60R8<2oz(6&c0 zL_2{^_^S0ddTIZFWvp+`^Ps>#V>MpKW~^qr%CrY>!qvD0U0jUM+4f=70w-<%@7O}S zx{PG87whps+kPB1KZi}MZ;tVBGoHp;EGjpq4jZrnyR7R`f$l>kmO}01Nz~EpL<jew z68Z@FHD~!(g%>e^*KL1bKJ{NfM-vY^<4#n-E^D9dAHX8|*P#MzK;40da3MZw`=`;N zoki{NC@TIbR05an=SA#l6YZ7?>aP-|=up5Hks_G=sIz<rnPX0%68p;f9ctk-sES=h zRiu<4O0W_&uLU))19ikJF^G5ItvKnU{yOUebU65#^#ZohE@74uT8_Hy{kFXpwZI^% za>J-gID*_;vkf(V0+rYlQgt(p8ux<zJeT1?3%p_nyoKC9bJX^KZ2LdQXFQY=wZJ26 zlN?P96?h62cn0-4?#5ei7CZ4b+ivANw6P)Fh#6e~P5c6NyHBDfUc+u&LY-@H7?s!) zsFFU7s=y2~)Vzd>a}ap}%)9u{B}65B7FF^KsLNi-`O?mqRXk|GC@NqQ^?vU}-Hkoi ziHA`OoJR$^gbGx}&1%KfsGV)K?Hp<&$5G=h+IE0<Tt|KzF4g=0Fb@higUa{_uE1|l zmuoKDSAb@uiso+Q6wEM&Fo`<j*HDSSfm+}LT#DbL5>zl9*)r6|y0M1!&HeU+apc!b z^G^ZySr4E}eh_u34xwJhJZi!BQGsWXoXu%eg1?}?FFbsiG-4xC1k;N;vLVc9z$g!! zaTn^nJ%tK<4Rs{t4APG3P=Wi9V>Fvk35_6YnXRaWcG>>@$mY$P$Qx=tL2cwqR07}D zQ-78ICpy}30bgVK>Rf|baLl%!#W3wdScd0N6}p7l`LC$NJglzD1W>Q#BGlcgMJ2iz zHE$Uzq4vh^Lco4I;4ai98$`WU51?+di>kypYQd)(^JnJNdrQaMw6i@Kb>sOT=glwj z-7~Vy-IBgD>bR-NNPHrHxqQ}B9NXb$->cZu6d8%fMx3ZS?k1vcV#}11NT!`wVj>-h z$K7Zs+wVJ45=*<=C$d+4d;J|<!SM26xXTHLSLu0Wc5mfa*5e<@uJNaeJ3}k-$NZmq z7beqbH{m|!I<a^mk$5tck5s+<zg#BA$i>b7QS+zAd#{qYQkQF98!M!-BjRi>B$h}f U{>>(mj)bz)^(SmP0}Z$T4QcoBNdN!< diff --git a/flask_admin/translations/it/LC_MESSAGES/admin.po b/flask_admin/translations/it/LC_MESSAGES/admin.po index e17835aaa..537fc1c62 100644 --- a/flask_admin/translations/it/LC_MESSAGES/admin.po +++ b/flask_admin/translations/it/LC_MESSAGES/admin.po @@ -1,275 +1,264 @@ + msgid "" msgstr "" -"Project-Id-Version: flask-admin\n" +"Project-Id-Version: flask-admin\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-02-07 00:17-0600\n" +"POT-Creation-Date: 2024-09-24 22:09+0100\n" "PO-Revision-Date: 2017-02-07 01:19-0500\n" "Last-Translator: mrjoes <serge.koval@gmail.com>\n" +"Language: it_IT\n" "Language-Team: Italian\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.1.1\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: flask-admin\n" -"X-Crowdin-Language: it\n" -"X-Crowdin-File: admin.pot\n" -"Language: it_IT\n" +"Generated-By: Babel 2.16.0\n" -#: ../flask_admin/base.py:440 +#: ../flask_admin/base.py:458 msgid "Home" msgstr "Pagina Principale" -#: ../flask_admin/contrib/rediscli.py:127 +#: ../flask_admin/contrib/rediscli.py:113 msgid "Cli: Invalid command." msgstr "Cli: Comando non valido." -#: ../flask_admin/contrib/fileadmin/__init__.py:352 +#: ../flask_admin/contrib/fileadmin/__init__.py:376 msgid "File to upload" msgstr "File da caricare" -#: ../flask_admin/contrib/fileadmin/__init__.py:360 +#: ../flask_admin/contrib/fileadmin/__init__.py:384 msgid "File required." msgstr "File obbligatorio." -#: ../flask_admin/contrib/fileadmin/__init__.py:365 +#: ../flask_admin/contrib/fileadmin/__init__.py:389 msgid "Invalid file type." msgstr "Tipo di file non valido." -#: ../flask_admin/contrib/fileadmin/__init__.py:376 +#: ../flask_admin/contrib/fileadmin/__init__.py:400 msgid "Content" msgstr "Contenuto" -#: ../flask_admin/contrib/fileadmin/__init__.py:390 +#: ../flask_admin/contrib/fileadmin/__init__.py:414 msgid "Invalid name" msgstr "Nome non valido" -#: ../flask_admin/contrib/fileadmin/__init__.py:398 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:106 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:112 -#: ../flask_admin/tests/sqla/test_translation.py:17 +#: ../flask_admin/contrib/fileadmin/__init__.py:422 +#: ../flask_admin/tests/sqla/test_translation.py:21 msgid "Name" msgstr "Nome" -#: ../flask_admin/contrib/fileadmin/__init__.py:757 +#: ../flask_admin/contrib/fileadmin/__init__.py:784 #, python-format msgid "File \"%(name)s\" already exists." msgstr "Il file \"%(name)s\" esiste giá." -#: ../flask_admin/contrib/fileadmin/__init__.py:802 -#: ../flask_admin/contrib/fileadmin/__init__.py:885 -#: ../flask_admin/contrib/fileadmin/__init__.py:947 -#: ../flask_admin/contrib/fileadmin/__init__.py:1000 -#: ../flask_admin/contrib/fileadmin/__init__.py:1047 -#: ../flask_admin/contrib/fileadmin/__init__.py:1099 -#: ../flask_admin/model/base.py:2168 +#: ../flask_admin/contrib/fileadmin/__init__.py:829 +#: ../flask_admin/contrib/fileadmin/__init__.py:926 +#: ../flask_admin/contrib/fileadmin/__init__.py:988 +#: ../flask_admin/contrib/fileadmin/__init__.py:1041 +#: ../flask_admin/contrib/fileadmin/__init__.py:1088 +#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/model/base.py:2324 msgid "Permission denied." msgstr "Permesso negato." -#: ../flask_admin/contrib/fileadmin/__init__.py:881 +#: ../flask_admin/contrib/fileadmin/__init__.py:922 msgid "File uploading is disabled." msgstr "Il caricamento dei file é stato disabilitato." -#: ../flask_admin/contrib/fileadmin/__init__.py:892 +#: ../flask_admin/contrib/fileadmin/__init__.py:933 #, python-format msgid "Successfully saved file: %(name)s" msgstr "File salvato con successo: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:896 +#: ../flask_admin/contrib/fileadmin/__init__.py:937 #, python-format msgid "Failed to save file: %(error)s" msgstr "Impossibile salvare il file: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:904 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:150 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:150 +#: ../flask_admin/contrib/fileadmin/__init__.py:945 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:150 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:152 msgid "Upload File" msgstr "Carica file" -#: ../flask_admin/contrib/fileadmin/__init__.py:943 +#: ../flask_admin/contrib/fileadmin/__init__.py:984 msgid "Directory creation is disabled." msgstr "La creazione di cartelle é disabilitata." -#: ../flask_admin/contrib/fileadmin/__init__.py:956 +#: ../flask_admin/contrib/fileadmin/__init__.py:997 #, python-format msgid "Successfully created directory: %(directory)s" msgstr "Cartella creata con successo: %(directory)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:960 +#: ../flask_admin/contrib/fileadmin/__init__.py:1001 #, python-format msgid "Failed to create directory: %(error)s" msgstr "Impossibile creare la cartella: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:970 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:161 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:161 +#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:161 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:163 msgid "Create Directory" msgstr "Crea cartella" -#: ../flask_admin/contrib/fileadmin/__init__.py:996 +#: ../flask_admin/contrib/fileadmin/__init__.py:1037 msgid "Deletion is disabled." msgstr "L'eliminazione é disabilitata." -#: ../flask_admin/contrib/fileadmin/__init__.py:1005 +#: ../flask_admin/contrib/fileadmin/__init__.py:1046 msgid "Directory deletion is disabled." msgstr "L'eliminazione di cartelle é disabilitata." -#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/contrib/fileadmin/__init__.py:1052 #, python-format msgid "Directory \"%(path)s\" was successfully deleted." msgstr "È stata eliminata la directory \"%(path)s\"." -#: ../flask_admin/contrib/fileadmin/__init__.py:1013 +#: ../flask_admin/contrib/fileadmin/__init__.py:1054 #, python-format msgid "Failed to delete directory: %(error)s" msgstr "Impossibile eliminare la cartella: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1019 -#: ../flask_admin/contrib/fileadmin/__init__.py:1176 +#: ../flask_admin/contrib/fileadmin/__init__.py:1060 +#: ../flask_admin/contrib/fileadmin/__init__.py:1215 #, python-format msgid "File \"%(name)s\" was successfully deleted." msgstr "Il file \"%(name)s\" é stato eliminato correttamente." -#: ../flask_admin/contrib/fileadmin/__init__.py:1021 -#: ../flask_admin/contrib/fileadmin/__init__.py:1178 +#: ../flask_admin/contrib/fileadmin/__init__.py:1062 +#: ../flask_admin/contrib/fileadmin/__init__.py:1217 #, python-format msgid "Failed to delete file: %(name)s" msgstr "Impossibile eliminare il file: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1043 +#: ../flask_admin/contrib/fileadmin/__init__.py:1084 msgid "Renaming is disabled." msgstr "La rinominazione é disabilitata." -#: ../flask_admin/contrib/fileadmin/__init__.py:1051 +#: ../flask_admin/contrib/fileadmin/__init__.py:1092 msgid "Path does not exist." msgstr "Il percorso non esiste." -#: ../flask_admin/contrib/fileadmin/__init__.py:1061 +#: ../flask_admin/contrib/fileadmin/__init__.py:1102 #, python-format msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\"" msgstr "\"%(src)s\" rinominato in \"%(dst)s\" con successo" -#: ../flask_admin/contrib/fileadmin/__init__.py:1064 +#: ../flask_admin/contrib/fileadmin/__init__.py:1105 #, python-format msgid "Failed to rename: %(error)s" msgstr "Impossibile rinominare: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1078 +#: ../flask_admin/contrib/fileadmin/__init__.py:1119 #, python-format msgid "Rename %(name)s" msgstr "Rinomina %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1115 +#: ../flask_admin/contrib/fileadmin/__init__.py:1155 #, python-format msgid "Error saving changes to %(name)s." msgstr "Errore nel salvataggio delle modifiche di %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1119 +#: ../flask_admin/contrib/fileadmin/__init__.py:1159 #, python-format msgid "Changes to %(name)s saved successfully." msgstr "Le modifiche a %(name)s sono state salvate con successo." -#: ../flask_admin/contrib/fileadmin/__init__.py:1128 +#: ../flask_admin/contrib/fileadmin/__init__.py:1167 #, python-format msgid "Error reading %(name)s." msgstr "Errore di lettura di %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1131 -#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/contrib/fileadmin/__init__.py:1170 +#: ../flask_admin/contrib/fileadmin/__init__.py:1179 #, python-format msgid "Unexpected error while reading from %(name)s" msgstr "Errore imprevisto durante la lettura di %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1137 +#: ../flask_admin/contrib/fileadmin/__init__.py:1176 #, python-format msgid "Cannot edit %(name)s." msgstr "Non è possibile modificare %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1155 +#: ../flask_admin/contrib/fileadmin/__init__.py:1194 #, python-format msgid "Editing %(path)s" msgstr "Modifica %(path)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/peewee/view.py:487 -#: ../flask_admin/contrib/pymongo/view.py:384 -#: ../flask_admin/contrib/sqla/view.py:1149 +#: ../flask_admin/contrib/fileadmin/__init__.py:1202 +#: ../flask_admin/contrib/peewee/view.py:510 +#: ../flask_admin/contrib/pymongo/view.py:385 +#: ../flask_admin/contrib/sqla/view.py:1241 msgid "Delete" msgstr "Elimina" -#: ../flask_admin/contrib/fileadmin/__init__.py:1164 +#: ../flask_admin/contrib/fileadmin/__init__.py:1203 msgid "Are you sure you want to delete these files?" msgstr "Sei sicuro di voler eliminare questi file?" -#: ../flask_admin/contrib/fileadmin/__init__.py:1167 +#: ../flask_admin/contrib/fileadmin/__init__.py:1206 msgid "File deletion is disabled." msgstr "La cancellazione del file è disattivata." -#: ../flask_admin/contrib/fileadmin/__init__.py:1180 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:22 +#: ../flask_admin/contrib/fileadmin/__init__.py:1219 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:22 msgid "Edit" msgstr "Modifica" -#: ../flask_admin/contrib/fileadmin/s3.py:153 +#: ../flask_admin/contrib/fileadmin/s3.py:162 msgid "Cannot operate on non empty directories" msgstr "Non può funzionare in directory non vuote" #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 -#: ../flask_admin/contrib/sqla/filters.py:41 +#: ../flask_admin/contrib/sqla/filters.py:42 msgid "equals" msgstr "uguale" #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 -#: ../flask_admin/contrib/sqla/filters.py:49 +#: ../flask_admin/contrib/sqla/filters.py:50 msgid "not equal" msgstr "differente" #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 -#: ../flask_admin/contrib/sqla/filters.py:58 +#: ../flask_admin/contrib/sqla/filters.py:59 msgid "contains" msgstr "contiene" #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 -#: ../flask_admin/contrib/sqla/filters.py:67 +#: ../flask_admin/contrib/sqla/filters.py:68 msgid "not contains" msgstr "non contiene" #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 -#: ../flask_admin/contrib/sqla/filters.py:75 +#: ../flask_admin/contrib/sqla/filters.py:76 msgid "greater than" msgstr "piú grande di" #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 -#: ../flask_admin/contrib/sqla/filters.py:83 +#: ../flask_admin/contrib/sqla/filters.py:84 msgid "smaller than" msgstr "piú piccolo di" #: ../flask_admin/contrib/peewee/filters.py:88 -#: ../flask_admin/contrib/sqla/filters.py:94 +#: ../flask_admin/contrib/sqla/filters.py:95 msgid "empty" msgstr "vuoto" #: ../flask_admin/contrib/peewee/filters.py:102 -#: ../flask_admin/contrib/sqla/filters.py:108 +#: ../flask_admin/contrib/sqla/filters.py:109 msgid "in list" msgstr "nell'elenco" #: ../flask_admin/contrib/peewee/filters.py:111 -#: ../flask_admin/contrib/sqla/filters.py:118 +#: ../flask_admin/contrib/sqla/filters.py:119 msgid "not in list" msgstr "non in elenco" @@ -282,84 +271,85 @@ msgstr "non in elenco" msgid "not between" msgstr "non tra" -msgid "ObjectId equals" -msgstr "ObjectId uguale" - -#, python-format -msgid "Failed to get model. %(error)s" -msgstr "Impossibile ottenere il modello. %(error)s" - -#: ../flask_admin/contrib/peewee/view.py:435 -#: ../flask_admin/contrib/pymongo/view.py:316 -#: ../flask_admin/contrib/sqla/view.py:1078 +#: ../flask_admin/contrib/peewee/view.py:458 +#: ../flask_admin/contrib/pymongo/view.py:317 +#: ../flask_admin/contrib/sqla/view.py:1170 #, python-format msgid "Failed to create record. %(error)s" msgstr "Impossibile creare il record. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:454 -#: ../flask_admin/contrib/pymongo/view.py:341 -#: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 -#: ../flask_admin/model/base.py:2313 ../flask_admin/model/base.py:2315 +#: ../flask_admin/contrib/peewee/view.py:477 +#: ../flask_admin/contrib/pymongo/view.py:342 +#: ../flask_admin/contrib/sqla/view.py:1196 ../flask_admin/model/base.py:2463 +#: ../flask_admin/model/base.py:2471 ../flask_admin/model/base.py:2473 #, python-format msgid "Failed to update record. %(error)s" msgstr "Impossibile aggiornare il record. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:469 -#: ../flask_admin/contrib/pymongo/view.py:366 -#: ../flask_admin/contrib/sqla/view.py:1129 +#: ../flask_admin/contrib/peewee/view.py:492 +#: ../flask_admin/contrib/pymongo/view.py:367 +#: ../flask_admin/contrib/sqla/view.py:1221 #, python-format msgid "Failed to delete record. %(error)s" msgstr "Impossibile eliminare il record: %(error)s" -#: ../flask_admin/contrib/peewee/view.py:488 -#: ../flask_admin/contrib/pymongo/view.py:385 -#: ../flask_admin/contrib/sqla/view.py:1150 +#: ../flask_admin/contrib/peewee/view.py:511 +#: ../flask_admin/contrib/pymongo/view.py:386 +#: ../flask_admin/contrib/sqla/view.py:1242 msgid "Are you sure you want to delete selected records?" msgstr "Sei sicuro di voler eliminare i record selezionati?" -#: ../flask_admin/contrib/peewee/view.py:505 -#: ../flask_admin/contrib/pymongo/view.py:395 -#: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 +#: ../flask_admin/contrib/peewee/view.py:528 +#: ../flask_admin/contrib/pymongo/view.py:396 +#: ../flask_admin/contrib/sqla/view.py:1258 ../flask_admin/model/base.py:2272 #, python-format msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." msgstr[0] "Il record é stato eliminato con successo." msgstr[1] "%(count)s records eliminati con successo." -#: ../flask_admin/contrib/peewee/view.py:511 -#: ../flask_admin/contrib/pymongo/view.py:400 -#: ../flask_admin/contrib/sqla/view.py:1174 +#: ../flask_admin/contrib/peewee/view.py:534 +#: ../flask_admin/contrib/pymongo/view.py:401 +#: ../flask_admin/contrib/sqla/view.py:1266 #, python-format msgid "Failed to delete records. %(error)s" msgstr "Impossibile eliminare le righe: %(error)s" -#: ../flask_admin/contrib/sqla/fields.py:126 -#: ../flask_admin/contrib/sqla/fields.py:176 -#: ../flask_admin/contrib/sqla/fields.py:181 ../flask_admin/model/fields.py:173 -#: ../flask_admin/model/fields.py:222 +#: ../flask_admin/contrib/sqla/fields.py:117 +#: ../flask_admin/contrib/sqla/fields.py:167 +#: ../flask_admin/contrib/sqla/fields.py:172 ../flask_admin/model/fields.py:174 +#: ../flask_admin/model/fields.py:223 msgid "Not a valid choice" msgstr "Scelta non valida" -#: ../flask_admin/contrib/sqla/fields.py:186 +#: ../flask_admin/contrib/sqla/fields.py:201 msgid "Key" msgstr "Chiave" -#: ../flask_admin/contrib/sqla/fields.py:187 +#: ../flask_admin/contrib/sqla/fields.py:202 msgid "Value" msgstr "Valore" -#: ../flask_admin/contrib/sqla/validators.py:42 +#: ../flask_admin/contrib/sqla/validators.py:28 msgid "Already exists." msgstr "Esiste già." -#: ../flask_admin/contrib/sqla/validators.py:60 +#: ../flask_admin/contrib/sqla/validators.py:59 #, python-format msgid "At least %(num)d item is required" msgid_plural "At least %(num)d items are required" msgstr[0] "È necessario almeno %(num)d elemento" msgstr[1] "Sono necessari almeno %(num)d elementi" -#: ../flask_admin/contrib/sqla/view.py:1057 +#: ../flask_admin/contrib/sqla/validators.py:75 +msgid "Not a valid ISO currency code (e.g. USD, EUR, CNY)." +msgstr "" + +#: ../flask_admin/contrib/sqla/validators.py:83 +msgid "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." +msgstr "" + +#: ../flask_admin/contrib/sqla/view.py:1134 #, python-format msgid "Integrity error. %(message)s" msgstr "Errore di integrità. %(message)s" @@ -368,274 +358,242 @@ msgstr "Errore di integrità. %(message)s" msgid "Invalid time format" msgstr "Formato orario non valido" -#: ../flask_admin/form/fields.py:144 +#: ../flask_admin/form/fields.py:147 msgid "Invalid Choice: could not coerce" msgstr "Scelta non valida: impossibile forzare" -#: ../flask_admin/form/fields.py:208 +#: ../flask_admin/form/fields.py:221 msgid "Invalid JSON" msgstr "JSON non valido" -#: ../flask_admin/form/upload.py:207 +#: ../flask_admin/form/upload.py:216 msgid "Invalid file extension" msgstr "Estensione del file non valida" -#: ../flask_admin/form/upload.py:214 ../flask_admin/form/upload.py:281 +#: ../flask_admin/form/upload.py:223 ../flask_admin/form/upload.py:293 #, python-format msgid "File \"%s\" already exists." msgstr "Il file \"%s\" esiste giá." -#: ../flask_admin/model/base.py:1649 +#: ../flask_admin/form/validators.py:16 +msgid "This field requires at least one item." +msgstr "" + +#: ../flask_admin/model/base.py:1737 msgid "There are no items in the table." msgstr "Non ci sono elementi nella tabella." -#: ../flask_admin/model/base.py:1673 +#: ../flask_admin/model/base.py:1746 #, python-format msgid "Invalid Filter Value: %(value)s" msgstr "Valore del filtro non valido: %(value)s" -#: ../flask_admin/model/base.py:1984 +#: ../flask_admin/model/base.py:2136 msgid "Record was successfully created." msgstr "Riga aggiunta con successo." -#: ../flask_admin/model/base.py:2028 ../flask_admin/model/base.py:2080 -#: ../flask_admin/model/base.py:2113 ../flask_admin/model/base.py:2297 +#: ../flask_admin/model/base.py:2180 ../flask_admin/model/base.py:2232 +#: ../flask_admin/model/base.py:2265 ../flask_admin/model/base.py:2455 msgid "Record does not exist." msgstr "La riga non esiste." -#: ../flask_admin/model/base.py:2037 ../flask_admin/model/base.py:2301 +#: ../flask_admin/model/base.py:2189 ../flask_admin/model/base.py:2459 msgid "Record was successfully saved." msgstr "Record stato salvato con successo." -#: ../flask_admin/model/base.py:2222 -msgid "Tablib dependency not installed." -msgstr "Dipendenza Tablib non installata." - -#: ../flask_admin/model/base.py:2249 +#: ../flask_admin/model/base.py:2407 #, python-format msgid "Export type \"%(type)s not supported." msgstr "Esportazione tipo \"%(type)s non supportata." -#: ../flask_admin/model/filters.py:103 ../flask_admin/model/widgets.py:111 +#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:119 msgid "Yes" msgstr "Si" -#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:110 +#: ../flask_admin/model/filters.py:105 ../flask_admin/model/widgets.py:118 msgid "No" msgstr "No" -#: ../flask_admin/model/filters.py:172 ../flask_admin/model/filters.py:212 -#: ../flask_admin/model/filters.py:257 +#: ../flask_admin/model/filters.py:173 ../flask_admin/model/filters.py:213 +#: ../flask_admin/model/filters.py:258 msgid "between" msgstr "tra" -#: ../flask_admin/model/template.py:81 ../flask_admin/model/template.py:88 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:37 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:8 +#: ../flask_admin/model/template.py:83 ../flask_admin/model/template.py:90 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:7 msgid "View Record" msgstr "Visualizza riga" -#: ../flask_admin/model/template.py:95 ../flask_admin/model/template.py:102 -#: ../flask_admin/model/template.py:109 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/edit.html:11 +#: ../flask_admin/model/template.py:97 ../flask_admin/model/template.py:104 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/edit.html:10 msgid "Edit Record" msgstr "Modifica riga" -#: ../flask_admin/model/widgets.py:61 +#: ../flask_admin/model/template.py:111 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Delete Record" +msgstr "" + +#: ../flask_admin/model/widgets.py:62 msgid "Please select model" msgstr "Selezionare un modello" -#: ../flask_admin/templates/bootstrap2/admin/actions.html:4 -#: ../flask_admin/templates/bootstrap3/admin/actions.html:4 +#: ../flask_admin/templates/bootstrap4/admin/actions.html:5 msgid "With selected" msgstr "Con la selezione" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:200 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:190 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:216 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:227 msgid "Save" msgstr "Salva" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:205 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:195 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:221 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:232 msgid "Cancel" msgstr "Annulla" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:256 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:247 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:290 msgid "Save and Add Another" msgstr "Salva e aggiungi un altro" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:259 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:250 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:293 msgid "Save and Continue Editing" msgstr "Salva e continua a modificare" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:9 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:9 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:10 msgid "Root" msgstr "Categoria principale" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:90 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:99 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:89 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:98 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:42 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:51 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:89 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:98 #, python-format msgid "Sort by %(name)s" msgstr "Ordina per %(name)s" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:77 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:79 msgid "Rename File" msgstr "Rinomina File" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:88 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:88 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:90 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\' recursively?" msgstr "Sei sicuro di voler elminare \\'%(name)s\\' ricorsivamente?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:97 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:97 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:99 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\'?" msgstr "Sei sicuro di voler elminare \\'%(name)s\\'?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:125 -msgid "Size" -msgstr "" - -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:185 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:187 msgid "Please select at least one file." msgstr "Selezionare almeno un file." -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:8 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:17 msgid "List" msgstr "Elenco" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:12 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:18 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 msgid "Create" msgstr "Crea" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:26 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:26 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:21 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:26 msgid "Details" msgstr "Dettagli" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:29 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:28 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:15 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:28 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:15 msgid "Filter" msgstr "Filtra" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:13 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:14 msgid "Delete?" msgstr "Eliminare?" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:33 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:16 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:35 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Are you sure you want to delete this record?" +msgstr "Sei sicuro di voler eliminare questo record?" + +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:33 msgid "New" msgstr "Nuovo" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:43 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:43 msgid "Add" msgstr "Aggiungi" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:3 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:3 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:2 msgid "Add Filter" msgstr "Aggiungi filtro" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:30 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:19 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:26 msgid "Export" msgstr "Esporta" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:38 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:38 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:49 msgid "Apply" msgstr "Applica" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:40 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:51 msgid "Reset Filters" msgstr "Reimposta filtri" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:66 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:64 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:80 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:93 +#, python-format +msgid "%(placeholder)s" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:88 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:94 msgid "Search" msgstr "Cerca" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:74 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:77 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:78 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:79 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:72 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:75 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:76 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:77 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:102 msgid "items" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/create.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/create.html:10 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/create.html:10 msgid "Create New Record" msgstr "Aggiungi nuova riga" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:76 msgid "Select all records" msgstr "Seleziona tutti i record" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:120 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:119 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:119 msgid "Select record" msgstr "Seleziona riga" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:186 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:195 msgid "Please select at least one record." msgstr "Selezionare almeno un record." -#: ../flask_admin/templates/bootstrap2/admin/model/row_actions.html:34 -#: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 -msgid "Are you sure you want to delete this record?" -msgstr "Sei sicuro di voler eliminare questo record?" +#~ msgid "ObjectId equals" +#~ msgstr "ObjectId uguale" + +#~ msgid "Failed to get model. %(error)s" +#~ msgstr "Impossibile ottenere il modello. %(error)s" + +#~ msgid "Tablib dependency not installed." +#~ msgstr "Dipendenza Tablib non installata." + +#~ msgid "Size" +#~ msgstr "" + diff --git a/flask_admin/translations/ja/LC_MESSAGES/admin.mo b/flask_admin/translations/ja/LC_MESSAGES/admin.mo index a0b58b3745e892f1931eeb219b9e2ca8d0f683d2..0387b3dd83cd195bd65bb49eb8992183934a67d1 100644 GIT binary patch delta 1860 zcmYM!e@N7K9LMp`%~N+d({s~mXWgwIO6k>kT{%1Zfh1c|VKmro82Lxcxf&7ZV2p9H zAH;si*mrH5OUnQHK_uM58Z04VL$XzWEQ-Vu`UP&~+#exZvFFQs!w%2K_x=8SzVGkn z*Z2CGj;&9RmH7`kK7069^6ku1^#5n1z&WKZ;Vit0B{+)t_y;!N6h^VO(78H%6KnBH z^DH(K-$S~(+Gm|BcP{N#a#2lUles_F;4(;GcM5gGAeQ1e4B}<WkE8lMKnl7^iwgqI zEhnChVO(qOL_hI|Sj6+)M_j0I56;2E_!17H9()5A<854m`7FaitU<-wP!H&|{I|G> zco0K)6BpoPYp*EE^>4tXJm00bn1>(Zi`a*=@r?N^s?asmfTmD0m_}{cQ;cBfxm@8! z<j=M8uL3);47)Aw;q$~tFs;4)kqZ?(WB!cFpT}qL7gT{^d;v!-{tF|-{^Hz<EI~c+ zRaAZ#ZpCiY3jBsTJAWc$c29~~f9+X->5_9{)Ig$U9QD9@)Cz4ut-xET0lka5uN!B! z5TnG0u?8=pwsIOH7~<)**oYcHM+xh%Q`}{V4^RaUpjO}@>TqR{bLIL`{g0ytGJq_C z8$|WHfGRv<`RmBBad$2M$nyW-0UtHf3|oc1=19-Q@67>Jei*ml6-?rMrrm@o^AI)? z-@=tx$;MLKwV)1d8#d#osFk^hI<(WM`spz1tBWesA&a8+YLn&PHuqWkdlr9#8|jz9 zWjJOA*iY3<ptd$?Zb$u2w4)}_kMv8sJ6vdn6Q~)!%n4eJov8Q(Ch)%HD|tuNz5`d_ z=eP=gvizjQ)hy>a@;g!e4xt7*f-|opF4p^B!O4ozkVNhAUeum-p$eyQDW1kEyoH=6 zSHQcfLgiSE38bcLHM>w}p$D}hy=K386a#wyPjSKI-C0z@%cz16QA<_9zHGo0YEOGn z10KRPIB9VWKL)z56*Z7gQ2qN*b<d+FHjWz51g6z6WgUX^a}6=nYg3OJSPIo|A8J57 zsFk^j^;k%wmUcb9hVP*6A41Np8%Ndo8};BoIA>|ty*~4r&9OuX_1Y~&jkF4Nnq%e$ zvjsK7HjCdkKQlAo?6Sg;KfAl=vCrF6yf-^h{EE-3FZs&5TQcDNQ2Jdko`}X8qVYr| z9$yn{sEO5iO~LlOU7K6HW5J{^>D>wL_t&jn9?QN__HTani@D8t-tExE>`>+JJ}<N2 OO7>(p=<_Z_QvU%X{Ka|z delta 2164 zcmZwIeN5F=9LMp)bD(%Hn%)5MUc;gkR74<^A({`g*<htxGjrqNr$a9oyNKzQmwQ?3 zK?&ziG-b4MZpKVjVa>E~)Bdt2T~;n<bNx_rJ#TH*dZ72Gd$#^4cH#B=p5OVM^F7~l zewV?;152Y{PE74H{Iv5smER*NivIm6&M-zzC76Y!=))>Z!&SHdAHovcjiq=Bi}71) z?rp{_CtiW+>W7n!i5i!SA{qv*7ZW$kZ^*O8mzj7VfPUg>n1gd{`w~>YT4X>|Z{rO( zo45^wIADDjQ;DzQIOaEBaiM{~#{iDubPTXuWx4=oU=7}d4&I5oY&?XT;F4|s84HO6 z<46`4VLq<4aVP5eJ`6IyImyMnco}msdAu=sI29*grF8{rpf#w(+EFWc0=0EdVh9hR z5;~21%oYAj!LM;5j@kB!+0=g$4M8rn$7QGiE3H+weF-Mhz8p0`E$R$Binrrt+unsC zVi&c-6R7b&M<wu$y`Rjg9waWDK>bysb{aI`9;687CDdNNiacY^q7u7c{S-Cv7pRK; zfT~C)gD62i>bXMHbET*)uD}vpiL-F4kNRt`U#201=d7bxOq|A3N@yPHv{&1B8ES%h zROQyA4q+p5Zp|iC{|G9v?MT&47ph;6z26t*LKF1c4o8vmXHMAm5!-$q<4KefHQ-v7 zc?ULFcc9u`T!n{l5#Ge5Sjaxe4OoSPSccIXT(DS^M?GiYOw@Z?hbmPc>eQb@O>oQl zBkC~zg4)7K?3eD(vo1j0ud(quTt?i4Gx3##QS*uI@E7tiX`B?9kNRRMMP<GjHNg;S zg>Rx(n9Ms{fz_yZE6&H)ZTk&t0p(J^)i?)tVY%M_)Aq(s|1=nL4=1Xc4(m}J2T&P* zh+65ds7eKRN9SS{YR_9yTi1!@*oAtn-@?1`8gfoe24&GWQ?N+ye>oS-Z633BqRvDw zYQ_E5!`4C6M6aPLbqckG7f=IV!y+6*Rj!CHhZ@|3?6x_ETEH2MY6YWQEX2tLi51nO z28f{&8$>;D7B#_5R08P)O3;sL4_GT~`x?~SwGNf&PE5sp$j2O<M*WrHNg|c(cdW!x zzP|3q7F6kv<7&K&8n7gk_#aS*8n^+K$TsUv)NA>aji0sg9#rD{P!)SIbYJ3Phz7l{ zBlgC7sFh!`@pslgt=ZFu&!^|7W^QykLakexo$&C-S=q_Hy2edTQ^y0%A*X$7Lpb7I z8Q(goKI}9^oKVCGbIW#KnO&Qd(z3&GdnWV-8ydqcjiF}eai^`>X=~aZYTMEgYH5pf zG=#%W^K3WI_eNSvhtnEy-}fDGpYvyB%w1SoSu(f6jrcdZSN)6J+?@85vf1;8pU?Rt zZHCu<*z11U>ptei_g?Sae|_YD7dz_3dc4?(7wh-pF5&RDz#}RD$@ZhX5B@jXgZZB& zr9P~5+X^nuTAj$(iw%vA3|v3{!ma&>N6*B)*lsU=#OogR;%|H1&v@PMkbxVVk~_S3 MT27M9zb?4;Z?S7BD*ylh diff --git a/flask_admin/translations/ja/LC_MESSAGES/admin.po b/flask_admin/translations/ja/LC_MESSAGES/admin.po index 932a747d4..0acdac536 100644 --- a/flask_admin/translations/ja/LC_MESSAGES/admin.po +++ b/flask_admin/translations/ja/LC_MESSAGES/admin.po @@ -1,275 +1,264 @@ + msgid "" msgstr "" -"Project-Id-Version: flask-admin\n" +"Project-Id-Version: flask-admin\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-02-07 00:17-0600\n" +"POT-Creation-Date: 2024-09-24 22:09+0100\n" "PO-Revision-Date: 2017-02-07 01:19-0500\n" "Last-Translator: mrjoes <serge.koval@gmail.com>\n" +"Language: ja_JP\n" "Language-Team: Japanese\n" +"Plural-Forms: nplurals=1; plural=0;\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.1.1\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: flask-admin\n" -"X-Crowdin-Language: ja\n" -"X-Crowdin-File: admin.pot\n" -"Language: ja_JP\n" +"Generated-By: Babel 2.16.0\n" -#: ../flask_admin/base.py:440 +#: ../flask_admin/base.py:458 msgid "Home" msgstr "ホーム" -#: ../flask_admin/contrib/rediscli.py:127 +#: ../flask_admin/contrib/rediscli.py:113 msgid "Cli: Invalid command." msgstr "Cli: コマンドが無効です。" -#: ../flask_admin/contrib/fileadmin/__init__.py:352 +#: ../flask_admin/contrib/fileadmin/__init__.py:376 msgid "File to upload" msgstr "アップロードするファイル" -#: ../flask_admin/contrib/fileadmin/__init__.py:360 +#: ../flask_admin/contrib/fileadmin/__init__.py:384 msgid "File required." msgstr "ファイルが必要です。" -#: ../flask_admin/contrib/fileadmin/__init__.py:365 +#: ../flask_admin/contrib/fileadmin/__init__.py:389 msgid "Invalid file type." msgstr "ファイルの種類が無効です。" -#: ../flask_admin/contrib/fileadmin/__init__.py:376 +#: ../flask_admin/contrib/fileadmin/__init__.py:400 msgid "Content" msgstr "内容" -#: ../flask_admin/contrib/fileadmin/__init__.py:390 +#: ../flask_admin/contrib/fileadmin/__init__.py:414 msgid "Invalid name" msgstr "名前が無効です。" -#: ../flask_admin/contrib/fileadmin/__init__.py:398 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:106 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:112 -#: ../flask_admin/tests/sqla/test_translation.py:17 +#: ../flask_admin/contrib/fileadmin/__init__.py:422 +#: ../flask_admin/tests/sqla/test_translation.py:21 msgid "Name" msgstr "名前" -#: ../flask_admin/contrib/fileadmin/__init__.py:757 +#: ../flask_admin/contrib/fileadmin/__init__.py:784 #, python-format msgid "File \"%(name)s\" already exists." msgstr "ファイル「%(name)s」は既に存在します。" -#: ../flask_admin/contrib/fileadmin/__init__.py:802 -#: ../flask_admin/contrib/fileadmin/__init__.py:885 -#: ../flask_admin/contrib/fileadmin/__init__.py:947 -#: ../flask_admin/contrib/fileadmin/__init__.py:1000 -#: ../flask_admin/contrib/fileadmin/__init__.py:1047 -#: ../flask_admin/contrib/fileadmin/__init__.py:1099 -#: ../flask_admin/model/base.py:2168 +#: ../flask_admin/contrib/fileadmin/__init__.py:829 +#: ../flask_admin/contrib/fileadmin/__init__.py:926 +#: ../flask_admin/contrib/fileadmin/__init__.py:988 +#: ../flask_admin/contrib/fileadmin/__init__.py:1041 +#: ../flask_admin/contrib/fileadmin/__init__.py:1088 +#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/model/base.py:2324 msgid "Permission denied." msgstr "アクセスが拒否されました。" -#: ../flask_admin/contrib/fileadmin/__init__.py:881 +#: ../flask_admin/contrib/fileadmin/__init__.py:922 msgid "File uploading is disabled." msgstr "ファイルのアップロードは無効です" -#: ../flask_admin/contrib/fileadmin/__init__.py:892 +#: ../flask_admin/contrib/fileadmin/__init__.py:933 #, python-format msgid "Successfully saved file: %(name)s" msgstr "ファイルが正常に保存されました: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:896 +#: ../flask_admin/contrib/fileadmin/__init__.py:937 #, python-format msgid "Failed to save file: %(error)s" msgstr "ファイルの保存に失敗しました: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:904 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:150 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:150 +#: ../flask_admin/contrib/fileadmin/__init__.py:945 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:150 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:152 msgid "Upload File" msgstr "ファイルのアップロード" -#: ../flask_admin/contrib/fileadmin/__init__.py:943 +#: ../flask_admin/contrib/fileadmin/__init__.py:984 msgid "Directory creation is disabled." msgstr "ディレクトリの作成は無効です" -#: ../flask_admin/contrib/fileadmin/__init__.py:956 +#: ../flask_admin/contrib/fileadmin/__init__.py:997 #, python-format msgid "Successfully created directory: %(directory)s" msgstr "ディレクトリが正常に作成されました: %(directory)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:960 +#: ../flask_admin/contrib/fileadmin/__init__.py:1001 #, python-format msgid "Failed to create directory: %(error)s" msgstr "ディレクトリの作成に失敗しました: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:970 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:161 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:161 +#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:161 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:163 msgid "Create Directory" msgstr "ディレクトリを作成" -#: ../flask_admin/contrib/fileadmin/__init__.py:996 +#: ../flask_admin/contrib/fileadmin/__init__.py:1037 msgid "Deletion is disabled." msgstr "削除はできません。" -#: ../flask_admin/contrib/fileadmin/__init__.py:1005 +#: ../flask_admin/contrib/fileadmin/__init__.py:1046 msgid "Directory deletion is disabled." msgstr "ディレクトリの削除は無効です" -#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/contrib/fileadmin/__init__.py:1052 #, python-format msgid "Directory \"%(path)s\" was successfully deleted." msgstr "ディレクトリ「%(path)s」が正常に削除されました。" -#: ../flask_admin/contrib/fileadmin/__init__.py:1013 +#: ../flask_admin/contrib/fileadmin/__init__.py:1054 #, python-format msgid "Failed to delete directory: %(error)s" msgstr "ディレクトリの削除に失敗しました: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1019 -#: ../flask_admin/contrib/fileadmin/__init__.py:1176 +#: ../flask_admin/contrib/fileadmin/__init__.py:1060 +#: ../flask_admin/contrib/fileadmin/__init__.py:1215 #, python-format msgid "File \"%(name)s\" was successfully deleted." msgstr "ファイル「%(name)s」が正常に削除されました。" -#: ../flask_admin/contrib/fileadmin/__init__.py:1021 -#: ../flask_admin/contrib/fileadmin/__init__.py:1178 +#: ../flask_admin/contrib/fileadmin/__init__.py:1062 +#: ../flask_admin/contrib/fileadmin/__init__.py:1217 #, python-format msgid "Failed to delete file: %(name)s" msgstr "ファイルの削除に失敗しました: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1043 +#: ../flask_admin/contrib/fileadmin/__init__.py:1084 msgid "Renaming is disabled." msgstr "名前の変更はできません。" -#: ../flask_admin/contrib/fileadmin/__init__.py:1051 +#: ../flask_admin/contrib/fileadmin/__init__.py:1092 msgid "Path does not exist." msgstr "パスは存在しません。" -#: ../flask_admin/contrib/fileadmin/__init__.py:1061 +#: ../flask_admin/contrib/fileadmin/__init__.py:1102 #, python-format msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\"" msgstr "「%(src)s」を「%(dst)s」に変更しました。" -#: ../flask_admin/contrib/fileadmin/__init__.py:1064 +#: ../flask_admin/contrib/fileadmin/__init__.py:1105 #, python-format msgid "Failed to rename: %(error)s" msgstr "名前の変更に失敗しました: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1078 +#: ../flask_admin/contrib/fileadmin/__init__.py:1119 #, python-format msgid "Rename %(name)s" msgstr "%(name)s の名前を変更します。" -#: ../flask_admin/contrib/fileadmin/__init__.py:1115 +#: ../flask_admin/contrib/fileadmin/__init__.py:1155 #, python-format msgid "Error saving changes to %(name)s." msgstr "%(name)s の変更を保存中にエラーが発生しました。" -#: ../flask_admin/contrib/fileadmin/__init__.py:1119 +#: ../flask_admin/contrib/fileadmin/__init__.py:1159 #, python-format msgid "Changes to %(name)s saved successfully." msgstr "%(name)s への変更に成功しました。" -#: ../flask_admin/contrib/fileadmin/__init__.py:1128 +#: ../flask_admin/contrib/fileadmin/__init__.py:1167 #, python-format msgid "Error reading %(name)s." msgstr "%(name)s を読込中にエラーが発生しました。" -#: ../flask_admin/contrib/fileadmin/__init__.py:1131 -#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/contrib/fileadmin/__init__.py:1170 +#: ../flask_admin/contrib/fileadmin/__init__.py:1179 #, python-format msgid "Unexpected error while reading from %(name)s" msgstr "%(name)s からの読み取り中に予期しないエラーが発生しました。" -#: ../flask_admin/contrib/fileadmin/__init__.py:1137 +#: ../flask_admin/contrib/fileadmin/__init__.py:1176 #, python-format msgid "Cannot edit %(name)s." msgstr "%(name)s が編集できません。" -#: ../flask_admin/contrib/fileadmin/__init__.py:1155 +#: ../flask_admin/contrib/fileadmin/__init__.py:1194 #, python-format msgid "Editing %(path)s" msgstr "%(path)s を編集中" -#: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/peewee/view.py:487 -#: ../flask_admin/contrib/pymongo/view.py:384 -#: ../flask_admin/contrib/sqla/view.py:1149 +#: ../flask_admin/contrib/fileadmin/__init__.py:1202 +#: ../flask_admin/contrib/peewee/view.py:510 +#: ../flask_admin/contrib/pymongo/view.py:385 +#: ../flask_admin/contrib/sqla/view.py:1241 msgid "Delete" msgstr "削除" -#: ../flask_admin/contrib/fileadmin/__init__.py:1164 +#: ../flask_admin/contrib/fileadmin/__init__.py:1203 msgid "Are you sure you want to delete these files?" msgstr "これらのファイルを削除してもよろしいですか。" -#: ../flask_admin/contrib/fileadmin/__init__.py:1167 +#: ../flask_admin/contrib/fileadmin/__init__.py:1206 msgid "File deletion is disabled." msgstr "ファイルの削除は出来ません。" -#: ../flask_admin/contrib/fileadmin/__init__.py:1180 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:22 +#: ../flask_admin/contrib/fileadmin/__init__.py:1219 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:22 msgid "Edit" msgstr "編集" -#: ../flask_admin/contrib/fileadmin/s3.py:153 +#: ../flask_admin/contrib/fileadmin/s3.py:162 msgid "Cannot operate on non empty directories" msgstr "ディレクトリがからではないため、操作できません" #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 -#: ../flask_admin/contrib/sqla/filters.py:41 +#: ../flask_admin/contrib/sqla/filters.py:42 msgid "equals" msgstr "等しい" #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 -#: ../flask_admin/contrib/sqla/filters.py:49 +#: ../flask_admin/contrib/sqla/filters.py:50 msgid "not equal" msgstr "等しくない" #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 -#: ../flask_admin/contrib/sqla/filters.py:58 +#: ../flask_admin/contrib/sqla/filters.py:59 msgid "contains" msgstr "含む" #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 -#: ../flask_admin/contrib/sqla/filters.py:67 +#: ../flask_admin/contrib/sqla/filters.py:68 msgid "not contains" msgstr "含まれていません" #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 -#: ../flask_admin/contrib/sqla/filters.py:75 +#: ../flask_admin/contrib/sqla/filters.py:76 msgid "greater than" msgstr "より大きい" #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 -#: ../flask_admin/contrib/sqla/filters.py:83 +#: ../flask_admin/contrib/sqla/filters.py:84 msgid "smaller than" msgstr "より小さい" #: ../flask_admin/contrib/peewee/filters.py:88 -#: ../flask_admin/contrib/sqla/filters.py:94 +#: ../flask_admin/contrib/sqla/filters.py:95 msgid "empty" msgstr "空" #: ../flask_admin/contrib/peewee/filters.py:102 -#: ../flask_admin/contrib/sqla/filters.py:108 +#: ../flask_admin/contrib/sqla/filters.py:109 msgid "in list" msgstr "一覧にある" #: ../flask_admin/contrib/peewee/filters.py:111 -#: ../flask_admin/contrib/sqla/filters.py:118 +#: ../flask_admin/contrib/sqla/filters.py:119 msgid "not in list" msgstr "一覧にない" @@ -282,82 +271,83 @@ msgstr "一覧にない" msgid "not between" msgstr "間ではなく" -msgid "ObjectId equals" -msgstr "" - -#, python-format -msgid "Failed to get model. %(error)s" -msgstr "モデルを取得できませんでした。%(error)s" - -#: ../flask_admin/contrib/peewee/view.py:435 -#: ../flask_admin/contrib/pymongo/view.py:316 -#: ../flask_admin/contrib/sqla/view.py:1078 +#: ../flask_admin/contrib/peewee/view.py:458 +#: ../flask_admin/contrib/pymongo/view.py:317 +#: ../flask_admin/contrib/sqla/view.py:1170 #, python-format msgid "Failed to create record. %(error)s" msgstr "レコードの作成に失敗しました。%(error)s" -#: ../flask_admin/contrib/peewee/view.py:454 -#: ../flask_admin/contrib/pymongo/view.py:341 -#: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 -#: ../flask_admin/model/base.py:2313 ../flask_admin/model/base.py:2315 +#: ../flask_admin/contrib/peewee/view.py:477 +#: ../flask_admin/contrib/pymongo/view.py:342 +#: ../flask_admin/contrib/sqla/view.py:1196 ../flask_admin/model/base.py:2463 +#: ../flask_admin/model/base.py:2471 ../flask_admin/model/base.py:2473 #, python-format msgid "Failed to update record. %(error)s" msgstr "レコードの更新に失敗しました。%(error)s" -#: ../flask_admin/contrib/peewee/view.py:469 -#: ../flask_admin/contrib/pymongo/view.py:366 -#: ../flask_admin/contrib/sqla/view.py:1129 +#: ../flask_admin/contrib/peewee/view.py:492 +#: ../flask_admin/contrib/pymongo/view.py:367 +#: ../flask_admin/contrib/sqla/view.py:1221 #, python-format msgid "Failed to delete record. %(error)s" msgstr "レコードの削除に失敗しました。%(error)s" -#: ../flask_admin/contrib/peewee/view.py:488 -#: ../flask_admin/contrib/pymongo/view.py:385 -#: ../flask_admin/contrib/sqla/view.py:1150 +#: ../flask_admin/contrib/peewee/view.py:511 +#: ../flask_admin/contrib/pymongo/view.py:386 +#: ../flask_admin/contrib/sqla/view.py:1242 msgid "Are you sure you want to delete selected records?" msgstr "選択したレコードを削除してもよろしいですか。" -#: ../flask_admin/contrib/peewee/view.py:505 -#: ../flask_admin/contrib/pymongo/view.py:395 -#: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 +#: ../flask_admin/contrib/peewee/view.py:528 +#: ../flask_admin/contrib/pymongo/view.py:396 +#: ../flask_admin/contrib/sqla/view.py:1258 ../flask_admin/model/base.py:2272 #, python-format msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." msgstr[0] "%(count)s レコードが正常に削除されました。" -#: ../flask_admin/contrib/peewee/view.py:511 -#: ../flask_admin/contrib/pymongo/view.py:400 -#: ../flask_admin/contrib/sqla/view.py:1174 +#: ../flask_admin/contrib/peewee/view.py:534 +#: ../flask_admin/contrib/pymongo/view.py:401 +#: ../flask_admin/contrib/sqla/view.py:1266 #, python-format msgid "Failed to delete records. %(error)s" msgstr "レコードの削除に失敗しました。%(error)s" -#: ../flask_admin/contrib/sqla/fields.py:126 -#: ../flask_admin/contrib/sqla/fields.py:176 -#: ../flask_admin/contrib/sqla/fields.py:181 ../flask_admin/model/fields.py:173 -#: ../flask_admin/model/fields.py:222 +#: ../flask_admin/contrib/sqla/fields.py:117 +#: ../flask_admin/contrib/sqla/fields.py:167 +#: ../flask_admin/contrib/sqla/fields.py:172 ../flask_admin/model/fields.py:174 +#: ../flask_admin/model/fields.py:223 msgid "Not a valid choice" msgstr "選択が無効です" -#: ../flask_admin/contrib/sqla/fields.py:186 +#: ../flask_admin/contrib/sqla/fields.py:201 msgid "Key" msgstr "鍵(キー)" -#: ../flask_admin/contrib/sqla/fields.py:187 +#: ../flask_admin/contrib/sqla/fields.py:202 msgid "Value" msgstr "値(バリュー)" -#: ../flask_admin/contrib/sqla/validators.py:42 +#: ../flask_admin/contrib/sqla/validators.py:28 msgid "Already exists." msgstr "既に存在します。" -#: ../flask_admin/contrib/sqla/validators.py:60 +#: ../flask_admin/contrib/sqla/validators.py:59 #, python-format msgid "At least %(num)d item is required" msgid_plural "At least %(num)d items are required" msgstr[0] "残り %(num)d 個のアイテムが必要です。" -#: ../flask_admin/contrib/sqla/view.py:1057 +#: ../flask_admin/contrib/sqla/validators.py:75 +msgid "Not a valid ISO currency code (e.g. USD, EUR, CNY)." +msgstr "" + +#: ../flask_admin/contrib/sqla/validators.py:83 +msgid "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." +msgstr "" + +#: ../flask_admin/contrib/sqla/view.py:1134 #, python-format msgid "Integrity error. %(message)s" msgstr "整合性エラーが発生しました。%(message)s" @@ -366,274 +356,242 @@ msgstr "整合性エラーが発生しました。%(message)s" msgid "Invalid time format" msgstr "無効な時刻の形式" -#: ../flask_admin/form/fields.py:144 +#: ../flask_admin/form/fields.py:147 msgid "Invalid Choice: could not coerce" msgstr "無効な選択: 強制できません。" -#: ../flask_admin/form/fields.py:208 +#: ../flask_admin/form/fields.py:221 msgid "Invalid JSON" msgstr "無効な JSON" -#: ../flask_admin/form/upload.py:207 +#: ../flask_admin/form/upload.py:216 msgid "Invalid file extension" msgstr "無効なファイル拡張子" -#: ../flask_admin/form/upload.py:214 ../flask_admin/form/upload.py:281 +#: ../flask_admin/form/upload.py:223 ../flask_admin/form/upload.py:293 #, python-format msgid "File \"%s\" already exists." msgstr "ファイル「%s」は既に存在します。" -#: ../flask_admin/model/base.py:1649 +#: ../flask_admin/form/validators.py:16 +msgid "This field requires at least one item." +msgstr "" + +#: ../flask_admin/model/base.py:1737 msgid "There are no items in the table." msgstr "表にはアイテムがありません。" -#: ../flask_admin/model/base.py:1673 +#: ../flask_admin/model/base.py:1746 #, python-format msgid "Invalid Filter Value: %(value)s" msgstr "無効なフィルター値: %(value)s" -#: ../flask_admin/model/base.py:1984 +#: ../flask_admin/model/base.py:2136 msgid "Record was successfully created." msgstr "レコードが正常に作成されました。" -#: ../flask_admin/model/base.py:2028 ../flask_admin/model/base.py:2080 -#: ../flask_admin/model/base.py:2113 ../flask_admin/model/base.py:2297 +#: ../flask_admin/model/base.py:2180 ../flask_admin/model/base.py:2232 +#: ../flask_admin/model/base.py:2265 ../flask_admin/model/base.py:2455 msgid "Record does not exist." msgstr "レコードが存在しません。" -#: ../flask_admin/model/base.py:2037 ../flask_admin/model/base.py:2301 +#: ../flask_admin/model/base.py:2189 ../flask_admin/model/base.py:2459 msgid "Record was successfully saved." msgstr "レコードが正常に保存されました。" -#: ../flask_admin/model/base.py:2222 -msgid "Tablib dependency not installed." -msgstr "Tablib の依存関係がインストールされていません。" - -#: ../flask_admin/model/base.py:2249 +#: ../flask_admin/model/base.py:2407 #, python-format msgid "Export type \"%(type)s not supported." msgstr "\"%(type)sエクスポートの種類 はサポートされていません。" -#: ../flask_admin/model/filters.py:103 ../flask_admin/model/widgets.py:111 +#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:119 msgid "Yes" msgstr "はい" -#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:110 +#: ../flask_admin/model/filters.py:105 ../flask_admin/model/widgets.py:118 msgid "No" msgstr "いいえ" -#: ../flask_admin/model/filters.py:172 ../flask_admin/model/filters.py:212 -#: ../flask_admin/model/filters.py:257 +#: ../flask_admin/model/filters.py:173 ../flask_admin/model/filters.py:213 +#: ../flask_admin/model/filters.py:258 msgid "between" msgstr "間" -#: ../flask_admin/model/template.py:81 ../flask_admin/model/template.py:88 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:37 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:8 +#: ../flask_admin/model/template.py:83 ../flask_admin/model/template.py:90 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:7 msgid "View Record" msgstr "レコードを見る" -#: ../flask_admin/model/template.py:95 ../flask_admin/model/template.py:102 -#: ../flask_admin/model/template.py:109 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/edit.html:11 +#: ../flask_admin/model/template.py:97 ../flask_admin/model/template.py:104 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/edit.html:10 msgid "Edit Record" msgstr "レコードを編集" -#: ../flask_admin/model/widgets.py:61 +#: ../flask_admin/model/template.py:111 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Delete Record" +msgstr "" + +#: ../flask_admin/model/widgets.py:62 msgid "Please select model" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/actions.html:4 -#: ../flask_admin/templates/bootstrap3/admin/actions.html:4 +#: ../flask_admin/templates/bootstrap4/admin/actions.html:5 msgid "With selected" msgstr "選択" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:200 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:190 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:216 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:227 msgid "Save" msgstr "保存" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:205 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:195 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:221 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:232 msgid "Cancel" msgstr "キャンセル" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:256 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:247 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:290 msgid "Save and Add Another" msgstr "保存してもう一つ追加" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:259 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:250 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:293 msgid "Save and Continue Editing" msgstr "保存して編集を続ける" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:9 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:9 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:10 msgid "Root" msgstr "ルート" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:90 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:99 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:89 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:98 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:42 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:51 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:89 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:98 #, python-format msgid "Sort by %(name)s" msgstr "%(name)s による並び替え" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:77 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:79 msgid "Rename File" msgstr "ファイル名を変更" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:88 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:88 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:90 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\' recursively?" msgstr "\\'%(name)s\\' を削除するよろしいです ' を再帰的にですか?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:97 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:97 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:99 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\'?" msgstr "\\本当に '%(name)s\\' を削除してもいいですか?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:125 -msgid "Size" -msgstr "" - -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:185 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:187 msgid "Please select at least one file." msgstr "少なくとも 1 つのファイルを選択してください。" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:8 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:17 msgid "List" msgstr "一覧" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:12 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:18 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 msgid "Create" msgstr "作成" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:26 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:26 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:21 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:26 msgid "Details" msgstr "詳細" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:29 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:28 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:15 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:28 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:15 msgid "Filter" msgstr "移動»" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:13 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:14 msgid "Delete?" msgstr "削除" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:33 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:16 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:35 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Are you sure you want to delete this record?" +msgstr "このレコードを削除してもよろしいですか。" + +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:33 msgid "New" msgstr "新規" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:43 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:43 msgid "Add" msgstr "追加" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:3 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:3 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:2 msgid "Add Filter" msgstr "フィルターを追加" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:30 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:19 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:26 msgid "Export" msgstr "出力" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:38 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:38 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:49 msgid "Apply" msgstr "適用" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:40 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:51 msgid "Reset Filters" msgstr "フィルターをリセット" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:66 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:64 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:80 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:93 +#, python-format +msgid "%(placeholder)s" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:88 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:94 msgid "Search" msgstr "検索" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:74 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:77 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:78 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:79 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:72 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:75 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:76 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:77 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:102 msgid "items" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/create.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/create.html:10 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/create.html:10 msgid "Create New Record" msgstr "新しいレコードを作成" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:76 msgid "Select all records" msgstr "すべてのレコードを選択" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:120 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:119 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:119 msgid "Select record" msgstr "レコードを選択" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:186 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:195 msgid "Please select at least one record." msgstr "少なくとも1つのレコードを選択してください。" -#: ../flask_admin/templates/bootstrap2/admin/model/row_actions.html:34 -#: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 -msgid "Are you sure you want to delete this record?" -msgstr "このレコードを削除してもよろしいですか。" +#~ msgid "ObjectId equals" +#~ msgstr "" + +#~ msgid "Failed to get model. %(error)s" +#~ msgstr "モデルを取得できませんでした。%(error)s" + +#~ msgid "Tablib dependency not installed." +#~ msgstr "Tablib の依存関係がインストールされていません。" + +#~ msgid "Size" +#~ msgstr "" + diff --git a/flask_admin/translations/ko/LC_MESSAGES/admin.mo b/flask_admin/translations/ko/LC_MESSAGES/admin.mo index eccacf234aa3a45c802a40d6a3dac71342cb9702..7cb61ac38fe7c5b4074086572d79ecf5c84b391f 100644 GIT binary patch delta 1867 zcmYM!e@N7K9LMqZo#)J)UT39co?ff<ORt@mQ%)`WL4&C17qnlrijAVBQ2i5uaLODE znfvu+K|feq6Gk>mJQf5+fz`F3VB4*+triQi#v-ymYJt+8FYg1%d5`bs{r!C2pWoNF zu)Q()S8?D=<FAGPa{k+LRC@k*;{`K?ZsK_S8-sWsb8!R{=+85YViVTj`&f;Koj>Ao z%8!vI)-=v+vRTrW@i3dfo6e5x3p<9?wR5NjX`F!9Fod^Ud>B>lKO~`9ezshK^C?zf zC9Zb1Vt{ft7SO+a!GjWig{62Br(+t`@jo~dAL7e6nPqqh8&TzVP#tu-cn{8?oW^PR zFIHe)LAKp2RQ(k=m;P-B4^z>@GVH@5yzKl9m1qbxApeWm8RVn3tOz4mg-W~%`B)2I zCAbfZ@iQ0y7AI2f$E5c50uNe}%g(E)_|NFa>!<|3<0QQA%D%#E$CFSi@+vCv8>o(3 z-1`r3HRT@EN<2cHp->U)&!lWR)79QZk$1KXHK29Qji`>_My=E?)Jk-r2KG6sT@Pw2 z2QZ3*ScSu=Ee+Fa1e>uMw**;#4WOHVPV)g&`3NfEanwqjMjf)V$T_o%sQTAX1IZwZ zVt=CQ-9zPh=;9;D@v(eHr}#uv{mLW{ANm*#D$xK(TOFT99mX^&ehZi45Nc*~nRX0c zN6qXbtioOwzm95`$9~MlB3z7hI0yHl&PwuY9yGG^s0LS%kNw1#25`s4M^Q^3U?23p z0@W^#v#<%3_+8Y1K1Ss`fy~W*K()JsIvaoBBHjOC9<&rO4gdjLh`MfVScBi7690l> z9Kl*FBa2*vig%*wAH@dDp!PV(EF##1x|W+z*R}%-b^pKPVQhr>3NJ39M*bMJ_oJv8 z`lguG;~dn|Z9&eJwWF@>r#KILkzKN1k*0PRmFF2MZw|{S$4mORkPA#fC8|WNKm#hl zW{l%rY{XvFjE7M51AHyON^HOlsF{9(YCqt-g1V-+Q4`MPM<uC|l<*+K$UB?qY<BUt zP>Hsp8ty|5v~}SUJct_L4Xnc;ze+lcuVDiBpxS+px;1BAd9d8Jj~%KE0WHx3)Ic6N zpSrlFt9StUHMIiNnJGc4*bL;r+hWx1*?{VBt1Isbr{?8N3#8sFc;ZX#EKK{n`e3(r zC)n>Dny^0<uZ_kM(Rghn9&d;xs$w<X($Myt%`4Y?$3h8Tqjx*BJ5W<MKbG29oC&11 Ym7emas>{~;y^iuTUTgTKx3*%_{}ed8`Tzg` delta 2124 zcmYk+drZ}39LMp8Yl6xFN{G1q0*g{^2OI<li3_x53)8lin~lrCp$CwG70q@|8@A+9 zwi5#@mf6`Pmkm2qbg{MSk1l^ylZsjCQrjBmXRdWywPx?nc(!7P^Ln1|`90s?_qqIj z!MYRmfwSrH<A%RJ{&V;b$Eo+<U-4DOC{%*U=tU2%#{}GhHF!6c;3#_WEi6XYnzhWB zCi=~osOxZ*F#!{zQAFS+>laHum_L!R#*?%(AQMyR=V2O_*?1%By3I&J(_;IbSW3SK z^Kr_03ghX2hs(LYIZs20f5J?>g4bgv(^aK4xEeR$4d}xH9I^dZP&b&j@n5l!e&%wD z#X8K!`)vOK)cA4C=l*7n#?82ZSs1&*nCmbHQ?T0Fj7oG5s<1xPOddjQ-6QDWGpK^z zMn2{nzB2GfOvfuWp1zXxznVZk4efCyDq*#Cy^S|wEb%5(g3YKiumi8bJvJUhhkgh( z!&y}RuTcd=?eDS7>Q4HFDXhPisE>dW9zqtu96{~n%g7k>KB}<KtzV*Ud<L~*mr*N{ zL=qL4iW*ml8s|lAaTS)}CR~gAJgmR=`UL_Geqg<b#q<*xrGhF@r@g`UZ$sUn1+{WJ zQHQV%Ik#pv>iT|EVS~u3n;`1CG5h;?fQD}Hti9kEa{kP$jlXN-pI|VCr9>sXmuaei z`%#Cs8x=o*8*vmh)6cLR|3OW(l>N}mTTt=9ei|Bh0*i1KH{iE;6XvqcI!w)|!a7mc z??o;#526YfvGEsCTXNj~{vm4I0^W${QF)WtUkVDC3K~kd9hscjflBO09hx9E-~?(3 zzq0)cxSD<e7wLtw36*#dbMYvy!}qMeVIBQ7RIA@R(W~cwh(;}e*HL@^Gdh@e?b366 zE9$v#M=kk5RG|}ChSR7CETGQ9In+!qU^OPQ99qGR$T>A_sK>hx*KmI`N<(k7H;{Xq zk5P%fM<xEj>RNxX{)I{u!x!h(<e*lh7?o!$R$v!u=Fg#KzJPqp?|cO+X{7O1sl_HN z#2_j`*!m9Yd7ekj{0~%N%XsTZ4=Q1X)obHhP<ghY#_d5pj{8vsKbph(H_~{DfGRzW zRhUSbTH1QlY3;@uJd8?o8ufTxwEab7G0fknm0QJ2MTKQq9aOx?_SYhBX;YDR%hI8$ zC!mCPAT^j4<cTres67v&Zv2GpKc5#llb9W!w97Z(boX}n{E>6XD`P!(we9w`58U42 z`1<y>`uii%6(7aKbv^70olJQ$zqQTZ)#h~g_WF7{d_C=hPEYTE)78^I(CYX5I!Z$g zo>vpP27KN9q063$G;eiDc|}QiwNqYRt9DgrB6U|NCaoq^m(~|oS-LJVlQth;6g@s2 z9h-BfhMdKjpnGJ_oeW2ZpLU{SGmbkFzBD?0X?)V13`Tl0KK);Li!+DasnJMH*4Ehg zZL05J_NlV%O9i?|54ewwxkD!%cPQ+>Iq5_XO}fW|jypc=l56<2=*Z*Ik#K3KDd()M Iw;*@tzga#O=l}o! diff --git a/flask_admin/translations/ko/LC_MESSAGES/admin.po b/flask_admin/translations/ko/LC_MESSAGES/admin.po index 93182ab97..95d2e395a 100644 --- a/flask_admin/translations/ko/LC_MESSAGES/admin.po +++ b/flask_admin/translations/ko/LC_MESSAGES/admin.po @@ -1,275 +1,264 @@ + msgid "" msgstr "" -"Project-Id-Version: flask-admin\n" +"Project-Id-Version: flask-admin\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-02-07 00:17-0600\n" +"POT-Creation-Date: 2024-09-24 22:09+0100\n" "PO-Revision-Date: 2017-03-03 00:31-0500\n" "Last-Translator: mrjoes <serge.koval@gmail.com>\n" +"Language: ko_KR\n" "Language-Team: Korean\n" +"Plural-Forms: nplurals=1; plural=0;\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.1.1\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: flask-admin\n" -"X-Crowdin-Language: ko\n" -"X-Crowdin-File: admin.pot\n" -"Language: ko_KR\n" +"Generated-By: Babel 2.16.0\n" -#: ../flask_admin/base.py:440 +#: ../flask_admin/base.py:458 msgid "Home" msgstr "홈" -#: ../flask_admin/contrib/rediscli.py:127 +#: ../flask_admin/contrib/rediscli.py:113 msgid "Cli: Invalid command." msgstr "Cli: 잘못된 명령입니다." -#: ../flask_admin/contrib/fileadmin/__init__.py:352 +#: ../flask_admin/contrib/fileadmin/__init__.py:376 msgid "File to upload" msgstr "파일 업로드" -#: ../flask_admin/contrib/fileadmin/__init__.py:360 +#: ../flask_admin/contrib/fileadmin/__init__.py:384 msgid "File required." msgstr "필수사항." -#: ../flask_admin/contrib/fileadmin/__init__.py:365 +#: ../flask_admin/contrib/fileadmin/__init__.py:389 msgid "Invalid file type." msgstr "지원되지않는 파일 형식입니다." -#: ../flask_admin/contrib/fileadmin/__init__.py:376 +#: ../flask_admin/contrib/fileadmin/__init__.py:400 msgid "Content" msgstr "콘텐츠" -#: ../flask_admin/contrib/fileadmin/__init__.py:390 +#: ../flask_admin/contrib/fileadmin/__init__.py:414 msgid "Invalid name" msgstr "잘못 된 이름" -#: ../flask_admin/contrib/fileadmin/__init__.py:398 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:106 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:112 -#: ../flask_admin/tests/sqla/test_translation.py:17 +#: ../flask_admin/contrib/fileadmin/__init__.py:422 +#: ../flask_admin/tests/sqla/test_translation.py:21 msgid "Name" msgstr "이름" -#: ../flask_admin/contrib/fileadmin/__init__.py:757 +#: ../flask_admin/contrib/fileadmin/__init__.py:784 #, python-format msgid "File \"%(name)s\" already exists." msgstr "\"%(name)s\" 파일은 이미 존재합니다." -#: ../flask_admin/contrib/fileadmin/__init__.py:802 -#: ../flask_admin/contrib/fileadmin/__init__.py:885 -#: ../flask_admin/contrib/fileadmin/__init__.py:947 -#: ../flask_admin/contrib/fileadmin/__init__.py:1000 -#: ../flask_admin/contrib/fileadmin/__init__.py:1047 -#: ../flask_admin/contrib/fileadmin/__init__.py:1099 -#: ../flask_admin/model/base.py:2168 +#: ../flask_admin/contrib/fileadmin/__init__.py:829 +#: ../flask_admin/contrib/fileadmin/__init__.py:926 +#: ../flask_admin/contrib/fileadmin/__init__.py:988 +#: ../flask_admin/contrib/fileadmin/__init__.py:1041 +#: ../flask_admin/contrib/fileadmin/__init__.py:1088 +#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/model/base.py:2324 msgid "Permission denied." msgstr "권한이 없습니다." -#: ../flask_admin/contrib/fileadmin/__init__.py:881 +#: ../flask_admin/contrib/fileadmin/__init__.py:922 msgid "File uploading is disabled." msgstr "파일 업로드를 사용할 수 없습니다." -#: ../flask_admin/contrib/fileadmin/__init__.py:892 +#: ../flask_admin/contrib/fileadmin/__init__.py:933 #, python-format msgid "Successfully saved file: %(name)s" msgstr "성공적으로 파일을 저장했습니다: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:896 +#: ../flask_admin/contrib/fileadmin/__init__.py:937 #, python-format msgid "Failed to save file: %(error)s" msgstr "파일을 저장하지 못했습니다: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:904 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:150 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:150 +#: ../flask_admin/contrib/fileadmin/__init__.py:945 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:150 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:152 msgid "Upload File" msgstr "파일 업로드" -#: ../flask_admin/contrib/fileadmin/__init__.py:943 +#: ../flask_admin/contrib/fileadmin/__init__.py:984 msgid "Directory creation is disabled." msgstr "디렉터리를 만들 수 없습니다." -#: ../flask_admin/contrib/fileadmin/__init__.py:956 +#: ../flask_admin/contrib/fileadmin/__init__.py:997 #, python-format msgid "Successfully created directory: %(directory)s" msgstr "성공적으로 디렉터리를 생성했습니다: %(directory)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:960 +#: ../flask_admin/contrib/fileadmin/__init__.py:1001 #, python-format msgid "Failed to create directory: %(error)s" msgstr "디렉터리 생성실패: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:970 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:161 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:161 +#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:161 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:163 msgid "Create Directory" msgstr "디렉터리 생성" -#: ../flask_admin/contrib/fileadmin/__init__.py:996 +#: ../flask_admin/contrib/fileadmin/__init__.py:1037 msgid "Deletion is disabled." msgstr "삭제 비활성화" -#: ../flask_admin/contrib/fileadmin/__init__.py:1005 +#: ../flask_admin/contrib/fileadmin/__init__.py:1046 msgid "Directory deletion is disabled." msgstr "디렉토리 삭제 비활성화." -#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/contrib/fileadmin/__init__.py:1052 #, python-format msgid "Directory \"%(path)s\" was successfully deleted." msgstr "디렉터리 삭제 성공 \"%(path)s\" " -#: ../flask_admin/contrib/fileadmin/__init__.py:1013 +#: ../flask_admin/contrib/fileadmin/__init__.py:1054 #, python-format msgid "Failed to delete directory: %(error)s" msgstr "디렉터리를 삭제 실패: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1019 -#: ../flask_admin/contrib/fileadmin/__init__.py:1176 +#: ../flask_admin/contrib/fileadmin/__init__.py:1060 +#: ../flask_admin/contrib/fileadmin/__init__.py:1215 #, python-format msgid "File \"%(name)s\" was successfully deleted." msgstr "파일 삭제 성공 \"%(name)s\" " -#: ../flask_admin/contrib/fileadmin/__init__.py:1021 -#: ../flask_admin/contrib/fileadmin/__init__.py:1178 +#: ../flask_admin/contrib/fileadmin/__init__.py:1062 +#: ../flask_admin/contrib/fileadmin/__init__.py:1217 #, python-format msgid "Failed to delete file: %(name)s" msgstr "파일삭제 실패: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1043 +#: ../flask_admin/contrib/fileadmin/__init__.py:1084 msgid "Renaming is disabled." msgstr "이름을 바꿀 수 없습니다." -#: ../flask_admin/contrib/fileadmin/__init__.py:1051 +#: ../flask_admin/contrib/fileadmin/__init__.py:1092 msgid "Path does not exist." msgstr "경로가 존재하지 않습니다." -#: ../flask_admin/contrib/fileadmin/__init__.py:1061 +#: ../flask_admin/contrib/fileadmin/__init__.py:1102 #, python-format msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\"" msgstr "이름변경 성공 \"%(dst)s\" <- 원본:\"%(src)s\"" -#: ../flask_admin/contrib/fileadmin/__init__.py:1064 +#: ../flask_admin/contrib/fileadmin/__init__.py:1105 #, python-format msgid "Failed to rename: %(error)s" msgstr "이름변경실패: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1078 +#: ../flask_admin/contrib/fileadmin/__init__.py:1119 #, python-format msgid "Rename %(name)s" msgstr "이름 변경: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1115 +#: ../flask_admin/contrib/fileadmin/__init__.py:1155 #, python-format msgid "Error saving changes to %(name)s." msgstr "%(name)s으로 이름변경 중 오류가 발생 했습니다." -#: ../flask_admin/contrib/fileadmin/__init__.py:1119 +#: ../flask_admin/contrib/fileadmin/__init__.py:1159 #, python-format msgid "Changes to %(name)s saved successfully." msgstr "변경된 내용 저장성공 %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1128 +#: ../flask_admin/contrib/fileadmin/__init__.py:1167 #, python-format msgid "Error reading %(name)s." msgstr "읽기실패 %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1131 -#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/contrib/fileadmin/__init__.py:1170 +#: ../flask_admin/contrib/fileadmin/__init__.py:1179 #, python-format msgid "Unexpected error while reading from %(name)s" msgstr "%(name)s 을 읽는 동안 예기치 않은 오류발생." -#: ../flask_admin/contrib/fileadmin/__init__.py:1137 +#: ../flask_admin/contrib/fileadmin/__init__.py:1176 #, python-format msgid "Cannot edit %(name)s." msgstr "%(name)s을 편집할 수 없습니다." -#: ../flask_admin/contrib/fileadmin/__init__.py:1155 +#: ../flask_admin/contrib/fileadmin/__init__.py:1194 #, python-format msgid "Editing %(path)s" msgstr "%(path)s 편집 중" -#: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/peewee/view.py:487 -#: ../flask_admin/contrib/pymongo/view.py:384 -#: ../flask_admin/contrib/sqla/view.py:1149 +#: ../flask_admin/contrib/fileadmin/__init__.py:1202 +#: ../flask_admin/contrib/peewee/view.py:510 +#: ../flask_admin/contrib/pymongo/view.py:385 +#: ../flask_admin/contrib/sqla/view.py:1241 msgid "Delete" msgstr "삭제" -#: ../flask_admin/contrib/fileadmin/__init__.py:1164 +#: ../flask_admin/contrib/fileadmin/__init__.py:1203 msgid "Are you sure you want to delete these files?" msgstr "파일을 삭제 하겠습니까?" -#: ../flask_admin/contrib/fileadmin/__init__.py:1167 +#: ../flask_admin/contrib/fileadmin/__init__.py:1206 msgid "File deletion is disabled." msgstr "파일을 삭제할 수 없습니다." -#: ../flask_admin/contrib/fileadmin/__init__.py:1180 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:22 +#: ../flask_admin/contrib/fileadmin/__init__.py:1219 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:22 msgid "Edit" msgstr "편집" -#: ../flask_admin/contrib/fileadmin/s3.py:153 +#: ../flask_admin/contrib/fileadmin/s3.py:162 msgid "Cannot operate on non empty directories" msgstr "비어 있지 않은 디렉토리에 작업할 수 없습니다." #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 -#: ../flask_admin/contrib/sqla/filters.py:41 +#: ../flask_admin/contrib/sqla/filters.py:42 msgid "equals" msgstr "같음" #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 -#: ../flask_admin/contrib/sqla/filters.py:49 +#: ../flask_admin/contrib/sqla/filters.py:50 msgid "not equal" msgstr "같지 않음" #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 -#: ../flask_admin/contrib/sqla/filters.py:58 +#: ../flask_admin/contrib/sqla/filters.py:59 msgid "contains" msgstr "포함" #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 -#: ../flask_admin/contrib/sqla/filters.py:67 +#: ../flask_admin/contrib/sqla/filters.py:68 msgid "not contains" msgstr "포함되지않은" #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 -#: ../flask_admin/contrib/sqla/filters.py:75 +#: ../flask_admin/contrib/sqla/filters.py:76 msgid "greater than" msgstr "보다 큰" #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 -#: ../flask_admin/contrib/sqla/filters.py:83 +#: ../flask_admin/contrib/sqla/filters.py:84 msgid "smaller than" msgstr "보다 작은" #: ../flask_admin/contrib/peewee/filters.py:88 -#: ../flask_admin/contrib/sqla/filters.py:94 +#: ../flask_admin/contrib/sqla/filters.py:95 msgid "empty" msgstr "빈" #: ../flask_admin/contrib/peewee/filters.py:102 -#: ../flask_admin/contrib/sqla/filters.py:108 +#: ../flask_admin/contrib/sqla/filters.py:109 msgid "in list" msgstr "목록에서" #: ../flask_admin/contrib/peewee/filters.py:111 -#: ../flask_admin/contrib/sqla/filters.py:118 +#: ../flask_admin/contrib/sqla/filters.py:119 msgid "not in list" msgstr "목록에 없는" @@ -282,82 +271,83 @@ msgstr "목록에 없는" msgid "not between" msgstr "사이에 존재하지않는" -msgid "ObjectId equals" -msgstr "ObjectId 같음" - -#, python-format -msgid "Failed to get model. %(error)s" -msgstr "모델을 가져오는 데 실패하였습니다. %(error)s" - -#: ../flask_admin/contrib/peewee/view.py:435 -#: ../flask_admin/contrib/pymongo/view.py:316 -#: ../flask_admin/contrib/sqla/view.py:1078 +#: ../flask_admin/contrib/peewee/view.py:458 +#: ../flask_admin/contrib/pymongo/view.py:317 +#: ../flask_admin/contrib/sqla/view.py:1170 #, python-format msgid "Failed to create record. %(error)s" msgstr "레코드를 만들지 못했습니다. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:454 -#: ../flask_admin/contrib/pymongo/view.py:341 -#: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 -#: ../flask_admin/model/base.py:2313 ../flask_admin/model/base.py:2315 +#: ../flask_admin/contrib/peewee/view.py:477 +#: ../flask_admin/contrib/pymongo/view.py:342 +#: ../flask_admin/contrib/sqla/view.py:1196 ../flask_admin/model/base.py:2463 +#: ../flask_admin/model/base.py:2471 ../flask_admin/model/base.py:2473 #, python-format msgid "Failed to update record. %(error)s" msgstr "레코드를 업데이트하지 못했습니다. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:469 -#: ../flask_admin/contrib/pymongo/view.py:366 -#: ../flask_admin/contrib/sqla/view.py:1129 +#: ../flask_admin/contrib/peewee/view.py:492 +#: ../flask_admin/contrib/pymongo/view.py:367 +#: ../flask_admin/contrib/sqla/view.py:1221 #, python-format msgid "Failed to delete record. %(error)s" msgstr "레코드를 삭제하지 못했습니다. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:488 -#: ../flask_admin/contrib/pymongo/view.py:385 -#: ../flask_admin/contrib/sqla/view.py:1150 +#: ../flask_admin/contrib/peewee/view.py:511 +#: ../flask_admin/contrib/pymongo/view.py:386 +#: ../flask_admin/contrib/sqla/view.py:1242 msgid "Are you sure you want to delete selected records?" msgstr "선택한 레코드를 삭제하시겠습니까?" -#: ../flask_admin/contrib/peewee/view.py:505 -#: ../flask_admin/contrib/pymongo/view.py:395 -#: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 +#: ../flask_admin/contrib/peewee/view.py:528 +#: ../flask_admin/contrib/pymongo/view.py:396 +#: ../flask_admin/contrib/sqla/view.py:1258 ../flask_admin/model/base.py:2272 #, python-format msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." msgstr[0] "%(count)s 레코드 성공적으로 삭제되었습니다." -#: ../flask_admin/contrib/peewee/view.py:511 -#: ../flask_admin/contrib/pymongo/view.py:400 -#: ../flask_admin/contrib/sqla/view.py:1174 +#: ../flask_admin/contrib/peewee/view.py:534 +#: ../flask_admin/contrib/pymongo/view.py:401 +#: ../flask_admin/contrib/sqla/view.py:1266 #, python-format msgid "Failed to delete records. %(error)s" msgstr "레코드를 삭제하지 못했습니다. %(error)s" -#: ../flask_admin/contrib/sqla/fields.py:126 -#: ../flask_admin/contrib/sqla/fields.py:176 -#: ../flask_admin/contrib/sqla/fields.py:181 ../flask_admin/model/fields.py:173 -#: ../flask_admin/model/fields.py:222 +#: ../flask_admin/contrib/sqla/fields.py:117 +#: ../flask_admin/contrib/sqla/fields.py:167 +#: ../flask_admin/contrib/sqla/fields.py:172 ../flask_admin/model/fields.py:174 +#: ../flask_admin/model/fields.py:223 msgid "Not a valid choice" msgstr "유효하지 않은 선택" -#: ../flask_admin/contrib/sqla/fields.py:186 +#: ../flask_admin/contrib/sqla/fields.py:201 msgid "Key" msgstr "키" -#: ../flask_admin/contrib/sqla/fields.py:187 +#: ../flask_admin/contrib/sqla/fields.py:202 msgid "Value" msgstr "Value" -#: ../flask_admin/contrib/sqla/validators.py:42 +#: ../flask_admin/contrib/sqla/validators.py:28 msgid "Already exists." msgstr "이미 존재합니다." -#: ../flask_admin/contrib/sqla/validators.py:60 +#: ../flask_admin/contrib/sqla/validators.py:59 #, python-format msgid "At least %(num)d item is required" msgid_plural "At least %(num)d items are required" msgstr[0] "최소 %(num)d 개의 항목이 필요합니다." -#: ../flask_admin/contrib/sqla/view.py:1057 +#: ../flask_admin/contrib/sqla/validators.py:75 +msgid "Not a valid ISO currency code (e.g. USD, EUR, CNY)." +msgstr "" + +#: ../flask_admin/contrib/sqla/validators.py:83 +msgid "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." +msgstr "" + +#: ../flask_admin/contrib/sqla/view.py:1134 #, python-format msgid "Integrity error. %(message)s" msgstr "무결성 오류입니다. %(message)s" @@ -366,274 +356,242 @@ msgstr "무결성 오류입니다. %(message)s" msgid "Invalid time format" msgstr "잘못된 시간 형식" -#: ../flask_admin/form/fields.py:144 +#: ../flask_admin/form/fields.py:147 msgid "Invalid Choice: could not coerce" msgstr "유효하지 않은 선택: 강제할 수 없습니다." -#: ../flask_admin/form/fields.py:208 +#: ../flask_admin/form/fields.py:221 msgid "Invalid JSON" msgstr "잘못된 JSON" -#: ../flask_admin/form/upload.py:207 +#: ../flask_admin/form/upload.py:216 msgid "Invalid file extension" msgstr "잘못된 파일 확장명" -#: ../flask_admin/form/upload.py:214 ../flask_admin/form/upload.py:281 +#: ../flask_admin/form/upload.py:223 ../flask_admin/form/upload.py:293 #, python-format msgid "File \"%s\" already exists." msgstr "\"%s\" 파일은 이미 있습니다." -#: ../flask_admin/model/base.py:1649 +#: ../flask_admin/form/validators.py:16 +msgid "This field requires at least one item." +msgstr "" + +#: ../flask_admin/model/base.py:1737 msgid "There are no items in the table." msgstr "테이블에 아무 항목도 없습니다." -#: ../flask_admin/model/base.py:1673 +#: ../flask_admin/model/base.py:1746 #, python-format msgid "Invalid Filter Value: %(value)s" msgstr "잘못된 필터 값: %(value)s" -#: ../flask_admin/model/base.py:1984 +#: ../flask_admin/model/base.py:2136 msgid "Record was successfully created." msgstr "레코드가 성공적으로 만들어졌습니다." -#: ../flask_admin/model/base.py:2028 ../flask_admin/model/base.py:2080 -#: ../flask_admin/model/base.py:2113 ../flask_admin/model/base.py:2297 +#: ../flask_admin/model/base.py:2180 ../flask_admin/model/base.py:2232 +#: ../flask_admin/model/base.py:2265 ../flask_admin/model/base.py:2455 msgid "Record does not exist." msgstr "레코드가 없습니다." -#: ../flask_admin/model/base.py:2037 ../flask_admin/model/base.py:2301 +#: ../flask_admin/model/base.py:2189 ../flask_admin/model/base.py:2459 msgid "Record was successfully saved." msgstr "레코드가 저장되었습니다." -#: ../flask_admin/model/base.py:2222 -msgid "Tablib dependency not installed." -msgstr "Tablib 종속성 설치 되지 않았습니다." - -#: ../flask_admin/model/base.py:2249 +#: ../flask_admin/model/base.py:2407 #, python-format msgid "Export type \"%(type)s not supported." msgstr "\"%(type)s 타입의 가져오기가 지원되지 않습니다." -#: ../flask_admin/model/filters.py:103 ../flask_admin/model/widgets.py:111 +#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:119 msgid "Yes" msgstr "예" -#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:110 +#: ../flask_admin/model/filters.py:105 ../flask_admin/model/widgets.py:118 msgid "No" msgstr "없음" -#: ../flask_admin/model/filters.py:172 ../flask_admin/model/filters.py:212 -#: ../flask_admin/model/filters.py:257 +#: ../flask_admin/model/filters.py:173 ../flask_admin/model/filters.py:213 +#: ../flask_admin/model/filters.py:258 msgid "between" msgstr "사이" -#: ../flask_admin/model/template.py:81 ../flask_admin/model/template.py:88 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:37 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:8 +#: ../flask_admin/model/template.py:83 ../flask_admin/model/template.py:90 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:7 msgid "View Record" msgstr "레코드 보기" -#: ../flask_admin/model/template.py:95 ../flask_admin/model/template.py:102 -#: ../flask_admin/model/template.py:109 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/edit.html:11 +#: ../flask_admin/model/template.py:97 ../flask_admin/model/template.py:104 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/edit.html:10 msgid "Edit Record" msgstr "레코드 편집" -#: ../flask_admin/model/widgets.py:61 +#: ../flask_admin/model/template.py:111 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Delete Record" +msgstr "" + +#: ../flask_admin/model/widgets.py:62 msgid "Please select model" msgstr "모델을 선택 하십시오" -#: ../flask_admin/templates/bootstrap2/admin/actions.html:4 -#: ../flask_admin/templates/bootstrap3/admin/actions.html:4 +#: ../flask_admin/templates/bootstrap4/admin/actions.html:5 msgid "With selected" msgstr "선택한 항목들을..." -#: ../flask_admin/templates/bootstrap2/admin/lib.html:200 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:190 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:216 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:227 msgid "Save" msgstr "저장" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:205 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:195 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:221 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:232 msgid "Cancel" msgstr "취소" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:256 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:247 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:290 msgid "Save and Add Another" msgstr "저장하고 새로 추가" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:259 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:250 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:293 msgid "Save and Continue Editing" msgstr "저장하고 계속 편집" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:9 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:9 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:10 msgid "Root" msgstr "루트" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:90 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:99 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:89 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:98 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:42 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:51 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:89 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:98 #, python-format msgid "Sort by %(name)s" msgstr "%(name)s 정렬" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:77 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:79 msgid "Rename File" msgstr "파일 이름 바꾸기" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:88 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:88 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:90 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\' recursively?" msgstr "\\'%(name)s\\' 과 하위 항목을 모두 삭제하시겠습니까?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:97 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:97 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:99 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\'?" msgstr "\\'%(name)s\\' 를 삭제 하시겠습니까 '?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:125 -msgid "Size" -msgstr "" - -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:185 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:187 msgid "Please select at least one file." msgstr "최소한 파일 하나를 선택해야 합니다." -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:8 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:17 msgid "List" msgstr "목록" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:12 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:18 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 msgid "Create" msgstr "생성" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:26 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:26 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:21 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:26 msgid "Details" msgstr "자세히" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:29 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:28 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:15 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:28 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:15 msgid "Filter" msgstr "필터" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:13 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:14 msgid "Delete?" msgstr "삭제하시겠습니까?" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:33 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:16 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:35 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Are you sure you want to delete this record?" +msgstr "이 레코드를 삭제 하시겠습니까?" + +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:33 msgid "New" msgstr "신규" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:43 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:43 msgid "Add" msgstr "추가" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:3 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:3 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:2 msgid "Add Filter" msgstr "필터 추가" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:30 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:19 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:26 msgid "Export" msgstr "내보내기" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:38 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:38 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:49 msgid "Apply" msgstr "적용" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:40 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:51 msgid "Reset Filters" msgstr "필터 재설정" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:66 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:64 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:80 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:93 +#, python-format +msgid "%(placeholder)s" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:88 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:94 msgid "Search" msgstr "검색" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:74 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:77 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:78 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:79 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:72 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:75 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:76 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:77 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:102 msgid "items" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/create.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/create.html:10 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/create.html:10 msgid "Create New Record" msgstr "새 레코드 만들기" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:76 msgid "Select all records" msgstr "모든 레코드 선택" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:120 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:119 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:119 msgid "Select record" msgstr "레코드 선택" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:186 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:195 msgid "Please select at least one record." msgstr "최소한 하나 이상의 레코드를 선택하십시오." -#: ../flask_admin/templates/bootstrap2/admin/model/row_actions.html:34 -#: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 -msgid "Are you sure you want to delete this record?" -msgstr "이 레코드를 삭제 하시겠습니까?" +#~ msgid "ObjectId equals" +#~ msgstr "ObjectId 같음" + +#~ msgid "Failed to get model. %(error)s" +#~ msgstr "모델을 가져오는 데 실패하였습니다. %(error)s" + +#~ msgid "Tablib dependency not installed." +#~ msgstr "Tablib 종속성 설치 되지 않았습니다." + +#~ msgid "Size" +#~ msgstr "" + diff --git a/flask_admin/translations/nl/LC_MESSAGES/admin.mo b/flask_admin/translations/nl/LC_MESSAGES/admin.mo index 972ac78e32692e48d7f286b84880e9aff5c97e62..568549dc6a3501042fda26171596aa9f1aa19bcc 100644 GIT binary patch delta 1859 zcmYM!Z%Ex$9LMqR)$9D1Ua#9+?&`c&wl(iHy=vy>x=fHYFt;ZmhGQ_smbeJP9z|YT z55};3@|y!2wLcF=1)}U0*JAl##zN3)L4QQ8EX>jW3AJP>y+89n7q741`QG#Uo^!tE z{C@B3oqICzU7>%-_;m9v;oF<8*8iXBO=b$sU=H5G0M26u{)UaXf>DfQn$_TQ7{S+_ zA7TsbpOLN>$uiq&matkbb`m(~?AiFihLOHDin<|%1vr60{M^MCQT=Ws3GFY}-jr=t zMLQqMaG&!C`f0y{xr}e8xlrOk+=dsi98;))XYmpI0V^<rGCYKpsCFA_fL<3rhY!<E zVF>4N2i|qR7v*mBZ^XwK-#WM`#@BE=zJ>WX?)(&$=xfx3R!}QgMQzzShB5TOM&c&q z&pP>6gk4yO{Vwj|X4;o9p}l>d3nd(PevFFWz%;yxN-%|6aNf1=V3@W)Z=)g=r~#iw z#gF1M*pI5fXQ;FDJ2Gcm%cK6<vuu`2%*s#`i8^Db0UJ;iYDHDx1ZqMrpziC(`&)=n z+841BXHZ+YieU^fdIXzL6X*(1f1To&T;OF?!ZWA}451F!FmkT!GOGW3sELdrMX(gA z-zTWV(=Prka%^nL#s75idpO`DXM$;~!#R$$R`515SsO*pi%no0r?4KgS@u&H$6D;e zI=qH0xQxmdWrMZy2Gs8zxC;mIK}?|*kobZNt>_!njSI-1E%Q$+xrbU|Ci_r|TTm;F z;ZEFx+S_BOr{q;srLLm#j3RTlNetsxScCr{3ryH94uDoxi+YT@P%}M?Rd~(0h`O<W z6DFH6jJ^0M4x#S5jup6sIs>^p)5_a`k7GNk!e_8Z&;NNYH1iQuNxno?WEQpJ?@^^( zbCyv*CD@O8&JQDFS+9!^Aak`hQI#4)<r_yG?g`hP#5BgYDK3;?8da*FkZrWTQ3GUg z^!37tAXT$NsEHlNHav}CyoGuntf2A)c$p|(jylxMs0kcKP3&1rXk|yZ&<iGks=x(g zv33QO=p)p?)2KaP#Cpu;CY3&pn&1gk$<Lw=^9QJWH<1HxGcLY>dawKuviAEO?hsIk z{zc7j9d%<m%h6MigE~}OQHOGei|=;rdejQ{yY``y<nGLnKY2X&uFvbvJC*!3?|{#1 z2)yAf1;)G!1?PjYx@dJ{G*%am#r9M;R#w+|&B2rDN84JxcY|@?Uhj6W$6xbARduqn h@JE00`E4(zdCSG8k|($K`Mh63!`?{AxYu2}??0{L#l`>t delta 2150 zcmZwHe@vBC9LMnkTr?24{4kJT@)!s?0U<;n9polRSw>k~Gv{`%_lbM)a^ZF_7D>BS zTPq7~J!5WIGd4GC*$>67ve{g&{?N5FYnDv^U~c7VwOU(qv*`U9XKSq(@H*!_=g0Sa z&v~Ai_BYq2t`_<x3_o%HD)>8`q1rz`^$U$rQv+sWGx~8IX5zirfe&H>zKqRy66^6N zYw0b<bW`ua1?q>l8j~^}g*qDEvR;^fU~V8|jX!ICKndnkUy22|%C@gZ_3K3@G<~-I z7&cOmVHLh^J%v8%S8x&Qn^_8)_-8D^Ib4P%Y*&$XU=7}d%hAQ#@FiP+7q!6Gw*7ak zre3m$U~w&$<5pYWg&IGBRjhA5q_6_N#ZpYqF{TVFFb~_TJ*bHuMg<l}?c_<+(LIe0 zPND+(82L3b{42&Eun^~Ldtom5FQTD}g3h=FHDQ}|oo!!_>9lvFCg?@ofk$yM?zHWD z(4p?3c6b6c|0PraKicQ%?CL)1)p_J!DT>pe312~yVBSET<xyme`4kn{dFwZ*g)gHr z_6sT_Sxlk;^HJlfQRA9XN4y3ba3ik75kL9YSx?d6;2G;Rtf!vIC<Sx}>b7^<`Ucbj zeW=WBM_s}oa&OH5s(%6%*eH^9vj^30+&-U3QP2VhZHFVs{WB+Q`zN;jEIyw`D(&;_ zY?Go1Bbzs)$h|W!U>ADWiWjjHvp9zq?8VhMhI$=S$0%sQKTw%SBd_XEjkn_?xCEa; z?PL<QvnkZLBgjy547HKZP&>VVm3S4k<C|EAKF(D~UXL|;|2I)k%7#%BjiTP~adhwy z>Vt9`wZq@A75_xt@)mBE0^Nd*IA(ntHSV%Chj&|VStmLe##+7qFH+D1@8fd(4s|)^ zPz$VN`>SvhD%HD@In7>V2WASDna@#~`2w}`i>QqLYAxcXYJ4l|`>+9vS>J^1gA}qU zvk#TB!>9?5qHghVTmJy{I-WuWavHg><`OD%-y_FvZlD&*;bWrLu?dyoEy!t@eoQIS zF$$Y;5*@sb`k-X<wb6uisP+!jt>20YD2xhp5Vg}0<kuYFpE5FyB+;Bi&GQv%+%;4H z*UQPjF2!Fo=uB%_wHCLb&gwZ-<nN%4<UH!u-$X5tOZ3|LVpMw#Dl@I9=k2HrcA*yT zw(a+z?$QI5?emv!o9*bLZt+gr;R#!R7Pa$zw*Fe>^w|aFzN~&X=?o5q-01X|*}3Wd z`-21Sj^y1T$BmB!q6u#%XRxR*>IM?7lW?OvvYj{P_NHY-o^rkMy!};yU^EhRLhi5| z3%Ri!qfTrn=|p0QWFQ)KLycaU|9EC3=?*5mbN&O~-u&!^O?Ni8H8id968Zh!mHaNR zvLK$((zts1)q+{y(w?D_q!Ww`IALNN8V(1dZp_&gh}osX#k>C-=j@XIk8^WrYCg_$ mWd~P06o>}@9cU!s#3HQH@1A+j#_K*##BTXVHsZ>P&c6YrKnoZE diff --git a/flask_admin/translations/nl/LC_MESSAGES/admin.po b/flask_admin/translations/nl/LC_MESSAGES/admin.po index 2b5b76aca..f4baa1909 100644 --- a/flask_admin/translations/nl/LC_MESSAGES/admin.po +++ b/flask_admin/translations/nl/LC_MESSAGES/admin.po @@ -1,275 +1,264 @@ + msgid "" msgstr "" -"Project-Id-Version: flask-admin\n" +"Project-Id-Version: flask-admin\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-02-07 00:17-0600\n" +"POT-Creation-Date: 2024-09-24 22:09+0100\n" "PO-Revision-Date: 2017-02-07 01:19-0500\n" "Last-Translator: mrjoes <serge.koval@gmail.com>\n" +"Language: nl_NL\n" "Language-Team: Dutch\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.1.1\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: flask-admin\n" -"X-Crowdin-Language: nl\n" -"X-Crowdin-File: admin.pot\n" -"Language: nl_NL\n" +"Generated-By: Babel 2.16.0\n" -#: ../flask_admin/base.py:440 +#: ../flask_admin/base.py:458 msgid "Home" msgstr "Thuis" -#: ../flask_admin/contrib/rediscli.py:127 +#: ../flask_admin/contrib/rediscli.py:113 msgid "Cli: Invalid command." msgstr "Cli: Ongeldige opdracht." -#: ../flask_admin/contrib/fileadmin/__init__.py:352 +#: ../flask_admin/contrib/fileadmin/__init__.py:376 msgid "File to upload" msgstr "Bestand om te uploaden" -#: ../flask_admin/contrib/fileadmin/__init__.py:360 +#: ../flask_admin/contrib/fileadmin/__init__.py:384 msgid "File required." msgstr "Bestand nodig." -#: ../flask_admin/contrib/fileadmin/__init__.py:365 +#: ../flask_admin/contrib/fileadmin/__init__.py:389 msgid "Invalid file type." msgstr "Ongeldig bestandstype." -#: ../flask_admin/contrib/fileadmin/__init__.py:376 +#: ../flask_admin/contrib/fileadmin/__init__.py:400 msgid "Content" msgstr "Inhoud" -#: ../flask_admin/contrib/fileadmin/__init__.py:390 +#: ../flask_admin/contrib/fileadmin/__init__.py:414 msgid "Invalid name" msgstr "Ongeldige naam" -#: ../flask_admin/contrib/fileadmin/__init__.py:398 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:106 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:112 -#: ../flask_admin/tests/sqla/test_translation.py:17 +#: ../flask_admin/contrib/fileadmin/__init__.py:422 +#: ../flask_admin/tests/sqla/test_translation.py:21 msgid "Name" msgstr "Naam" -#: ../flask_admin/contrib/fileadmin/__init__.py:757 +#: ../flask_admin/contrib/fileadmin/__init__.py:784 #, python-format msgid "File \"%(name)s\" already exists." msgstr "Er bestaat al een bestand \"%(name)s\"." -#: ../flask_admin/contrib/fileadmin/__init__.py:802 -#: ../flask_admin/contrib/fileadmin/__init__.py:885 -#: ../flask_admin/contrib/fileadmin/__init__.py:947 -#: ../flask_admin/contrib/fileadmin/__init__.py:1000 -#: ../flask_admin/contrib/fileadmin/__init__.py:1047 -#: ../flask_admin/contrib/fileadmin/__init__.py:1099 -#: ../flask_admin/model/base.py:2168 +#: ../flask_admin/contrib/fileadmin/__init__.py:829 +#: ../flask_admin/contrib/fileadmin/__init__.py:926 +#: ../flask_admin/contrib/fileadmin/__init__.py:988 +#: ../flask_admin/contrib/fileadmin/__init__.py:1041 +#: ../flask_admin/contrib/fileadmin/__init__.py:1088 +#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/model/base.py:2324 msgid "Permission denied." msgstr "Toegang geweigerd." -#: ../flask_admin/contrib/fileadmin/__init__.py:881 +#: ../flask_admin/contrib/fileadmin/__init__.py:922 msgid "File uploading is disabled." msgstr "Bestanden uploaden is uitgeschakeld." -#: ../flask_admin/contrib/fileadmin/__init__.py:892 +#: ../flask_admin/contrib/fileadmin/__init__.py:933 #, python-format msgid "Successfully saved file: %(name)s" msgstr "Bestand succesvol opgeslagen: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:896 +#: ../flask_admin/contrib/fileadmin/__init__.py:937 #, python-format msgid "Failed to save file: %(error)s" msgstr "Opslaan van bestand mislukt: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:904 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:150 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:150 +#: ../flask_admin/contrib/fileadmin/__init__.py:945 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:150 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:152 msgid "Upload File" msgstr "Bestand uploaden" -#: ../flask_admin/contrib/fileadmin/__init__.py:943 +#: ../flask_admin/contrib/fileadmin/__init__.py:984 msgid "Directory creation is disabled." msgstr "Mappen maken is uitgeschakeld." -#: ../flask_admin/contrib/fileadmin/__init__.py:956 +#: ../flask_admin/contrib/fileadmin/__init__.py:997 #, python-format msgid "Successfully created directory: %(directory)s" msgstr "Map succesvol aangemaakt: %(directory)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:960 +#: ../flask_admin/contrib/fileadmin/__init__.py:1001 #, python-format msgid "Failed to create directory: %(error)s" msgstr "Map maken is mislukt: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:970 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:161 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:161 +#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:161 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:163 msgid "Create Directory" msgstr "Map maken" -#: ../flask_admin/contrib/fileadmin/__init__.py:996 +#: ../flask_admin/contrib/fileadmin/__init__.py:1037 msgid "Deletion is disabled." msgstr "Verwijderen is uitgeschakeld." -#: ../flask_admin/contrib/fileadmin/__init__.py:1005 +#: ../flask_admin/contrib/fileadmin/__init__.py:1046 msgid "Directory deletion is disabled." msgstr "Mappen verwijderen is uitgeschakeld." -#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/contrib/fileadmin/__init__.py:1052 #, python-format msgid "Directory \"%(path)s\" was successfully deleted." msgstr "Map \"%(path)s\" is succesvol verwijderd." -#: ../flask_admin/contrib/fileadmin/__init__.py:1013 +#: ../flask_admin/contrib/fileadmin/__init__.py:1054 #, python-format msgid "Failed to delete directory: %(error)s" msgstr "Fout bij het verwijderen van de map: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1019 -#: ../flask_admin/contrib/fileadmin/__init__.py:1176 +#: ../flask_admin/contrib/fileadmin/__init__.py:1060 +#: ../flask_admin/contrib/fileadmin/__init__.py:1215 #, python-format msgid "File \"%(name)s\" was successfully deleted." msgstr "Bestand \"%(name)s\" is succesvol verwijderd." -#: ../flask_admin/contrib/fileadmin/__init__.py:1021 -#: ../flask_admin/contrib/fileadmin/__init__.py:1178 +#: ../flask_admin/contrib/fileadmin/__init__.py:1062 +#: ../flask_admin/contrib/fileadmin/__init__.py:1217 #, python-format msgid "Failed to delete file: %(name)s" msgstr "Fout bij het verwijderen van bestand: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1043 +#: ../flask_admin/contrib/fileadmin/__init__.py:1084 msgid "Renaming is disabled." msgstr "Namen wijzigen is uitgeschakeld." -#: ../flask_admin/contrib/fileadmin/__init__.py:1051 +#: ../flask_admin/contrib/fileadmin/__init__.py:1092 msgid "Path does not exist." msgstr "Pad bestaat niet." -#: ../flask_admin/contrib/fileadmin/__init__.py:1061 +#: ../flask_admin/contrib/fileadmin/__init__.py:1102 #, python-format msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\"" msgstr "Naam succesvol gewijzigd van \"%(src)s\" naar \"%(dst)s\"" -#: ../flask_admin/contrib/fileadmin/__init__.py:1064 +#: ../flask_admin/contrib/fileadmin/__init__.py:1105 #, python-format msgid "Failed to rename: %(error)s" msgstr "Naam wijzigen mislukt: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1078 +#: ../flask_admin/contrib/fileadmin/__init__.py:1119 #, python-format msgid "Rename %(name)s" msgstr "%(name)s van naam veranderen" -#: ../flask_admin/contrib/fileadmin/__init__.py:1115 +#: ../flask_admin/contrib/fileadmin/__init__.py:1155 #, python-format msgid "Error saving changes to %(name)s." msgstr "Fout bij het opslaan van wijzigingen in %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1119 +#: ../flask_admin/contrib/fileadmin/__init__.py:1159 #, python-format msgid "Changes to %(name)s saved successfully." msgstr "Wijzigingen in %(name)s zijn opgeslagen." -#: ../flask_admin/contrib/fileadmin/__init__.py:1128 +#: ../flask_admin/contrib/fileadmin/__init__.py:1167 #, python-format msgid "Error reading %(name)s." msgstr "Fout bij het lezen van %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1131 -#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/contrib/fileadmin/__init__.py:1170 +#: ../flask_admin/contrib/fileadmin/__init__.py:1179 #, python-format msgid "Unexpected error while reading from %(name)s" msgstr "Onverwachte fout bij het lezen van %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1137 +#: ../flask_admin/contrib/fileadmin/__init__.py:1176 #, python-format msgid "Cannot edit %(name)s." msgstr "%(name)s kan niet bewerkt worden." -#: ../flask_admin/contrib/fileadmin/__init__.py:1155 +#: ../flask_admin/contrib/fileadmin/__init__.py:1194 #, python-format msgid "Editing %(path)s" msgstr "%(path)s bewerken" -#: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/peewee/view.py:487 -#: ../flask_admin/contrib/pymongo/view.py:384 -#: ../flask_admin/contrib/sqla/view.py:1149 +#: ../flask_admin/contrib/fileadmin/__init__.py:1202 +#: ../flask_admin/contrib/peewee/view.py:510 +#: ../flask_admin/contrib/pymongo/view.py:385 +#: ../flask_admin/contrib/sqla/view.py:1241 msgid "Delete" msgstr "Verwijderen" -#: ../flask_admin/contrib/fileadmin/__init__.py:1164 +#: ../flask_admin/contrib/fileadmin/__init__.py:1203 msgid "Are you sure you want to delete these files?" msgstr "Weet u zeker dat u deze bestanden wilt verwijderen?" -#: ../flask_admin/contrib/fileadmin/__init__.py:1167 +#: ../flask_admin/contrib/fileadmin/__init__.py:1206 msgid "File deletion is disabled." msgstr "Het verwijderen van bestanden is uitgeschakeld." -#: ../flask_admin/contrib/fileadmin/__init__.py:1180 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:22 +#: ../flask_admin/contrib/fileadmin/__init__.py:1219 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:22 msgid "Edit" msgstr "Bewerken" -#: ../flask_admin/contrib/fileadmin/s3.py:153 +#: ../flask_admin/contrib/fileadmin/s3.py:162 msgid "Cannot operate on non empty directories" msgstr "Operatie kan alleen worden uitgevoerd op lege mappen" #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 -#: ../flask_admin/contrib/sqla/filters.py:41 +#: ../flask_admin/contrib/sqla/filters.py:42 msgid "equals" msgstr "gelijk" #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 -#: ../flask_admin/contrib/sqla/filters.py:49 +#: ../flask_admin/contrib/sqla/filters.py:50 msgid "not equal" msgstr "niet gelijk" #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 -#: ../flask_admin/contrib/sqla/filters.py:58 +#: ../flask_admin/contrib/sqla/filters.py:59 msgid "contains" msgstr "bevat" #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 -#: ../flask_admin/contrib/sqla/filters.py:67 +#: ../flask_admin/contrib/sqla/filters.py:68 msgid "not contains" msgstr "bevat niet" #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 -#: ../flask_admin/contrib/sqla/filters.py:75 +#: ../flask_admin/contrib/sqla/filters.py:76 msgid "greater than" msgstr "groter dan" #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 -#: ../flask_admin/contrib/sqla/filters.py:83 +#: ../flask_admin/contrib/sqla/filters.py:84 msgid "smaller than" msgstr "kleiner dan" #: ../flask_admin/contrib/peewee/filters.py:88 -#: ../flask_admin/contrib/sqla/filters.py:94 +#: ../flask_admin/contrib/sqla/filters.py:95 msgid "empty" msgstr "leeg" #: ../flask_admin/contrib/peewee/filters.py:102 -#: ../flask_admin/contrib/sqla/filters.py:108 +#: ../flask_admin/contrib/sqla/filters.py:109 msgid "in list" msgstr "in lijst" #: ../flask_admin/contrib/peewee/filters.py:111 -#: ../flask_admin/contrib/sqla/filters.py:118 +#: ../flask_admin/contrib/sqla/filters.py:119 msgid "not in list" msgstr "niet in lijst" @@ -282,84 +271,85 @@ msgstr "niet in lijst" msgid "not between" msgstr "niet tussen" -msgid "ObjectId equals" -msgstr "" - -#, python-format -msgid "Failed to get model. %(error)s" -msgstr "Fout bij het ophalen van model. %(error)s" - -#: ../flask_admin/contrib/peewee/view.py:435 -#: ../flask_admin/contrib/pymongo/view.py:316 -#: ../flask_admin/contrib/sqla/view.py:1078 +#: ../flask_admin/contrib/peewee/view.py:458 +#: ../flask_admin/contrib/pymongo/view.py:317 +#: ../flask_admin/contrib/sqla/view.py:1170 #, python-format msgid "Failed to create record. %(error)s" msgstr "Is mislukt om record te maken. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:454 -#: ../flask_admin/contrib/pymongo/view.py:341 -#: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 -#: ../flask_admin/model/base.py:2313 ../flask_admin/model/base.py:2315 +#: ../flask_admin/contrib/peewee/view.py:477 +#: ../flask_admin/contrib/pymongo/view.py:342 +#: ../flask_admin/contrib/sqla/view.py:1196 ../flask_admin/model/base.py:2463 +#: ../flask_admin/model/base.py:2471 ../flask_admin/model/base.py:2473 #, python-format msgid "Failed to update record. %(error)s" msgstr "Is mislukt om record te maken. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:469 -#: ../flask_admin/contrib/pymongo/view.py:366 -#: ../flask_admin/contrib/sqla/view.py:1129 +#: ../flask_admin/contrib/peewee/view.py:492 +#: ../flask_admin/contrib/pymongo/view.py:367 +#: ../flask_admin/contrib/sqla/view.py:1221 #, python-format msgid "Failed to delete record. %(error)s" msgstr "Fout bij het verwijderen van de record. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:488 -#: ../flask_admin/contrib/pymongo/view.py:385 -#: ../flask_admin/contrib/sqla/view.py:1150 +#: ../flask_admin/contrib/peewee/view.py:511 +#: ../flask_admin/contrib/pymongo/view.py:386 +#: ../flask_admin/contrib/sqla/view.py:1242 msgid "Are you sure you want to delete selected records?" msgstr "Weet u zeker dat u wilt verwijderen van geselecteerde records?" -#: ../flask_admin/contrib/peewee/view.py:505 -#: ../flask_admin/contrib/pymongo/view.py:395 -#: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 +#: ../flask_admin/contrib/peewee/view.py:528 +#: ../flask_admin/contrib/pymongo/view.py:396 +#: ../flask_admin/contrib/sqla/view.py:1258 ../flask_admin/model/base.py:2272 #, python-format msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." msgstr[0] "Record is met succes verwijderd." msgstr[1] "%(count)s records zijn met succes verwijderd." -#: ../flask_admin/contrib/peewee/view.py:511 -#: ../flask_admin/contrib/pymongo/view.py:400 -#: ../flask_admin/contrib/sqla/view.py:1174 +#: ../flask_admin/contrib/peewee/view.py:534 +#: ../flask_admin/contrib/pymongo/view.py:401 +#: ../flask_admin/contrib/sqla/view.py:1266 #, python-format msgid "Failed to delete records. %(error)s" msgstr "Fout bij het verwijderen van de record. %(error)s" -#: ../flask_admin/contrib/sqla/fields.py:126 -#: ../flask_admin/contrib/sqla/fields.py:176 -#: ../flask_admin/contrib/sqla/fields.py:181 ../flask_admin/model/fields.py:173 -#: ../flask_admin/model/fields.py:222 +#: ../flask_admin/contrib/sqla/fields.py:117 +#: ../flask_admin/contrib/sqla/fields.py:167 +#: ../flask_admin/contrib/sqla/fields.py:172 ../flask_admin/model/fields.py:174 +#: ../flask_admin/model/fields.py:223 msgid "Not a valid choice" msgstr "Niet een geldige keuze" -#: ../flask_admin/contrib/sqla/fields.py:186 +#: ../flask_admin/contrib/sqla/fields.py:201 msgid "Key" msgstr "Sleutel" -#: ../flask_admin/contrib/sqla/fields.py:187 +#: ../flask_admin/contrib/sqla/fields.py:202 msgid "Value" msgstr "Waarde" -#: ../flask_admin/contrib/sqla/validators.py:42 +#: ../flask_admin/contrib/sqla/validators.py:28 msgid "Already exists." msgstr "Er bestaat al." -#: ../flask_admin/contrib/sqla/validators.py:60 +#: ../flask_admin/contrib/sqla/validators.py:59 #, python-format msgid "At least %(num)d item is required" msgid_plural "At least %(num)d items are required" msgstr[0] "Ten minste %(num)d item is vereist" msgstr[1] "Ten minste %(num)d item is vereist" -#: ../flask_admin/contrib/sqla/view.py:1057 +#: ../flask_admin/contrib/sqla/validators.py:75 +msgid "Not a valid ISO currency code (e.g. USD, EUR, CNY)." +msgstr "" + +#: ../flask_admin/contrib/sqla/validators.py:83 +msgid "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." +msgstr "" + +#: ../flask_admin/contrib/sqla/view.py:1134 #, python-format msgid "Integrity error. %(message)s" msgstr "Integriteit fout. %(message)s" @@ -368,274 +358,242 @@ msgstr "Integriteit fout. %(message)s" msgid "Invalid time format" msgstr "Ongeldige tijdnotatie" -#: ../flask_admin/form/fields.py:144 +#: ../flask_admin/form/fields.py:147 msgid "Invalid Choice: could not coerce" msgstr "Ongeldige keuze: kon niet dwingen" -#: ../flask_admin/form/fields.py:208 +#: ../flask_admin/form/fields.py:221 msgid "Invalid JSON" msgstr "Ongeldige JSON" -#: ../flask_admin/form/upload.py:207 +#: ../flask_admin/form/upload.py:216 msgid "Invalid file extension" msgstr "Ongeldige bestanden met de extensie" -#: ../flask_admin/form/upload.py:214 ../flask_admin/form/upload.py:281 +#: ../flask_admin/form/upload.py:223 ../flask_admin/form/upload.py:293 #, python-format msgid "File \"%s\" already exists." msgstr "Er bestaat al een bestand \"%s\"." -#: ../flask_admin/model/base.py:1649 +#: ../flask_admin/form/validators.py:16 +msgid "This field requires at least one item." +msgstr "" + +#: ../flask_admin/model/base.py:1737 msgid "There are no items in the table." msgstr "Er zijn geen objecten in de tabel." -#: ../flask_admin/model/base.py:1673 +#: ../flask_admin/model/base.py:1746 #, python-format msgid "Invalid Filter Value: %(value)s" msgstr "Ongeldige filterwaarde: %(value)s" -#: ../flask_admin/model/base.py:1984 +#: ../flask_admin/model/base.py:2136 msgid "Record was successfully created." msgstr "Record is met succes gemaakt." -#: ../flask_admin/model/base.py:2028 ../flask_admin/model/base.py:2080 -#: ../flask_admin/model/base.py:2113 ../flask_admin/model/base.py:2297 +#: ../flask_admin/model/base.py:2180 ../flask_admin/model/base.py:2232 +#: ../flask_admin/model/base.py:2265 ../flask_admin/model/base.py:2455 msgid "Record does not exist." msgstr "Record bestaat niet." -#: ../flask_admin/model/base.py:2037 ../flask_admin/model/base.py:2301 +#: ../flask_admin/model/base.py:2189 ../flask_admin/model/base.py:2459 msgid "Record was successfully saved." msgstr "Record is met succes opgeslagen." -#: ../flask_admin/model/base.py:2222 -msgid "Tablib dependency not installed." -msgstr "Talbib dependency is niet geïnstalleerd." - -#: ../flask_admin/model/base.py:2249 +#: ../flask_admin/model/base.py:2407 #, python-format msgid "Export type \"%(type)s not supported." msgstr "Exporteren naar type %(type)s wordt niet ondersteund." -#: ../flask_admin/model/filters.py:103 ../flask_admin/model/widgets.py:111 +#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:119 msgid "Yes" msgstr "Ja" -#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:110 +#: ../flask_admin/model/filters.py:105 ../flask_admin/model/widgets.py:118 msgid "No" msgstr "No" -#: ../flask_admin/model/filters.py:172 ../flask_admin/model/filters.py:212 -#: ../flask_admin/model/filters.py:257 +#: ../flask_admin/model/filters.py:173 ../flask_admin/model/filters.py:213 +#: ../flask_admin/model/filters.py:258 msgid "between" msgstr "tussen" -#: ../flask_admin/model/template.py:81 ../flask_admin/model/template.py:88 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:37 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:8 +#: ../flask_admin/model/template.py:83 ../flask_admin/model/template.py:90 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:7 msgid "View Record" msgstr "Weergave Record" -#: ../flask_admin/model/template.py:95 ../flask_admin/model/template.py:102 -#: ../flask_admin/model/template.py:109 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/edit.html:11 +#: ../flask_admin/model/template.py:97 ../flask_admin/model/template.py:104 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/edit.html:10 msgid "Edit Record" msgstr "Een Record Bewerken" -#: ../flask_admin/model/widgets.py:61 +#: ../flask_admin/model/template.py:111 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Delete Record" +msgstr "" + +#: ../flask_admin/model/widgets.py:62 msgid "Please select model" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/actions.html:4 -#: ../flask_admin/templates/bootstrap3/admin/actions.html:4 +#: ../flask_admin/templates/bootstrap4/admin/actions.html:5 msgid "With selected" msgstr "Met geselecteerd" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:200 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:190 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:216 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:227 msgid "Save" msgstr "Opslaan" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:205 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:195 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:221 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:232 msgid "Cancel" msgstr "Annuleren" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:256 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:247 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:290 msgid "Save and Add Another" msgstr "Opslaan en nog een item toevoegen" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:259 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:250 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:293 msgid "Save and Continue Editing" msgstr "Opslaan en blijven bewerken" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:9 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:9 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:10 msgid "Root" msgstr "Root" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:90 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:99 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:89 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:98 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:42 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:51 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:89 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:98 #, python-format msgid "Sort by %(name)s" msgstr "Sorteren op %(name)s" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:77 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:79 msgid "Rename File" msgstr "Bestand Hernoemen" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:88 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:88 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:90 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\' recursively?" msgstr "Weet u zeker dat u wilt verwijderen van \\'%(name)s\\' recursief?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:97 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:97 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:99 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\'?" msgstr "Weet u zeker dat u wilt verwijderen van \\'%(name)s\\'?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:125 -msgid "Size" -msgstr "" - -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:185 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:187 msgid "Please select at least one file." msgstr "Selecteer ten minste één bestand." -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:8 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:17 msgid "List" msgstr "Lijst" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:12 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:18 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 msgid "Create" msgstr "Maken" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:26 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:26 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:21 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:26 msgid "Details" msgstr "Details" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:29 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:28 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:15 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:28 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:15 msgid "Filter" msgstr "Filter" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:13 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:14 msgid "Delete?" msgstr "Verwijderen?" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:33 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:16 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:35 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Are you sure you want to delete this record?" +msgstr "Weet u zeker dat u wilt verwijderen van deze record?" + +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:33 msgid "New" msgstr "Nieuw" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:43 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:43 msgid "Add" msgstr "Toevoegen" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:3 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:3 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:2 msgid "Add Filter" msgstr "Filter toevoegen" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:30 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:19 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:26 msgid "Export" msgstr "Exporteren" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:38 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:38 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:49 msgid "Apply" msgstr "Toepassing" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:40 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:51 msgid "Reset Filters" msgstr "Reset Filters" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:66 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:64 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:80 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:93 +#, python-format +msgid "%(placeholder)s" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:88 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:94 msgid "Search" msgstr "Zoeken" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:74 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:77 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:78 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:79 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:72 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:75 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:76 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:77 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:102 msgid "items" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/create.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/create.html:10 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/create.html:10 msgid "Create New Record" msgstr "Nieuwe Record Maken" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:76 msgid "Select all records" msgstr "Alle records selecteren" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:120 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:119 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:119 msgid "Select record" msgstr "Record selecteren" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:186 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:195 msgid "Please select at least one record." msgstr "Selecteer ten minste één record." -#: ../flask_admin/templates/bootstrap2/admin/model/row_actions.html:34 -#: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 -msgid "Are you sure you want to delete this record?" -msgstr "Weet u zeker dat u wilt verwijderen van deze record?" +#~ msgid "ObjectId equals" +#~ msgstr "" + +#~ msgid "Failed to get model. %(error)s" +#~ msgstr "Fout bij het ophalen van model. %(error)s" + +#~ msgid "Tablib dependency not installed." +#~ msgstr "Talbib dependency is niet geïnstalleerd." + +#~ msgid "Size" +#~ msgstr "" + diff --git a/flask_admin/translations/no/LC_MESSAGES/admin.mo b/flask_admin/translations/no/LC_MESSAGES/admin.mo index 46b18366ddf573946830fd01f534574cf2dee527..989a0cca4ae4c235d429e758f66e9b136fa2b126 100644 GIT binary patch delta 1799 zcmYM!X=q$k7{>8;nl$Moj*}TP&CFzKuW`xV&cu>*q^%^Hh|<I;RYclAHZ^I}gc?f} z%Txq6s!~p?9~z~!AJhmDiAu%2NEMA1V^vT|tx%N;+7Ciq(f>maINaRdIq$vqtnbMO zZPU5JV!U|2@f+YT!(UU8YXAS%m6$2C9?P&Dqqq^5;%3a_05;<^=I|qI!oR)srDmPf zZ$&~jjR~`Y9i~uA;PvwXJB3_!j+<Wm7b~!2nOO|0Q1N=yds(C*TZ^l(2Up@Q?=x6T z{VgoVqp0>i#VY!@lN2r?a1JlWRM@NruSV4ePz^rf<Im%z)IY{*{1q?8a+XKmHK5+_ z#(EsX6h4h<d>Jpqc}f5F4FxrH1~s!1hN%%pP+Jnm09T_L?!^mm0+-`1jN?8Ze-1CA z{tBv{551q@66y=6_rJhGC54}S;2#XASJ1j<l0$W{2^HUp-M9xe<F8S<@CWj#g(K&; zB7t1i$V~&tdpDpacnxX*H$+%}%C?1@_GBwI<Ner(GpMck5(E4ln=r-tslzVs&B!C` zLnZ4rRBlWlyJ}OYWPJcNfQOMW+Y?%Uy?B6t8a(VDyo7A4z3Jn}e0%|iLgb8pel4Tc z3iO~R(8o<P9!H&uNnDMy*ouq3o*<JI?<`QzvA72{vNuq<a1^!oi>NL53pLO<>n78v z8P_0fS{60KcK`f3tfGD+YOC%<CGA6~6`et~Q<$fqr8t3Hc8Z&_^fy%YM#&`QLLSw? zW>f>aaRnao^>^_y>fd94r6iV~*P*`aLVY*t<9m>a7Hoz>z=LC`0sQFw6SV>n4!2gO z0kyO_RKu;_O{f{}Kuu&XYD=C)t<0>Czk_Oj9<@>@u~_H-GzBHi8D#MG3+lxsth-F0 z;&sTFY#p*2b`$cd4Pp-O#U#Fnq=&ta`u=m&M1DYhU&Owsza%cz`Oi?$%xX|0u0<u^ zT2u!esB?cC*5VYZp@Vn@zUuuJl@mpbf`26zL#;>#b?)m?E7|0qUx{5B$p-(R19b|n zM;)76e7z5~q@zB5AF87VQ623~&NY<o4!MP8``z2&u$v0M=Z4F^n;R-W9$L9^<nBr9 z=^q=mo^h_ppg-8zzinhF7`$tIWN_GxM#kLFk+ZHWTIbrLkGs>++g)cxuRBojRIFu9 zb2i`HvL<M0xhk7)%;sE2?2gd5dm*;MosCTt=UP`~=LX}`Ay-@Zs5?@*;9g67H8;Eb sc&JR>4%_zro!i}$$&@>i>~)#cXD*WtTzh(lJCWYv+N!(VW7X^b1Fe_FcK`qY delta 2564 zcmb8ve@xV69KiAC1Vuu)1B_FVc*GxwdB|adL@7}*Eq`EEYnj%;J>bFdz2oj6&&{2! zT8p%3-$+;5s^zNHoDJ7lKeyVdRgRoCv(i7zRa>r>YirImdVk<?ZLO_jcf6kG`F_98 z^Z9;0&vOTYpVVj07G)1A{(AV%<oj}#^#1-^n4^>o1@IaSq8FFpL|lhU@OBK~9t`5! zxDYQ`r%zU@nf_{=B=_O9N@bKwqmqHwtjEVMs7uJR%9}g>fFFJIufsxIWXGFO?puRQ zs9J2l9joa(SdIs+?_oCmGnmKv>KqN3_!so!D9%DZuPc!*!8y1b=c2(1eBAaAqbzXJ zj{lCc>HG5t7MEfv-edcHD9;aKIqR!o8ddl;PR9vTl$wDvu>k9>t5GJp6D6=7lsDOd zQo3EJ@mZ9B-a$U<TmF^cPgsPbcDyK`{1-D&PD5(E7-hnG>oPmugcBHVMwws@${yH) zQ?bjA??z4EMR~)cDD$5}3E*dYeFAT_p8o6t@-HdsVL&DvK$4(dK&j;$$TR9gl)%2U zeuc8|Hz*nV6(u9NOd<jLP@bEO@>~$5#B~_JTkv}9^^$+7^@|K>{K$G97t)`|QxZ@u z%5J~O_E(`S(1Mb=Z77?t71_6{6XpISN?>Uu>uNX3eS7Wo!3+&q;5mE4E6Dy+NA39g zcKkEk>mil)y5Tj6QN@rUl|gya0hHr7h>LIp>u}We>!^o}x1$`#%ri73!tYQv*Y{Y7 zqbQrIk~~Z8R-r_`#oC6Ffi9E)(kO4-Z?6xaoTmM@e*~q}!zicY6q5Ojx@>PKqu`RF zxk#|87UdK)qnwWWQ3CD9IrtRHCVLBI!qX_F{1eNtoT#PWh;sjZsPSRzAuN;g|1k}j z;5^C$lL=cUSb&m|HK;L+64)cw{U{lF9VM_&QA#j^^888bMU*%9O&fo~MJT0PhCVs} z>+FTCC<}C=Y^q%-DSZ%S;z#ZH9_s*7CG|AQgs-AJKWzQnUO$T@SzWaK9FC0qf|g>2 zY^eYZ`ORL5+@pGt6Q!O&neZUWn;t=#=om_X=THLt!H!=*KFUMgB;Zn%y`fPyb<mD4 zMOk<G4Dv6(RCh5To30OKf#*@<5YEGs*2^fHu7bMA!ZpaRt*S%WJ54A*R2xuAvdLb* z8zta2JKlkE>YUOW$It6d24upA?1jfrQaXroo)4icd>CcHcT0yFChhjj3pq|KrDJiE z2&IgUIojcCy5p&|4o4EEEfq^dOwt|B**D3gLXl|FT|fDY1<gC+u|!IZqf_a)(G_#& zi&aTxNa<v6T<$Po*PnYXx5K1#cPwn8?gzOgLzi+#JcYNJv|1NQrqqT|w^19+1McxW zzjtG6CrhpkYtz#kVyz$Zx{F()CX_TfX`)=R(`=sdTOibDbjS(orZ8XD+-?$T^OeDs zF((yqdW~)lM`(1oEAkg)MRppuGylo*P-`^Os>3F3oUn1)(qj=voMb8#jhb+^`$zu0 zS)pjJ+fuN3VkBj{lkQ6e`wD~gftuPtO}(zEX^?iEd#ktI)9SwIEvssY_9jBn!0K3{ zJK3O}_*ggDSi4k@Hyh_WdRC(jR=LN#Jz0yZZx~wPJK(8Y`9HINrm#O}l}&$p(TS@` ze|_=k{O!h}wqpf|R=b;urw;k1j(8fbl)xw_)aOVIlw%@lZC97k6s#j14M#e3Untt4 y{#h4K$)=)zDN9SqiK{HjEPusVS(^MQeaC;*<*0vKHgz$sZ`#J}vAS%XcJp7f8J7(J diff --git a/flask_admin/translations/no/LC_MESSAGES/admin.po b/flask_admin/translations/no/LC_MESSAGES/admin.po index 3e83eee35..139d2935c 100644 --- a/flask_admin/translations/no/LC_MESSAGES/admin.po +++ b/flask_admin/translations/no/LC_MESSAGES/admin.po @@ -1,275 +1,263 @@ + msgid "" msgstr "" -"Project-Id-Version: flask-admin\n" +"Project-Id-Version: flask-admin\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-02-07 00:17-0600\n" +"POT-Creation-Date: 2024-09-24 22:09+0100\n" "PO-Revision-Date: 2017-02-07 01:19-0500\n" "Last-Translator: mrjoes <serge.koval@gmail.com>\n" +"Language: no_NO\n" "Language-Team: Norwegian\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.1.1\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: flask-admin\n" -"X-Crowdin-Language: no\n" -"X-Crowdin-File: admin.pot\n" -"Language: no_NO\n" +"Generated-By: Babel 2.16.0\n" -#: ../flask_admin/base.py:440 +#: ../flask_admin/base.py:458 msgid "Home" msgstr "Hjem" -#: ../flask_admin/contrib/rediscli.py:127 +#: ../flask_admin/contrib/rediscli.py:113 msgid "Cli: Invalid command." msgstr "CLI: Ugyldig kommando." -#: ../flask_admin/contrib/fileadmin/__init__.py:352 +#: ../flask_admin/contrib/fileadmin/__init__.py:376 msgid "File to upload" msgstr "Fil for opplasting" -#: ../flask_admin/contrib/fileadmin/__init__.py:360 +#: ../flask_admin/contrib/fileadmin/__init__.py:384 msgid "File required." msgstr "Fil er nødvendig." -#: ../flask_admin/contrib/fileadmin/__init__.py:365 +#: ../flask_admin/contrib/fileadmin/__init__.py:389 msgid "Invalid file type." msgstr "Ugyldig filtype." -#: ../flask_admin/contrib/fileadmin/__init__.py:376 +#: ../flask_admin/contrib/fileadmin/__init__.py:400 msgid "Content" msgstr "Innhold" -#: ../flask_admin/contrib/fileadmin/__init__.py:390 +#: ../flask_admin/contrib/fileadmin/__init__.py:414 msgid "Invalid name" msgstr "Ugyldig navn" -#: ../flask_admin/contrib/fileadmin/__init__.py:398 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:106 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:112 -#: ../flask_admin/tests/sqla/test_translation.py:17 +#: ../flask_admin/contrib/fileadmin/__init__.py:422 +#: ../flask_admin/tests/sqla/test_translation.py:21 msgid "Name" msgstr "navn" -#: ../flask_admin/contrib/fileadmin/__init__.py:757 +#: ../flask_admin/contrib/fileadmin/__init__.py:784 #, python-format msgid "File \"%(name)s\" already exists." msgstr "Filen \"%(name)s\" finnes allerede." -#: ../flask_admin/contrib/fileadmin/__init__.py:802 -#: ../flask_admin/contrib/fileadmin/__init__.py:885 -#: ../flask_admin/contrib/fileadmin/__init__.py:947 -#: ../flask_admin/contrib/fileadmin/__init__.py:1000 -#: ../flask_admin/contrib/fileadmin/__init__.py:1047 -#: ../flask_admin/contrib/fileadmin/__init__.py:1099 -#: ../flask_admin/model/base.py:2168 +#: ../flask_admin/contrib/fileadmin/__init__.py:829 +#: ../flask_admin/contrib/fileadmin/__init__.py:926 +#: ../flask_admin/contrib/fileadmin/__init__.py:988 +#: ../flask_admin/contrib/fileadmin/__init__.py:1041 +#: ../flask_admin/contrib/fileadmin/__init__.py:1088 +#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/model/base.py:2324 msgid "Permission denied." msgstr "Tillatelse nektet." -#: ../flask_admin/contrib/fileadmin/__init__.py:881 +#: ../flask_admin/contrib/fileadmin/__init__.py:922 msgid "File uploading is disabled." msgstr "Filopplasting er deaktivert." -#: ../flask_admin/contrib/fileadmin/__init__.py:892 +#: ../flask_admin/contrib/fileadmin/__init__.py:933 #, python-format msgid "Successfully saved file: %(name)s" msgstr "Lagret fil: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:896 +#: ../flask_admin/contrib/fileadmin/__init__.py:937 #, python-format msgid "Failed to save file: %(error)s" msgstr "Kan ikke lagre fil: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:904 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:150 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:150 +#: ../flask_admin/contrib/fileadmin/__init__.py:945 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:150 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:152 msgid "Upload File" msgstr "Filopplasting" -#: ../flask_admin/contrib/fileadmin/__init__.py:943 +#: ../flask_admin/contrib/fileadmin/__init__.py:984 msgid "Directory creation is disabled." msgstr "Opprettelse av mappe er deaktivert." -#: ../flask_admin/contrib/fileadmin/__init__.py:956 +#: ../flask_admin/contrib/fileadmin/__init__.py:997 #, python-format msgid "Successfully created directory: %(directory)s" msgstr "Opprettet mappen: %(directory)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:960 +#: ../flask_admin/contrib/fileadmin/__init__.py:1001 #, python-format msgid "Failed to create directory: %(error)s" msgstr "Kan ikke opprette mappe: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:970 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:161 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:161 +#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:161 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:163 msgid "Create Directory" msgstr "Opprett mappe" -#: ../flask_admin/contrib/fileadmin/__init__.py:996 +#: ../flask_admin/contrib/fileadmin/__init__.py:1037 msgid "Deletion is disabled." msgstr "Sletting er deaktivert." -#: ../flask_admin/contrib/fileadmin/__init__.py:1005 +#: ../flask_admin/contrib/fileadmin/__init__.py:1046 msgid "Directory deletion is disabled." msgstr "Sletting av mapper er deaktivert." -#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/contrib/fileadmin/__init__.py:1052 #, python-format msgid "Directory \"%(path)s\" was successfully deleted." msgstr "Mappen \"%(path)s\" ble slettet." -#: ../flask_admin/contrib/fileadmin/__init__.py:1013 +#: ../flask_admin/contrib/fileadmin/__init__.py:1054 #, python-format msgid "Failed to delete directory: %(error)s" msgstr "Kan ikke slette mappen: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1019 -#: ../flask_admin/contrib/fileadmin/__init__.py:1176 +#: ../flask_admin/contrib/fileadmin/__init__.py:1060 +#: ../flask_admin/contrib/fileadmin/__init__.py:1215 #, python-format msgid "File \"%(name)s\" was successfully deleted." msgstr "Filen \"%(name)s\" ble slettet." -#: ../flask_admin/contrib/fileadmin/__init__.py:1021 -#: ../flask_admin/contrib/fileadmin/__init__.py:1178 +#: ../flask_admin/contrib/fileadmin/__init__.py:1062 +#: ../flask_admin/contrib/fileadmin/__init__.py:1217 #, python-format msgid "Failed to delete file: %(name)s" msgstr "Kan ikke slette fil: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1043 +#: ../flask_admin/contrib/fileadmin/__init__.py:1084 msgid "Renaming is disabled." msgstr "Bytte av navn er deaktivert." -#: ../flask_admin/contrib/fileadmin/__init__.py:1051 +#: ../flask_admin/contrib/fileadmin/__init__.py:1092 msgid "Path does not exist." msgstr "Banen finnes ikke." -#: ../flask_admin/contrib/fileadmin/__init__.py:1061 +#: ../flask_admin/contrib/fileadmin/__init__.py:1102 #, python-format msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\"" msgstr "Endret navn fra \"%(src)s\" til \"%(dst)s\"" -#: ../flask_admin/contrib/fileadmin/__init__.py:1064 +#: ../flask_admin/contrib/fileadmin/__init__.py:1105 #, python-format msgid "Failed to rename: %(error)s" msgstr "Kan ikke gi nytt navn: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1078 +#: ../flask_admin/contrib/fileadmin/__init__.py:1119 #, python-format msgid "Rename %(name)s" msgstr "Endre %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1115 +#: ../flask_admin/contrib/fileadmin/__init__.py:1155 #, python-format msgid "Error saving changes to %(name)s." msgstr "Feil ved lagring av endringer i %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1119 +#: ../flask_admin/contrib/fileadmin/__init__.py:1159 #, python-format msgid "Changes to %(name)s saved successfully." msgstr "Endringer i %(name)s lagret." -#: ../flask_admin/contrib/fileadmin/__init__.py:1128 +#: ../flask_admin/contrib/fileadmin/__init__.py:1167 #, python-format msgid "Error reading %(name)s." msgstr "Feil i lesing av %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1131 -#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/contrib/fileadmin/__init__.py:1170 +#: ../flask_admin/contrib/fileadmin/__init__.py:1179 #, python-format msgid "Unexpected error while reading from %(name)s" msgstr "Uventet feil under lesing fra %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1137 +#: ../flask_admin/contrib/fileadmin/__init__.py:1176 #, python-format msgid "Cannot edit %(name)s." msgstr "Kan ikke redigere %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1155 +#: ../flask_admin/contrib/fileadmin/__init__.py:1194 #, python-format msgid "Editing %(path)s" msgstr "Redigerer %(path)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/peewee/view.py:487 -#: ../flask_admin/contrib/pymongo/view.py:384 -#: ../flask_admin/contrib/sqla/view.py:1149 +#: ../flask_admin/contrib/fileadmin/__init__.py:1202 +#: ../flask_admin/contrib/peewee/view.py:510 +#: ../flask_admin/contrib/pymongo/view.py:385 +#: ../flask_admin/contrib/sqla/view.py:1241 msgid "Delete" msgstr "Slett" -#: ../flask_admin/contrib/fileadmin/__init__.py:1164 +#: ../flask_admin/contrib/fileadmin/__init__.py:1203 msgid "Are you sure you want to delete these files?" msgstr "Er du sikker på at du vil slette disse filene?" -#: ../flask_admin/contrib/fileadmin/__init__.py:1167 +#: ../flask_admin/contrib/fileadmin/__init__.py:1206 msgid "File deletion is disabled." msgstr "Sletting av filer er deaktivert." -#: ../flask_admin/contrib/fileadmin/__init__.py:1180 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:22 +#: ../flask_admin/contrib/fileadmin/__init__.py:1219 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:22 msgid "Edit" msgstr "Rediger" -#: ../flask_admin/contrib/fileadmin/s3.py:153 +#: ../flask_admin/contrib/fileadmin/s3.py:162 msgid "Cannot operate on non empty directories" msgstr "" #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 -#: ../flask_admin/contrib/sqla/filters.py:41 +#: ../flask_admin/contrib/sqla/filters.py:42 msgid "equals" msgstr "er lik" #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 -#: ../flask_admin/contrib/sqla/filters.py:49 +#: ../flask_admin/contrib/sqla/filters.py:50 msgid "not equal" msgstr "ikke lik" #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 -#: ../flask_admin/contrib/sqla/filters.py:58 +#: ../flask_admin/contrib/sqla/filters.py:59 msgid "contains" msgstr "inneholder" #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 -#: ../flask_admin/contrib/sqla/filters.py:67 +#: ../flask_admin/contrib/sqla/filters.py:68 msgid "not contains" msgstr "inneholder ikke" #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 -#: ../flask_admin/contrib/sqla/filters.py:75 +#: ../flask_admin/contrib/sqla/filters.py:76 msgid "greater than" msgstr "større enn" #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 -#: ../flask_admin/contrib/sqla/filters.py:83 +#: ../flask_admin/contrib/sqla/filters.py:84 msgid "smaller than" msgstr "mindre enn" #: ../flask_admin/contrib/peewee/filters.py:88 -#: ../flask_admin/contrib/sqla/filters.py:94 +#: ../flask_admin/contrib/sqla/filters.py:95 msgid "empty" msgstr "Tom" #: ../flask_admin/contrib/peewee/filters.py:102 -#: ../flask_admin/contrib/sqla/filters.py:108 +#: ../flask_admin/contrib/sqla/filters.py:109 msgid "in list" msgstr "i listen" #: ../flask_admin/contrib/peewee/filters.py:111 -#: ../flask_admin/contrib/sqla/filters.py:118 +#: ../flask_admin/contrib/sqla/filters.py:119 msgid "not in list" msgstr "ikke i listen" @@ -282,84 +270,85 @@ msgstr "ikke i listen" msgid "not between" msgstr "ikke mellom" -msgid "ObjectId equals" -msgstr "" - -#, python-format -msgid "Failed to get model. %(error)s" -msgstr "Kan ikke hente modell. %(error)s" - -#: ../flask_admin/contrib/peewee/view.py:435 -#: ../flask_admin/contrib/pymongo/view.py:316 -#: ../flask_admin/contrib/sqla/view.py:1078 +#: ../flask_admin/contrib/peewee/view.py:458 +#: ../flask_admin/contrib/pymongo/view.py:317 +#: ../flask_admin/contrib/sqla/view.py:1170 #, python-format msgid "Failed to create record. %(error)s" msgstr "Kan ikke opprette posten. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:454 -#: ../flask_admin/contrib/pymongo/view.py:341 -#: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 -#: ../flask_admin/model/base.py:2313 ../flask_admin/model/base.py:2315 +#: ../flask_admin/contrib/peewee/view.py:477 +#: ../flask_admin/contrib/pymongo/view.py:342 +#: ../flask_admin/contrib/sqla/view.py:1196 ../flask_admin/model/base.py:2463 +#: ../flask_admin/model/base.py:2471 ../flask_admin/model/base.py:2473 #, python-format msgid "Failed to update record. %(error)s" msgstr "Kan ikke opprette posten. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:469 -#: ../flask_admin/contrib/pymongo/view.py:366 -#: ../flask_admin/contrib/sqla/view.py:1129 +#: ../flask_admin/contrib/peewee/view.py:492 +#: ../flask_admin/contrib/pymongo/view.py:367 +#: ../flask_admin/contrib/sqla/view.py:1221 #, python-format msgid "Failed to delete record. %(error)s" msgstr "Kan ikke slette posten. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:488 -#: ../flask_admin/contrib/pymongo/view.py:385 -#: ../flask_admin/contrib/sqla/view.py:1150 +#: ../flask_admin/contrib/peewee/view.py:511 +#: ../flask_admin/contrib/pymongo/view.py:386 +#: ../flask_admin/contrib/sqla/view.py:1242 msgid "Are you sure you want to delete selected records?" msgstr "Er du sikker på at du vil slette valgte oppføringer?" -#: ../flask_admin/contrib/peewee/view.py:505 -#: ../flask_admin/contrib/pymongo/view.py:395 -#: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 +#: ../flask_admin/contrib/peewee/view.py:528 +#: ../flask_admin/contrib/pymongo/view.py:396 +#: ../flask_admin/contrib/sqla/view.py:1258 ../flask_admin/model/base.py:2272 #, python-format msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." msgstr[0] "Posten ble slettet." msgstr[1] "%(count)s poster ble slettet." -#: ../flask_admin/contrib/peewee/view.py:511 -#: ../flask_admin/contrib/pymongo/view.py:400 -#: ../flask_admin/contrib/sqla/view.py:1174 +#: ../flask_admin/contrib/peewee/view.py:534 +#: ../flask_admin/contrib/pymongo/view.py:401 +#: ../flask_admin/contrib/sqla/view.py:1266 #, python-format msgid "Failed to delete records. %(error)s" msgstr "Kan ikke slette posten(e). %(error)s" -#: ../flask_admin/contrib/sqla/fields.py:126 -#: ../flask_admin/contrib/sqla/fields.py:176 -#: ../flask_admin/contrib/sqla/fields.py:181 ../flask_admin/model/fields.py:173 -#: ../flask_admin/model/fields.py:222 +#: ../flask_admin/contrib/sqla/fields.py:117 +#: ../flask_admin/contrib/sqla/fields.py:167 +#: ../flask_admin/contrib/sqla/fields.py:172 ../flask_admin/model/fields.py:174 +#: ../flask_admin/model/fields.py:223 msgid "Not a valid choice" msgstr "Ikke et gyldig valg" -#: ../flask_admin/contrib/sqla/fields.py:186 +#: ../flask_admin/contrib/sqla/fields.py:201 msgid "Key" msgstr "" -#: ../flask_admin/contrib/sqla/fields.py:187 +#: ../flask_admin/contrib/sqla/fields.py:202 msgid "Value" msgstr "" -#: ../flask_admin/contrib/sqla/validators.py:42 +#: ../flask_admin/contrib/sqla/validators.py:28 msgid "Already exists." msgstr "Finnes allerede." -#: ../flask_admin/contrib/sqla/validators.py:60 +#: ../flask_admin/contrib/sqla/validators.py:59 #, python-format msgid "At least %(num)d item is required" msgid_plural "At least %(num)d items are required" msgstr[0] "" msgstr[1] "" -#: ../flask_admin/contrib/sqla/view.py:1057 +#: ../flask_admin/contrib/sqla/validators.py:75 +msgid "Not a valid ISO currency code (e.g. USD, EUR, CNY)." +msgstr "" + +#: ../flask_admin/contrib/sqla/validators.py:83 +msgid "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." +msgstr "" + +#: ../flask_admin/contrib/sqla/view.py:1134 #, python-format msgid "Integrity error. %(message)s" msgstr "Integritets feil. %(message)s" @@ -368,274 +357,242 @@ msgstr "Integritets feil. %(message)s" msgid "Invalid time format" msgstr "Ugyldig tidsformat" -#: ../flask_admin/form/fields.py:144 +#: ../flask_admin/form/fields.py:147 msgid "Invalid Choice: could not coerce" msgstr "Ugyldig valg: kan ikke tvinge" -#: ../flask_admin/form/fields.py:208 +#: ../flask_admin/form/fields.py:221 msgid "Invalid JSON" msgstr "Ugyldig JSON" -#: ../flask_admin/form/upload.py:207 +#: ../flask_admin/form/upload.py:216 msgid "Invalid file extension" msgstr "Ugyldig filtype" -#: ../flask_admin/form/upload.py:214 ../flask_admin/form/upload.py:281 +#: ../flask_admin/form/upload.py:223 ../flask_admin/form/upload.py:293 #, python-format msgid "File \"%s\" already exists." msgstr "Filen \"%s\" finnes allerede." -#: ../flask_admin/model/base.py:1649 +#: ../flask_admin/form/validators.py:16 +msgid "This field requires at least one item." +msgstr "" + +#: ../flask_admin/model/base.py:1737 msgid "There are no items in the table." msgstr "Det finnes ingen elementer i tabellen." -#: ../flask_admin/model/base.py:1673 +#: ../flask_admin/model/base.py:1746 #, python-format msgid "Invalid Filter Value: %(value)s" msgstr "Ugyldig filterverdi: %(value)s" -#: ../flask_admin/model/base.py:1984 +#: ../flask_admin/model/base.py:2136 msgid "Record was successfully created." msgstr "Posten ble opprettet." -#: ../flask_admin/model/base.py:2028 ../flask_admin/model/base.py:2080 -#: ../flask_admin/model/base.py:2113 ../flask_admin/model/base.py:2297 +#: ../flask_admin/model/base.py:2180 ../flask_admin/model/base.py:2232 +#: ../flask_admin/model/base.py:2265 ../flask_admin/model/base.py:2455 msgid "Record does not exist." msgstr "Post finnes ikke." -#: ../flask_admin/model/base.py:2037 ../flask_admin/model/base.py:2301 +#: ../flask_admin/model/base.py:2189 ../flask_admin/model/base.py:2459 msgid "Record was successfully saved." msgstr "Oppføringen ble lagret." -#: ../flask_admin/model/base.py:2222 -msgid "Tablib dependency not installed." -msgstr "" - -#: ../flask_admin/model/base.py:2249 +#: ../flask_admin/model/base.py:2407 #, python-format msgid "Export type \"%(type)s not supported." msgstr "" -#: ../flask_admin/model/filters.py:103 ../flask_admin/model/widgets.py:111 +#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:119 msgid "Yes" msgstr "ja" -#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:110 +#: ../flask_admin/model/filters.py:105 ../flask_admin/model/widgets.py:118 msgid "No" msgstr "nei" -#: ../flask_admin/model/filters.py:172 ../flask_admin/model/filters.py:212 -#: ../flask_admin/model/filters.py:257 +#: ../flask_admin/model/filters.py:173 ../flask_admin/model/filters.py:213 +#: ../flask_admin/model/filters.py:258 msgid "between" msgstr "mellom" -#: ../flask_admin/model/template.py:81 ../flask_admin/model/template.py:88 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:37 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:8 +#: ../flask_admin/model/template.py:83 ../flask_admin/model/template.py:90 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:7 msgid "View Record" msgstr "Vis posten" -#: ../flask_admin/model/template.py:95 ../flask_admin/model/template.py:102 -#: ../flask_admin/model/template.py:109 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/edit.html:11 +#: ../flask_admin/model/template.py:97 ../flask_admin/model/template.py:104 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/edit.html:10 msgid "Edit Record" msgstr "Rediger Post" -#: ../flask_admin/model/widgets.py:61 +#: ../flask_admin/model/template.py:111 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Delete Record" +msgstr "" + +#: ../flask_admin/model/widgets.py:62 msgid "Please select model" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/actions.html:4 -#: ../flask_admin/templates/bootstrap3/admin/actions.html:4 +#: ../flask_admin/templates/bootstrap4/admin/actions.html:5 msgid "With selected" msgstr "Med utvalgte" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:200 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:190 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:216 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:227 msgid "Save" msgstr "Lagre" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:205 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:195 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:221 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:232 msgid "Cancel" msgstr "Avbryt" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:256 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:247 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:290 msgid "Save and Add Another" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:259 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:250 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:293 msgid "Save and Continue Editing" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:9 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:9 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:10 msgid "Root" msgstr "Rot" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:90 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:99 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:89 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:98 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:42 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:51 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:89 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:98 #, python-format msgid "Sort by %(name)s" msgstr "Sorter etter %(name)s" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:77 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:79 msgid "Rename File" msgstr "Gi Filen Nytt Navn" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:88 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:88 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:90 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\' recursively?" msgstr "Er du sikker på at du vil slette \\'%(name)s\\' rekursivt?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:97 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:97 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:99 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\'?" msgstr "Er du sikker på at du vil slette \\'%(name)s\\'?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:125 -msgid "Size" -msgstr "" - -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:185 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:187 msgid "Please select at least one file." msgstr "Velg minst én fil." -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:8 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:17 msgid "List" msgstr "Liste" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:12 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:18 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 msgid "Create" msgstr "Opprett" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:26 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:26 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:21 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:26 msgid "Details" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:29 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:28 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:15 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:28 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:15 msgid "Filter" msgstr "Filter" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:13 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:14 msgid "Delete?" msgstr "Slette?" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:33 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:16 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:35 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Are you sure you want to delete this record?" +msgstr "Er du sikker på at du vil slette denne posten?" + +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:33 msgid "New" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:43 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:43 msgid "Add" msgstr "Legge til" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:3 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:3 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:2 msgid "Add Filter" msgstr "Legg til Filter" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:30 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:19 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:26 msgid "Export" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:38 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:38 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:49 msgid "Apply" msgstr "Bruk" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:40 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:51 msgid "Reset Filters" msgstr "Tilbakestille filtre" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:66 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:64 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:80 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:93 +#, python-format +msgid "%(placeholder)s" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:88 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:94 msgid "Search" msgstr "Søk" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:74 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:77 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:78 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:79 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:72 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:75 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:76 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:77 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:102 msgid "items" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/create.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/create.html:10 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/create.html:10 msgid "Create New Record" msgstr "Opprette Ny Post" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:76 msgid "Select all records" msgstr "Velg alle poster" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:120 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:119 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:119 msgid "Select record" msgstr "Velg post" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:186 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:195 msgid "Please select at least one record." msgstr "Velg minst én post." -#: ../flask_admin/templates/bootstrap2/admin/model/row_actions.html:34 -#: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 -msgid "Are you sure you want to delete this record?" -msgstr "Er du sikker på at du vil slette denne posten?" +#~ msgid "ObjectId equals" +#~ msgstr "" + +#~ msgid "Failed to get model. %(error)s" +#~ msgstr "Kan ikke hente modell. %(error)s" + +#~ msgid "Tablib dependency not installed." +#~ msgstr "" + +#~ msgid "Size" +#~ msgstr "" + diff --git a/flask_admin/translations/pa/LC_MESSAGES/admin.mo b/flask_admin/translations/pa/LC_MESSAGES/admin.mo index 8bc821b43e5620d6b07aab5f2798356ebfcaef98..3fa0229343a8ed5a264da9f718d963759992cade 100644 GIT binary patch delta 1833 zcmYM!Yi!e17{~F`QOCM5x>cbYPWB%<b{}g+U~UQwyTk!?Tr|4rblpV<TZXzAypUo{ z6fe^khfCrRUd%}4MXQ!XOcXOij80_9jJ%L2CB{U-Ac=`6k>K~2{u7(7pL3r6doIs; z&i>joy*~a^z`M`zit$&*U;P~Q{(rUR8l%u%n2&4Gj~nm?d>ETCh7EWSLpY7~_^)ft zTw@~iA3#FpATBT_ZYF6|5%?q<Fz1oCxx$AYypBbfn`cZh22t@E)N@V9KxP#-Vie19 zm+L#|rT-Zg;1{UzPGgYy%{dws1g>BumimlYf~!&e7;3;hZajgv(*Fi;#y@Z|7LXqO zt`_zDMy$aREX4!32tUO6cuF$AIZHzWT|n(Dmt|_jg{UJ5po7a$19##)+<^;m7Y1;z z8$W_K(m#e8=PTE5F^B#v>iO?6eiMyf-M}?;=oc}%b`nBOuoV^GjvMg})Q*2Z)xtl> zPmQlIdlU<hx2fYp3utz|8@0i8s0DNsl7HIf5k7P#+pz&(z&bpNI+`=+;NMt}rQ}Z& zw!3adzA`<iVjV`+#t!6E%}!LYzKB}DE6AG7o65f)oFJe9C*3bn$g!GF-T0Sod=|$& z)QsC7VbwaK=P-;1P#K%XQ+OUNCaK)_u#IgW!r$;M+!N=ZbS+9a2c20Dw%}9Pg-KK< ze3ZCSeFtjg5v<0|sEj=CexE?*G{^CF{2GVx8fu<xtS*WlpvH+`r=g;n7tCItdR#`o z8#m$WxCMX22QgG)Odr06ieJKRY@@{GAzY7Fu^rnf`TKDkJMd@h!A2_n9^L<O8mkG+ zqOMzjd^X@JT!VwCogYCR$;YT2Phl@!!Zz%@C3}l3w$e{wE&h(mY><jwfpw^z$Iz$y zKk5daMWys*R0dLR{~SI<KaVsil`(9=8B{6@92SRNsEp-Mv3zB=q82cQn)ooXR&xeb zgnyzxPU9*Kttg*6r=15;14NJ%nE})Sj$$`@`R}8NAHy}6LZ$pNF2&Z{vcK;`hyF{b z%)N`cc1hHHQ`oM?X&OrLS>$-kMRYKi^Qgiq<T%ZJNV%9HY{cED=TnvG+PS+ub~bOH zJ>m1&oxUkMke^BS7tDCdHw-;JW}>|#1137kd(7!|p6MMP>Ua8{7#->xu-ghp?8U;% zHs4=uSNg~8Fa9nYDeANnMf;1x%Nv@S8^X(-aQM!q=DMbkZ7Y6!&ZGB6?fb=RJuUV^ z@sr-ripHjNPhg$bCQBpf`N4dT{jQ`e-CA-|jm7DXMV_4WMA@KsVJ7iWCh>VDaXgba vY%+;NCUGK@NZRs>mFd9>$CG}0NlT9PR(7ZRD?2=PX6Z5eYSl@*rF!x|UkmLW delta 2533 zcma*ndu)?c7{~F`tz*=&bsLv4h4p0@7-M&o$wgtXO<*uKCq#h&9X()2*KTWvOrl#L z@dgCVn?b~A96?zVT!IBdG=LHP!v#bFh>DtqU@+c@3BeHm!0*G3nivyV)_u--`o8C! z_jk^_q57LmJ>O+I`xHMNd?xTYkSM)>eu|Tol2QrYgB9q;Ihce?a3(&ACAbqS@O>=C zpN-igm8zv*ha==V9II51vT01A5H+3~{zBbC?p1Er@C{j*PCo}Tu*}q}QLbBv45%7S ze*>1%526QOHy%eP{ckaa`PCH~GVrgMg|~4MX7RYP(wUf#^RNIl=Hd?1A4Hkpf~nuY zJo;HFEEZ?ueYn!}H>2F&haTov$7oE&FEJYvMk#eKPQWy*GS;CCv>at&9Vkz-1!e1= zK@0bxEa(H|S6$}MIQ#)K@wTaFrjq|?3LYA=$J0>;tTN6q^=eF@UW+ooLX<PG3di6k zQ}0EKzK!yPM^MJUgtCC2%=ZaA)l&L-Y2+^vbx@E2Uq(VuZ=&qwA><zQ5z4|oH(o@U z_-mBJuA?O4Vh~wiI?8={DEC#MZ1D^%!AEc!cDc!4_PU>fg{O>Hv6y}mcgcb(QBM2A zreA|HK_g0XYfuhh3vzB%E6Vj@l!bL8sjFU;>voy%`+8`|1h1J34kG7I9WnJ2rapu( zIEd2p*YTLL=WSStFQG(y98co~w6UN3-^K@s>ka${cjH##mDjN+g}Y>rns7F1oPzzh z5<f+WDxX(_P*fwzldQu+Y(q(EkNN%-vPN|tr{h(WCmugusQ_9i6Ys(XdH>JTkO6bq zNIA7-Sc=QA44=g&97KsyUX6T6#%3(W$FUdJ<5#Bs5U<KA`mY#&!DaLp5nDaJigoh- ze@|mMh2n`yEyiuQ2G3xP)H$JZu>%Y6Fv=mig!3?oRZB8;C|kDzC6RUL#a%cbuOn+v zl@|X!u>p&EXzZXNTksyvz#)`F<=|vWGD#={XQI?6n7W0s1tlm8Sb=4@!PNKQ6ZB7_ zM4!z&Df2vsvvD8xum|c38V9i;Z#e2R$YPa;oQrTS%EDTauv9<FR-8bY_!E@Z@glNI z>PM7?JBdq@%0L-!E;?~7)}XI|{AGnv3ac=2@|{DW)}lp!5a;1pls!x5WYSctF$uS$ z4E!Qm7)42H2zde21(bzcGu}X1u!Gn*CMu)w!QmT=Dae3Jk!w^l%9CtGUI5jHawrd> z+<3V#Hfuz$W3o3G3`ML^yYBQxv=s_kK|Z>zJ<@IY{GEDzB-H8GVf$F}-Vr+D^#{WC z(vhc&YPYn9IwNWrE7IMrt=xh_acY<mB38JoU9QkRJIi&&wNXc`wvbN;?31o>v0JXQ zj*NQUt(N%15!K*r)2cx~WuHsQaxZIXWy(c9OLug6nd@3g+vvuC_J*|;)&agU!!(cj zt;D-oTi&40s`l|=&L?%JYW}OZAQX)FgI(IH_4#RRwCAT5CHkM%c5CWxkGCb@Z?Sy3 zT?c(SxW4<&iv7WG#2W}`U#b0j>gq&qpv!JdYfkb<bX(ZopSCxnqN=34vZTDqDleZU z?HTrB_eT4OyV}0#?ns<odVg$F`U2;a1$UQd?42=<j^rAXY17z=vFvdlJEq-zu%&j> zSWoPaEJwna!FY6Me4sx*@U9gf=!-`W#|QSuKFr?lOeAI7n=?L9^4*eC_3wORgE^BN z{}piTGtZoa(!bNZyNF%6tDVhc9P{PYJFLh4FXh3!qnRs+S*!TK(RlRv_`sfcbcfxa QIojTq|CR}Ua>0Q=0Xa~lBme*a diff --git a/flask_admin/translations/pa/LC_MESSAGES/admin.po b/flask_admin/translations/pa/LC_MESSAGES/admin.po index b3a367c37..3731e7a81 100644 --- a/flask_admin/translations/pa/LC_MESSAGES/admin.po +++ b/flask_admin/translations/pa/LC_MESSAGES/admin.po @@ -1,275 +1,264 @@ + msgid "" msgstr "" -"Project-Id-Version: flask-admin\n" +"Project-Id-Version: flask-admin\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-02-07 00:17-0600\n" +"POT-Creation-Date: 2024-09-24 22:09+0100\n" "PO-Revision-Date: 2017-02-07 01:19-0500\n" "Last-Translator: mrjoes <serge.koval@gmail.com>\n" +"Language: pa_IN\n" "Language-Team: Punjabi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.1.1\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: flask-admin\n" -"X-Crowdin-Language: pa-IN\n" -"X-Crowdin-File: admin.pot\n" -"Language: pa_IN\n" +"Generated-By: Babel 2.16.0\n" -#: ../flask_admin/base.py:440 +#: ../flask_admin/base.py:458 msgid "Home" msgstr "ਹੋਮ" -#: ../flask_admin/contrib/rediscli.py:127 +#: ../flask_admin/contrib/rediscli.py:113 msgid "Cli: Invalid command." msgstr "Cli: ਨਾ ਵਾਜਿਬ ਕਮਾਂਡ" -#: ../flask_admin/contrib/fileadmin/__init__.py:352 +#: ../flask_admin/contrib/fileadmin/__init__.py:376 msgid "File to upload" msgstr "ਅਪਲੋਡ ਕਰਨ ਲਈ ਫਾਈਲ" -#: ../flask_admin/contrib/fileadmin/__init__.py:360 +#: ../flask_admin/contrib/fileadmin/__init__.py:384 msgid "File required." msgstr "ਫ਼ਾਈਲ ਜ਼ਰੂਰੀ ਹੈ |" -#: ../flask_admin/contrib/fileadmin/__init__.py:365 +#: ../flask_admin/contrib/fileadmin/__init__.py:389 msgid "Invalid file type." msgstr "ਗਲਤ ਕਿਸਮ ਦੀ ਫਾਈਲ" -#: ../flask_admin/contrib/fileadmin/__init__.py:376 +#: ../flask_admin/contrib/fileadmin/__init__.py:400 msgid "Content" msgstr "ਸਮਗਰੀ" -#: ../flask_admin/contrib/fileadmin/__init__.py:390 +#: ../flask_admin/contrib/fileadmin/__init__.py:414 msgid "Invalid name" msgstr "ਗਲਤ ਨਾਮ" -#: ../flask_admin/contrib/fileadmin/__init__.py:398 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:106 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:112 -#: ../flask_admin/tests/sqla/test_translation.py:17 +#: ../flask_admin/contrib/fileadmin/__init__.py:422 +#: ../flask_admin/tests/sqla/test_translation.py:21 msgid "Name" msgstr "ਨਾਮ" -#: ../flask_admin/contrib/fileadmin/__init__.py:757 +#: ../flask_admin/contrib/fileadmin/__init__.py:784 #, python-format msgid "File \"%(name)s\" already exists." msgstr "ਫ਼ਾਈਲ \"%(name)s\" ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ |" -#: ../flask_admin/contrib/fileadmin/__init__.py:802 -#: ../flask_admin/contrib/fileadmin/__init__.py:885 -#: ../flask_admin/contrib/fileadmin/__init__.py:947 -#: ../flask_admin/contrib/fileadmin/__init__.py:1000 -#: ../flask_admin/contrib/fileadmin/__init__.py:1047 -#: ../flask_admin/contrib/fileadmin/__init__.py:1099 -#: ../flask_admin/model/base.py:2168 +#: ../flask_admin/contrib/fileadmin/__init__.py:829 +#: ../flask_admin/contrib/fileadmin/__init__.py:926 +#: ../flask_admin/contrib/fileadmin/__init__.py:988 +#: ../flask_admin/contrib/fileadmin/__init__.py:1041 +#: ../flask_admin/contrib/fileadmin/__init__.py:1088 +#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/model/base.py:2324 msgid "Permission denied." msgstr "ਮਨਜ਼ੂਰੀ ਨਹੀਂ ਹੈ |" -#: ../flask_admin/contrib/fileadmin/__init__.py:881 +#: ../flask_admin/contrib/fileadmin/__init__.py:922 msgid "File uploading is disabled." msgstr "ਫ਼ਾਈਲ ਅਪਲੋਡ ਕਰਨ ਤੇ ਰੋਕ ਹੈ |" -#: ../flask_admin/contrib/fileadmin/__init__.py:892 +#: ../flask_admin/contrib/fileadmin/__init__.py:933 #, python-format msgid "Successfully saved file: %(name)s" msgstr "ਫ਼ਾਈਲ ਕਾਮਯਾਬੀ ਨਾਲ ਸਾਂਭੀ ਗਈ : %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:896 +#: ../flask_admin/contrib/fileadmin/__init__.py:937 #, python-format msgid "Failed to save file: %(error)s" msgstr "ਫ਼ਾਈਲ ਸਾਂਭੀ ਨਹੀਂ ਜਾ ਸਕੀ : %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:904 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:150 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:150 +#: ../flask_admin/contrib/fileadmin/__init__.py:945 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:150 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:152 msgid "Upload File" msgstr "ਫ਼ਾਈਲ ਅਪਲੋਡ ਕਰੋ" -#: ../flask_admin/contrib/fileadmin/__init__.py:943 +#: ../flask_admin/contrib/fileadmin/__init__.py:984 msgid "Directory creation is disabled." msgstr "ਡਾਇਰੈਕਟਰੀ ਬਣਾਉਣ ਤੇ ਰੋਕ ਹੈ |" -#: ../flask_admin/contrib/fileadmin/__init__.py:956 +#: ../flask_admin/contrib/fileadmin/__init__.py:997 #, python-format msgid "Successfully created directory: %(directory)s" msgstr "ਡਾਇਰੈਕਟਰੀ ਕਾਮਯਾਬੀ ਨਾਲ ਬਣ ਗਈ : %(directory)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:960 +#: ../flask_admin/contrib/fileadmin/__init__.py:1001 #, python-format msgid "Failed to create directory: %(error)s" msgstr "ਡਾਇਰੈਕਟਰੀ ਨਹੀਂ ਬਣਾਈ ਜਾ ਸਕੀ : %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:970 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:161 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:161 +#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:161 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:163 msgid "Create Directory" msgstr "ਡਾਇਰੈਕਟਰੀ ਬਣਾਓ" -#: ../flask_admin/contrib/fileadmin/__init__.py:996 +#: ../flask_admin/contrib/fileadmin/__init__.py:1037 msgid "Deletion is disabled." msgstr "ਮਿਟਾਉਣ ਦੀ ਮਨਾਹੀ ਹੈ |" -#: ../flask_admin/contrib/fileadmin/__init__.py:1005 +#: ../flask_admin/contrib/fileadmin/__init__.py:1046 msgid "Directory deletion is disabled." msgstr "ਡਾਇਰੈਕਟਰੀ ਮਿਟਾਉਣ ਦੀ ਮਨਾਹੀ ਹੈ |" -#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/contrib/fileadmin/__init__.py:1052 #, python-format msgid "Directory \"%(path)s\" was successfully deleted." msgstr "ਡਾਇਰੈਕਟਰੀ \"%(path)s\" ਕਾਮਯਾਬੀ ਨਾਲ ਮਿਟਾ ਦਿੱਤੀ ਗਈ |" -#: ../flask_admin/contrib/fileadmin/__init__.py:1013 +#: ../flask_admin/contrib/fileadmin/__init__.py:1054 #, python-format msgid "Failed to delete directory: %(error)s" msgstr "ਡਾਇਰੈਕਟਰੀ ਮਿਟਾਉਣ ਵਿੱਚ ਨਾਕਾਮਯਾਬੀ: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1019 -#: ../flask_admin/contrib/fileadmin/__init__.py:1176 +#: ../flask_admin/contrib/fileadmin/__init__.py:1060 +#: ../flask_admin/contrib/fileadmin/__init__.py:1215 #, python-format msgid "File \"%(name)s\" was successfully deleted." msgstr "ਫ਼ਾਈਲ \"%(name)s\" ਕਾਮਯਾਬੀ ਨਾਲ ਮਿਟਾ ਦਿੱਤੀ ਗਈ |" -#: ../flask_admin/contrib/fileadmin/__init__.py:1021 -#: ../flask_admin/contrib/fileadmin/__init__.py:1178 +#: ../flask_admin/contrib/fileadmin/__init__.py:1062 +#: ../flask_admin/contrib/fileadmin/__init__.py:1217 #, python-format msgid "Failed to delete file: %(name)s" msgstr "ਫ਼ਾਈਲ ਮਿਟਾਉਣ ਵਿੱਚ ਨਾਕਾਮਯਾਬੀ: %(name)s " -#: ../flask_admin/contrib/fileadmin/__init__.py:1043 +#: ../flask_admin/contrib/fileadmin/__init__.py:1084 msgid "Renaming is disabled." msgstr "ਨਾਮ ਬਦਲਣ ਦੀ ਮਨਾਹੀ ਹੈ |" -#: ../flask_admin/contrib/fileadmin/__init__.py:1051 +#: ../flask_admin/contrib/fileadmin/__init__.py:1092 msgid "Path does not exist." msgstr "ਪਾਥ ਮੌਜੂਦ ਨਹੀਂ ਹੈ |" -#: ../flask_admin/contrib/fileadmin/__init__.py:1061 +#: ../flask_admin/contrib/fileadmin/__init__.py:1102 #, python-format msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\"" msgstr "ਨਾਮ \"%(src)s\" ਤੋਂ \"%(dst)s\" ਬਦਲਣ ਵਿੱਚ ਕਾਮਯਾਬੀ |" -#: ../flask_admin/contrib/fileadmin/__init__.py:1064 +#: ../flask_admin/contrib/fileadmin/__init__.py:1105 #, python-format msgid "Failed to rename: %(error)s" msgstr "ਨਾਮ ਬਦਲਣ ਵਿੱਚ ਨਾਕਾਮਯਾਬੀ : %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1078 +#: ../flask_admin/contrib/fileadmin/__init__.py:1119 #, python-format msgid "Rename %(name)s" msgstr "ਨਾਮ ਬਦਲੋ %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1115 +#: ../flask_admin/contrib/fileadmin/__init__.py:1155 #, python-format msgid "Error saving changes to %(name)s." msgstr "%(name)s ਵਿੱਚ ਬਦਲਾਅ ਸਾਂਭਣ ਵਿੱਚ ਗਲਤੀ |" -#: ../flask_admin/contrib/fileadmin/__init__.py:1119 +#: ../flask_admin/contrib/fileadmin/__init__.py:1159 #, python-format msgid "Changes to %(name)s saved successfully." msgstr "%(name)s ਵਿੱਚ ਬਦਲਾਅ ਸਾਂਭਣ ਵਿੱਚ ਕਾਮਯਾਬੀ |" -#: ../flask_admin/contrib/fileadmin/__init__.py:1128 +#: ../flask_admin/contrib/fileadmin/__init__.py:1167 #, python-format msgid "Error reading %(name)s." msgstr " %(name)s ਪੜਨ ਵਿੱਚ ਗਲਤੀ |" -#: ../flask_admin/contrib/fileadmin/__init__.py:1131 -#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/contrib/fileadmin/__init__.py:1170 +#: ../flask_admin/contrib/fileadmin/__init__.py:1179 #, python-format msgid "Unexpected error while reading from %(name)s" msgstr "%(name)s ਤੋਂ ਪੜਨ ਵਿੱਚ ਅਚਨਚੇਤ ਗਲਤੀ |" -#: ../flask_admin/contrib/fileadmin/__init__.py:1137 +#: ../flask_admin/contrib/fileadmin/__init__.py:1176 #, python-format msgid "Cannot edit %(name)s." msgstr "%(name)s ਨਹੀਂ ਬਦਲਿਆ ਜਾ ਸਕਦਾ |" -#: ../flask_admin/contrib/fileadmin/__init__.py:1155 +#: ../flask_admin/contrib/fileadmin/__init__.py:1194 #, python-format msgid "Editing %(path)s" msgstr " %(path)s ਬਦਲਿਆ ਜਾ ਰਿਹਾ " -#: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/peewee/view.py:487 -#: ../flask_admin/contrib/pymongo/view.py:384 -#: ../flask_admin/contrib/sqla/view.py:1149 +#: ../flask_admin/contrib/fileadmin/__init__.py:1202 +#: ../flask_admin/contrib/peewee/view.py:510 +#: ../flask_admin/contrib/pymongo/view.py:385 +#: ../flask_admin/contrib/sqla/view.py:1241 msgid "Delete" msgstr "ਮਿਟਾਓ" -#: ../flask_admin/contrib/fileadmin/__init__.py:1164 +#: ../flask_admin/contrib/fileadmin/__init__.py:1203 msgid "Are you sure you want to delete these files?" msgstr "ਕੀ ਤੁਹਾਨੂੰ ਯਕੀਨ ਹੈ ਇੱਕ ਤੁਸੀਂ ਇਹ ਫ਼ਾਈਲਾਂ ਮਿਟਾਉਣੀਆਂ ਚਾਹੁੰਦੇ ਹੋ?" -#: ../flask_admin/contrib/fileadmin/__init__.py:1167 +#: ../flask_admin/contrib/fileadmin/__init__.py:1206 msgid "File deletion is disabled." msgstr "ਫ਼ਾਈਲ ਮਿਟਾਉਣ ਦੀ ਮਨਾਹੀ ਹੈ |" -#: ../flask_admin/contrib/fileadmin/__init__.py:1180 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:22 +#: ../flask_admin/contrib/fileadmin/__init__.py:1219 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:22 msgid "Edit" msgstr "ਬਦਲੋ" -#: ../flask_admin/contrib/fileadmin/s3.py:153 +#: ../flask_admin/contrib/fileadmin/s3.py:162 msgid "Cannot operate on non empty directories" msgstr "" #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 -#: ../flask_admin/contrib/sqla/filters.py:41 +#: ../flask_admin/contrib/sqla/filters.py:42 msgid "equals" msgstr "ਬਰਾਬਰ" #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 -#: ../flask_admin/contrib/sqla/filters.py:49 +#: ../flask_admin/contrib/sqla/filters.py:50 msgid "not equal" msgstr "ਨਾ ਬਰਾਬਰ" #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 -#: ../flask_admin/contrib/sqla/filters.py:58 +#: ../flask_admin/contrib/sqla/filters.py:59 msgid "contains" msgstr "ਸ਼ਾਮਲ" #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 -#: ../flask_admin/contrib/sqla/filters.py:67 +#: ../flask_admin/contrib/sqla/filters.py:68 msgid "not contains" msgstr "ਸ਼ਾਮਲ ਨਹੀਂ" #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 -#: ../flask_admin/contrib/sqla/filters.py:75 +#: ../flask_admin/contrib/sqla/filters.py:76 msgid "greater than" msgstr "ਤੋਂ ਵੱਧ ਹੈ" #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 -#: ../flask_admin/contrib/sqla/filters.py:83 +#: ../flask_admin/contrib/sqla/filters.py:84 msgid "smaller than" msgstr "ਤੋਂ ਘੱਟ ਹੈ" #: ../flask_admin/contrib/peewee/filters.py:88 -#: ../flask_admin/contrib/sqla/filters.py:94 +#: ../flask_admin/contrib/sqla/filters.py:95 msgid "empty" msgstr "ਖਾਲੀ" #: ../flask_admin/contrib/peewee/filters.py:102 -#: ../flask_admin/contrib/sqla/filters.py:108 +#: ../flask_admin/contrib/sqla/filters.py:109 msgid "in list" msgstr "ਸੂਚੀ ਵਿੱਚ ਹੈ" #: ../flask_admin/contrib/peewee/filters.py:111 -#: ../flask_admin/contrib/sqla/filters.py:118 +#: ../flask_admin/contrib/sqla/filters.py:119 msgid "not in list" msgstr "ਸੂਚੀ ਵਿੱਚ ਨਹੀਂ ਹੈ " @@ -282,84 +271,85 @@ msgstr "ਸੂਚੀ ਵਿੱਚ ਨਹੀਂ ਹੈ " msgid "not between" msgstr "ਵਿਚਾਲੇ ਨਹੀਂ ਹੈ " -msgid "ObjectId equals" -msgstr "" - -#, python-format -msgid "Failed to get model. %(error)s" -msgstr "ਮੌਡਲ ਕੱਢਣ ਵਿੱਚ ਨਾਕਾਮਯਾਬੀ | %(error)s" - -#: ../flask_admin/contrib/peewee/view.py:435 -#: ../flask_admin/contrib/pymongo/view.py:316 -#: ../flask_admin/contrib/sqla/view.py:1078 +#: ../flask_admin/contrib/peewee/view.py:458 +#: ../flask_admin/contrib/pymongo/view.py:317 +#: ../flask_admin/contrib/sqla/view.py:1170 #, python-format msgid "Failed to create record. %(error)s" msgstr "ਰਿਕਾਰਡ ਬਨਾਉਣ ਵਿੱਚ ਨਾਕਾਮਯਾਬੀ | %(error)s" -#: ../flask_admin/contrib/peewee/view.py:454 -#: ../flask_admin/contrib/pymongo/view.py:341 -#: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 -#: ../flask_admin/model/base.py:2313 ../flask_admin/model/base.py:2315 +#: ../flask_admin/contrib/peewee/view.py:477 +#: ../flask_admin/contrib/pymongo/view.py:342 +#: ../flask_admin/contrib/sqla/view.py:1196 ../flask_admin/model/base.py:2463 +#: ../flask_admin/model/base.py:2471 ../flask_admin/model/base.py:2473 #, python-format msgid "Failed to update record. %(error)s" msgstr "ਰਿਕਾਰਡ ਬਦਲਣ ਵਿੱਚ ਨਾਕਾਮਯਾਬੀ | %(error)s" -#: ../flask_admin/contrib/peewee/view.py:469 -#: ../flask_admin/contrib/pymongo/view.py:366 -#: ../flask_admin/contrib/sqla/view.py:1129 +#: ../flask_admin/contrib/peewee/view.py:492 +#: ../flask_admin/contrib/pymongo/view.py:367 +#: ../flask_admin/contrib/sqla/view.py:1221 #, python-format msgid "Failed to delete record. %(error)s" msgstr "ਰਿਕਾਰਡ ਮਿਟਾਉਣ ਵਿੱਚ ਨਾਕਾਮਯਾਬੀ | %(error)s" -#: ../flask_admin/contrib/peewee/view.py:488 -#: ../flask_admin/contrib/pymongo/view.py:385 -#: ../flask_admin/contrib/sqla/view.py:1150 +#: ../flask_admin/contrib/peewee/view.py:511 +#: ../flask_admin/contrib/pymongo/view.py:386 +#: ../flask_admin/contrib/sqla/view.py:1242 msgid "Are you sure you want to delete selected records?" msgstr "ਕੀ ਤੁਹਾਨੂੰ ਯਕੀਨ ਹੈ ਕਿ ਤੁਸੀਂ ਚੁਣੇ ਹੋਏ ਰਿਕਾਰਡ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?" -#: ../flask_admin/contrib/peewee/view.py:505 -#: ../flask_admin/contrib/pymongo/view.py:395 -#: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 +#: ../flask_admin/contrib/peewee/view.py:528 +#: ../flask_admin/contrib/pymongo/view.py:396 +#: ../flask_admin/contrib/sqla/view.py:1258 ../flask_admin/model/base.py:2272 #, python-format msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." msgstr[0] "ਰਿਕਾਰਡ ਕਾਮਯਾਬੀ ਨਾਲ ਮਿਟਾਇਆ ਗਿਆ |" msgstr[1] "%(count)s ਰਿਕਾਰਡ ਕਾਮਯਾਬੀ ਨਾਲ ਮਿਟਾਏ ਗਏ |" -#: ../flask_admin/contrib/peewee/view.py:511 -#: ../flask_admin/contrib/pymongo/view.py:400 -#: ../flask_admin/contrib/sqla/view.py:1174 +#: ../flask_admin/contrib/peewee/view.py:534 +#: ../flask_admin/contrib/pymongo/view.py:401 +#: ../flask_admin/contrib/sqla/view.py:1266 #, python-format msgid "Failed to delete records. %(error)s" msgstr "ਰਿਕਾਰਡ ਮਿਟਾਉਣ ਵਿੱਚ ਨਾਕਾਮਯਾਬੀ | %(error)s" -#: ../flask_admin/contrib/sqla/fields.py:126 -#: ../flask_admin/contrib/sqla/fields.py:176 -#: ../flask_admin/contrib/sqla/fields.py:181 ../flask_admin/model/fields.py:173 -#: ../flask_admin/model/fields.py:222 +#: ../flask_admin/contrib/sqla/fields.py:117 +#: ../flask_admin/contrib/sqla/fields.py:167 +#: ../flask_admin/contrib/sqla/fields.py:172 ../flask_admin/model/fields.py:174 +#: ../flask_admin/model/fields.py:223 msgid "Not a valid choice" msgstr "ਸਹੀ ਚੋਣ ਨਹੀਂ ਹੈ " -#: ../flask_admin/contrib/sqla/fields.py:186 +#: ../flask_admin/contrib/sqla/fields.py:201 msgid "Key" msgstr "" -#: ../flask_admin/contrib/sqla/fields.py:187 +#: ../flask_admin/contrib/sqla/fields.py:202 msgid "Value" msgstr "" -#: ../flask_admin/contrib/sqla/validators.py:42 +#: ../flask_admin/contrib/sqla/validators.py:28 msgid "Already exists." msgstr "ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ |" -#: ../flask_admin/contrib/sqla/validators.py:60 +#: ../flask_admin/contrib/sqla/validators.py:59 #, python-format msgid "At least %(num)d item is required" msgid_plural "At least %(num)d items are required" msgstr[0] "" msgstr[1] "" -#: ../flask_admin/contrib/sqla/view.py:1057 +#: ../flask_admin/contrib/sqla/validators.py:75 +msgid "Not a valid ISO currency code (e.g. USD, EUR, CNY)." +msgstr "" + +#: ../flask_admin/contrib/sqla/validators.py:83 +msgid "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." +msgstr "" + +#: ../flask_admin/contrib/sqla/view.py:1134 #, python-format msgid "Integrity error. %(message)s" msgstr "ਪੂਰਨਤਾ ਗਲਤੀ| %(message)s" @@ -368,274 +358,244 @@ msgstr "ਪੂਰਨਤਾ ਗਲਤੀ| %(message)s" msgid "Invalid time format" msgstr "ਨਾ ਵਾਜਿਬ ਟਾਈਮ ਫ਼ੌਰਮੈਟ" -#: ../flask_admin/form/fields.py:144 +#: ../flask_admin/form/fields.py:147 msgid "Invalid Choice: could not coerce" msgstr "ਨਾ ਵਾਜਿਬ ਚੋਣ : ਮਜ਼ਬੂਰ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ " -#: ../flask_admin/form/fields.py:208 +#: ../flask_admin/form/fields.py:221 msgid "Invalid JSON" msgstr "ਨਾ ਵਾਜਿਬ JSON" -#: ../flask_admin/form/upload.py:207 +#: ../flask_admin/form/upload.py:216 msgid "Invalid file extension" msgstr "ਨਾ ਵਾਜਿਬ ਫ਼ਾਈਲ ਐਕਸਟੇਨਸ਼ਨ" -#: ../flask_admin/form/upload.py:214 ../flask_admin/form/upload.py:281 +#: ../flask_admin/form/upload.py:223 ../flask_admin/form/upload.py:293 #, python-format msgid "File \"%s\" already exists." msgstr "ਫ਼ਾਈਲ \"%s\" ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ |" -#: ../flask_admin/model/base.py:1649 +#: ../flask_admin/form/validators.py:16 +msgid "This field requires at least one item." +msgstr "" + +#: ../flask_admin/model/base.py:1737 msgid "There are no items in the table." msgstr "ਟੇਬਲ ਵਿੱਚ ਕੋਈ ਸ਼ੈ ਨਹੀਂ ਹੈ |" -#: ../flask_admin/model/base.py:1673 +#: ../flask_admin/model/base.py:1746 #, python-format msgid "Invalid Filter Value: %(value)s" msgstr "ਨਾ ਵਾਜਿਬ ਫਿਲਟਰ ਸੰਖਿਆ: %(value)s" -#: ../flask_admin/model/base.py:1984 +#: ../flask_admin/model/base.py:2136 msgid "Record was successfully created." msgstr "ਰਿਕੌਰਡ ਕਾਮਯਾਬੀ ਨਾਲ ਬਣਾਇਆ ਗਿਆ |" -#: ../flask_admin/model/base.py:2028 ../flask_admin/model/base.py:2080 -#: ../flask_admin/model/base.py:2113 ../flask_admin/model/base.py:2297 +#: ../flask_admin/model/base.py:2180 ../flask_admin/model/base.py:2232 +#: ../flask_admin/model/base.py:2265 ../flask_admin/model/base.py:2455 msgid "Record does not exist." msgstr "ਦਾ ਰਿਕਾਰਡ ਮੌਜੂਦ ਨਹੀ ਹੈ." -#: ../flask_admin/model/base.py:2037 ../flask_admin/model/base.py:2301 +#: ../flask_admin/model/base.py:2189 ../flask_admin/model/base.py:2459 msgid "Record was successfully saved." msgstr "ਰਿਕੌਰਡ ਕਾਮਯਾਬੀ ਨਾਲ ਸਾਂਭਿਆ ਗਿਆ |" -#: ../flask_admin/model/base.py:2222 -msgid "Tablib dependency not installed." -msgstr "" - -#: ../flask_admin/model/base.py:2249 +#: ../flask_admin/model/base.py:2407 #, python-format msgid "Export type \"%(type)s not supported." msgstr "" -#: ../flask_admin/model/filters.py:103 ../flask_admin/model/widgets.py:111 +#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:119 msgid "Yes" msgstr "ਹਾਂ" -#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:110 +#: ../flask_admin/model/filters.py:105 ../flask_admin/model/widgets.py:118 msgid "No" msgstr "ਨਹੀਂ" -#: ../flask_admin/model/filters.py:172 ../flask_admin/model/filters.py:212 -#: ../flask_admin/model/filters.py:257 +#: ../flask_admin/model/filters.py:173 ../flask_admin/model/filters.py:213 +#: ../flask_admin/model/filters.py:258 msgid "between" msgstr "ਵਿਚਕਾਰ" -#: ../flask_admin/model/template.py:81 ../flask_admin/model/template.py:88 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:37 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:8 +#: ../flask_admin/model/template.py:83 ../flask_admin/model/template.py:90 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:7 msgid "View Record" msgstr "ਵੇਖੋ ਰਿਕਾਰਡ" -#: ../flask_admin/model/template.py:95 ../flask_admin/model/template.py:102 -#: ../flask_admin/model/template.py:109 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/edit.html:11 +#: ../flask_admin/model/template.py:97 ../flask_admin/model/template.py:104 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/edit.html:10 msgid "Edit Record" msgstr "ਰਿਕੌਰਡ ਬਦਲੋ" -#: ../flask_admin/model/widgets.py:61 +#: ../flask_admin/model/template.py:111 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Delete Record" +msgstr "" + +#: ../flask_admin/model/widgets.py:62 msgid "Please select model" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/actions.html:4 -#: ../flask_admin/templates/bootstrap3/admin/actions.html:4 +#: ../flask_admin/templates/bootstrap4/admin/actions.html:5 msgid "With selected" msgstr "ਚੁਣੇ ਹੋਏ ਨੂੰ" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:200 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:190 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:216 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:227 msgid "Save" msgstr "ਸਾਂਭੋ" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:205 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:195 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:221 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:232 msgid "Cancel" msgstr "ਰੱਦ ਕਰੋ" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:256 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:247 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:290 msgid "Save and Add Another" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:259 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:250 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:293 msgid "Save and Continue Editing" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:9 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:9 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:10 msgid "Root" msgstr "ਜੜ" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:90 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:99 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:89 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:98 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:42 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:51 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:89 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:98 #, python-format msgid "Sort by %(name)s" msgstr "%(name)s ਮੁਤਾਬਿਕ ਸ਼੍ਰੇਣੀਬੱਧ ਕਰੋ" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:77 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:79 msgid "Rename File" msgstr "ਫ਼ਾਈਲ ਦਾ ਨਾਮ ਬਦਲੋ" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:88 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:88 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:90 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\' recursively?" -msgstr "ਕੀ ਤੁਹਾਨੂੰ ਯਕੀਨ ਹੈ ਕਿ ਤੁਸੀਂ \\'%(name)s\\' ਅਤੇ ਇਸਦੇ ਵਿਚਲੀਆਂ ਸ਼ੈਆਂ ਨੂੰ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?" +msgstr "" +"ਕੀ ਤੁਹਾਨੂੰ ਯਕੀਨ ਹੈ ਕਿ ਤੁਸੀਂ \\'%(name)s\\' ਅਤੇ ਇਸਦੇ ਵਿਚਲੀਆਂ ਸ਼ੈਆਂ ਨੂੰ " +"ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:97 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:97 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:99 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\'?" msgstr "ਕੀ ਤੁਹਾਨੂੰ ਯਕੀਨ ਹੈ ਕਿ ਤੁਸੀਂ \\'%(name)s\\' ਨੂੰ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:125 -msgid "Size" -msgstr "" - -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:185 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:187 msgid "Please select at least one file." msgstr "ਕਿਰਪਾ ਕਰਕੇ ਘੱਟੋ ਘੱਟ ਇੱਕ ਫ਼ਾਈਲ ਚੁਣੋ |" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:8 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:17 msgid "List" msgstr "ਲਿਸਟ" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:12 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:18 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 msgid "Create" msgstr "ਬਣਾਓ" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:26 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:26 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:21 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:26 msgid "Details" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:29 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:28 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:15 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:28 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:15 msgid "Filter" msgstr "ਫਿਲਟਰ" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:13 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:14 msgid "Delete?" msgstr "ਮਿਟਾਓ?" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:33 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:16 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:35 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Are you sure you want to delete this record?" +msgstr "ਕੀ ਤੁਹਾਨੂੰ ਯਕੀਨ ਹੈ ਕਿ ਤੁਸੀਂ ਰਿਕੌਰਡ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?" + +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:33 msgid "New" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:43 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:43 msgid "Add" msgstr "ਜੋੜੋ" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:3 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:3 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:2 msgid "Add Filter" msgstr "ਫਿਲਟਰ ਜੋੜੋ" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:30 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:19 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:26 msgid "Export" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:38 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:38 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:49 msgid "Apply" msgstr "ਲਾਗੂ ਕਰੋ" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:40 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:51 msgid "Reset Filters" msgstr "ਫਿਲਟਰ ਬਦਲੋ" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:66 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:64 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:80 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:93 +#, python-format +msgid "%(placeholder)s" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:88 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:94 msgid "Search" msgstr "ਲੱਭੋ" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:74 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:77 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:78 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:79 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:72 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:75 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:76 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:77 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:102 msgid "items" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/create.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/create.html:10 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/create.html:10 msgid "Create New Record" msgstr "ਨਵਾਂ ਰਿਕੌਰਡ ਬਣਾਓ" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:76 msgid "Select all records" msgstr "ਸਾਰੇ ਰਿਕੌਰਡ ਚੁਣੋ" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:120 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:119 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:119 msgid "Select record" msgstr "ਰਿਕੌਰਡ ਚੁਣੋ" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:186 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:195 msgid "Please select at least one record." msgstr "ਕਿਰਪਾ ਕਰਕੇ ਘੱਟੋ ਘੱਟ ਇੱਕ ਰਿਕੌਰਡ ਜਰੂਰ ਚੁਣੋ |" -#: ../flask_admin/templates/bootstrap2/admin/model/row_actions.html:34 -#: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 -msgid "Are you sure you want to delete this record?" -msgstr "ਕੀ ਤੁਹਾਨੂੰ ਯਕੀਨ ਹੈ ਕਿ ਤੁਸੀਂ ਰਿਕੌਰਡ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?" +#~ msgid "ObjectId equals" +#~ msgstr "" + +#~ msgid "Failed to get model. %(error)s" +#~ msgstr "ਮੌਡਲ ਕੱਢਣ ਵਿੱਚ ਨਾਕਾਮਯਾਬੀ | %(error)s" + +#~ msgid "Tablib dependency not installed." +#~ msgstr "" + +#~ msgid "Size" +#~ msgstr "" + diff --git a/flask_admin/translations/pl/LC_MESSAGES/admin.mo b/flask_admin/translations/pl/LC_MESSAGES/admin.mo index f243a2335c026a5d2591a5095da87c6edd64b3cb..9839d0304284054cf49d57bf6a41fb4c69519823 100644 GIT binary patch delta 1859 zcmYM!S!h#P9LMp0Z0a(#jj4MRZCvWsrX*3+IF$j#4XQW~GvZp2x)duYqc4gkD0KlH zAFf);ptbm9A6$r<D(J&>P-N7isJIkSure}=)t6G-=KE_8Oi25==iGD8`Jey!-<+uU zJDGY>=s#|JHuD$eZ+nhf|9|fEHB;AJ`~mM{0NXJa-(eCzVHC^ynZ<Dhmf>ONRh&or z4Kmcq`kM_kOW9N|CepFUxvlqxH6UZ{JnDfg4#FE4#5ULe3N`K@WJ2q7?Y;xd%4rv1 zG0t|bMnCP{n8*6ImkUk&I}XQ29D`ZZ!cTELzQhvDB@JV-6xCjWT41~DKZfIIXEB7& zaWr<h`@`~j$0u<z>)UcJM&dp!!jo8lEzVo0i5{Z@`h?m+H|of~VFW`1dnc|yzP5^g z!>|SmG41+298CK(rgXNKxX^?x&g-cDKd}$qL``rThhV#Ff5ZrFe|~R9N>B?fMD<tU zVoakla1T{G?~$18Yd-ncnGImO^jR?~kf<|(T5tv`LzSouY(NFH1@&ASdyWvJv>UM$ z@1l;f8zUHE^)jqL1yB<p|El60u45N!!UL!b97h#b15#Jkgc{$B3giNk1k0kv{e_zN zj_ZGdl#O+`{tvGIGv4$uXNs^jVH+i_2OlB9+AGw8oj4u4aSF!Rb_`eI1U!tBFoSj2 zjtXoY2dtFWpmux^Rm7KF|1;EjsctS5VJ>+lC<`E6R*VX4D(Zd`Rcv!n53a>H)}kgp zg(cXE3g9g&lbxt}zu^ch;JjzzL?mM=Tg!!ZvI(`5qo{~mTz?1Zbs9)zX<Q67ZW&I- zG%A2*R6uR0o%?u~6;K4V@O+G56)MAN4Cwto%7qqaMD4h>=LXe|de5Jt7W#rZf(gu~ z4E>BMuJx$mJb-M{nozIn71VqWoKKuDP(}V4bM*ed<$_Jxdt?pEVK$D@LRgIDsD+lG z7TAi~aUJf*X4D4a{CKc=`vnzXEh-af)DbkIiu63{h_aZ{12?$fYmeNGPGnB&LZvFm zb`)3yOK~P9uo{)2dQ_m-a27s8JvWqsQSFRJ)j~O{b}CSB*TS$Z>lsi<ha&qGm9jN% zU^VK&t;nyZ?Q!ix?tZ=NKZ9EEoV$NLoSD)u<j+*+b@{x_`L&sU^B4HM8G$2SN8p0@ z$Dk9z#I$HE8BI)!Boeb?$<kQdn-koaQ?<0xI~&~T`_UU$xXmA*ULMQT7q<E{b;Ez_ a<Ml7vk~vg#(dYdXZt%W`+q{RP=KKd3v&3uw delta 2137 zcmZwIe`wTo9LMpG`=Q%(yW4E8dDHvaHmkX<{fN!!kffYTiiVlgg5c)9+3D@B<L;`B z<V>>PBjwu+8)cCcVn4tstW`ptk|^pT%bDmOqd$sbAw;AQ>-pk7&>uCndwf2h@8`$+ z^ZtCkw=*64I@4Fn@<t3lasI0KJD985zd!Z!j8Rhq7GX2`uoLs~KJ37a*nqELGfrSV z{${N#FlHU~E}W}=SZ++(coc4>;gI#)>;rQh8Ebrn*#Q;kr@j<R@ebR*7S*pCnb7pu z`s3J0J&Hkm+xjKuQNM!oS>H@k(8M!XfwQ;_E7-0g?Z6tm3v1EETkus|{{*$b1>61y zR#UH-Pq4Te1K4ZpPoc(-V376AIECAB3M(;Zfia7*3QMrv+J&0vAyi;-)J~p39o-Ie z@GVq8pCiBKG9QcZXDq{6+g?^o{uj~^q@XiyMNQal?X>M{F^Bebs0q4Jci>UH3Afw! zo#;^aP&+(|n*SmyfM4zN9Cmd-_39GxuN1{;(1d%CB$#(mXZaB_#(a$mY|{EYYT+MI z8T%cTkwPX>fPU1tYSg%9)DgE~1FpvvnDUW-o%MS(IGC~ig!R<(8Kr<)P`7=Jt>1%M zpa+$?$55BB54pEy8>)W-71$t>b+Z%IZ`eK`NmI}Qqqf6`$o(@%ZToTCej2};Ln=`d z?`NADcL3SEIgDC(0^2Zyb$A1tu$FUJj+^l|+=06>{Q(6<SWiB66s@S8Z^RmPu<Zv? z3uaIOo=1{oE+JExUr>SlZJ+0Ie!7&!sBv|u?}awhyiZ`Q-v40=3SbPC(h1bWr|@Q+ z!j*UpmAX1^l6KO9+Q}oRfOpyUPf@Sm54L^-)o&T^wlcB-^|qz3M(_Ut3X1FmDg%Ea zk(qK<R{*Q|aBveU)hSef&!ZN41GV#U+kPB%`_G{kx`tXfz)e-Ax=?qn7c2GtKTCnE znSH4D`!H(4Z>(pn-=S{vCDf(6iX_EMqXPO1iQN?N<-xHV2lYMBidyhNQ~)W|dM{&I zXYme&7chg`(FUR*YbJ^sup5<`{iub;QAcqKb##-c{uhxc%#3X><N^?r@uM<VhuS~~ zD$q4m<bMT)%`~*&E>!A{q0V>;wS!q)g~27+iF#3&FpRo03DhNf4wac<`+P4d&{0%I z-$(U3gc^5j$;#}1wT$g>&OW$cJ5D2C=Vk`AgX{Kr!P2qQa|3yWTiv8H5bJj%W9N&C zb9@i<ZF9FI@9lTocq$Z0c$XIpEbNK6p@i!s+z5|s=k>+ib8^E&t~XrrdN9-%3HLeu z?vrk`-;Hh=bfU4O6OJa5p-9B-Z}b-Xj^u}v?m)sj<9pM4#a}e9X;pK3LsOfV@Nf05 z_=miQOXIn%jdzZnEzRWlQ$vG^?V%GdW|vAedLNeu#`Y{q{5QIs%IN<_7ppvyjV>4% rUEUjtxF^4e#!ikh<)&<`(Xi_bg|Z>Wo(@GrjoxR0NgL!#Rd@dbimDB6 diff --git a/flask_admin/translations/pl/LC_MESSAGES/admin.po b/flask_admin/translations/pl/LC_MESSAGES/admin.po index b01df7afa..4f5ada8ca 100644 --- a/flask_admin/translations/pl/LC_MESSAGES/admin.po +++ b/flask_admin/translations/pl/LC_MESSAGES/admin.po @@ -1,275 +1,265 @@ + msgid "" msgstr "" -"Project-Id-Version: flask-admin\n" +"Project-Id-Version: flask-admin\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-02-07 00:17-0600\n" +"POT-Creation-Date: 2024-09-24 22:09+0100\n" "PO-Revision-Date: 2017-02-07 01:19-0500\n" "Last-Translator: mrjoes <serge.koval@gmail.com>\n" +"Language: pl_PL\n" "Language-Team: Polish\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && " +"(n%100<10 || n%100>=20) ? 1 : 2);\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.1.1\n" -"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: flask-admin\n" -"X-Crowdin-Language: pl\n" -"X-Crowdin-File: admin.pot\n" -"Language: pl_PL\n" +"Generated-By: Babel 2.16.0\n" -#: ../flask_admin/base.py:440 +#: ../flask_admin/base.py:458 msgid "Home" msgstr "Strona główna" -#: ../flask_admin/contrib/rediscli.py:127 +#: ../flask_admin/contrib/rediscli.py:113 msgid "Cli: Invalid command." msgstr "Cli: Nieprawidłowe polecenie." -#: ../flask_admin/contrib/fileadmin/__init__.py:352 +#: ../flask_admin/contrib/fileadmin/__init__.py:376 msgid "File to upload" msgstr "Plik do wgrania" -#: ../flask_admin/contrib/fileadmin/__init__.py:360 +#: ../flask_admin/contrib/fileadmin/__init__.py:384 msgid "File required." msgstr "Plik wymagany." -#: ../flask_admin/contrib/fileadmin/__init__.py:365 +#: ../flask_admin/contrib/fileadmin/__init__.py:389 msgid "Invalid file type." msgstr "Nieprawidłowy typ pliku." -#: ../flask_admin/contrib/fileadmin/__init__.py:376 +#: ../flask_admin/contrib/fileadmin/__init__.py:400 msgid "Content" msgstr "Zawartość" -#: ../flask_admin/contrib/fileadmin/__init__.py:390 +#: ../flask_admin/contrib/fileadmin/__init__.py:414 msgid "Invalid name" msgstr "Nieprawidłowa nazwa" -#: ../flask_admin/contrib/fileadmin/__init__.py:398 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:106 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:112 -#: ../flask_admin/tests/sqla/test_translation.py:17 +#: ../flask_admin/contrib/fileadmin/__init__.py:422 +#: ../flask_admin/tests/sqla/test_translation.py:21 msgid "Name" msgstr "Nazwa" -#: ../flask_admin/contrib/fileadmin/__init__.py:757 +#: ../flask_admin/contrib/fileadmin/__init__.py:784 #, python-format msgid "File \"%(name)s\" already exists." msgstr "Plik \"%(name)s\" już istnieje." -#: ../flask_admin/contrib/fileadmin/__init__.py:802 -#: ../flask_admin/contrib/fileadmin/__init__.py:885 -#: ../flask_admin/contrib/fileadmin/__init__.py:947 -#: ../flask_admin/contrib/fileadmin/__init__.py:1000 -#: ../flask_admin/contrib/fileadmin/__init__.py:1047 -#: ../flask_admin/contrib/fileadmin/__init__.py:1099 -#: ../flask_admin/model/base.py:2168 +#: ../flask_admin/contrib/fileadmin/__init__.py:829 +#: ../flask_admin/contrib/fileadmin/__init__.py:926 +#: ../flask_admin/contrib/fileadmin/__init__.py:988 +#: ../flask_admin/contrib/fileadmin/__init__.py:1041 +#: ../flask_admin/contrib/fileadmin/__init__.py:1088 +#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/model/base.py:2324 msgid "Permission denied." msgstr "Odmowa uprawnień." -#: ../flask_admin/contrib/fileadmin/__init__.py:881 +#: ../flask_admin/contrib/fileadmin/__init__.py:922 msgid "File uploading is disabled." msgstr "Wgrywanie plików jest wyłączone." -#: ../flask_admin/contrib/fileadmin/__init__.py:892 +#: ../flask_admin/contrib/fileadmin/__init__.py:933 #, python-format msgid "Successfully saved file: %(name)s" msgstr "Plik zapisany pomyślnie: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:896 +#: ../flask_admin/contrib/fileadmin/__init__.py:937 #, python-format msgid "Failed to save file: %(error)s" msgstr "Nie można zapisać pliku: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:904 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:150 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:150 +#: ../flask_admin/contrib/fileadmin/__init__.py:945 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:150 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:152 msgid "Upload File" msgstr "Prześlij plik" -#: ../flask_admin/contrib/fileadmin/__init__.py:943 +#: ../flask_admin/contrib/fileadmin/__init__.py:984 msgid "Directory creation is disabled." msgstr "Tworzenie katalogu jest wyłączona." -#: ../flask_admin/contrib/fileadmin/__init__.py:956 +#: ../flask_admin/contrib/fileadmin/__init__.py:997 #, python-format msgid "Successfully created directory: %(directory)s" msgstr "Katalog utworzony pomyślnie: %(directory)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:960 +#: ../flask_admin/contrib/fileadmin/__init__.py:1001 #, python-format msgid "Failed to create directory: %(error)s" msgstr "Nie można utworzyć katalogu: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:970 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:161 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:161 +#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:161 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:163 msgid "Create Directory" msgstr "Utwórz katalog" -#: ../flask_admin/contrib/fileadmin/__init__.py:996 +#: ../flask_admin/contrib/fileadmin/__init__.py:1037 msgid "Deletion is disabled." msgstr "Usunięcie jest wyłączona." -#: ../flask_admin/contrib/fileadmin/__init__.py:1005 +#: ../flask_admin/contrib/fileadmin/__init__.py:1046 msgid "Directory deletion is disabled." msgstr "Usunięcie katalogu jest wyłączona." -#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/contrib/fileadmin/__init__.py:1052 #, python-format msgid "Directory \"%(path)s\" was successfully deleted." msgstr "Katalog \"%(path)s\" zostało pomyślnie usunięte." -#: ../flask_admin/contrib/fileadmin/__init__.py:1013 +#: ../flask_admin/contrib/fileadmin/__init__.py:1054 #, python-format msgid "Failed to delete directory: %(error)s" msgstr "Nie można usunąć katalog: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1019 -#: ../flask_admin/contrib/fileadmin/__init__.py:1176 +#: ../flask_admin/contrib/fileadmin/__init__.py:1060 +#: ../flask_admin/contrib/fileadmin/__init__.py:1215 #, python-format msgid "File \"%(name)s\" was successfully deleted." msgstr "Pomyślnie usunięto plik \"%(name)s\"." -#: ../flask_admin/contrib/fileadmin/__init__.py:1021 -#: ../flask_admin/contrib/fileadmin/__init__.py:1178 +#: ../flask_admin/contrib/fileadmin/__init__.py:1062 +#: ../flask_admin/contrib/fileadmin/__init__.py:1217 #, python-format msgid "Failed to delete file: %(name)s" msgstr "Nie można usunąć pliku: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1043 +#: ../flask_admin/contrib/fileadmin/__init__.py:1084 msgid "Renaming is disabled." msgstr "Zmiana nazwy jest wyłączona." -#: ../flask_admin/contrib/fileadmin/__init__.py:1051 +#: ../flask_admin/contrib/fileadmin/__init__.py:1092 msgid "Path does not exist." msgstr "Ścieżka nie istnieje." -#: ../flask_admin/contrib/fileadmin/__init__.py:1061 +#: ../flask_admin/contrib/fileadmin/__init__.py:1102 #, python-format msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\"" msgstr "Pomyślnie zmieniono nazwę \"%(src)s\" na \"%(dst)s\"" -#: ../flask_admin/contrib/fileadmin/__init__.py:1064 +#: ../flask_admin/contrib/fileadmin/__init__.py:1105 #, python-format msgid "Failed to rename: %(error)s" msgstr "Nie udało się zmienić nazwy: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1078 +#: ../flask_admin/contrib/fileadmin/__init__.py:1119 #, python-format msgid "Rename %(name)s" msgstr "Zmień nazwę %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1115 +#: ../flask_admin/contrib/fileadmin/__init__.py:1155 #, python-format msgid "Error saving changes to %(name)s." msgstr "Wystąpił błąd podczas zapisywania zmian na %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1119 +#: ../flask_admin/contrib/fileadmin/__init__.py:1159 #, python-format msgid "Changes to %(name)s saved successfully." msgstr "Zmiany %(name)s zapisane pomyślnie." -#: ../flask_admin/contrib/fileadmin/__init__.py:1128 +#: ../flask_admin/contrib/fileadmin/__init__.py:1167 #, python-format msgid "Error reading %(name)s." msgstr "Błąd odczytu %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1131 -#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/contrib/fileadmin/__init__.py:1170 +#: ../flask_admin/contrib/fileadmin/__init__.py:1179 #, python-format msgid "Unexpected error while reading from %(name)s" msgstr "Wystąpił nieoczekiwany błąd podczas odczytu z %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1137 +#: ../flask_admin/contrib/fileadmin/__init__.py:1176 #, python-format msgid "Cannot edit %(name)s." msgstr "Nie można edytować %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1155 +#: ../flask_admin/contrib/fileadmin/__init__.py:1194 #, python-format msgid "Editing %(path)s" msgstr "Edycja %(path)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/peewee/view.py:487 -#: ../flask_admin/contrib/pymongo/view.py:384 -#: ../flask_admin/contrib/sqla/view.py:1149 +#: ../flask_admin/contrib/fileadmin/__init__.py:1202 +#: ../flask_admin/contrib/peewee/view.py:510 +#: ../flask_admin/contrib/pymongo/view.py:385 +#: ../flask_admin/contrib/sqla/view.py:1241 msgid "Delete" msgstr "Usuń" -#: ../flask_admin/contrib/fileadmin/__init__.py:1164 +#: ../flask_admin/contrib/fileadmin/__init__.py:1203 msgid "Are you sure you want to delete these files?" msgstr "Czy na pewno chcesz usunąć te pliki?" -#: ../flask_admin/contrib/fileadmin/__init__.py:1167 +#: ../flask_admin/contrib/fileadmin/__init__.py:1206 msgid "File deletion is disabled." msgstr "Usuwanie pliku jest wyłączone." -#: ../flask_admin/contrib/fileadmin/__init__.py:1180 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:22 +#: ../flask_admin/contrib/fileadmin/__init__.py:1219 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:22 msgid "Edit" msgstr "Edycja" -#: ../flask_admin/contrib/fileadmin/s3.py:153 +#: ../flask_admin/contrib/fileadmin/s3.py:162 msgid "Cannot operate on non empty directories" msgstr "Nie może operować na niepustych katalogach" #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 -#: ../flask_admin/contrib/sqla/filters.py:41 +#: ../flask_admin/contrib/sqla/filters.py:42 msgid "equals" msgstr "jest równe" #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 -#: ../flask_admin/contrib/sqla/filters.py:49 +#: ../flask_admin/contrib/sqla/filters.py:50 msgid "not equal" msgstr "nie równe" #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 -#: ../flask_admin/contrib/sqla/filters.py:58 +#: ../flask_admin/contrib/sqla/filters.py:59 msgid "contains" msgstr "zawiera" #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 -#: ../flask_admin/contrib/sqla/filters.py:67 +#: ../flask_admin/contrib/sqla/filters.py:68 msgid "not contains" msgstr "nie zawiera" #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 -#: ../flask_admin/contrib/sqla/filters.py:75 +#: ../flask_admin/contrib/sqla/filters.py:76 msgid "greater than" msgstr "większe niż" #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 -#: ../flask_admin/contrib/sqla/filters.py:83 +#: ../flask_admin/contrib/sqla/filters.py:84 msgid "smaller than" msgstr "mniejsze niż" #: ../flask_admin/contrib/peewee/filters.py:88 -#: ../flask_admin/contrib/sqla/filters.py:94 +#: ../flask_admin/contrib/sqla/filters.py:95 msgid "empty" msgstr "puste" #: ../flask_admin/contrib/peewee/filters.py:102 -#: ../flask_admin/contrib/sqla/filters.py:108 +#: ../flask_admin/contrib/sqla/filters.py:109 msgid "in list" msgstr "na liście" #: ../flask_admin/contrib/peewee/filters.py:111 -#: ../flask_admin/contrib/sqla/filters.py:118 +#: ../flask_admin/contrib/sqla/filters.py:119 msgid "not in list" msgstr "nie na liście" @@ -282,44 +272,37 @@ msgstr "nie na liście" msgid "not between" msgstr "nie pomiędzy" -msgid "ObjectId equals" -msgstr "" - -#, python-format -msgid "Failed to get model. %(error)s" -msgstr "Nie udało się uzyskać modelu. %(error)s" - -#: ../flask_admin/contrib/peewee/view.py:435 -#: ../flask_admin/contrib/pymongo/view.py:316 -#: ../flask_admin/contrib/sqla/view.py:1078 +#: ../flask_admin/contrib/peewee/view.py:458 +#: ../flask_admin/contrib/pymongo/view.py:317 +#: ../flask_admin/contrib/sqla/view.py:1170 #, python-format msgid "Failed to create record. %(error)s" msgstr "Nie udało się utworzyć rekordu. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:454 -#: ../flask_admin/contrib/pymongo/view.py:341 -#: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 -#: ../flask_admin/model/base.py:2313 ../flask_admin/model/base.py:2315 +#: ../flask_admin/contrib/peewee/view.py:477 +#: ../flask_admin/contrib/pymongo/view.py:342 +#: ../flask_admin/contrib/sqla/view.py:1196 ../flask_admin/model/base.py:2463 +#: ../flask_admin/model/base.py:2471 ../flask_admin/model/base.py:2473 #, python-format msgid "Failed to update record. %(error)s" msgstr "Nie udało się zaktualizować rekordu. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:469 -#: ../flask_admin/contrib/pymongo/view.py:366 -#: ../flask_admin/contrib/sqla/view.py:1129 +#: ../flask_admin/contrib/peewee/view.py:492 +#: ../flask_admin/contrib/pymongo/view.py:367 +#: ../flask_admin/contrib/sqla/view.py:1221 #, python-format msgid "Failed to delete record. %(error)s" msgstr "Nie można usunąć rekordu. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:488 -#: ../flask_admin/contrib/pymongo/view.py:385 -#: ../flask_admin/contrib/sqla/view.py:1150 +#: ../flask_admin/contrib/peewee/view.py:511 +#: ../flask_admin/contrib/pymongo/view.py:386 +#: ../flask_admin/contrib/sqla/view.py:1242 msgid "Are you sure you want to delete selected records?" msgstr "Czy na pewno chcesz usunąć zaznaczone rekordy?" -#: ../flask_admin/contrib/peewee/view.py:505 -#: ../flask_admin/contrib/pymongo/view.py:395 -#: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 +#: ../flask_admin/contrib/peewee/view.py:528 +#: ../flask_admin/contrib/pymongo/view.py:396 +#: ../flask_admin/contrib/sqla/view.py:1258 ../flask_admin/model/base.py:2272 #, python-format msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." @@ -327,33 +310,33 @@ msgstr[0] "Rekord został pomyślnie usunięty." msgstr[1] "%(count)s rekordy zostały pomyślnie usunięte." msgstr[2] "%(count)s rekordy zostały pomyślnie usunięte." -#: ../flask_admin/contrib/peewee/view.py:511 -#: ../flask_admin/contrib/pymongo/view.py:400 -#: ../flask_admin/contrib/sqla/view.py:1174 +#: ../flask_admin/contrib/peewee/view.py:534 +#: ../flask_admin/contrib/pymongo/view.py:401 +#: ../flask_admin/contrib/sqla/view.py:1266 #, python-format msgid "Failed to delete records. %(error)s" msgstr "Nie można usunąć rekordów. %(error)s" -#: ../flask_admin/contrib/sqla/fields.py:126 -#: ../flask_admin/contrib/sqla/fields.py:176 -#: ../flask_admin/contrib/sqla/fields.py:181 ../flask_admin/model/fields.py:173 -#: ../flask_admin/model/fields.py:222 +#: ../flask_admin/contrib/sqla/fields.py:117 +#: ../flask_admin/contrib/sqla/fields.py:167 +#: ../flask_admin/contrib/sqla/fields.py:172 ../flask_admin/model/fields.py:174 +#: ../flask_admin/model/fields.py:223 msgid "Not a valid choice" msgstr "Nieprawidłowy wybór" -#: ../flask_admin/contrib/sqla/fields.py:186 +#: ../flask_admin/contrib/sqla/fields.py:201 msgid "Key" msgstr "Klucz" -#: ../flask_admin/contrib/sqla/fields.py:187 +#: ../flask_admin/contrib/sqla/fields.py:202 msgid "Value" msgstr "Wartość" -#: ../flask_admin/contrib/sqla/validators.py:42 +#: ../flask_admin/contrib/sqla/validators.py:28 msgid "Already exists." msgstr "Już istnieje." -#: ../flask_admin/contrib/sqla/validators.py:60 +#: ../flask_admin/contrib/sqla/validators.py:59 #, python-format msgid "At least %(num)d item is required" msgid_plural "At least %(num)d items are required" @@ -361,7 +344,15 @@ msgstr[0] "Przynajmniej %(num)d element jest wymagany" msgstr[1] "Przynajmniej %(num)d elementy są wymagane" msgstr[2] "Przynajmniej %(num)d elementów jest wymaganych" -#: ../flask_admin/contrib/sqla/view.py:1057 +#: ../flask_admin/contrib/sqla/validators.py:75 +msgid "Not a valid ISO currency code (e.g. USD, EUR, CNY)." +msgstr "" + +#: ../flask_admin/contrib/sqla/validators.py:83 +msgid "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." +msgstr "" + +#: ../flask_admin/contrib/sqla/view.py:1134 #, python-format msgid "Integrity error. %(message)s" msgstr "Błąd integralności. %(message)s" @@ -370,274 +361,242 @@ msgstr "Błąd integralności. %(message)s" msgid "Invalid time format" msgstr "Nieprawidłowy format czasu" -#: ../flask_admin/form/fields.py:144 +#: ../flask_admin/form/fields.py:147 msgid "Invalid Choice: could not coerce" msgstr "Nieprawidłowy wybór: nie można zmusić" -#: ../flask_admin/form/fields.py:208 +#: ../flask_admin/form/fields.py:221 msgid "Invalid JSON" msgstr "Nieprawidłowy JSON" -#: ../flask_admin/form/upload.py:207 +#: ../flask_admin/form/upload.py:216 msgid "Invalid file extension" msgstr "Nieprawidłowe rozszerzenie pliku" -#: ../flask_admin/form/upload.py:214 ../flask_admin/form/upload.py:281 +#: ../flask_admin/form/upload.py:223 ../flask_admin/form/upload.py:293 #, python-format msgid "File \"%s\" already exists." msgstr "Plik \"%s\" już istnieje." -#: ../flask_admin/model/base.py:1649 +#: ../flask_admin/form/validators.py:16 +msgid "This field requires at least one item." +msgstr "" + +#: ../flask_admin/model/base.py:1737 msgid "There are no items in the table." msgstr "Nie istnieją pozycje w tabeli." -#: ../flask_admin/model/base.py:1673 +#: ../flask_admin/model/base.py:1746 #, python-format msgid "Invalid Filter Value: %(value)s" msgstr "Nieprawidłowa wartość filtru: %(value)s" -#: ../flask_admin/model/base.py:1984 +#: ../flask_admin/model/base.py:2136 msgid "Record was successfully created." msgstr "Rekord został utworzony pomyślnie." -#: ../flask_admin/model/base.py:2028 ../flask_admin/model/base.py:2080 -#: ../flask_admin/model/base.py:2113 ../flask_admin/model/base.py:2297 +#: ../flask_admin/model/base.py:2180 ../flask_admin/model/base.py:2232 +#: ../flask_admin/model/base.py:2265 ../flask_admin/model/base.py:2455 msgid "Record does not exist." msgstr "Rekord nie istnieje." -#: ../flask_admin/model/base.py:2037 ../flask_admin/model/base.py:2301 +#: ../flask_admin/model/base.py:2189 ../flask_admin/model/base.py:2459 msgid "Record was successfully saved." msgstr "Rekord został pomyślnie zapisany." -#: ../flask_admin/model/base.py:2222 -msgid "Tablib dependency not installed." -msgstr "Zależność Tablib nie zainstalowana." - -#: ../flask_admin/model/base.py:2249 +#: ../flask_admin/model/base.py:2407 #, python-format msgid "Export type \"%(type)s not supported." msgstr "Niewspierany typ eksportowy \"%(type)s." -#: ../flask_admin/model/filters.py:103 ../flask_admin/model/widgets.py:111 +#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:119 msgid "Yes" msgstr "Tak" -#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:110 +#: ../flask_admin/model/filters.py:105 ../flask_admin/model/widgets.py:118 msgid "No" msgstr "Nie" -#: ../flask_admin/model/filters.py:172 ../flask_admin/model/filters.py:212 -#: ../flask_admin/model/filters.py:257 +#: ../flask_admin/model/filters.py:173 ../flask_admin/model/filters.py:213 +#: ../flask_admin/model/filters.py:258 msgid "between" msgstr "pomiędzy" -#: ../flask_admin/model/template.py:81 ../flask_admin/model/template.py:88 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:37 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:8 +#: ../flask_admin/model/template.py:83 ../flask_admin/model/template.py:90 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:7 msgid "View Record" msgstr "Zobacz rekord" -#: ../flask_admin/model/template.py:95 ../flask_admin/model/template.py:102 -#: ../flask_admin/model/template.py:109 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/edit.html:11 +#: ../flask_admin/model/template.py:97 ../flask_admin/model/template.py:104 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/edit.html:10 msgid "Edit Record" msgstr "Edytuj Rekord" -#: ../flask_admin/model/widgets.py:61 +#: ../flask_admin/model/template.py:111 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Delete Record" +msgstr "" + +#: ../flask_admin/model/widgets.py:62 msgid "Please select model" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/actions.html:4 -#: ../flask_admin/templates/bootstrap3/admin/actions.html:4 +#: ../flask_admin/templates/bootstrap4/admin/actions.html:5 msgid "With selected" msgstr "Z wybranych" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:200 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:190 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:216 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:227 msgid "Save" msgstr "Zapisz" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:205 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:195 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:221 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:232 msgid "Cancel" msgstr "Anuluj" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:256 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:247 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:290 msgid "Save and Add Another" msgstr "Zapisz i dodaj kolejny" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:259 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:250 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:293 msgid "Save and Continue Editing" msgstr "Zapisz i kontynuuj edycję" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:9 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:9 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:10 msgid "Root" msgstr "Korzeń" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:90 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:99 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:89 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:98 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:42 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:51 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:89 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:98 #, python-format msgid "Sort by %(name)s" msgstr "Sortuj według %(name)s" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:77 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:79 msgid "Rename File" msgstr "Zmień nazwę pliku" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:88 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:88 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:90 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\' recursively?" msgstr "Czy na pewno chcesz usunąć rekursywnie \\'%(name)s\\'?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:97 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:97 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:99 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\'?" msgstr "Czy na pewno chcesz usunąć \\'%(name)s\\'?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:125 -msgid "Size" -msgstr "" - -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:185 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:187 msgid "Please select at least one file." msgstr "Wybierz co najmniej jeden plik." -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:8 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:17 msgid "List" msgstr "Lista" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:12 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:18 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 msgid "Create" msgstr "Tworzenie" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:26 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:26 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:21 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:26 msgid "Details" msgstr "Szczegóły" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:29 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:28 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:15 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:28 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:15 msgid "Filter" msgstr "Filtr" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:13 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:14 msgid "Delete?" msgstr "Usunąć?" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:33 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:16 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:35 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Are you sure you want to delete this record?" +msgstr "Czy na pewno chcesz usunąć ten rekord?" + +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:33 msgid "New" msgstr "Nowy" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:43 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:43 msgid "Add" msgstr "Dodaj" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:3 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:3 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:2 msgid "Add Filter" msgstr "Dodaj filtr" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:30 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:19 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:26 msgid "Export" msgstr "Eksport" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:38 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:38 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:49 msgid "Apply" msgstr "Zastosuj" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:40 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:51 msgid "Reset Filters" msgstr "Zresetuj filtry" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:66 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:64 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:80 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:93 +#, python-format +msgid "%(placeholder)s" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:88 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:94 msgid "Search" msgstr "Szukaj" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:74 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:77 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:78 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:79 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:72 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:75 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:76 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:77 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:102 msgid "items" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/create.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/create.html:10 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/create.html:10 msgid "Create New Record" msgstr "Utwórz nowy rekord" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:76 msgid "Select all records" msgstr "Zaznacz wszystkie rekordy" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:120 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:119 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:119 msgid "Select record" msgstr "Zaznacz rekord" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:186 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:195 msgid "Please select at least one record." msgstr "Wybierz co najmniej jeden rekord." -#: ../flask_admin/templates/bootstrap2/admin/model/row_actions.html:34 -#: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 -msgid "Are you sure you want to delete this record?" -msgstr "Czy na pewno chcesz usunąć ten rekord?" +#~ msgid "ObjectId equals" +#~ msgstr "" + +#~ msgid "Failed to get model. %(error)s" +#~ msgstr "Nie udało się uzyskać modelu. %(error)s" + +#~ msgid "Tablib dependency not installed." +#~ msgstr "Zależność Tablib nie zainstalowana." + +#~ msgid "Size" +#~ msgstr "" + diff --git a/flask_admin/translations/pt/LC_MESSAGES/admin.mo b/flask_admin/translations/pt/LC_MESSAGES/admin.mo index 804cc383f295b5565e903b236a004d0ca3e59dad..b6d3c3f61a1f2d2ba0dbcc30f9d6ffa6fd508fb0 100644 GIT binary patch delta 1853 zcmYM!Z%oxy9LMqRPryImg?mXsE?4-G{}8?Gaz`+Tr8(5v5ZS_IPDgh@aa{xzbJnP< z58B)m#`qOA|Ezyo&K{+AJrFDBrkfAgte&(6wKk?3InADs_@H`!<ZQ9a@AW(9{(k3t z&-s4Oz1+O;ROYwh+z*YvSNM<d-<G4+|9`_v&D8ZS=HqcJ!c&-sXR!%C$2iVl9p*1H z+lnpDH14E5fjnX}xY{gZv)pW=V_~tws+OB^YmKM}w_zA}VFX`v{b|&5gUCR3)U`*k zmi7cz;tl6*%%z>T!mI%EG0gl{!c8e1o3IMEp(ak@2JFKpan!Xhq6Yri_5Y3QXh+$e za(o6W@Br$)w^7fZ#m)FFmf;<YGXLXn3Za~^WDRPdCR8B%P>~-*r6`3yzK0t46I_W` zu>_~E7-wDoJU&4?hleyysWXO|C3IAAqZiiWDr|J^HuPzCp;mGXHNh9Ie-ii5o<^;B zb7-+Po<rue{ixLRARl{&ivl>|90{@insA&BZOM7mim#ypx`}*jnu}^+4&(R;w_r8f zrIdA|k4JDTeuN6(y7LF*6`Mg7^B<_%xnIcsQx`T*hpPEsQ~-IDIE%8Cs0YhX16H~I zIFfd2cKxlczXQiSvqSFt`$Vn4A9B(AE2v<Nw;G?twHa=b+;m|Jj$=LE!aB@l8+2?M zP=OBPdVC*i@henHenAEF0JV@usEL($<vzki6K_C`6UVifX>c8#n4sejYT!}S7JrA@ zkvU{h_5g|PaiJ);#pJIBt5E~LfC}&+syL71M*Iv_LpM<=ySv!VScp+n)d|!Cdr-$| z5PkdrmGf_qMcJ(Te%`gCEMGei=TeQWsDS%XD;`20hfxbVhYD~C3w8eg;zrf0AAu-T zB4uFBsG@uxHDEWYdJj7XP{(u#8N$X;0iH+g+$8F}-$7!v@S4T(HsW5|+i?x^+ZZ?6 z(hI1ZT|w>06e^H8R8AkF0{I6OSRNNWSBc7f3o56(kStjbvdeZ9bt*<MiIb?EzK0pT z5N6rRRV^xzc2urkMuN9N)Ui2%3gi@OYsX#twDVI`AYY<t;cMha&Mu=)({=a#kEj5r zqYR@L{)}d8mL2o5KP`XV3wrZ^&-N7D@+#ZXZw*;{s=wFT2lx#6DgQ|7wRDf)-8Yc# z?hOuy`m=XKyS<>XXe78@bRgIn?g-9=CnCxEc%mtutoM`2=0ww$L|w2W@@h_3M`v&$ z(&{}O+>5-CTh~yV$fk<F_p-ZJUGjp8l3%msr8P?mG->Khrt9ww_Lr>-PL^e|712H~ UI9dL2&>HIqPRCvf7Gm4~14GitDF6Tf delta 2368 zcma*neN5F=9LMo<dC)-M@*rM8lwY8r@*to=nrksZu?)zkEp4_7{9@NG_g=Uc5VpG5 zAO4{^TfdykX4BTz?1BEcZdon=u-VF0*0kkpIdlEt%2ifd;o9u|iPPFzTQcr_orm8! z=X<{A{O;6UZ?8&TF3dP+_#5O?#^>d9)&BXbooS4k>M$D{(T}S!6F1;W+=zAfG&bTp zSc})KC3hIpPJJ!T&~sR9OwxE1s%bcG{d~H^Od(^9KWlnG0Q0FYzye%m+gnl3bs!U( zZd-p0>#0Yu9FJJv!wl+Q<1E%US1D-XA25Ko@J<Y{T}8SQ7vg=m2wkkeeYQS{THu0h z{}n5#2WAm0-h=aSo2`$a#vjCT);A|9EWwLdf@wL%lwuj?VT*MwYN9Quzy?t}*@Zf~ zC(yyesDR!@{>@i>&B1F}h_`HeVJ`VEqM@9E&UiU$!WQdl+un+4w6~)s=s?|p?Km4B zx9t<?Q1?(fJb{}3OH=^g+x|3m^&s`iJo2v;4bq?qpFxsfj-t-;b!3b=jSB2D>ldhn zFQGE_BPt_VOrikuQR6C6;~G&%+>CX&4r_4OPyTh*$7pcyee1VaOFffO3aANn+wZmY zHq-*$sLbs^UBVvZ-kP1L=i{ir#*nO=3Dk4@ZU4a}1ugJ`ec%=3{+ScD{giD#i~D?} z()RbVO^Rj!HU3G|#Cx$7pT#D;fU9vP=dc3XP_O40>UB)MMnMtZz=e1dtFfH?*5f+V z*^QtA+mG7WAyfcIkRfIg6~JlKd}nb!p11WI*g*XzYTg>omm^4;Z4{KEJxJEge$@MY z1o<~_^0gGtpeFta73h?80nzEUufZzpMP0tVsH1(u*3Y4y`x*7N6!NZD=>1<tLGSBE zbZ`W9Ne&^|GiPl7MO*&^nZx+!8nYOyP#fq%Wne2hxC6D*Br4!Z<er-Is7rqpOIhFe zxWeivL*3>YzI3VDQ4_C6-QsTBzQxubM*SY_KxJ+m71&->;Kz^@n-i$tmn*2F%I3#~ z<e3GSq|L0L(1o2yQ07I{5xj*u<Bw1&yMzk#H`E=N!RiVy2Q^O->bW}9UAZ512R5S? z9ztzo4{{C6zIo(duh~%=bXz|`ot<WJpb|Af8|v(OP=Pg9`^&JQD}VqQgM?zHXy z0CglE+xi9TB~*Y{%I==NRNvW-Uyz?~GlhCzGgw^@7NB-8&(@dCPmRx*@KpsPk!Zq+ z#@wM`!gZn%C&I@ah$Y6HzR-}{n}`mD+<5BunK9qO_Fb{)P{K)!#ayRi(PFtI&VYmy zAC9TZ?W_0tv%bmdcN5M)w9gHDdD(MP9ogr61rNAmW<w~RFrC2x*L1q0o|6;sclGRK ziS>PsJ2)H+$Gzs9fuioP8;rY7+zrz;Jx%JRoDN@lXx#O#<sK*x_Jl({PM;fdBYke9 zckHhSLXmhP7!E6f;k-xEgW+NC)4WZYp@cgS_Z<JBg2tA*hNilP7N?<MmCDWDhyH%A zDZkAd%^yr(UcVxBJ^z%idd+Pn<alA~HWRXa_T`LdPr~(f7Z-WC#aXG9#Y@wQ{?12m z$aF?+Mk0aAyniL+Kw$TOCd5BC<jdHkjEt5%?`;0Rl=w>@%G^p$T<_7+Z8j+<OI!a0 Djt^3& diff --git a/flask_admin/translations/pt/LC_MESSAGES/admin.po b/flask_admin/translations/pt/LC_MESSAGES/admin.po index 660748539..94c5108ad 100644 --- a/flask_admin/translations/pt/LC_MESSAGES/admin.po +++ b/flask_admin/translations/pt/LC_MESSAGES/admin.po @@ -1,275 +1,264 @@ + msgid "" msgstr "" -"Project-Id-Version: flask-admin\n" +"Project-Id-Version: flask-admin\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-02-07 00:17-0600\n" +"POT-Creation-Date: 2024-09-24 22:09+0100\n" "PO-Revision-Date: 2017-02-07 01:19-0500\n" "Last-Translator: mrjoes <serge.koval@gmail.com>\n" +"Language: pt_PT\n" "Language-Team: Portuguese\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.1.1\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: flask-admin\n" -"X-Crowdin-Language: pt-PT\n" -"X-Crowdin-File: admin.pot\n" -"Language: pt_PT\n" +"Generated-By: Babel 2.16.0\n" -#: ../flask_admin/base.py:440 +#: ../flask_admin/base.py:458 msgid "Home" msgstr "Início" -#: ../flask_admin/contrib/rediscli.py:127 +#: ../flask_admin/contrib/rediscli.py:113 msgid "Cli: Invalid command." msgstr "Cli: Comando inválido" -#: ../flask_admin/contrib/fileadmin/__init__.py:352 +#: ../flask_admin/contrib/fileadmin/__init__.py:376 msgid "File to upload" msgstr "Ficheiro para carregar" -#: ../flask_admin/contrib/fileadmin/__init__.py:360 +#: ../flask_admin/contrib/fileadmin/__init__.py:384 msgid "File required." msgstr "Arquivo requerido." -#: ../flask_admin/contrib/fileadmin/__init__.py:365 +#: ../flask_admin/contrib/fileadmin/__init__.py:389 msgid "Invalid file type." msgstr "Tipo de arquivo inválido." -#: ../flask_admin/contrib/fileadmin/__init__.py:376 +#: ../flask_admin/contrib/fileadmin/__init__.py:400 msgid "Content" msgstr "Conteúdo" -#: ../flask_admin/contrib/fileadmin/__init__.py:390 +#: ../flask_admin/contrib/fileadmin/__init__.py:414 msgid "Invalid name" msgstr "Nome inválido" -#: ../flask_admin/contrib/fileadmin/__init__.py:398 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:106 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:112 -#: ../flask_admin/tests/sqla/test_translation.py:17 +#: ../flask_admin/contrib/fileadmin/__init__.py:422 +#: ../flask_admin/tests/sqla/test_translation.py:21 msgid "Name" msgstr "Nome" -#: ../flask_admin/contrib/fileadmin/__init__.py:757 +#: ../flask_admin/contrib/fileadmin/__init__.py:784 #, python-format msgid "File \"%(name)s\" already exists." msgstr "O arquivo \"%(name)s\" já existe." -#: ../flask_admin/contrib/fileadmin/__init__.py:802 -#: ../flask_admin/contrib/fileadmin/__init__.py:885 -#: ../flask_admin/contrib/fileadmin/__init__.py:947 -#: ../flask_admin/contrib/fileadmin/__init__.py:1000 -#: ../flask_admin/contrib/fileadmin/__init__.py:1047 -#: ../flask_admin/contrib/fileadmin/__init__.py:1099 -#: ../flask_admin/model/base.py:2168 +#: ../flask_admin/contrib/fileadmin/__init__.py:829 +#: ../flask_admin/contrib/fileadmin/__init__.py:926 +#: ../flask_admin/contrib/fileadmin/__init__.py:988 +#: ../flask_admin/contrib/fileadmin/__init__.py:1041 +#: ../flask_admin/contrib/fileadmin/__init__.py:1088 +#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/model/base.py:2324 msgid "Permission denied." msgstr "Permissão negada." -#: ../flask_admin/contrib/fileadmin/__init__.py:881 +#: ../flask_admin/contrib/fileadmin/__init__.py:922 msgid "File uploading is disabled." msgstr "O Upload de arquivos está desabilitado." -#: ../flask_admin/contrib/fileadmin/__init__.py:892 +#: ../flask_admin/contrib/fileadmin/__init__.py:933 #, python-format msgid "Successfully saved file: %(name)s" msgstr "Arquivo salvo com êxito: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:896 +#: ../flask_admin/contrib/fileadmin/__init__.py:937 #, python-format msgid "Failed to save file: %(error)s" msgstr "Falha ao gravar arquivo: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:904 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:150 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:150 +#: ../flask_admin/contrib/fileadmin/__init__.py:945 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:150 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:152 msgid "Upload File" msgstr "Carregar Ficheiro" -#: ../flask_admin/contrib/fileadmin/__init__.py:943 +#: ../flask_admin/contrib/fileadmin/__init__.py:984 msgid "Directory creation is disabled." msgstr "A criação de diretórios está desabilitada." -#: ../flask_admin/contrib/fileadmin/__init__.py:956 +#: ../flask_admin/contrib/fileadmin/__init__.py:997 #, python-format msgid "Successfully created directory: %(directory)s" msgstr "Diretório criado com sucesso: %(directory)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:960 +#: ../flask_admin/contrib/fileadmin/__init__.py:1001 #, python-format msgid "Failed to create directory: %(error)s" msgstr "Falha ao criar diretório: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:970 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:161 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:161 +#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:161 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:163 msgid "Create Directory" msgstr "Criar diretório" -#: ../flask_admin/contrib/fileadmin/__init__.py:996 +#: ../flask_admin/contrib/fileadmin/__init__.py:1037 msgid "Deletion is disabled." msgstr "Exclusão está desabilitada." -#: ../flask_admin/contrib/fileadmin/__init__.py:1005 +#: ../flask_admin/contrib/fileadmin/__init__.py:1046 msgid "Directory deletion is disabled." msgstr "Exclusão de diretórios está desabilitada" -#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/contrib/fileadmin/__init__.py:1052 #, python-format msgid "Directory \"%(path)s\" was successfully deleted." msgstr "Diretório \"%(path)s\" foi excluído com sucesso." -#: ../flask_admin/contrib/fileadmin/__init__.py:1013 +#: ../flask_admin/contrib/fileadmin/__init__.py:1054 #, python-format msgid "Failed to delete directory: %(error)s" msgstr "Falha ao excluir diretório: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1019 -#: ../flask_admin/contrib/fileadmin/__init__.py:1176 +#: ../flask_admin/contrib/fileadmin/__init__.py:1060 +#: ../flask_admin/contrib/fileadmin/__init__.py:1215 #, python-format msgid "File \"%(name)s\" was successfully deleted." msgstr "Arquivo \"%(name)s\" foi excluído com sucesso." -#: ../flask_admin/contrib/fileadmin/__init__.py:1021 -#: ../flask_admin/contrib/fileadmin/__init__.py:1178 +#: ../flask_admin/contrib/fileadmin/__init__.py:1062 +#: ../flask_admin/contrib/fileadmin/__init__.py:1217 #, python-format msgid "Failed to delete file: %(name)s" msgstr "Falha ao excluir arquivo: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1043 +#: ../flask_admin/contrib/fileadmin/__init__.py:1084 msgid "Renaming is disabled." msgstr "Renomear está desabilitado." -#: ../flask_admin/contrib/fileadmin/__init__.py:1051 +#: ../flask_admin/contrib/fileadmin/__init__.py:1092 msgid "Path does not exist." msgstr "O caminho não existe." -#: ../flask_admin/contrib/fileadmin/__init__.py:1061 +#: ../flask_admin/contrib/fileadmin/__init__.py:1102 #, python-format msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\"" msgstr "Renomeado com sucesso: de \"%(src)s\" para \"%(dst)s\"" -#: ../flask_admin/contrib/fileadmin/__init__.py:1064 +#: ../flask_admin/contrib/fileadmin/__init__.py:1105 #, python-format msgid "Failed to rename: %(error)s" msgstr "Falha ao renomear: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1078 +#: ../flask_admin/contrib/fileadmin/__init__.py:1119 #, python-format msgid "Rename %(name)s" msgstr "Renomeie %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1115 +#: ../flask_admin/contrib/fileadmin/__init__.py:1155 #, python-format msgid "Error saving changes to %(name)s." msgstr "Erro ao salvar alterações para %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1119 +#: ../flask_admin/contrib/fileadmin/__init__.py:1159 #, python-format msgid "Changes to %(name)s saved successfully." msgstr "Alterações para %(name)s salvas com sucesso." -#: ../flask_admin/contrib/fileadmin/__init__.py:1128 +#: ../flask_admin/contrib/fileadmin/__init__.py:1167 #, python-format msgid "Error reading %(name)s." msgstr "Erro ao ler %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1131 -#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/contrib/fileadmin/__init__.py:1170 +#: ../flask_admin/contrib/fileadmin/__init__.py:1179 #, python-format msgid "Unexpected error while reading from %(name)s" msgstr "Erro inesperado ao ler %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1137 +#: ../flask_admin/contrib/fileadmin/__init__.py:1176 #, python-format msgid "Cannot edit %(name)s." msgstr "Não é ṕossível editar %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1155 +#: ../flask_admin/contrib/fileadmin/__init__.py:1194 #, python-format msgid "Editing %(path)s" msgstr "Edição %(path)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/peewee/view.py:487 -#: ../flask_admin/contrib/pymongo/view.py:384 -#: ../flask_admin/contrib/sqla/view.py:1149 +#: ../flask_admin/contrib/fileadmin/__init__.py:1202 +#: ../flask_admin/contrib/peewee/view.py:510 +#: ../flask_admin/contrib/pymongo/view.py:385 +#: ../flask_admin/contrib/sqla/view.py:1241 msgid "Delete" msgstr "Excluir" -#: ../flask_admin/contrib/fileadmin/__init__.py:1164 +#: ../flask_admin/contrib/fileadmin/__init__.py:1203 msgid "Are you sure you want to delete these files?" msgstr "Você tem certeza que deseja excluir estes arquivos?" -#: ../flask_admin/contrib/fileadmin/__init__.py:1167 +#: ../flask_admin/contrib/fileadmin/__init__.py:1206 msgid "File deletion is disabled." msgstr "Exclusão de arquivos desabilitada." -#: ../flask_admin/contrib/fileadmin/__init__.py:1180 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:22 +#: ../flask_admin/contrib/fileadmin/__init__.py:1219 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:22 msgid "Edit" msgstr "Editar" -#: ../flask_admin/contrib/fileadmin/s3.py:153 +#: ../flask_admin/contrib/fileadmin/s3.py:162 msgid "Cannot operate on non empty directories" msgstr "" #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 -#: ../flask_admin/contrib/sqla/filters.py:41 +#: ../flask_admin/contrib/sqla/filters.py:42 msgid "equals" msgstr "igual" #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 -#: ../flask_admin/contrib/sqla/filters.py:49 +#: ../flask_admin/contrib/sqla/filters.py:50 msgid "not equal" msgstr "diferente" #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 -#: ../flask_admin/contrib/sqla/filters.py:58 +#: ../flask_admin/contrib/sqla/filters.py:59 msgid "contains" msgstr "contém" #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 -#: ../flask_admin/contrib/sqla/filters.py:67 +#: ../flask_admin/contrib/sqla/filters.py:68 msgid "not contains" msgstr "não contém" #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 -#: ../flask_admin/contrib/sqla/filters.py:75 +#: ../flask_admin/contrib/sqla/filters.py:76 msgid "greater than" msgstr "maior que" #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 -#: ../flask_admin/contrib/sqla/filters.py:83 +#: ../flask_admin/contrib/sqla/filters.py:84 msgid "smaller than" msgstr "menor que" #: ../flask_admin/contrib/peewee/filters.py:88 -#: ../flask_admin/contrib/sqla/filters.py:94 +#: ../flask_admin/contrib/sqla/filters.py:95 msgid "empty" msgstr "vazio" #: ../flask_admin/contrib/peewee/filters.py:102 -#: ../flask_admin/contrib/sqla/filters.py:108 +#: ../flask_admin/contrib/sqla/filters.py:109 msgid "in list" msgstr "na lista" #: ../flask_admin/contrib/peewee/filters.py:111 -#: ../flask_admin/contrib/sqla/filters.py:118 +#: ../flask_admin/contrib/sqla/filters.py:119 msgid "not in list" msgstr "Não está na lista" @@ -282,84 +271,85 @@ msgstr "Não está na lista" msgid "not between" msgstr "Não entre" -msgid "ObjectId equals" -msgstr "" - -#, python-format -msgid "Failed to get model. %(error)s" -msgstr "Falha ao obter model. %(error)s" - -#: ../flask_admin/contrib/peewee/view.py:435 -#: ../flask_admin/contrib/pymongo/view.py:316 -#: ../flask_admin/contrib/sqla/view.py:1078 +#: ../flask_admin/contrib/peewee/view.py:458 +#: ../flask_admin/contrib/pymongo/view.py:317 +#: ../flask_admin/contrib/sqla/view.py:1170 #, python-format msgid "Failed to create record. %(error)s" msgstr "Falha ao criar model. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:454 -#: ../flask_admin/contrib/pymongo/view.py:341 -#: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 -#: ../flask_admin/model/base.py:2313 ../flask_admin/model/base.py:2315 +#: ../flask_admin/contrib/peewee/view.py:477 +#: ../flask_admin/contrib/pymongo/view.py:342 +#: ../flask_admin/contrib/sqla/view.py:1196 ../flask_admin/model/base.py:2463 +#: ../flask_admin/model/base.py:2471 ../flask_admin/model/base.py:2473 #, python-format msgid "Failed to update record. %(error)s" msgstr "Falha ao atualizar model. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:469 -#: ../flask_admin/contrib/pymongo/view.py:366 -#: ../flask_admin/contrib/sqla/view.py:1129 +#: ../flask_admin/contrib/peewee/view.py:492 +#: ../flask_admin/contrib/pymongo/view.py:367 +#: ../flask_admin/contrib/sqla/view.py:1221 #, python-format msgid "Failed to delete record. %(error)s" msgstr "Falha ao excluir model. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:488 -#: ../flask_admin/contrib/pymongo/view.py:385 -#: ../flask_admin/contrib/sqla/view.py:1150 +#: ../flask_admin/contrib/peewee/view.py:511 +#: ../flask_admin/contrib/pymongo/view.py:386 +#: ../flask_admin/contrib/sqla/view.py:1242 msgid "Are you sure you want to delete selected records?" msgstr "Você tem certeza que deseja excluir os models selecionados?" -#: ../flask_admin/contrib/peewee/view.py:505 -#: ../flask_admin/contrib/pymongo/view.py:395 -#: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 +#: ../flask_admin/contrib/peewee/view.py:528 +#: ../flask_admin/contrib/pymongo/view.py:396 +#: ../flask_admin/contrib/sqla/view.py:1258 ../flask_admin/model/base.py:2272 #, python-format msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." msgstr[0] "Registo eliminado com sucesso." msgstr[1] "%(count)s registos foram eliminados com sucesso." -#: ../flask_admin/contrib/peewee/view.py:511 -#: ../flask_admin/contrib/pymongo/view.py:400 -#: ../flask_admin/contrib/sqla/view.py:1174 +#: ../flask_admin/contrib/peewee/view.py:534 +#: ../flask_admin/contrib/pymongo/view.py:401 +#: ../flask_admin/contrib/sqla/view.py:1266 #, python-format msgid "Failed to delete records. %(error)s" msgstr "Falha ao excluir models. %(error)s" -#: ../flask_admin/contrib/sqla/fields.py:126 -#: ../flask_admin/contrib/sqla/fields.py:176 -#: ../flask_admin/contrib/sqla/fields.py:181 ../flask_admin/model/fields.py:173 -#: ../flask_admin/model/fields.py:222 +#: ../flask_admin/contrib/sqla/fields.py:117 +#: ../flask_admin/contrib/sqla/fields.py:167 +#: ../flask_admin/contrib/sqla/fields.py:172 ../flask_admin/model/fields.py:174 +#: ../flask_admin/model/fields.py:223 msgid "Not a valid choice" msgstr "Não é uma escolha válida" -#: ../flask_admin/contrib/sqla/fields.py:186 +#: ../flask_admin/contrib/sqla/fields.py:201 msgid "Key" msgstr "" -#: ../flask_admin/contrib/sqla/fields.py:187 +#: ../flask_admin/contrib/sqla/fields.py:202 msgid "Value" msgstr "" -#: ../flask_admin/contrib/sqla/validators.py:42 +#: ../flask_admin/contrib/sqla/validators.py:28 msgid "Already exists." msgstr "Já existe." -#: ../flask_admin/contrib/sqla/validators.py:60 +#: ../flask_admin/contrib/sqla/validators.py:59 #, python-format msgid "At least %(num)d item is required" msgid_plural "At least %(num)d items are required" msgstr[0] "" msgstr[1] "" -#: ../flask_admin/contrib/sqla/view.py:1057 +#: ../flask_admin/contrib/sqla/validators.py:75 +msgid "Not a valid ISO currency code (e.g. USD, EUR, CNY)." +msgstr "" + +#: ../flask_admin/contrib/sqla/validators.py:83 +msgid "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." +msgstr "" + +#: ../flask_admin/contrib/sqla/view.py:1134 #, python-format msgid "Integrity error. %(message)s" msgstr "Erro de integridade. %(message)s" @@ -368,274 +358,242 @@ msgstr "Erro de integridade. %(message)s" msgid "Invalid time format" msgstr "Formato de hora inválido" -#: ../flask_admin/form/fields.py:144 +#: ../flask_admin/form/fields.py:147 msgid "Invalid Choice: could not coerce" msgstr "Escolha inválida: não é possível converter" -#: ../flask_admin/form/fields.py:208 +#: ../flask_admin/form/fields.py:221 msgid "Invalid JSON" msgstr "JSON inválido" -#: ../flask_admin/form/upload.py:207 +#: ../flask_admin/form/upload.py:216 msgid "Invalid file extension" msgstr "Extensão de arquivo inválida" -#: ../flask_admin/form/upload.py:214 ../flask_admin/form/upload.py:281 +#: ../flask_admin/form/upload.py:223 ../flask_admin/form/upload.py:293 #, python-format msgid "File \"%s\" already exists." msgstr "O \"%s\" já existe." -#: ../flask_admin/model/base.py:1649 +#: ../flask_admin/form/validators.py:16 +msgid "This field requires at least one item." +msgstr "" + +#: ../flask_admin/model/base.py:1737 msgid "There are no items in the table." msgstr "Não existem itens na tabela." -#: ../flask_admin/model/base.py:1673 +#: ../flask_admin/model/base.py:1746 #, python-format msgid "Invalid Filter Value: %(value)s" msgstr "Valor de filtro inválido: %(value)s" -#: ../flask_admin/model/base.py:1984 +#: ../flask_admin/model/base.py:2136 msgid "Record was successfully created." msgstr "Model criado com sucesso." -#: ../flask_admin/model/base.py:2028 ../flask_admin/model/base.py:2080 -#: ../flask_admin/model/base.py:2113 ../flask_admin/model/base.py:2297 +#: ../flask_admin/model/base.py:2180 ../flask_admin/model/base.py:2232 +#: ../flask_admin/model/base.py:2265 ../flask_admin/model/base.py:2455 msgid "Record does not exist." msgstr "Registro não existe." -#: ../flask_admin/model/base.py:2037 ../flask_admin/model/base.py:2301 +#: ../flask_admin/model/base.py:2189 ../flask_admin/model/base.py:2459 msgid "Record was successfully saved." msgstr "Model salvo com sucesso." -#: ../flask_admin/model/base.py:2222 -msgid "Tablib dependency not installed." -msgstr "" - -#: ../flask_admin/model/base.py:2249 +#: ../flask_admin/model/base.py:2407 #, python-format msgid "Export type \"%(type)s not supported." msgstr "" -#: ../flask_admin/model/filters.py:103 ../flask_admin/model/widgets.py:111 +#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:119 msgid "Yes" msgstr "Sim" -#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:110 +#: ../flask_admin/model/filters.py:105 ../flask_admin/model/widgets.py:118 msgid "No" msgstr "Não" -#: ../flask_admin/model/filters.py:172 ../flask_admin/model/filters.py:212 -#: ../flask_admin/model/filters.py:257 +#: ../flask_admin/model/filters.py:173 ../flask_admin/model/filters.py:213 +#: ../flask_admin/model/filters.py:258 msgid "between" msgstr "entre" -#: ../flask_admin/model/template.py:81 ../flask_admin/model/template.py:88 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:37 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:8 +#: ../flask_admin/model/template.py:83 ../flask_admin/model/template.py:90 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:7 msgid "View Record" msgstr "Mostrar Registo" -#: ../flask_admin/model/template.py:95 ../flask_admin/model/template.py:102 -#: ../flask_admin/model/template.py:109 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/edit.html:11 +#: ../flask_admin/model/template.py:97 ../flask_admin/model/template.py:104 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/edit.html:10 msgid "Edit Record" msgstr "Editar Registro" -#: ../flask_admin/model/widgets.py:61 +#: ../flask_admin/model/template.py:111 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Delete Record" +msgstr "" + +#: ../flask_admin/model/widgets.py:62 msgid "Please select model" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/actions.html:4 -#: ../flask_admin/templates/bootstrap3/admin/actions.html:4 +#: ../flask_admin/templates/bootstrap4/admin/actions.html:5 msgid "With selected" msgstr "Com o(s) selecionado(s)" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:200 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:190 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:216 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:227 msgid "Save" msgstr "Salvar" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:205 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:195 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:221 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:232 msgid "Cancel" msgstr "Cancelar" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:256 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:247 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:290 msgid "Save and Add Another" msgstr "Guardar e Adicionar Outro" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:259 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:250 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:293 msgid "Save and Continue Editing" msgstr "Guardar e Continuar a Editar" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:9 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:9 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:10 msgid "Root" msgstr "Raíz" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:90 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:99 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:89 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:98 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:42 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:51 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:89 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:98 #, python-format msgid "Sort by %(name)s" msgstr "Ordenar por %(name)s" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:77 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:79 msgid "Rename File" msgstr "Renomear Arquivo" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:88 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:88 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:90 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\' recursively?" msgstr "Você tem certeza que deseja excluir \\'%(name)s\\' recursivamente?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:97 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:97 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:99 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\'?" msgstr "Você tem certeza que deseja excluir \\'%(name)s\\'?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:125 -msgid "Size" -msgstr "" - -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:185 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:187 msgid "Please select at least one file." msgstr "Por favor, selecione pelo menos um arquivo." -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:8 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:17 msgid "List" msgstr "Listar" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:12 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:18 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 msgid "Create" msgstr "Criar" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:26 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:26 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:21 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:26 msgid "Details" msgstr "Detalhes" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:29 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:28 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:15 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:28 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:15 msgid "Filter" msgstr "Filtro" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:13 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:14 msgid "Delete?" msgstr "Excluir?" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:33 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:16 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:35 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Are you sure you want to delete this record?" +msgstr "Você tem a certeza que deseja excluir este item?" + +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:33 msgid "New" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:43 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:43 msgid "Add" msgstr "Adicionar" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:3 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:3 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:2 msgid "Add Filter" msgstr "Adicionar Filtro" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:30 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:19 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:26 msgid "Export" msgstr "Exportar" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:38 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:38 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:49 msgid "Apply" msgstr "Aplicar" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:40 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:51 msgid "Reset Filters" msgstr "Limpar Filtros" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:66 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:64 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:80 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:93 +#, python-format +msgid "%(placeholder)s" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:88 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:94 msgid "Search" msgstr "Pesquisar" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:74 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:77 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:78 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:79 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:72 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:75 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:76 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:77 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:102 msgid "items" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/create.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/create.html:10 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/create.html:10 msgid "Create New Record" msgstr "Criar Novo Registro" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:76 msgid "Select all records" msgstr "Selecionar todos os registros" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:120 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:119 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:119 msgid "Select record" msgstr "Selecionar registro" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:186 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:195 msgid "Please select at least one record." msgstr "Por favor, selecione pelo menos um model." -#: ../flask_admin/templates/bootstrap2/admin/model/row_actions.html:34 -#: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 -msgid "Are you sure you want to delete this record?" -msgstr "Você tem a certeza que deseja excluir este item?" +#~ msgid "ObjectId equals" +#~ msgstr "" + +#~ msgid "Failed to get model. %(error)s" +#~ msgstr "Falha ao obter model. %(error)s" + +#~ msgid "Tablib dependency not installed." +#~ msgstr "" + +#~ msgid "Size" +#~ msgstr "" + diff --git a/flask_admin/translations/pt_BR/LC_MESSAGES/admin.mo b/flask_admin/translations/pt_BR/LC_MESSAGES/admin.mo index d7ce71923bfca5e42a7427ac257e381415e64765..efa3661fdb88faa209091705bea4f0d21d204075 100644 GIT binary patch delta 1859 zcmYM!e`wTo9LMqZU6<QBcemTr<$kzZ>N3w;cjs!I8!X*o2pY;T76XwPgzd)a&p<qC zK`IPtU;3fbiW-GTw7NfJgp)McsZ2tmh*d*nYePZpk6b0y^W}Y@vEAeI{(L|8`MkgH z&*!r@TmF11`)hgN9pfj%Uk!izA5irF&(BND)b$HKgjX?)H}OHdhiUW|nZ>acllT&D zz+=t}_zdwM$XBej*lf93*4k-2O2_lg*9s5p1TxmnpuRAPWq27QIOF>7pvEmC6PlG2 z;uY9PxC-lVyR#ny#6uWleH*5si9f(f`~vH761DIGuEE>57MD|oN3aDI??x@~hU*{2 z)x?unjW=)=76l96Ye0?PijT3r?W3_0J*>jdF@$;NkEn^}Pzm{$7T%x)wPhiUVhlC$ zHssebe5}A%u^iuW{hwe3@fc>cx8KrGN%GDqRR0z9;}56_e!^vV)5X5h!otf?6?p<R zaW`t=jC($a+lfa}mG~WXh9V*A&r4Z7udBU_BhRcImC#P-bEt)TP?dTaRf)r>#NI}I zZxpqaUtt{2VGQq}wzQU2qu7QUa8H=}D}f<8befN#;tx?1o<vn*9CgS}Bj?P{qsCuG zCGtH|6q`nkn@7!a+x6c=j*pd)o%$<K<Lk0CMto$08j$B`)3ht7f!9$J-onjz7gLz# zwRP<>*o2?r<2a35F~~kB(Osy+yBjy+AU5JD)M3xg(a^&Gpx&sMIxB$?(q(n11U8~3 zY{6RWaB(jti2G0zA48S)5~?zb$jjTmNbVM9pS9KXe5}{~Z>FJ%dohW9sEm(0&te1d zZ>U2S;$$gKqOM;z>J}V8Js)w;CooDpi#iKScwLHPO{nYHc|T_V`)KG*58yf+MrHmr z>dnt$6fdIQ@CGWus)q~Lv<-EtpG95Ye%F5xby(j+RrX8Nyr)oydqV2|pK~2~)IFa< zlC}j@#+oGt6{ym-p|&7{6vYmsD)13@;c3)75wcOq<ESldLyg;kTnOvOtTNkALz%sf ztZ9c(6MT$18xyDn^QcPAA=_zxp%Mx+IEAgKEf_$JA4dH{8bc-W9csO6s53ENZ7<$$ zEYhKCR!n*tuoPALau-)Qqo{-$P-iBA{CBl9>N<6}=Q~k}_PBVUCbzz*I*@xIc-NQf zE1mRt&EX+$HazByl)W2CHN_L@c&aIyN^MG{V~M1<B{J@7@&1my5=cJTn8*#3e-p@c ZRqplYF0L%|do$JVdq-<N^Ezvv{ttTtxoQ9a delta 2082 zcmYM!ZERCj9LMpqt^-Hex+ga1HhbAnP}kCJgl$5IP1tw{1cdoU4ce~PrDJq9D=M0$ zi<&G!beKAD5DY{UhA}3yGn*PsbO}M;_z;a`K0pXjBPtqsvp3@R=Z>*y`#Jw}?>Xmx z9`2oQAK8%op~5?6_@w#O@q43C(f^;O#m1;AgiEj){kRc}a0hna9t`0TY{vJo34gV& zxXqYO;x1gI`*4{tS(Br%nu>GQFBUGCd8DoJ7cVrZ!7}38u^iXh`Y7tYtw@Jvw~Zge zFmVclc*^=AdWpYBALE;=6x8wWScA84CDt%qW!izO@IJf)U2MP?Z2UHAfUj)*O>88t z@sTWUz*>CJ#!sNyk71DU%?yRR@Di>-&r)LoScj$9X6-_C^Z+WcG-@VKp|)-a9Xx?b z=mX?yzU8kPf5r;DW$P<SSpP~Yf)upJt*8#$tQ&286g|{;qB_`$Is*@374En7!{`v_ zP&1rD_5Tejf$R3Vhgt0;ZY*W}wM1zu)ZtNN5zJ}SUcQC2F`u9k``r39YT!B4irql1 zNHLu#!7^04MpV0I)E2MD5N^SH@Svad*Iu8Y!ogYVHEbd-qLmVAL7nzZHr|XHU^i;z z_Mr}8967h94|V?_DzQVzs+(cdeJ|SUV_6Cs;H16bEOP$Ll&$~B)?dW&0+!NVPcu!5 z<{4D`BdCsF#VDS}7QBjjJeRQ#>u?vY#piJwW~V49<G*ngE@oX@u?fTYDC(&gMJ09? zHM2=n0@FxSa{-mWcc}iZVLkq4V;}n&A+AF8+lj1j)?_GXiOwLaZYEIA_YCqi7x}vz zub?{iagy|csX`^(W!;Z=5+6k!zG)lJp&r`;W}*7ksHbK7zcKsYOF<0}ql1&EL-HlE zdd4hYc%Ca!aT{vJ+i?x<Lrq`=wE{1pgU3)aokk`4BXUlSj}xmyAHaZ~{|*Ye(2aae z4}V(XAymiDp-%B(>!|e=)car@mC(D$WX-3jM6aMu`Cq8R9OR{<E!lxu**?r_DTXQR z#Z#yb|3qy;34!)Fh`KL=N^~bG!G}=^#*xXHB=R-S@~5-%8fw4^RD$PG6PZJfg}GeI z{wuSaRJ7nqM$sO1Tc1RAa02y4n?WUZ36;Pvs5A42RX6K#EJIzdLTyRF#tqgrs073H z?F)yh-Cl?yuWz#j^}Oz}H$H-zLDI%U_4&C)wcg@hH{%=_NVxs^%S%c;{$24tw<ohL z;kfC8vHrpQ^`#dI3X@N}xyjPeU@YFBj5`VUaW|E4Q$2^A)Ii2brUo;y{(d(R&TaC) zQ<TiO2L^LD{Kw0i+d`3+P^8U?MDA62eeQVKd%63|(}k_!b@}t<AA7w6@r;}MthzdP zvbs1wQr+Vz|8Mx&b563C44nK=%PT$Jy-Hy|Fy644!4tD@rh1Ywr+Xov)a>g6Hj7vy P7S6p~J7KeEuZ#Wz|1RzR diff --git a/flask_admin/translations/pt_BR/LC_MESSAGES/admin.po b/flask_admin/translations/pt_BR/LC_MESSAGES/admin.po index a8a02ae89..e2581d513 100644 --- a/flask_admin/translations/pt_BR/LC_MESSAGES/admin.po +++ b/flask_admin/translations/pt_BR/LC_MESSAGES/admin.po @@ -1,275 +1,264 @@ + msgid "" msgstr "" -"Project-Id-Version: flask-admin\n" +"Project-Id-Version: flask-admin\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-02-07 00:17-0600\n" +"POT-Creation-Date: 2024-09-24 22:09+0100\n" "PO-Revision-Date: 2017-02-07 01:19-0500\n" "Last-Translator: mrjoes <serge.koval@gmail.com>\n" +"Language: pt_BR\n" "Language-Team: Portuguese, Brazilian\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.1.1\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: flask-admin\n" -"X-Crowdin-Language: pt-BR\n" -"X-Crowdin-File: admin.pot\n" -"Language: pt_BR\n" +"Generated-By: Babel 2.16.0\n" -#: ../flask_admin/base.py:440 +#: ../flask_admin/base.py:458 msgid "Home" msgstr "Início" -#: ../flask_admin/contrib/rediscli.py:127 +#: ../flask_admin/contrib/rediscli.py:113 msgid "Cli: Invalid command." msgstr "Cli: Comando inválido." -#: ../flask_admin/contrib/fileadmin/__init__.py:352 +#: ../flask_admin/contrib/fileadmin/__init__.py:376 msgid "File to upload" msgstr "Arquivo para upload" -#: ../flask_admin/contrib/fileadmin/__init__.py:360 +#: ../flask_admin/contrib/fileadmin/__init__.py:384 msgid "File required." msgstr "Arquivo requerido." -#: ../flask_admin/contrib/fileadmin/__init__.py:365 +#: ../flask_admin/contrib/fileadmin/__init__.py:389 msgid "Invalid file type." msgstr "Tipo de arquivo inválido." -#: ../flask_admin/contrib/fileadmin/__init__.py:376 +#: ../flask_admin/contrib/fileadmin/__init__.py:400 msgid "Content" msgstr "Conteúdo" -#: ../flask_admin/contrib/fileadmin/__init__.py:390 +#: ../flask_admin/contrib/fileadmin/__init__.py:414 msgid "Invalid name" msgstr "Nome inválido" -#: ../flask_admin/contrib/fileadmin/__init__.py:398 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:106 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:112 -#: ../flask_admin/tests/sqla/test_translation.py:17 +#: ../flask_admin/contrib/fileadmin/__init__.py:422 +#: ../flask_admin/tests/sqla/test_translation.py:21 msgid "Name" msgstr "Nome" -#: ../flask_admin/contrib/fileadmin/__init__.py:757 +#: ../flask_admin/contrib/fileadmin/__init__.py:784 #, python-format msgid "File \"%(name)s\" already exists." msgstr "O arquivo \"%(name)s\" já existe." -#: ../flask_admin/contrib/fileadmin/__init__.py:802 -#: ../flask_admin/contrib/fileadmin/__init__.py:885 -#: ../flask_admin/contrib/fileadmin/__init__.py:947 -#: ../flask_admin/contrib/fileadmin/__init__.py:1000 -#: ../flask_admin/contrib/fileadmin/__init__.py:1047 -#: ../flask_admin/contrib/fileadmin/__init__.py:1099 -#: ../flask_admin/model/base.py:2168 +#: ../flask_admin/contrib/fileadmin/__init__.py:829 +#: ../flask_admin/contrib/fileadmin/__init__.py:926 +#: ../flask_admin/contrib/fileadmin/__init__.py:988 +#: ../flask_admin/contrib/fileadmin/__init__.py:1041 +#: ../flask_admin/contrib/fileadmin/__init__.py:1088 +#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/model/base.py:2324 msgid "Permission denied." msgstr "Permissão negada." -#: ../flask_admin/contrib/fileadmin/__init__.py:881 +#: ../flask_admin/contrib/fileadmin/__init__.py:922 msgid "File uploading is disabled." msgstr "O Upload de arquivos está desabilitado." -#: ../flask_admin/contrib/fileadmin/__init__.py:892 +#: ../flask_admin/contrib/fileadmin/__init__.py:933 #, python-format msgid "Successfully saved file: %(name)s" msgstr "Arquivo salvo com êxito: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:896 +#: ../flask_admin/contrib/fileadmin/__init__.py:937 #, python-format msgid "Failed to save file: %(error)s" msgstr "Falha ao gravar arquivo: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:904 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:150 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:150 +#: ../flask_admin/contrib/fileadmin/__init__.py:945 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:150 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:152 msgid "Upload File" msgstr "Upload de arquivo" -#: ../flask_admin/contrib/fileadmin/__init__.py:943 +#: ../flask_admin/contrib/fileadmin/__init__.py:984 msgid "Directory creation is disabled." msgstr "A criação de diretórios está desabilitada." -#: ../flask_admin/contrib/fileadmin/__init__.py:956 +#: ../flask_admin/contrib/fileadmin/__init__.py:997 #, python-format msgid "Successfully created directory: %(directory)s" msgstr "Diretório criado com sucesso: %(directory)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:960 +#: ../flask_admin/contrib/fileadmin/__init__.py:1001 #, python-format msgid "Failed to create directory: %(error)s" msgstr "Falha ao criar diretório: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:970 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:161 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:161 +#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:161 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:163 msgid "Create Directory" msgstr "Criar diretório" -#: ../flask_admin/contrib/fileadmin/__init__.py:996 +#: ../flask_admin/contrib/fileadmin/__init__.py:1037 msgid "Deletion is disabled." msgstr "Exclusão está desabilitada." -#: ../flask_admin/contrib/fileadmin/__init__.py:1005 +#: ../flask_admin/contrib/fileadmin/__init__.py:1046 msgid "Directory deletion is disabled." msgstr "Exclusão de diretórios está desabilitada." -#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/contrib/fileadmin/__init__.py:1052 #, python-format msgid "Directory \"%(path)s\" was successfully deleted." msgstr "Diretório \"%(path)s\" foi excluído com sucesso." -#: ../flask_admin/contrib/fileadmin/__init__.py:1013 +#: ../flask_admin/contrib/fileadmin/__init__.py:1054 #, python-format msgid "Failed to delete directory: %(error)s" msgstr "Falha ao excluir diretório: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1019 -#: ../flask_admin/contrib/fileadmin/__init__.py:1176 +#: ../flask_admin/contrib/fileadmin/__init__.py:1060 +#: ../flask_admin/contrib/fileadmin/__init__.py:1215 #, python-format msgid "File \"%(name)s\" was successfully deleted." msgstr "Arquivo \"%(name)s\" foi excluído com sucesso." -#: ../flask_admin/contrib/fileadmin/__init__.py:1021 -#: ../flask_admin/contrib/fileadmin/__init__.py:1178 +#: ../flask_admin/contrib/fileadmin/__init__.py:1062 +#: ../flask_admin/contrib/fileadmin/__init__.py:1217 #, python-format msgid "Failed to delete file: %(name)s" msgstr "Falha ao excluir arquivo: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1043 +#: ../flask_admin/contrib/fileadmin/__init__.py:1084 msgid "Renaming is disabled." msgstr "Renomear está desabilitado." -#: ../flask_admin/contrib/fileadmin/__init__.py:1051 +#: ../flask_admin/contrib/fileadmin/__init__.py:1092 msgid "Path does not exist." msgstr "O caminho não existe." -#: ../flask_admin/contrib/fileadmin/__init__.py:1061 +#: ../flask_admin/contrib/fileadmin/__init__.py:1102 #, python-format msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\"" msgstr "Renomeado com sucesso: de \"%(src)s\" para \"%(dst)s\"" -#: ../flask_admin/contrib/fileadmin/__init__.py:1064 +#: ../flask_admin/contrib/fileadmin/__init__.py:1105 #, python-format msgid "Failed to rename: %(error)s" msgstr "Falha ao renomear: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1078 +#: ../flask_admin/contrib/fileadmin/__init__.py:1119 #, python-format msgid "Rename %(name)s" msgstr "Renomeie %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1115 +#: ../flask_admin/contrib/fileadmin/__init__.py:1155 #, python-format msgid "Error saving changes to %(name)s." msgstr "Erro ao salvar alterações para %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1119 +#: ../flask_admin/contrib/fileadmin/__init__.py:1159 #, python-format msgid "Changes to %(name)s saved successfully." msgstr "Alterações para %(name)s salvas com sucesso." -#: ../flask_admin/contrib/fileadmin/__init__.py:1128 +#: ../flask_admin/contrib/fileadmin/__init__.py:1167 #, python-format msgid "Error reading %(name)s." msgstr "Erro ao ler %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1131 -#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/contrib/fileadmin/__init__.py:1170 +#: ../flask_admin/contrib/fileadmin/__init__.py:1179 #, python-format msgid "Unexpected error while reading from %(name)s" msgstr "Erro inesperado ao ler %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1137 +#: ../flask_admin/contrib/fileadmin/__init__.py:1176 #, python-format msgid "Cannot edit %(name)s." msgstr "Não é ṕossível editar %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1155 +#: ../flask_admin/contrib/fileadmin/__init__.py:1194 #, python-format msgid "Editing %(path)s" msgstr "Edição %(path)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/peewee/view.py:487 -#: ../flask_admin/contrib/pymongo/view.py:384 -#: ../flask_admin/contrib/sqla/view.py:1149 +#: ../flask_admin/contrib/fileadmin/__init__.py:1202 +#: ../flask_admin/contrib/peewee/view.py:510 +#: ../flask_admin/contrib/pymongo/view.py:385 +#: ../flask_admin/contrib/sqla/view.py:1241 msgid "Delete" msgstr "Excluir" -#: ../flask_admin/contrib/fileadmin/__init__.py:1164 +#: ../flask_admin/contrib/fileadmin/__init__.py:1203 msgid "Are you sure you want to delete these files?" msgstr "Você tem certeza que deseja excluir estes arquivos?" -#: ../flask_admin/contrib/fileadmin/__init__.py:1167 +#: ../flask_admin/contrib/fileadmin/__init__.py:1206 msgid "File deletion is disabled." msgstr "Exclusão de arquivos desabilitada." -#: ../flask_admin/contrib/fileadmin/__init__.py:1180 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:22 +#: ../flask_admin/contrib/fileadmin/__init__.py:1219 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:22 msgid "Edit" msgstr "Editar" -#: ../flask_admin/contrib/fileadmin/s3.py:153 +#: ../flask_admin/contrib/fileadmin/s3.py:162 msgid "Cannot operate on non empty directories" msgstr "Não é possível operar em diretórios não-vazios" #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 -#: ../flask_admin/contrib/sqla/filters.py:41 +#: ../flask_admin/contrib/sqla/filters.py:42 msgid "equals" msgstr "igual" #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 -#: ../flask_admin/contrib/sqla/filters.py:49 +#: ../flask_admin/contrib/sqla/filters.py:50 msgid "not equal" msgstr "diferente" #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 -#: ../flask_admin/contrib/sqla/filters.py:58 +#: ../flask_admin/contrib/sqla/filters.py:59 msgid "contains" msgstr "contém" #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 -#: ../flask_admin/contrib/sqla/filters.py:67 +#: ../flask_admin/contrib/sqla/filters.py:68 msgid "not contains" msgstr "não contém" #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 -#: ../flask_admin/contrib/sqla/filters.py:75 +#: ../flask_admin/contrib/sqla/filters.py:76 msgid "greater than" msgstr "maior que" #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 -#: ../flask_admin/contrib/sqla/filters.py:83 +#: ../flask_admin/contrib/sqla/filters.py:84 msgid "smaller than" msgstr "menor que" #: ../flask_admin/contrib/peewee/filters.py:88 -#: ../flask_admin/contrib/sqla/filters.py:94 +#: ../flask_admin/contrib/sqla/filters.py:95 msgid "empty" msgstr "vazio" #: ../flask_admin/contrib/peewee/filters.py:102 -#: ../flask_admin/contrib/sqla/filters.py:108 +#: ../flask_admin/contrib/sqla/filters.py:109 msgid "in list" msgstr "na lista" #: ../flask_admin/contrib/peewee/filters.py:111 -#: ../flask_admin/contrib/sqla/filters.py:118 +#: ../flask_admin/contrib/sqla/filters.py:119 msgid "not in list" msgstr "Não está na lista" @@ -282,84 +271,85 @@ msgstr "Não está na lista" msgid "not between" msgstr "não entre" -msgid "ObjectId equals" -msgstr "ObjectId é igual a" - -#, python-format -msgid "Failed to get model. %(error)s" -msgstr "Falha ao obter registro. %(error)s" - -#: ../flask_admin/contrib/peewee/view.py:435 -#: ../flask_admin/contrib/pymongo/view.py:316 -#: ../flask_admin/contrib/sqla/view.py:1078 +#: ../flask_admin/contrib/peewee/view.py:458 +#: ../flask_admin/contrib/pymongo/view.py:317 +#: ../flask_admin/contrib/sqla/view.py:1170 #, python-format msgid "Failed to create record. %(error)s" msgstr "Falha ao criar o registro. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:454 -#: ../flask_admin/contrib/pymongo/view.py:341 -#: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 -#: ../flask_admin/model/base.py:2313 ../flask_admin/model/base.py:2315 +#: ../flask_admin/contrib/peewee/view.py:477 +#: ../flask_admin/contrib/pymongo/view.py:342 +#: ../flask_admin/contrib/sqla/view.py:1196 ../flask_admin/model/base.py:2463 +#: ../flask_admin/model/base.py:2471 ../flask_admin/model/base.py:2473 #, python-format msgid "Failed to update record. %(error)s" msgstr "Falha ao atualizar registro. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:469 -#: ../flask_admin/contrib/pymongo/view.py:366 -#: ../flask_admin/contrib/sqla/view.py:1129 +#: ../flask_admin/contrib/peewee/view.py:492 +#: ../flask_admin/contrib/pymongo/view.py:367 +#: ../flask_admin/contrib/sqla/view.py:1221 #, python-format msgid "Failed to delete record. %(error)s" msgstr "Falha ao excluir o registro. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:488 -#: ../flask_admin/contrib/pymongo/view.py:385 -#: ../flask_admin/contrib/sqla/view.py:1150 +#: ../flask_admin/contrib/peewee/view.py:511 +#: ../flask_admin/contrib/pymongo/view.py:386 +#: ../flask_admin/contrib/sqla/view.py:1242 msgid "Are you sure you want to delete selected records?" msgstr "Tem certeza que deseja excluir os registros selecionados?" -#: ../flask_admin/contrib/peewee/view.py:505 -#: ../flask_admin/contrib/pymongo/view.py:395 -#: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 +#: ../flask_admin/contrib/peewee/view.py:528 +#: ../flask_admin/contrib/pymongo/view.py:396 +#: ../flask_admin/contrib/sqla/view.py:1258 ../flask_admin/model/base.py:2272 #, python-format msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." msgstr[0] "Registro foi excluído com êxito." msgstr[1] "%(count)s registros foram excluídos com êxito." -#: ../flask_admin/contrib/peewee/view.py:511 -#: ../flask_admin/contrib/pymongo/view.py:400 -#: ../flask_admin/contrib/sqla/view.py:1174 +#: ../flask_admin/contrib/peewee/view.py:534 +#: ../flask_admin/contrib/pymongo/view.py:401 +#: ../flask_admin/contrib/sqla/view.py:1266 #, python-format msgid "Failed to delete records. %(error)s" msgstr "Falha ao excluir registros. %(error)s" -#: ../flask_admin/contrib/sqla/fields.py:126 -#: ../flask_admin/contrib/sqla/fields.py:176 -#: ../flask_admin/contrib/sqla/fields.py:181 ../flask_admin/model/fields.py:173 -#: ../flask_admin/model/fields.py:222 +#: ../flask_admin/contrib/sqla/fields.py:117 +#: ../flask_admin/contrib/sqla/fields.py:167 +#: ../flask_admin/contrib/sqla/fields.py:172 ../flask_admin/model/fields.py:174 +#: ../flask_admin/model/fields.py:223 msgid "Not a valid choice" msgstr "Não é uma escolha válida" -#: ../flask_admin/contrib/sqla/fields.py:186 +#: ../flask_admin/contrib/sqla/fields.py:201 msgid "Key" msgstr "Chave" -#: ../flask_admin/contrib/sqla/fields.py:187 +#: ../flask_admin/contrib/sqla/fields.py:202 msgid "Value" msgstr "Valor" -#: ../flask_admin/contrib/sqla/validators.py:42 +#: ../flask_admin/contrib/sqla/validators.py:28 msgid "Already exists." msgstr "Já existe." -#: ../flask_admin/contrib/sqla/validators.py:60 +#: ../flask_admin/contrib/sqla/validators.py:59 #, python-format msgid "At least %(num)d item is required" msgid_plural "At least %(num)d items are required" msgstr[0] "Pelo menos %(num)d item é exigido" msgstr[1] "Pelo menos %(num)d itens são exigidos" -#: ../flask_admin/contrib/sqla/view.py:1057 +#: ../flask_admin/contrib/sqla/validators.py:75 +msgid "Not a valid ISO currency code (e.g. USD, EUR, CNY)." +msgstr "" + +#: ../flask_admin/contrib/sqla/validators.py:83 +msgid "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." +msgstr "" + +#: ../flask_admin/contrib/sqla/view.py:1134 #, python-format msgid "Integrity error. %(message)s" msgstr "Erro de integridade. %(message)s" @@ -368,274 +358,242 @@ msgstr "Erro de integridade. %(message)s" msgid "Invalid time format" msgstr "Formato de hora inválido" -#: ../flask_admin/form/fields.py:144 +#: ../flask_admin/form/fields.py:147 msgid "Invalid Choice: could not coerce" msgstr "Escolha inválida: não é possível converter" -#: ../flask_admin/form/fields.py:208 +#: ../flask_admin/form/fields.py:221 msgid "Invalid JSON" msgstr "JSON inválido" -#: ../flask_admin/form/upload.py:207 +#: ../flask_admin/form/upload.py:216 msgid "Invalid file extension" msgstr "Extensão de arquivo inválida" -#: ../flask_admin/form/upload.py:214 ../flask_admin/form/upload.py:281 +#: ../flask_admin/form/upload.py:223 ../flask_admin/form/upload.py:293 #, python-format msgid "File \"%s\" already exists." msgstr "O \"%s\" já existe." -#: ../flask_admin/model/base.py:1649 +#: ../flask_admin/form/validators.py:16 +msgid "This field requires at least one item." +msgstr "" + +#: ../flask_admin/model/base.py:1737 msgid "There are no items in the table." msgstr "Não existem itens na tabela." -#: ../flask_admin/model/base.py:1673 +#: ../flask_admin/model/base.py:1746 #, python-format msgid "Invalid Filter Value: %(value)s" msgstr "Valor de filtro inválido: %(value)s" -#: ../flask_admin/model/base.py:1984 +#: ../flask_admin/model/base.py:2136 msgid "Record was successfully created." msgstr "Registro criado com sucesso." -#: ../flask_admin/model/base.py:2028 ../flask_admin/model/base.py:2080 -#: ../flask_admin/model/base.py:2113 ../flask_admin/model/base.py:2297 +#: ../flask_admin/model/base.py:2180 ../flask_admin/model/base.py:2232 +#: ../flask_admin/model/base.py:2265 ../flask_admin/model/base.py:2455 msgid "Record does not exist." msgstr "Registro não existe." -#: ../flask_admin/model/base.py:2037 ../flask_admin/model/base.py:2301 +#: ../flask_admin/model/base.py:2189 ../flask_admin/model/base.py:2459 msgid "Record was successfully saved." msgstr "Registro salvo com sucesso." -#: ../flask_admin/model/base.py:2222 -msgid "Tablib dependency not installed." -msgstr "Depedência Tablib não instalada." - -#: ../flask_admin/model/base.py:2249 +#: ../flask_admin/model/base.py:2407 #, python-format msgid "Export type \"%(type)s not supported." msgstr "Tipo de exportação \"%(type)s não é suportado." -#: ../flask_admin/model/filters.py:103 ../flask_admin/model/widgets.py:111 +#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:119 msgid "Yes" msgstr "Sim" -#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:110 +#: ../flask_admin/model/filters.py:105 ../flask_admin/model/widgets.py:118 msgid "No" msgstr "Não" -#: ../flask_admin/model/filters.py:172 ../flask_admin/model/filters.py:212 -#: ../flask_admin/model/filters.py:257 +#: ../flask_admin/model/filters.py:173 ../flask_admin/model/filters.py:213 +#: ../flask_admin/model/filters.py:258 msgid "between" msgstr "entre" -#: ../flask_admin/model/template.py:81 ../flask_admin/model/template.py:88 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:37 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:8 +#: ../flask_admin/model/template.py:83 ../flask_admin/model/template.py:90 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:7 msgid "View Record" msgstr "Exibir registro" -#: ../flask_admin/model/template.py:95 ../flask_admin/model/template.py:102 -#: ../flask_admin/model/template.py:109 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/edit.html:11 +#: ../flask_admin/model/template.py:97 ../flask_admin/model/template.py:104 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/edit.html:10 msgid "Edit Record" msgstr "Editar Registro" -#: ../flask_admin/model/widgets.py:61 +#: ../flask_admin/model/template.py:111 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Delete Record" +msgstr "" + +#: ../flask_admin/model/widgets.py:62 msgid "Please select model" msgstr "Por favor, selecione o modelo" -#: ../flask_admin/templates/bootstrap2/admin/actions.html:4 -#: ../flask_admin/templates/bootstrap3/admin/actions.html:4 +#: ../flask_admin/templates/bootstrap4/admin/actions.html:5 msgid "With selected" msgstr "Com selecionado" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:200 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:190 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:216 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:227 msgid "Save" msgstr "Salvar" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:205 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:195 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:221 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:232 msgid "Cancel" msgstr "Cancelar" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:256 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:247 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:290 msgid "Save and Add Another" msgstr "Salvar e adicionar outro" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:259 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:250 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:293 msgid "Save and Continue Editing" msgstr "Salvar e continuar editando" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:9 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:9 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:10 msgid "Root" msgstr "Raíz" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:90 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:99 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:89 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:98 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:42 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:51 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:89 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:98 #, python-format msgid "Sort by %(name)s" msgstr "Ordenar por %(name)s" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:77 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:79 msgid "Rename File" msgstr "Renomear arquivo" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:88 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:88 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:90 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\' recursively?" msgstr "Você tem certeza que deseja excluir \\'%(name)s\\' recursivamente?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:97 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:97 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:99 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\'?" msgstr "Você tem certeza que deseja excluir \\'%(name)s\\'?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:125 -msgid "Size" -msgstr "" - -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:185 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:187 msgid "Please select at least one file." msgstr "Por favor, selecione pelo menos um arquivo." -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:8 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:17 msgid "List" msgstr "Listar" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:12 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:18 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 msgid "Create" msgstr "Criar" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:26 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:26 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:21 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:26 msgid "Details" msgstr "Detalhes" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:29 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:28 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:15 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:28 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:15 msgid "Filter" msgstr "Filtro" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:13 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:14 msgid "Delete?" msgstr "Excluir?" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:33 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:16 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:35 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Are you sure you want to delete this record?" +msgstr "Você tem certeza que deseja excluir este item?" + +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:33 msgid "New" msgstr "Novo" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:43 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:43 msgid "Add" msgstr "Adicionar" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:3 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:3 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:2 msgid "Add Filter" msgstr "Adicionar Filtro" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:30 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:19 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:26 msgid "Export" msgstr "Exportar" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:38 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:38 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:49 msgid "Apply" msgstr "Aplicar" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:40 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:51 msgid "Reset Filters" msgstr "Limpar Filtros" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:66 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:64 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:80 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:93 +#, python-format +msgid "%(placeholder)s" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:88 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:94 msgid "Search" msgstr "Pesquisar" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:74 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:77 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:78 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:79 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:72 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:75 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:76 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:77 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:102 msgid "items" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/create.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/create.html:10 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/create.html:10 msgid "Create New Record" msgstr "Criar Novo Registro" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:76 msgid "Select all records" msgstr "Selecionar todos os registros" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:120 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:119 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:119 msgid "Select record" msgstr "Selecionar registro" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:186 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:195 msgid "Please select at least one record." msgstr "Por favor, selecione pelo menos um registro." -#: ../flask_admin/templates/bootstrap2/admin/model/row_actions.html:34 -#: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 -msgid "Are you sure you want to delete this record?" -msgstr "Você tem certeza que deseja excluir este item?" +#~ msgid "ObjectId equals" +#~ msgstr "ObjectId é igual a" + +#~ msgid "Failed to get model. %(error)s" +#~ msgstr "Falha ao obter registro. %(error)s" + +#~ msgid "Tablib dependency not installed." +#~ msgstr "Depedência Tablib não instalada." + +#~ msgid "Size" +#~ msgstr "" + diff --git a/flask_admin/translations/ro/LC_MESSAGES/admin.mo b/flask_admin/translations/ro/LC_MESSAGES/admin.mo index 4ed230f249f1c88ca13acc59717856225a362216..f35cb1bcc2c136deaa871a64df9b75fb6666ff57 100644 GIT binary patch delta 1827 zcmYMzTWnNC9LMqhmfCh(N-t8@rCT{@1$x=C-5{k{#9G@ZmP!cnU_i5NH(0y9SgG~_ zT!=B?4KO20gc3*}q`Wk^`cPv{Acmk-NjA|31TTpaq9LF$qKO8-zi<*ayZf1$b7tm0 zGygf-GQKkXU3u<7<I~MA!moagYX5&)^32q<1`DwjORy7f!!6j1-5A9q*odEFJ^tfc zlW*2eeKXQzN3g;yZ4(rh(lC9i!G1)(c7s2?coR!8ufVJfL#Xx|)O#^xAX|kE*oBL5 zr|&rCQlG&hJcAnVD-1EeeNSOA4L9%}3<u5b!nLS+H)_DWe)|c$oBAwP;x)Vzi`X9Z zt3|!P9&2y_!}ty^#8WsAzmUvt-%`*(zo1r@N0^GZ7<DA&=;3nIz#DKb4&wsciRJi~ z-~JxnPW=PaIOlx7#2o5b)cap!dOn3Ke#5`$Q7>h5t)vk(!6sCDKd#5uQ7gWH%7wp? zt`;o5brcoI*XsCF0L{MlqZZhP3SeC^`%l@n@~1QD$0+W=Iy{Lwns3m<zpx&|?4Ks= z@ZE?!vL{i=nnLBqFmkFkhDz4mr~vjLG21@vzg|2{g9e=NA50;~Y9IUUXZ`jpeiR^Q zPy@Y7)SCFX?-X*1HiHk~Ic&lpnXABCaWxL&GMr3P=%bKDMcTr?RAD<V!5&n0zlsXz z7-~yTq9&d~y4nnC;`6A5TtMa2Wz@tuBt$hXM<wqj)WXwa6hahsA;H=qzdnf#)K8-V zxsGuRkuXbf9qM+BU=$Dep7o#qftol%^y>Erdbk61wByKaNZV%=lx#ntR+3M~-GO1$ z^@*c)W(#V|lc@Jo{`38)6-}dd;1X)(S5OPf<xgiFLDpb3s9acsxw`*t6mn>I80lk= zqO!UhiOEJVhI{c|oJQT}Yv^H+X!l?(D&Y5##oI+x|KCv8IG;|OhE=1Es0j;n|Jzi+ zPF#$SBYo@zREGnoEuX+zoJH-xpQvjXW*?hy6>8#P)C4c1R{kbxfk#n0cpNp~3GC2y zIYmJ)eu!H68C0@meJ`R0yo`G9ci)?+oS9phsm<RNaM^-`?vr59jRjA;WZ@5)-lFq? zMV)=mZMUw(K+?K~_-^+S-t&o6U$58m^iW?<(mhi=;C?N>?g~qmxu%jg+|MOXxc1Tw z?r`bbW$_i!SaUSK!i&dO$C~S6jqbs+ZF8R5_?Vk48w}j%LgmlqHm+=lWnL?v4Y(KQ zA9G78u4dLQ$PZ-tLmfHQnmb{Gqf9<HYF(q=ke5g$w<SlCiXqY6m-_T2cQw2(vwz{% YfUAr=<a#5oxOr6rZg<sYcd4rNKfSxxl>h($ delta 2536 zcmb8vd2Ccg9Ki9}mI7<(O<7tB9Vxfn(gISzsvH(k4l7kdlwjVnLs{IuZFk=S1+`5y z@efY(B#3|tsDy+VOd%mQctT7nMo2WE1Y(c`qgXU*42coHKX=f?n21exKQr^@_|0$T z?e3{BH*{Vo?zc_x*UqPc&uiII`}?nYfKt*F##^us3$OumZ~;!o#TdqoSch+8HD0ln z4OFU;`dsWU{jgN2PUTY=OTz){>C6Ll4H>Hnf|&s!ETldHi*TZCpM}zI9x|b7vh@{M zL*2zn+-*IE{ivVET-H|?Dagcq7{cp#D~8yvL^>Tu;Y=Kj21nusTYnQ}fzNFF&sar0 zluNL92M)tWZGAP$_-$Cp`syf!@pu-?Fl&%f<ye9FSZ|$+GSR~*fwiOTWG%|kJ%t)y zLJ6n``B&%o8iL<oF<!Ur#d+kvgoa8Aa>kQUCakwM*!EeNMSCO41oKetz+*TVpRny+ zsHyuXJ3Nds{~443zO&D>*wsSnRr%y!Qq)d^Ot=+Ef_fF@EDs`M)CVYmow9z8vhbHE z8M}&-ksy;ufQ2aIs!+z&p&ap44CB3c8>S1$znt|R8Z>@ry@b`&a~LH7O+vZtciH+q zC<`>9WNsPCC5#~VR;@zmpF#<&1IfDTLg}~3KHt_!K^E9)JM2g9pE_*Y-?8nzcqBk7 zQ6}8PHYI=;tb37rrw-vv?7@2c4P_%!IENYN;5gicG3-1+K_Z?=K8NEp9E*?O7<?M# zC|*YitOq5fCr|?DMR^_1q6F|Q%7%VHxvT*O%Z`Vm1Tq>&;bP=1=~QcMhn*;|-#%oM zs>jw(Vh#06C_69VCdmZlC;{G$lW+w};5$%W)Av!%`m(i@$z|LelzuC*THgPy6l8*9 zsPPAs%TY8m^BUfXa+{Z+>~uZyuQu@|uk9Ns89ap&;1?+Uzp~G>xuNoV5Jt(+gD9C< ziXnOb*HVznu@yNDwHxJ9y@hg#j-aHx$F{$RS=5gsn^PYl_f=i6_94kqzhf;9=EvlA zY($xVJ@QCx!A?!#0EOqU7iC9_36JAbPohlpJjxHue&jx><0xl*24&}8qx8RmGI4;; z(mo93?HYw7L(N6m$m1yUL@UU@oW&X%Cg3Y5sq00J-=q9K<a0CYF^sa1LCMTIlt8*r zGPn^XGdoa@Vi!sv`%p4^5T)NCl#Cr4J}q;rKcPV;JcDw}&!bFy8D+pvR*6O~XWoeJ z8U4EgV;t8_cskK$l8$F|!qqMx)7s{B=x8iymV1e0%%uFI1Ge`!o)e3w{DlKgPH0@) zmPmRkgZ4Vwj2=09oH#zk44zJ<+oXqy`k~;(V2kl|Ya(jm{=2~;-PeMj28!mJ4z(bb z^3)=y)u=^gjej~fRPaD#6-(Y1)uuh|u-4_=){>^UaZ*O7Oq@q{n&v@2hMm<$J8o3Z zit=I2l_sg0Z#2$HxL(Xn8{HU<QE2gJ=S|3ttuy|rye*YZBp!?CsA)59)VRw#{){;0 zraUJeH_;mZ*Sw|KPCV^5<u~WVJky%;_vUXes;dvzP72r7>)P5GQl9GHU(n(oE^z&- z!uIURHB-7@Ec`eycFs*^G*Z0hMn(fASN}&wyZcIlfe^8K$+UKKB64D1%r%+B)c8fE z72P?d)3O?FB-l}II+I}vYEfDzv=cWiCTa9)C+<XI@#D{^f9Bl@ZT`2sclU*s1#13E o^37#_epzF7b8MZzxom@e=)Y1wwA}4S>W%+w`4XG^bLF%D0A`?<RsaA1 diff --git a/flask_admin/translations/ro/LC_MESSAGES/admin.po b/flask_admin/translations/ro/LC_MESSAGES/admin.po index 4a208eda0..9a5a35901 100644 --- a/flask_admin/translations/ro/LC_MESSAGES/admin.po +++ b/flask_admin/translations/ro/LC_MESSAGES/admin.po @@ -1,275 +1,265 @@ + msgid "" msgstr "" -"Project-Id-Version: flask-admin\n" +"Project-Id-Version: flask-admin\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-02-07 00:17-0600\n" +"POT-Creation-Date: 2024-09-24 22:09+0100\n" "PO-Revision-Date: 2017-02-07 01:19-0500\n" "Last-Translator: mrjoes <serge.koval@gmail.com>\n" +"Language: ro_RO\n" "Language-Team: Romanian\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100>0 && " +"n%100<20)) ? 1 : 2);\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.1.1\n" -"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100>0 && n%100<20)) ? 1 : 2);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: flask-admin\n" -"X-Crowdin-Language: ro\n" -"X-Crowdin-File: admin.pot\n" -"Language: ro_RO\n" +"Generated-By: Babel 2.16.0\n" -#: ../flask_admin/base.py:440 +#: ../flask_admin/base.py:458 msgid "Home" msgstr "Acasă" -#: ../flask_admin/contrib/rediscli.py:127 +#: ../flask_admin/contrib/rediscli.py:113 msgid "Cli: Invalid command." msgstr "CLI: Comanda Invalid." -#: ../flask_admin/contrib/fileadmin/__init__.py:352 +#: ../flask_admin/contrib/fileadmin/__init__.py:376 msgid "File to upload" msgstr "Dosar la spre încărcat" -#: ../flask_admin/contrib/fileadmin/__init__.py:360 +#: ../flask_admin/contrib/fileadmin/__init__.py:384 msgid "File required." msgstr "Fişier necesare." -#: ../flask_admin/contrib/fileadmin/__init__.py:365 +#: ../flask_admin/contrib/fileadmin/__init__.py:389 msgid "Invalid file type." msgstr "Invalid tip de fişier." -#: ../flask_admin/contrib/fileadmin/__init__.py:376 +#: ../flask_admin/contrib/fileadmin/__init__.py:400 msgid "Content" msgstr "Conţinut" -#: ../flask_admin/contrib/fileadmin/__init__.py:390 +#: ../flask_admin/contrib/fileadmin/__init__.py:414 msgid "Invalid name" msgstr "Nume nevalid" -#: ../flask_admin/contrib/fileadmin/__init__.py:398 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:106 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:112 -#: ../flask_admin/tests/sqla/test_translation.py:17 +#: ../flask_admin/contrib/fileadmin/__init__.py:422 +#: ../flask_admin/tests/sqla/test_translation.py:21 msgid "Name" msgstr "nume" -#: ../flask_admin/contrib/fileadmin/__init__.py:757 +#: ../flask_admin/contrib/fileadmin/__init__.py:784 #, python-format msgid "File \"%(name)s\" already exists." msgstr "Fişier \"%(name)s\" există deja." -#: ../flask_admin/contrib/fileadmin/__init__.py:802 -#: ../flask_admin/contrib/fileadmin/__init__.py:885 -#: ../flask_admin/contrib/fileadmin/__init__.py:947 -#: ../flask_admin/contrib/fileadmin/__init__.py:1000 -#: ../flask_admin/contrib/fileadmin/__init__.py:1047 -#: ../flask_admin/contrib/fileadmin/__init__.py:1099 -#: ../flask_admin/model/base.py:2168 +#: ../flask_admin/contrib/fileadmin/__init__.py:829 +#: ../flask_admin/contrib/fileadmin/__init__.py:926 +#: ../flask_admin/contrib/fileadmin/__init__.py:988 +#: ../flask_admin/contrib/fileadmin/__init__.py:1041 +#: ../flask_admin/contrib/fileadmin/__init__.py:1088 +#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/model/base.py:2324 msgid "Permission denied." msgstr "Permisiune refuzată." -#: ../flask_admin/contrib/fileadmin/__init__.py:881 +#: ../flask_admin/contrib/fileadmin/__init__.py:922 msgid "File uploading is disabled." msgstr "Încărcarea fişierelor este dezactivat." -#: ../flask_admin/contrib/fileadmin/__init__.py:892 +#: ../flask_admin/contrib/fileadmin/__init__.py:933 #, python-format msgid "Successfully saved file: %(name)s" msgstr "Fişier salvat cu succes: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:896 +#: ../flask_admin/contrib/fileadmin/__init__.py:937 #, python-format msgid "Failed to save file: %(error)s" msgstr "Nu a reuşit să salvaţi fişier: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:904 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:150 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:150 +#: ../flask_admin/contrib/fileadmin/__init__.py:945 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:150 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:152 msgid "Upload File" msgstr "Încărcaţi fişier" -#: ../flask_admin/contrib/fileadmin/__init__.py:943 +#: ../flask_admin/contrib/fileadmin/__init__.py:984 msgid "Directory creation is disabled." msgstr "Crearea de director este dezactivat." -#: ../flask_admin/contrib/fileadmin/__init__.py:956 +#: ../flask_admin/contrib/fileadmin/__init__.py:997 #, python-format msgid "Successfully created directory: %(directory)s" msgstr "Director cu succes creat: %(directory)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:960 +#: ../flask_admin/contrib/fileadmin/__init__.py:1001 #, python-format msgid "Failed to create directory: %(error)s" msgstr "Imposibil de creat Director: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:970 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:161 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:161 +#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:161 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:163 msgid "Create Directory" msgstr "Crea Director" -#: ../flask_admin/contrib/fileadmin/__init__.py:996 +#: ../flask_admin/contrib/fileadmin/__init__.py:1037 msgid "Deletion is disabled." msgstr "Ştergerea este dezactivat." -#: ../flask_admin/contrib/fileadmin/__init__.py:1005 +#: ../flask_admin/contrib/fileadmin/__init__.py:1046 msgid "Directory deletion is disabled." msgstr "Director stergerea este dezactivat." -#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/contrib/fileadmin/__init__.py:1052 #, python-format msgid "Directory \"%(path)s\" was successfully deleted." msgstr "Director \"%(path)s\" a fost şters cu succes." -#: ../flask_admin/contrib/fileadmin/__init__.py:1013 +#: ../flask_admin/contrib/fileadmin/__init__.py:1054 #, python-format msgid "Failed to delete directory: %(error)s" msgstr "Imposibil de șters Director: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1019 -#: ../flask_admin/contrib/fileadmin/__init__.py:1176 +#: ../flask_admin/contrib/fileadmin/__init__.py:1060 +#: ../flask_admin/contrib/fileadmin/__init__.py:1215 #, python-format msgid "File \"%(name)s\" was successfully deleted." msgstr "Fişier \"%(name)s\" a fost şters cu succes." -#: ../flask_admin/contrib/fileadmin/__init__.py:1021 -#: ../flask_admin/contrib/fileadmin/__init__.py:1178 +#: ../flask_admin/contrib/fileadmin/__init__.py:1062 +#: ../flask_admin/contrib/fileadmin/__init__.py:1217 #, python-format msgid "Failed to delete file: %(name)s" msgstr "Imposibil de șters fişier: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1043 +#: ../flask_admin/contrib/fileadmin/__init__.py:1084 msgid "Renaming is disabled." msgstr "Redenumirea este dezactivat." -#: ../flask_admin/contrib/fileadmin/__init__.py:1051 +#: ../flask_admin/contrib/fileadmin/__init__.py:1092 msgid "Path does not exist." msgstr "Cale nu exista." -#: ../flask_admin/contrib/fileadmin/__init__.py:1061 +#: ../flask_admin/contrib/fileadmin/__init__.py:1102 #, python-format msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\"" msgstr "Cu succes redenumit \"%(src)s\" la \"%(dst)s\"" -#: ../flask_admin/contrib/fileadmin/__init__.py:1064 +#: ../flask_admin/contrib/fileadmin/__init__.py:1105 #, python-format msgid "Failed to rename: %(error)s" msgstr "Nu a reuşit să redenumiţi: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1078 +#: ../flask_admin/contrib/fileadmin/__init__.py:1119 #, python-format msgid "Rename %(name)s" msgstr "Redenumiţi %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1115 +#: ../flask_admin/contrib/fileadmin/__init__.py:1155 #, python-format msgid "Error saving changes to %(name)s." msgstr "Eroare la salvarea modificărilor la %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1119 +#: ../flask_admin/contrib/fileadmin/__init__.py:1159 #, python-format msgid "Changes to %(name)s saved successfully." msgstr "Modificări %(name)s salvat cu succes." -#: ../flask_admin/contrib/fileadmin/__init__.py:1128 +#: ../flask_admin/contrib/fileadmin/__init__.py:1167 #, python-format msgid "Error reading %(name)s." msgstr "Eroare citire %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1131 -#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/contrib/fileadmin/__init__.py:1170 +#: ../flask_admin/contrib/fileadmin/__init__.py:1179 #, python-format msgid "Unexpected error while reading from %(name)s" msgstr "Eroare neașteptată în timp ce citirea de la %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1137 +#: ../flask_admin/contrib/fileadmin/__init__.py:1176 #, python-format msgid "Cannot edit %(name)s." msgstr "Imposibil de editat %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1155 +#: ../flask_admin/contrib/fileadmin/__init__.py:1194 #, python-format msgid "Editing %(path)s" msgstr "Editare %(path)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/peewee/view.py:487 -#: ../flask_admin/contrib/pymongo/view.py:384 -#: ../flask_admin/contrib/sqla/view.py:1149 +#: ../flask_admin/contrib/fileadmin/__init__.py:1202 +#: ../flask_admin/contrib/peewee/view.py:510 +#: ../flask_admin/contrib/pymongo/view.py:385 +#: ../flask_admin/contrib/sqla/view.py:1241 msgid "Delete" msgstr "Ştergeţi" -#: ../flask_admin/contrib/fileadmin/__init__.py:1164 +#: ../flask_admin/contrib/fileadmin/__init__.py:1203 msgid "Are you sure you want to delete these files?" msgstr "Sunteţi sigur că doriţi să ştergeţi aceste fişiere?" -#: ../flask_admin/contrib/fileadmin/__init__.py:1167 +#: ../flask_admin/contrib/fileadmin/__init__.py:1206 msgid "File deletion is disabled." msgstr "Ştergere fişier este dezactivat." -#: ../flask_admin/contrib/fileadmin/__init__.py:1180 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:22 +#: ../flask_admin/contrib/fileadmin/__init__.py:1219 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:22 msgid "Edit" msgstr "Editare" -#: ../flask_admin/contrib/fileadmin/s3.py:153 +#: ../flask_admin/contrib/fileadmin/s3.py:162 msgid "Cannot operate on non empty directories" msgstr "" #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 -#: ../flask_admin/contrib/sqla/filters.py:41 +#: ../flask_admin/contrib/sqla/filters.py:42 msgid "equals" msgstr "este egal cu" #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 -#: ../flask_admin/contrib/sqla/filters.py:49 +#: ../flask_admin/contrib/sqla/filters.py:50 msgid "not equal" msgstr "nu este egal" #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 -#: ../flask_admin/contrib/sqla/filters.py:58 +#: ../flask_admin/contrib/sqla/filters.py:59 msgid "contains" msgstr "conţine" #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 -#: ../flask_admin/contrib/sqla/filters.py:67 +#: ../flask_admin/contrib/sqla/filters.py:68 msgid "not contains" msgstr "nu conţine" #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 -#: ../flask_admin/contrib/sqla/filters.py:75 +#: ../flask_admin/contrib/sqla/filters.py:76 msgid "greater than" msgstr "mai mare decât" #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 -#: ../flask_admin/contrib/sqla/filters.py:83 +#: ../flask_admin/contrib/sqla/filters.py:84 msgid "smaller than" msgstr "mai mică decât" #: ../flask_admin/contrib/peewee/filters.py:88 -#: ../flask_admin/contrib/sqla/filters.py:94 +#: ../flask_admin/contrib/sqla/filters.py:95 msgid "empty" msgstr "gol" #: ../flask_admin/contrib/peewee/filters.py:102 -#: ../flask_admin/contrib/sqla/filters.py:108 +#: ../flask_admin/contrib/sqla/filters.py:109 msgid "in list" msgstr "în lista" #: ../flask_admin/contrib/peewee/filters.py:111 -#: ../flask_admin/contrib/sqla/filters.py:118 +#: ../flask_admin/contrib/sqla/filters.py:119 msgid "not in list" msgstr "nu în lista" @@ -282,44 +272,37 @@ msgstr "nu în lista" msgid "not between" msgstr "nu între" -msgid "ObjectId equals" -msgstr "" - -#, python-format -msgid "Failed to get model. %(error)s" -msgstr "Nu pentru a obţine model. %(error)s" - -#: ../flask_admin/contrib/peewee/view.py:435 -#: ../flask_admin/contrib/pymongo/view.py:316 -#: ../flask_admin/contrib/sqla/view.py:1078 +#: ../flask_admin/contrib/peewee/view.py:458 +#: ../flask_admin/contrib/pymongo/view.py:317 +#: ../flask_admin/contrib/sqla/view.py:1170 #, python-format msgid "Failed to create record. %(error)s" msgstr "Nu a reuşit să creaţi înregistrarea. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:454 -#: ../flask_admin/contrib/pymongo/view.py:341 -#: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 -#: ../flask_admin/model/base.py:2313 ../flask_admin/model/base.py:2315 +#: ../flask_admin/contrib/peewee/view.py:477 +#: ../flask_admin/contrib/pymongo/view.py:342 +#: ../flask_admin/contrib/sqla/view.py:1196 ../flask_admin/model/base.py:2463 +#: ../flask_admin/model/base.py:2471 ../flask_admin/model/base.py:2473 #, python-format msgid "Failed to update record. %(error)s" msgstr "Nu a reuşit să creaţi înregistrarea. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:469 -#: ../flask_admin/contrib/pymongo/view.py:366 -#: ../flask_admin/contrib/sqla/view.py:1129 +#: ../flask_admin/contrib/peewee/view.py:492 +#: ../flask_admin/contrib/pymongo/view.py:367 +#: ../flask_admin/contrib/sqla/view.py:1221 #, python-format msgid "Failed to delete record. %(error)s" msgstr "Imposibil de șters înregistrări. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:488 -#: ../flask_admin/contrib/pymongo/view.py:385 -#: ../flask_admin/contrib/sqla/view.py:1150 +#: ../flask_admin/contrib/peewee/view.py:511 +#: ../flask_admin/contrib/pymongo/view.py:386 +#: ../flask_admin/contrib/sqla/view.py:1242 msgid "Are you sure you want to delete selected records?" msgstr "Sigur ștergeți înregistrările selectate?" -#: ../flask_admin/contrib/peewee/view.py:505 -#: ../flask_admin/contrib/pymongo/view.py:395 -#: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 +#: ../flask_admin/contrib/peewee/view.py:528 +#: ../flask_admin/contrib/pymongo/view.py:396 +#: ../flask_admin/contrib/sqla/view.py:1258 ../flask_admin/model/base.py:2272 #, python-format msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." @@ -327,33 +310,33 @@ msgstr[0] "Recordul a fost şters cu succes." msgstr[1] "%(count)s înregistrări au fost şters cu succes." msgstr[2] "%(count)s înregistrări au fost şters cu succes." -#: ../flask_admin/contrib/peewee/view.py:511 -#: ../flask_admin/contrib/pymongo/view.py:400 -#: ../flask_admin/contrib/sqla/view.py:1174 +#: ../flask_admin/contrib/peewee/view.py:534 +#: ../flask_admin/contrib/pymongo/view.py:401 +#: ../flask_admin/contrib/sqla/view.py:1266 #, python-format msgid "Failed to delete records. %(error)s" msgstr "Imposibil de șters înregistrări. %(error)s" -#: ../flask_admin/contrib/sqla/fields.py:126 -#: ../flask_admin/contrib/sqla/fields.py:176 -#: ../flask_admin/contrib/sqla/fields.py:181 ../flask_admin/model/fields.py:173 -#: ../flask_admin/model/fields.py:222 +#: ../flask_admin/contrib/sqla/fields.py:117 +#: ../flask_admin/contrib/sqla/fields.py:167 +#: ../flask_admin/contrib/sqla/fields.py:172 ../flask_admin/model/fields.py:174 +#: ../flask_admin/model/fields.py:223 msgid "Not a valid choice" msgstr "Nu o alegere valabilă" -#: ../flask_admin/contrib/sqla/fields.py:186 +#: ../flask_admin/contrib/sqla/fields.py:201 msgid "Key" msgstr "" -#: ../flask_admin/contrib/sqla/fields.py:187 +#: ../flask_admin/contrib/sqla/fields.py:202 msgid "Value" msgstr "" -#: ../flask_admin/contrib/sqla/validators.py:42 +#: ../flask_admin/contrib/sqla/validators.py:28 msgid "Already exists." msgstr "Există deja." -#: ../flask_admin/contrib/sqla/validators.py:60 +#: ../flask_admin/contrib/sqla/validators.py:59 #, python-format msgid "At least %(num)d item is required" msgid_plural "At least %(num)d items are required" @@ -361,7 +344,15 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: ../flask_admin/contrib/sqla/view.py:1057 +#: ../flask_admin/contrib/sqla/validators.py:75 +msgid "Not a valid ISO currency code (e.g. USD, EUR, CNY)." +msgstr "" + +#: ../flask_admin/contrib/sqla/validators.py:83 +msgid "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." +msgstr "" + +#: ../flask_admin/contrib/sqla/view.py:1134 #, python-format msgid "Integrity error. %(message)s" msgstr "Eroare de integritate. %(message)s" @@ -370,274 +361,242 @@ msgstr "Eroare de integritate. %(message)s" msgid "Invalid time format" msgstr "Format nevalid timp" -#: ../flask_admin/form/fields.py:144 +#: ../flask_admin/form/fields.py:147 msgid "Invalid Choice: could not coerce" msgstr "Alegerea nevalid: nu ar putea constrânge" -#: ../flask_admin/form/fields.py:208 +#: ../flask_admin/form/fields.py:221 msgid "Invalid JSON" msgstr "JSON valid" -#: ../flask_admin/form/upload.py:207 +#: ../flask_admin/form/upload.py:216 msgid "Invalid file extension" msgstr "Extensia de fişier nevalid" -#: ../flask_admin/form/upload.py:214 ../flask_admin/form/upload.py:281 +#: ../flask_admin/form/upload.py:223 ../flask_admin/form/upload.py:293 #, python-format msgid "File \"%s\" already exists." msgstr "Fişier \"%s\" există deja." -#: ../flask_admin/model/base.py:1649 +#: ../flask_admin/form/validators.py:16 +msgid "This field requires at least one item." +msgstr "" + +#: ../flask_admin/model/base.py:1737 msgid "There are no items in the table." msgstr "Nu există elemente în masă." -#: ../flask_admin/model/base.py:1673 +#: ../flask_admin/model/base.py:1746 #, python-format msgid "Invalid Filter Value: %(value)s" msgstr "Valoare nevalidă filtru: %(value)s" -#: ../flask_admin/model/base.py:1984 +#: ../flask_admin/model/base.py:2136 msgid "Record was successfully created." msgstr "Recordul a fost creat cu succes." -#: ../flask_admin/model/base.py:2028 ../flask_admin/model/base.py:2080 -#: ../flask_admin/model/base.py:2113 ../flask_admin/model/base.py:2297 +#: ../flask_admin/model/base.py:2180 ../flask_admin/model/base.py:2232 +#: ../flask_admin/model/base.py:2265 ../flask_admin/model/base.py:2455 msgid "Record does not exist." msgstr "Nu există înregistrare." -#: ../flask_admin/model/base.py:2037 ../flask_admin/model/base.py:2301 +#: ../flask_admin/model/base.py:2189 ../flask_admin/model/base.py:2459 msgid "Record was successfully saved." msgstr "Înregistrarea a fost salvată cu succes." -#: ../flask_admin/model/base.py:2222 -msgid "Tablib dependency not installed." -msgstr "" - -#: ../flask_admin/model/base.py:2249 +#: ../flask_admin/model/base.py:2407 #, python-format msgid "Export type \"%(type)s not supported." msgstr "" -#: ../flask_admin/model/filters.py:103 ../flask_admin/model/widgets.py:111 +#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:119 msgid "Yes" msgstr "da" -#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:110 +#: ../flask_admin/model/filters.py:105 ../flask_admin/model/widgets.py:118 msgid "No" msgstr "nu" -#: ../flask_admin/model/filters.py:172 ../flask_admin/model/filters.py:212 -#: ../flask_admin/model/filters.py:257 +#: ../flask_admin/model/filters.py:173 ../flask_admin/model/filters.py:213 +#: ../flask_admin/model/filters.py:258 msgid "between" msgstr "între" -#: ../flask_admin/model/template.py:81 ../flask_admin/model/template.py:88 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:37 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:8 +#: ../flask_admin/model/template.py:83 ../flask_admin/model/template.py:90 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:7 msgid "View Record" msgstr "Vezi Record" -#: ../flask_admin/model/template.py:95 ../flask_admin/model/template.py:102 -#: ../flask_admin/model/template.py:109 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/edit.html:11 +#: ../flask_admin/model/template.py:97 ../flask_admin/model/template.py:104 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/edit.html:10 msgid "Edit Record" msgstr "Editaţi înregistrarea" -#: ../flask_admin/model/widgets.py:61 +#: ../flask_admin/model/template.py:111 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Delete Record" +msgstr "" + +#: ../flask_admin/model/widgets.py:62 msgid "Please select model" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/actions.html:4 -#: ../flask_admin/templates/bootstrap3/admin/actions.html:4 +#: ../flask_admin/templates/bootstrap4/admin/actions.html:5 msgid "With selected" msgstr "Cu selectate" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:200 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:190 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:216 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:227 msgid "Save" msgstr "Salvaţi" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:205 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:195 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:221 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:232 msgid "Cancel" msgstr "Revocare" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:256 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:247 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:290 msgid "Save and Add Another" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:259 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:250 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:293 msgid "Save and Continue Editing" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:9 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:9 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:10 msgid "Root" msgstr "Rădăcină" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:90 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:99 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:89 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:98 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:42 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:51 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:89 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:98 #, python-format msgid "Sort by %(name)s" msgstr "Un fel de %(name)s" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:77 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:79 msgid "Rename File" msgstr "Redenumiţi Fişierul" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:88 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:88 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:90 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\' recursively?" msgstr "Sunteţi sigur că doriţi să ştergeţi \\'%(name)s\\' recursiv?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:97 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:97 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:99 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\'?" msgstr "Sunteţi sigur că doriţi să ştergeţi \\'%(name)s\\'?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:125 -msgid "Size" -msgstr "" - -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:185 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:187 msgid "Please select at least one file." msgstr "Vă rugăm să selectaţi cel puţin un fişier." -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:8 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:17 msgid "List" msgstr "Lista" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:12 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:18 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 msgid "Create" msgstr "Crea" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:26 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:26 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:21 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:26 msgid "Details" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:29 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:28 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:15 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:28 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:15 msgid "Filter" msgstr "Filtrare" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:13 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:14 msgid "Delete?" msgstr "Ştergeţi?" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:33 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:16 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:35 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Are you sure you want to delete this record?" +msgstr "Sigur ștergeți această înregistrare?" + +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:33 msgid "New" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:43 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:43 msgid "Add" msgstr "Adauga" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:3 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:3 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:2 msgid "Add Filter" msgstr "Adauga filtru" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:30 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:19 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:26 msgid "Export" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:38 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:38 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:49 msgid "Apply" msgstr "Se aplică" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:40 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:51 msgid "Reset Filters" msgstr "Resetaţi filtrele" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:66 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:64 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:80 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:93 +#, python-format +msgid "%(placeholder)s" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:88 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:94 msgid "Search" msgstr "Căutare" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:74 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:77 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:78 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:79 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:72 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:75 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:76 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:77 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:102 msgid "items" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/create.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/create.html:10 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/create.html:10 msgid "Create New Record" msgstr "Creare Nou Record" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:76 msgid "Select all records" msgstr "Selectaţi toate înregistrările" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:120 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:119 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:119 msgid "Select record" msgstr "Selectaţi înregistrare" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:186 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:195 msgid "Please select at least one record." msgstr "Vă rugăm să selectaţi cel puţin o înregistrare." -#: ../flask_admin/templates/bootstrap2/admin/model/row_actions.html:34 -#: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 -msgid "Are you sure you want to delete this record?" -msgstr "Sigur ștergeți această înregistrare?" +#~ msgid "ObjectId equals" +#~ msgstr "" + +#~ msgid "Failed to get model. %(error)s" +#~ msgstr "Nu pentru a obţine model. %(error)s" + +#~ msgid "Tablib dependency not installed." +#~ msgstr "" + +#~ msgid "Size" +#~ msgstr "" + diff --git a/flask_admin/translations/ru/LC_MESSAGES/admin.mo b/flask_admin/translations/ru/LC_MESSAGES/admin.mo index e697d9c85d7556fb7be465d85b90aa886f6dcca7..07a8cd868baa72b31878cf3fcc061cc54e64d2e3 100644 GIT binary patch delta 1885 zcmYM!3useU9LMp0Y)sWw+r&q0bv3PzS=*E(YpboR+G_Dx<`Z=IK<RwY%{dqYMTxqH zY$7VLB8uPxQJHkYt)PfZieMFn_$YCLMWk9qWr(N~MfUxX0}Dw$_kZrW=kY)1+-<WS zPfv7({4K`k8-Bz2{gk2T|IhP)nTlRuKYWQf_yK!kcBWZ1hA@J2Fov7349__K#s=a* zAAYKbgUu4QfQwHlSm)fEzF`-TXY2;*ffVLq7Y6YkSMKYZuGa@?&~jZo2Fr=daRe@N zZb3isVa%d`JH~|?ZpA$O6N@l~>i8XwLQQ`(jK*S|?c(*Q4)(e7HXKQu!eRIx3o$P% z{ah8Q{t_&qf7{4KJ|4#cyo3YruCoW#&>Pf%LfPpV<fE3X5W_eT)$mf}Yn%BSg1=%2 zkGOIV2NGY#gx2;B7fQ)p=Y3T9L+pi*Q4KuBLHNPN!T#xvN1-y(fNFRxs^iV>ei9pr z+fbS4#q6|)iUyE>CS@@Sw05;f9b14J&`RfORL9MzOl?JF;vi~ZM^VqUp_Z~8BX}E2 z(MNAu(g=p}3oOG8IpkjhI81?d^J!H42dcq~s7zc#ZN|TleP^Ah`dz4jbR$WzXQ+Dr zy89Z9+6$oWhmh@LBV2h&!riFEl+Ual`C0+f`UFc+YdjM*)7AVf!HqZ#Z{q|UO5SJU zJe-Y(@E-P{I&LR@<#+=Z;YX~)#6t3}RP9G?o-0V!tQ)n9U*Q<cV?k9u37MQVqE5v! z)WEjmWNbkVtP}NKDBwtGLJLvH{43Nc+J&^AFprBF6r@ly4G-nzfVEhQzhNbIxcDQ+ zi9cr}sQg>3!4p`44{$sV<|tKTBTm5`I2Jpw247-K=f8}zRYt*b4C7AJ8|(}+3F|`5 z{53|=&nV|&B~Ha(P)l_kmB}YqibE(=M(a@nU4_~^2T)6L6a(~ctz7VquyZQF%cuvh zqL!csb!@Wun}Xv|DQ?Ek@GL5|-Kf-N^YCtrV+ppS+Ifz;pBqk3qzV&E%GPk95&ei- z%RM*=kK=TFh#KIyqVzehM8;%`QG4JARH_eQ6?USQD7!eF*~zF)`8BG)^Qb*>r<nY! zp+^+3&n$ys`Y|8XVIitwiHmET4aml}xv0(9gsS(wi+@J7*W%*eQA>Fd_1rDAx~3+p z^WvEU{a#bnTc6k5|Ee!JK4+KrC})l@7_W##t0VD>a6DcUtuBqmlJ&tg87t;5N}dkx n^i51wgue5~s>-9@snE4dueBiH_ih&M$w;m*?(n`GdD8bE7jVL| delta 2124 zcmYM!dra0<9LMp)MGZl2Qd~s%aZzhr<R%CaL84%pk-=uRm0X?}a#03U*xG~mhg*uc zo>-f$MXRNmHtK=pBxu>z%8~m$U94=jRjjoN`6u19Kj{7GIa}=E_d4hMJLmk)`JVIp z{Z@DALGMrT;bVrsUj9@0e=AJ2|NnAV7^6@guEau&!Ae|)JFpygVICgCLcD;v_?I>L z4r8`b--gT84(~L^YkU+o5O~KL2;MNakiI4+BG@4jW2vWM9B#Dn8dSS_WI)qk>rZ1o z^&U*e*Q_%bPW>82@_h3P1r2;16LASMFp=eIrsbH8)wm8ln2ASi{XNtJzOnJYF^hU) zB$LH^aSiUV^=DB1$1t7eoAVUz!S68{L!*pI!BmXKGV3<fKuxHL^`cht9BS)cKnG8v zCNz!w%#U2|!rw6-mux(K75QIHAf1BtxEM8HnYGf!YcQ1fR@4CXs59^cCSa$H51~Wd zhg#tzYW(j|6Zq5K4`o#kQ_qSf|4LCW0S$NpNrD+i?d4gdkGY7Nm}~tO_28?hj4h%v z62TyvU@WR%7OGz%YKu!T59=@o2V%&-_WBJ14t{E#$6V^m=%oo2p-y|1t=FO+(16O^ zlc+=3f}C5k57oX8HL*b?>t+bmZp7Xn^HR_QUbPKQA?MFb+W4%EU&60KNG0+!XISQ1 zoJQ^a52%&j<nlO1koQ__#m#scx8u+F5ay7+tLS}}f@ZdheCOj+*o4Qi2Io;JTh9jS zP&FdiHvOnmei+x|DI33xB+p#KY+OK1ES^{Eeq4u|m<Rc8c+D9KTG2diz#FL7Y;98T z0b8)1dOK>R6SxDv#QQLX1F#8qqw2@82<L2k2`i{?;+3kz16YFRu<XD0pF%l-6yB|B zY{a{93@dOJ^+mgdIukj}!ol6B_#m=K^DZhg7qI{X*npwz(-wRT`I%R^D5F!D!}&A6 zQc!ARconpgji^K9L2XSB>JUATd|S-0t&gDky^K7|Oro|Vfc(r2F4dSoBc;3vi}55X z)0fe!RNtg9im6WULv$83&=u7E+o%;e8Nm<Gqo|2>qxSY7R^bTN;T&qB348?f9Z2WG z8qEW!etS`8qdSxQEA=lCD8)I{-i7gWO`w#EQoaXuYL6hhV7^A3nMKsV8jW*m(l8uL zP!lLewX3!DChK10MKGP&n}es-Ya5QDPVYEszzJLb47JBsP#qVt{eLW96CTm->36#K zw|Tn!iz`=!#yrxp&(qq!z0L9T4m5Z5`TvRfJS42+pvU(~^k{l>OIJsW)8;wg>1p%y zv<^Bw`}>`ap1%I(t}ahozJF)T&XBmmvb=(#yn-^PprAtKQs24Qc3)!LQQw<!y<x@q zCH|!NFIM>8PF|hne(cV=(}BZ*BkuXYaNwBZeneo>og#QF-&dHN<X=d>9hSv(h`%3r zkvkUx!|sF=7;-1v58N4d*0`@Tz_9OnTDm_fturigoI4*f&{SZ^H;{2Dt1&oh+D<vN WJf!~WNcU;Rn{g-d{Z*N#L;eLT?<lYU diff --git a/flask_admin/translations/ru/LC_MESSAGES/admin.po b/flask_admin/translations/ru/LC_MESSAGES/admin.po index 9e5d2024b..d0e25830e 100644 --- a/flask_admin/translations/ru/LC_MESSAGES/admin.po +++ b/flask_admin/translations/ru/LC_MESSAGES/admin.po @@ -1,275 +1,265 @@ + msgid "" msgstr "" -"Project-Id-Version: flask-admin\n" +"Project-Id-Version: flask-admin\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-02-07 00:17-0600\n" +"POT-Creation-Date: 2024-09-24 22:09+0100\n" "PO-Revision-Date: 2017-02-13 09:18-0500\n" "Last-Translator: mrjoes <serge.koval@gmail.com>\n" +"Language: ru_RU\n" "Language-Team: Russian\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.1.1\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: flask-admin\n" -"X-Crowdin-Language: ru\n" -"X-Crowdin-File: admin.pot\n" -"Language: ru_RU\n" +"Generated-By: Babel 2.16.0\n" -#: ../flask_admin/base.py:440 +#: ../flask_admin/base.py:458 msgid "Home" msgstr "Главная" -#: ../flask_admin/contrib/rediscli.py:127 +#: ../flask_admin/contrib/rediscli.py:113 msgid "Cli: Invalid command." msgstr "CLI: Недопустимая команда." -#: ../flask_admin/contrib/fileadmin/__init__.py:352 +#: ../flask_admin/contrib/fileadmin/__init__.py:376 msgid "File to upload" msgstr "Файл для загрузки" -#: ../flask_admin/contrib/fileadmin/__init__.py:360 +#: ../flask_admin/contrib/fileadmin/__init__.py:384 msgid "File required." msgstr "Необходимо выбрать файл" -#: ../flask_admin/contrib/fileadmin/__init__.py:365 +#: ../flask_admin/contrib/fileadmin/__init__.py:389 msgid "Invalid file type." msgstr "Недопустимый тип файла." -#: ../flask_admin/contrib/fileadmin/__init__.py:376 +#: ../flask_admin/contrib/fileadmin/__init__.py:400 msgid "Content" msgstr "Содержимое сайта" -#: ../flask_admin/contrib/fileadmin/__init__.py:390 +#: ../flask_admin/contrib/fileadmin/__init__.py:414 msgid "Invalid name" msgstr "Недопустимое имя" -#: ../flask_admin/contrib/fileadmin/__init__.py:398 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:106 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:112 -#: ../flask_admin/tests/sqla/test_translation.py:17 +#: ../flask_admin/contrib/fileadmin/__init__.py:422 +#: ../flask_admin/tests/sqla/test_translation.py:21 msgid "Name" msgstr "Имя" -#: ../flask_admin/contrib/fileadmin/__init__.py:757 +#: ../flask_admin/contrib/fileadmin/__init__.py:784 #, python-format msgid "File \"%(name)s\" already exists." msgstr "Файл с именем \"%(name)s\" уже существует." -#: ../flask_admin/contrib/fileadmin/__init__.py:802 -#: ../flask_admin/contrib/fileadmin/__init__.py:885 -#: ../flask_admin/contrib/fileadmin/__init__.py:947 -#: ../flask_admin/contrib/fileadmin/__init__.py:1000 -#: ../flask_admin/contrib/fileadmin/__init__.py:1047 -#: ../flask_admin/contrib/fileadmin/__init__.py:1099 -#: ../flask_admin/model/base.py:2168 +#: ../flask_admin/contrib/fileadmin/__init__.py:829 +#: ../flask_admin/contrib/fileadmin/__init__.py:926 +#: ../flask_admin/contrib/fileadmin/__init__.py:988 +#: ../flask_admin/contrib/fileadmin/__init__.py:1041 +#: ../flask_admin/contrib/fileadmin/__init__.py:1088 +#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/model/base.py:2324 msgid "Permission denied." msgstr "Доступ запрещён." -#: ../flask_admin/contrib/fileadmin/__init__.py:881 +#: ../flask_admin/contrib/fileadmin/__init__.py:922 msgid "File uploading is disabled." msgstr "Загрузка файлов запрещена." -#: ../flask_admin/contrib/fileadmin/__init__.py:892 +#: ../flask_admin/contrib/fileadmin/__init__.py:933 #, python-format msgid "Successfully saved file: %(name)s" msgstr "Файл успешно сохранён: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:896 +#: ../flask_admin/contrib/fileadmin/__init__.py:937 #, python-format msgid "Failed to save file: %(error)s" msgstr "Ошибка сохранения файла: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:904 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:150 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:150 +#: ../flask_admin/contrib/fileadmin/__init__.py:945 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:150 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:152 msgid "Upload File" msgstr "Загрузить файл" -#: ../flask_admin/contrib/fileadmin/__init__.py:943 +#: ../flask_admin/contrib/fileadmin/__init__.py:984 msgid "Directory creation is disabled." msgstr "Создание новых директорий запрещено." -#: ../flask_admin/contrib/fileadmin/__init__.py:956 +#: ../flask_admin/contrib/fileadmin/__init__.py:997 #, python-format msgid "Successfully created directory: %(directory)s" msgstr "Каталог успешно создан: %(directory)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:960 +#: ../flask_admin/contrib/fileadmin/__init__.py:1001 #, python-format msgid "Failed to create directory: %(error)s" msgstr "Ошибка создания директории: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:970 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:161 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:161 +#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:161 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:163 msgid "Create Directory" msgstr "Создать директорию" -#: ../flask_admin/contrib/fileadmin/__init__.py:996 +#: ../flask_admin/contrib/fileadmin/__init__.py:1037 msgid "Deletion is disabled." msgstr "Удаление запрещено." -#: ../flask_admin/contrib/fileadmin/__init__.py:1005 +#: ../flask_admin/contrib/fileadmin/__init__.py:1046 msgid "Directory deletion is disabled." msgstr "Удаление директорий запрещено." -#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/contrib/fileadmin/__init__.py:1052 #, python-format msgid "Directory \"%(path)s\" was successfully deleted." msgstr "Каталог «%(path)s» был успешно удален." -#: ../flask_admin/contrib/fileadmin/__init__.py:1013 +#: ../flask_admin/contrib/fileadmin/__init__.py:1054 #, python-format msgid "Failed to delete directory: %(error)s" msgstr "Ошибка удаления директории: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1019 -#: ../flask_admin/contrib/fileadmin/__init__.py:1176 +#: ../flask_admin/contrib/fileadmin/__init__.py:1060 +#: ../flask_admin/contrib/fileadmin/__init__.py:1215 #, python-format msgid "File \"%(name)s\" was successfully deleted." msgstr "Файл \"%(name)s\" был удален." -#: ../flask_admin/contrib/fileadmin/__init__.py:1021 -#: ../flask_admin/contrib/fileadmin/__init__.py:1178 +#: ../flask_admin/contrib/fileadmin/__init__.py:1062 +#: ../flask_admin/contrib/fileadmin/__init__.py:1217 #, python-format msgid "Failed to delete file: %(name)s" msgstr "Ошибка удаления файла: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1043 +#: ../flask_admin/contrib/fileadmin/__init__.py:1084 msgid "Renaming is disabled." msgstr "Переименование отключено." -#: ../flask_admin/contrib/fileadmin/__init__.py:1051 +#: ../flask_admin/contrib/fileadmin/__init__.py:1092 msgid "Path does not exist." msgstr "Путь не существует." -#: ../flask_admin/contrib/fileadmin/__init__.py:1061 +#: ../flask_admin/contrib/fileadmin/__init__.py:1102 #, python-format msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\"" msgstr "\"%(src)s\" был переименован в \"%(dst)s\"" -#: ../flask_admin/contrib/fileadmin/__init__.py:1064 +#: ../flask_admin/contrib/fileadmin/__init__.py:1105 #, python-format msgid "Failed to rename: %(error)s" msgstr "Ошибка переименования: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1078 +#: ../flask_admin/contrib/fileadmin/__init__.py:1119 #, python-format msgid "Rename %(name)s" msgstr "Переименовать %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1115 +#: ../flask_admin/contrib/fileadmin/__init__.py:1155 #, python-format msgid "Error saving changes to %(name)s." msgstr "Ошибка при сохранении изменений в %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1119 +#: ../flask_admin/contrib/fileadmin/__init__.py:1159 #, python-format msgid "Changes to %(name)s saved successfully." msgstr "Изменения в %(name)s успешно сохранены." -#: ../flask_admin/contrib/fileadmin/__init__.py:1128 +#: ../flask_admin/contrib/fileadmin/__init__.py:1167 #, python-format msgid "Error reading %(name)s." msgstr "Ошибка чтения %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1131 -#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/contrib/fileadmin/__init__.py:1170 +#: ../flask_admin/contrib/fileadmin/__init__.py:1179 #, python-format msgid "Unexpected error while reading from %(name)s" msgstr "Непредвиденная ошибка при чтении из %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1137 +#: ../flask_admin/contrib/fileadmin/__init__.py:1176 #, python-format msgid "Cannot edit %(name)s." msgstr "Не удается изменить %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1155 +#: ../flask_admin/contrib/fileadmin/__init__.py:1194 #, python-format msgid "Editing %(path)s" msgstr "Редактирование %(path)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/peewee/view.py:487 -#: ../flask_admin/contrib/pymongo/view.py:384 -#: ../flask_admin/contrib/sqla/view.py:1149 +#: ../flask_admin/contrib/fileadmin/__init__.py:1202 +#: ../flask_admin/contrib/peewee/view.py:510 +#: ../flask_admin/contrib/pymongo/view.py:385 +#: ../flask_admin/contrib/sqla/view.py:1241 msgid "Delete" msgstr "Удалить" -#: ../flask_admin/contrib/fileadmin/__init__.py:1164 +#: ../flask_admin/contrib/fileadmin/__init__.py:1203 msgid "Are you sure you want to delete these files?" msgstr "Вы уверены что хотите удалить эти файлы?" -#: ../flask_admin/contrib/fileadmin/__init__.py:1167 +#: ../flask_admin/contrib/fileadmin/__init__.py:1206 msgid "File deletion is disabled." msgstr "Удаление файлов отключено." -#: ../flask_admin/contrib/fileadmin/__init__.py:1180 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:22 +#: ../flask_admin/contrib/fileadmin/__init__.py:1219 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:22 msgid "Edit" msgstr "Изменить" -#: ../flask_admin/contrib/fileadmin/s3.py:153 +#: ../flask_admin/contrib/fileadmin/s3.py:162 msgid "Cannot operate on non empty directories" msgstr "Невозможно редактировать непустые директории" #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 -#: ../flask_admin/contrib/sqla/filters.py:41 +#: ../flask_admin/contrib/sqla/filters.py:42 msgid "equals" msgstr "равно" #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 -#: ../flask_admin/contrib/sqla/filters.py:49 +#: ../flask_admin/contrib/sqla/filters.py:50 msgid "not equal" msgstr "не равно" #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 -#: ../flask_admin/contrib/sqla/filters.py:58 +#: ../flask_admin/contrib/sqla/filters.py:59 msgid "contains" msgstr "содержит" #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 -#: ../flask_admin/contrib/sqla/filters.py:67 +#: ../flask_admin/contrib/sqla/filters.py:68 msgid "not contains" msgstr "не содержит" #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 -#: ../flask_admin/contrib/sqla/filters.py:75 +#: ../flask_admin/contrib/sqla/filters.py:76 msgid "greater than" msgstr "больше чем" #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 -#: ../flask_admin/contrib/sqla/filters.py:83 +#: ../flask_admin/contrib/sqla/filters.py:84 msgid "smaller than" msgstr "меньше чем" #: ../flask_admin/contrib/peewee/filters.py:88 -#: ../flask_admin/contrib/sqla/filters.py:94 +#: ../flask_admin/contrib/sqla/filters.py:95 msgid "empty" msgstr "пусто" #: ../flask_admin/contrib/peewee/filters.py:102 -#: ../flask_admin/contrib/sqla/filters.py:108 +#: ../flask_admin/contrib/sqla/filters.py:109 msgid "in list" msgstr "в списке" #: ../flask_admin/contrib/peewee/filters.py:111 -#: ../flask_admin/contrib/sqla/filters.py:118 +#: ../flask_admin/contrib/sqla/filters.py:119 msgid "not in list" msgstr "нет в списке" @@ -282,44 +272,37 @@ msgstr "нет в списке" msgid "not between" msgstr "не между" -msgid "ObjectId equals" -msgstr "Id объекта равно" - -#, python-format -msgid "Failed to get model. %(error)s" -msgstr "Не удалось получить модель. %(error)s" - -#: ../flask_admin/contrib/peewee/view.py:435 -#: ../flask_admin/contrib/pymongo/view.py:316 -#: ../flask_admin/contrib/sqla/view.py:1078 +#: ../flask_admin/contrib/peewee/view.py:458 +#: ../flask_admin/contrib/pymongo/view.py:317 +#: ../flask_admin/contrib/sqla/view.py:1170 #, python-format msgid "Failed to create record. %(error)s" msgstr "Ошибка создания записи: %(error)s" -#: ../flask_admin/contrib/peewee/view.py:454 -#: ../flask_admin/contrib/pymongo/view.py:341 -#: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 -#: ../flask_admin/model/base.py:2313 ../flask_admin/model/base.py:2315 +#: ../flask_admin/contrib/peewee/view.py:477 +#: ../flask_admin/contrib/pymongo/view.py:342 +#: ../flask_admin/contrib/sqla/view.py:1196 ../flask_admin/model/base.py:2463 +#: ../flask_admin/model/base.py:2471 ../flask_admin/model/base.py:2473 #, python-format msgid "Failed to update record. %(error)s" msgstr "Ошибка обновления записи: %(error)s" -#: ../flask_admin/contrib/peewee/view.py:469 -#: ../flask_admin/contrib/pymongo/view.py:366 -#: ../flask_admin/contrib/sqla/view.py:1129 +#: ../flask_admin/contrib/peewee/view.py:492 +#: ../flask_admin/contrib/pymongo/view.py:367 +#: ../flask_admin/contrib/sqla/view.py:1221 #, python-format msgid "Failed to delete record. %(error)s" msgstr "Ошибка удаления записи: %(error)s" -#: ../flask_admin/contrib/peewee/view.py:488 -#: ../flask_admin/contrib/pymongo/view.py:385 -#: ../flask_admin/contrib/sqla/view.py:1150 +#: ../flask_admin/contrib/peewee/view.py:511 +#: ../flask_admin/contrib/pymongo/view.py:386 +#: ../flask_admin/contrib/sqla/view.py:1242 msgid "Are you sure you want to delete selected records?" msgstr "Вы уверены что хотите удалить ?" -#: ../flask_admin/contrib/peewee/view.py:505 -#: ../flask_admin/contrib/pymongo/view.py:395 -#: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 +#: ../flask_admin/contrib/peewee/view.py:528 +#: ../flask_admin/contrib/pymongo/view.py:396 +#: ../flask_admin/contrib/sqla/view.py:1258 ../flask_admin/model/base.py:2272 #, python-format msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." @@ -327,33 +310,33 @@ msgstr[0] "Запись успешно удалена." msgstr[1] "Было удалено %(count)s записей." msgstr[2] "Было удалено %(count)s записей." -#: ../flask_admin/contrib/peewee/view.py:511 -#: ../flask_admin/contrib/pymongo/view.py:400 -#: ../flask_admin/contrib/sqla/view.py:1174 +#: ../flask_admin/contrib/peewee/view.py:534 +#: ../flask_admin/contrib/pymongo/view.py:401 +#: ../flask_admin/contrib/sqla/view.py:1266 #, python-format msgid "Failed to delete records. %(error)s" msgstr "Не удалось удалить записи. %(error)s" -#: ../flask_admin/contrib/sqla/fields.py:126 -#: ../flask_admin/contrib/sqla/fields.py:176 -#: ../flask_admin/contrib/sqla/fields.py:181 ../flask_admin/model/fields.py:173 -#: ../flask_admin/model/fields.py:222 +#: ../flask_admin/contrib/sqla/fields.py:117 +#: ../flask_admin/contrib/sqla/fields.py:167 +#: ../flask_admin/contrib/sqla/fields.py:172 ../flask_admin/model/fields.py:174 +#: ../flask_admin/model/fields.py:223 msgid "Not a valid choice" msgstr "Неверный вариант" -#: ../flask_admin/contrib/sqla/fields.py:186 +#: ../flask_admin/contrib/sqla/fields.py:201 msgid "Key" msgstr "Ключ" -#: ../flask_admin/contrib/sqla/fields.py:187 +#: ../flask_admin/contrib/sqla/fields.py:202 msgid "Value" msgstr "Значение" -#: ../flask_admin/contrib/sqla/validators.py:42 +#: ../flask_admin/contrib/sqla/validators.py:28 msgid "Already exists." msgstr "Уже существует." -#: ../flask_admin/contrib/sqla/validators.py:60 +#: ../flask_admin/contrib/sqla/validators.py:59 #, python-format msgid "At least %(num)d item is required" msgid_plural "At least %(num)d items are required" @@ -361,7 +344,15 @@ msgstr[0] "По крайней мере %(num)d элемент требуетс msgstr[1] "По крайней мере %(num)d элемента требуется" msgstr[2] "По крайней мере %(num)d элементов требуется" -#: ../flask_admin/contrib/sqla/view.py:1057 +#: ../flask_admin/contrib/sqla/validators.py:75 +msgid "Not a valid ISO currency code (e.g. USD, EUR, CNY)." +msgstr "" + +#: ../flask_admin/contrib/sqla/validators.py:83 +msgid "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." +msgstr "" + +#: ../flask_admin/contrib/sqla/view.py:1134 #, python-format msgid "Integrity error. %(message)s" msgstr "Ошибка целостности. %(message)s" @@ -370,274 +361,242 @@ msgstr "Ошибка целостности. %(message)s" msgid "Invalid time format" msgstr "Неправильный формат времени." -#: ../flask_admin/form/fields.py:144 +#: ../flask_admin/form/fields.py:147 msgid "Invalid Choice: could not coerce" msgstr "Неверный вариант: невозможно преобразовать" -#: ../flask_admin/form/fields.py:208 +#: ../flask_admin/form/fields.py:221 msgid "Invalid JSON" msgstr "Недопустимый JSON" -#: ../flask_admin/form/upload.py:207 +#: ../flask_admin/form/upload.py:216 msgid "Invalid file extension" msgstr "Недопустимое расширение" -#: ../flask_admin/form/upload.py:214 ../flask_admin/form/upload.py:281 +#: ../flask_admin/form/upload.py:223 ../flask_admin/form/upload.py:293 #, python-format msgid "File \"%s\" already exists." msgstr "Файл с именем \"%s\" уже существует." -#: ../flask_admin/model/base.py:1649 +#: ../flask_admin/form/validators.py:16 +msgid "This field requires at least one item." +msgstr "" + +#: ../flask_admin/model/base.py:1737 msgid "There are no items in the table." msgstr "Нет элементов в таблице." -#: ../flask_admin/model/base.py:1673 +#: ../flask_admin/model/base.py:1746 #, python-format msgid "Invalid Filter Value: %(value)s" msgstr "Недопустимое значение фильтра: %(value)s" -#: ../flask_admin/model/base.py:1984 +#: ../flask_admin/model/base.py:2136 msgid "Record was successfully created." msgstr "Запись была создана." -#: ../flask_admin/model/base.py:2028 ../flask_admin/model/base.py:2080 -#: ../flask_admin/model/base.py:2113 ../flask_admin/model/base.py:2297 +#: ../flask_admin/model/base.py:2180 ../flask_admin/model/base.py:2232 +#: ../flask_admin/model/base.py:2265 ../flask_admin/model/base.py:2455 msgid "Record does not exist." msgstr "Запись не существует." -#: ../flask_admin/model/base.py:2037 ../flask_admin/model/base.py:2301 +#: ../flask_admin/model/base.py:2189 ../flask_admin/model/base.py:2459 msgid "Record was successfully saved." msgstr "Запись была сохранена." -#: ../flask_admin/model/base.py:2222 -msgid "Tablib dependency not installed." -msgstr "Tablib не установлена." - -#: ../flask_admin/model/base.py:2249 +#: ../flask_admin/model/base.py:2407 #, python-format msgid "Export type \"%(type)s not supported." msgstr "Экспорт в формате %(type)s не поддерживается." -#: ../flask_admin/model/filters.py:103 ../flask_admin/model/widgets.py:111 +#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:119 msgid "Yes" msgstr "Да" -#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:110 +#: ../flask_admin/model/filters.py:105 ../flask_admin/model/widgets.py:118 msgid "No" msgstr "Нет" -#: ../flask_admin/model/filters.py:172 ../flask_admin/model/filters.py:212 -#: ../flask_admin/model/filters.py:257 +#: ../flask_admin/model/filters.py:173 ../flask_admin/model/filters.py:213 +#: ../flask_admin/model/filters.py:258 msgid "between" msgstr "между" -#: ../flask_admin/model/template.py:81 ../flask_admin/model/template.py:88 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:37 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:8 +#: ../flask_admin/model/template.py:83 ../flask_admin/model/template.py:90 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:7 msgid "View Record" msgstr "Просмотр записи" -#: ../flask_admin/model/template.py:95 ../flask_admin/model/template.py:102 -#: ../flask_admin/model/template.py:109 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/edit.html:11 +#: ../flask_admin/model/template.py:97 ../flask_admin/model/template.py:104 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/edit.html:10 msgid "Edit Record" msgstr "Редактировать запись" -#: ../flask_admin/model/widgets.py:61 +#: ../flask_admin/model/template.py:111 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Delete Record" +msgstr "" + +#: ../flask_admin/model/widgets.py:62 msgid "Please select model" msgstr "Пожалуйста, выберите модель" -#: ../flask_admin/templates/bootstrap2/admin/actions.html:4 -#: ../flask_admin/templates/bootstrap3/admin/actions.html:4 +#: ../flask_admin/templates/bootstrap4/admin/actions.html:5 msgid "With selected" msgstr "С выбранным" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:200 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:190 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:216 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:227 msgid "Save" msgstr "Сохранить" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:205 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:195 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:221 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:232 msgid "Cancel" msgstr "Отмена" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:256 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:247 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:290 msgid "Save and Add Another" msgstr "Сохранить и добавить новый объект" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:259 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:250 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:293 msgid "Save and Continue Editing" msgstr "Сохранить и продолжить редактирование" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:9 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:9 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:10 msgid "Root" msgstr "Корень" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:90 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:99 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:89 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:98 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:42 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:51 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:89 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:98 #, python-format msgid "Sort by %(name)s" msgstr "Сортировать по %(name)s" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:77 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:79 msgid "Rename File" msgstr "Переименовать файла" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:88 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:88 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:90 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\' recursively?" msgstr "Вы уверены что хотите рекурсивно удалить \\'%(name)s\\'?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:97 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:97 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:99 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\'?" msgstr "Вы уверены что хотите удалить \\'%(name)s\\'?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:125 -msgid "Size" -msgstr "Размер" - -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:185 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:187 msgid "Please select at least one file." msgstr "Выберите по крайней мере один файл." -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:8 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:17 msgid "List" msgstr "Список" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:12 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:18 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 msgid "Create" msgstr "Создать" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:26 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:26 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:21 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:26 msgid "Details" msgstr "Подробнее" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:29 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:28 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:15 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:28 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:15 msgid "Filter" msgstr "Фильтровать" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:13 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:14 msgid "Delete?" msgstr "Удалить?" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:33 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:16 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:35 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Are you sure you want to delete this record?" +msgstr "Вы уверены что хотите удалить эту запись?" + +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:33 msgid "New" msgstr "Новый" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:43 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:43 msgid "Add" msgstr "Добавить" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:3 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:3 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:2 msgid "Add Filter" msgstr "Добавить Фильтр" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:30 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:19 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:26 msgid "Export" msgstr "Экспортировать" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:38 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:38 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:49 msgid "Apply" msgstr "Применить" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:40 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:51 msgid "Reset Filters" msgstr "Сброс Фильтров" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:66 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:64 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:80 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:93 +#, python-format +msgid "%(placeholder)s" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:88 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:94 msgid "Search" msgstr "Поиск" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:74 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:77 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:78 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:79 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:72 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:75 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:76 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:77 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:102 msgid "items" msgstr "элементы" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/create.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/create.html:10 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/create.html:10 msgid "Create New Record" msgstr "Создать новую запись" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:76 msgid "Select all records" msgstr "Выбрать все записи" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:120 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:119 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:119 msgid "Select record" msgstr "Выберите запись" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:186 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:195 msgid "Please select at least one record." msgstr "Выберите по крайней мере одну запись." -#: ../flask_admin/templates/bootstrap2/admin/model/row_actions.html:34 -#: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 -msgid "Are you sure you want to delete this record?" -msgstr "Вы уверены что хотите удалить эту запись?" +#~ msgid "ObjectId equals" +#~ msgstr "Id объекта равно" + +#~ msgid "Failed to get model. %(error)s" +#~ msgstr "Не удалось получить модель. %(error)s" + +#~ msgid "Tablib dependency not installed." +#~ msgstr "Tablib не установлена." + +#~ msgid "Size" +#~ msgstr "Размер" + diff --git a/flask_admin/translations/sk/LC_MESSAGES/admin.mo b/flask_admin/translations/sk/LC_MESSAGES/admin.mo index e54c0e22bb3460d85582ea4df6b2cb871bb91c43..1ee7e757df6a4e41c6838e80e677f924d29e5357 100644 GIT binary patch delta 1859 zcmYMze@NX`7{~GF&g+~xy?VE_)Xi(P&0p7DucBOYE5<7O`Op4{=0X-*anV|W!Jr@4 zHfVo1rS_cz8DV3CQ7{s2c$FwCL|g19wJ027HKo{O&Hj)P8+(7e2PW71`kr&o_nhZE z&p8t<OR>aE&_7`Ob?{%xe|Lsj_y5kVG*j1kd;l+F0Iy;u-oO|xVi;?(%<6C_*5G01 z7(PXN9vNyitIQrWOISS*o9KAf*_Hmm29dG$CF+F~=Hs_mfEQi=AE<GEBNN)cuDvqb ztd@2jmf;rXtLUfwKIX8#9pFI|_hS(bVL7Hy3;&Lf;Vf>zOw#ZOR-@W4p%&<N{YUXp z+9@o-X<Uy>?)So+^!ON7vcA2-!^3zGi}6#;!%^oHYNB6J0WG3-a2r*!yBNZf)#-^_ zkdN)+s}SQD#2(l0;TqbXVM4Y2iU&<N>ih=P{{ybTNz?>qaV=hT?OPb4?axhTWCLo! zR#bmGzKA`j3|v5+odqOjyOT@)RkLiiOP`gY0tq{#s0Eu)8F~Sgf!9$1y@`6S2bW8T zVcJ7jjptFNyp16&Vf7kpK?M*Gkbj-xcU;H2s0k0DGBAKTT!YBDvJ<HBU!VdRMv`DD z)VK-M#OGZ9Z^*H+IoE&F_5Y8jeax94Y`r+lktRqRMFlX0oEN)-^*D>0a4p+j-T_w7 zj-!4*g8Ok271$FLSZC&Gtisn&<NHvDd<3<T#04G{;V;O$Hsc1|LhU%4{A-6nRBg*p z0XO1i+={vdZ=q6s6!qQ+swCs6c`xBQ{0ldtkGhkogjMjM2pdo}Yj^ElR4qqb`x<KJ z0isyW0P0%CQ9J9$T1;Uj&SMkivt3=sR@61^L_T(yub}S#DIOG23YEGURBGl>*Xugg z<En?!3$~z2wHtL^-$tdn7pan+Mjh5MRHlAL%{%S<6E*)on4$ZBlLtQbA77eiHE*+7 zt3ai8D=NS}NL8#CmFgk<2*1Y=wh|55wKyu}AE4&@#I?_$0{RYBq8~A#0hf7DDi=^Y z3(~28%8`R=&CcgALVG8w_Ptn#U!zK}fGSxbY12I0Q48)s1>S}_OZ!mQ{Jm0pc{vpy z(xHeBIX^}n%0cHz=NZ%lDb($lKwY<ssKYkx`frpbtFlV`$vrtsKCdIUGkHDt8K2h_ z==0_R!`|`yV+GNMa3mIvHiV+l=18nMQs-?ecq5~I$MfFj1#P~^J%6yvU)NY0N$wAx f^(W&+11r3|;zaU9@wm_1TYA!KSof3XU;pGiQu4*1 delta 2141 zcmZwIeN5F=9LMp)<$^p2_ksoSp!^C;RJcMo5o1lZRNQK@%(X?aF7ne|y<B4VLds_M zu0Pt+ShipEK<fc#8I}AI=9;e7y0Mk4vSm^ctXi!nS6g#y^#}I;c+b`!#V+@C&iVb$ zIp6a==fIz>@3$ovO8ujTp8<ZW`8}4c+P^>bON>!d0~TNt2Cxlt@K$WaJFo#C#U?zB z^?1=*k!Q>n>RT~a@8Q+PB#lR56%7;CPcsk9Ur1jQ$j@{r#~}3;Sc2<pdpqjA4rD;n zY3sW&L_LNz_?-1^^i!Y5LgqK$QP9A@VL4vLYq6Z=D$-V5iJS3ybn!YoZ0nP#3C`R0 zOIS<2ypUk=Cal7{ZG8yUe-vw&-@HX(HGY8==v!(`C01iGwph2K2HJ@VYyh>A{iv-w zhz^dS0y=|y%p6~3_!E}mW!qj_ME;l2P(wj`+>9Eq#oA`u+tEk+7SsS8s58)oSK&U} zo<fJZhg#uD)cCWg0DiU4eXQy>>b1q>Unv@(K?5E^l3-p$?d9u8AM+k6uyfYWQ4@cK z%GmFyjN~(j0t}-1)uQ?}p|*GfHsCf~i-Q63ue~0p!NIikd#tCPLoWq%BkHu@Z0on6 zCg?<Et{Zg-dysQ$_M+a8qXIjCWZk4t?~T~!qe%*y;92{^ape4&leYaG+kO_0W|2zN z0K+VkMVp6Efjo|!JM#iI<Eyv|7f=hyWgqIW8TI@g+>gm46t1L>eCluoaShg^I^2c2 z6)Dt;o<;@uJTkU<#XdiSTKQ+Fm41!d^Pf=xYd_aP9_kitL^7W=-4xU@g)GiIf*N=X zm*WY%0cTK|`U4f<B5Ds;GmGjwQG1)R^-0vqzqIDE3T31jS7H~|>HeoEglL$+E7uTP zsQa$T+~ZBC>(q@rG7q8xd=eGd1S*5)P#Ky<UB`J;s{ck!7~-UA%XXlycMn!Ezd1-j zf6<;nKIS#Pl(K2mz#m!9qb8U`9lCFkvCR+2c{PiuEi7hql4I7OQoR`!=x$`U&4_gz zlREuxQg|3=(ZOy;VcSd+wbCb010T2bG%COgsI6N-KITWhw9;&rua(xJ0&GDA*onH1 z_u0BzP5v8c7^Fdm<7L!8j|-^1&Eo**5Uxk<?Y*dh52FGYL#^m2>d>7+O^`-q>H}1O zA6sWphxZ%nFUvP(8ZObG4vVOP{QOnYbt*v}x@y$nth4Q{E2hroR{8VyxCy7Pzt@dU zeNs^53*6qb*WH!a-s`vngW+i0n_JqqtTXC{<E|5Tqdc-NZ!7A^%8m@X-bnFdHQ}CU zq{r!X?{{OpZfw^9C)S^EBC&WP9F4lYA+Iv<MouK*_Qk!Kz*F9#V8N2cO-(HgjT^jp zaE~`1?DASm2C|z&>!&75KJ*t4r%%N9g{NQ2OyxC}RZcxnHu~S#3M*3o8{46ZceDIE z6x{ZzV{7lsL^qrsABx1I{qaP^iA7jV`m_@ZM`F|CMA<(Sj-@9;-o>gJ8|bO(_J06? Co(^jO diff --git a/flask_admin/translations/sk/LC_MESSAGES/admin.po b/flask_admin/translations/sk/LC_MESSAGES/admin.po index b0e0c25e4..626c1dbff 100644 --- a/flask_admin/translations/sk/LC_MESSAGES/admin.po +++ b/flask_admin/translations/sk/LC_MESSAGES/admin.po @@ -1,275 +1,264 @@ + msgid "" msgstr "" -"Project-Id-Version: flask-admin\n" +"Project-Id-Version: flask-admin\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-02-07 00:17-0600\n" +"POT-Creation-Date: 2024-09-24 22:09+0100\n" "PO-Revision-Date: 2017-02-07 01:19-0500\n" "Last-Translator: mrjoes <serge.koval@gmail.com>\n" +"Language: sk_SK\n" "Language-Team: Slovak\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.1.1\n" -"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: flask-admin\n" -"X-Crowdin-Language: sk\n" -"X-Crowdin-File: admin.pot\n" -"Language: sk_SK\n" +"Generated-By: Babel 2.16.0\n" -#: ../flask_admin/base.py:440 +#: ../flask_admin/base.py:458 msgid "Home" msgstr "Domov" -#: ../flask_admin/contrib/rediscli.py:127 +#: ../flask_admin/contrib/rediscli.py:113 msgid "Cli: Invalid command." msgstr "CLI: Neplatný príkaz." -#: ../flask_admin/contrib/fileadmin/__init__.py:352 +#: ../flask_admin/contrib/fileadmin/__init__.py:376 msgid "File to upload" msgstr "Súbor na nahranie" -#: ../flask_admin/contrib/fileadmin/__init__.py:360 +#: ../flask_admin/contrib/fileadmin/__init__.py:384 msgid "File required." msgstr "Súbor je požadovaný." -#: ../flask_admin/contrib/fileadmin/__init__.py:365 +#: ../flask_admin/contrib/fileadmin/__init__.py:389 msgid "Invalid file type." msgstr "Nesprávny formát súboru." -#: ../flask_admin/contrib/fileadmin/__init__.py:376 +#: ../flask_admin/contrib/fileadmin/__init__.py:400 msgid "Content" msgstr "Obsah" -#: ../flask_admin/contrib/fileadmin/__init__.py:390 +#: ../flask_admin/contrib/fileadmin/__init__.py:414 msgid "Invalid name" msgstr "Nesprávny názov" -#: ../flask_admin/contrib/fileadmin/__init__.py:398 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:106 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:112 -#: ../flask_admin/tests/sqla/test_translation.py:17 +#: ../flask_admin/contrib/fileadmin/__init__.py:422 +#: ../flask_admin/tests/sqla/test_translation.py:21 msgid "Name" msgstr "Názov" -#: ../flask_admin/contrib/fileadmin/__init__.py:757 +#: ../flask_admin/contrib/fileadmin/__init__.py:784 #, python-format msgid "File \"%(name)s\" already exists." msgstr "Súbor s názvom \"%(name)s\" už existuje." -#: ../flask_admin/contrib/fileadmin/__init__.py:802 -#: ../flask_admin/contrib/fileadmin/__init__.py:885 -#: ../flask_admin/contrib/fileadmin/__init__.py:947 -#: ../flask_admin/contrib/fileadmin/__init__.py:1000 -#: ../flask_admin/contrib/fileadmin/__init__.py:1047 -#: ../flask_admin/contrib/fileadmin/__init__.py:1099 -#: ../flask_admin/model/base.py:2168 +#: ../flask_admin/contrib/fileadmin/__init__.py:829 +#: ../flask_admin/contrib/fileadmin/__init__.py:926 +#: ../flask_admin/contrib/fileadmin/__init__.py:988 +#: ../flask_admin/contrib/fileadmin/__init__.py:1041 +#: ../flask_admin/contrib/fileadmin/__init__.py:1088 +#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/model/base.py:2324 msgid "Permission denied." msgstr "Nepovolený prístup." -#: ../flask_admin/contrib/fileadmin/__init__.py:881 +#: ../flask_admin/contrib/fileadmin/__init__.py:922 msgid "File uploading is disabled." msgstr "Nahrávanie súborov nie je povolené." -#: ../flask_admin/contrib/fileadmin/__init__.py:892 +#: ../flask_admin/contrib/fileadmin/__init__.py:933 #, python-format msgid "Successfully saved file: %(name)s" msgstr "Súbor s názvom %(name)s bol úspešne uložený" -#: ../flask_admin/contrib/fileadmin/__init__.py:896 +#: ../flask_admin/contrib/fileadmin/__init__.py:937 #, python-format msgid "Failed to save file: %(error)s" msgstr "Nepodarilo sa uložiť súbor: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:904 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:150 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:150 +#: ../flask_admin/contrib/fileadmin/__init__.py:945 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:150 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:152 msgid "Upload File" msgstr "Nahrať súbor" -#: ../flask_admin/contrib/fileadmin/__init__.py:943 +#: ../flask_admin/contrib/fileadmin/__init__.py:984 msgid "Directory creation is disabled." msgstr "Vytváranie adresárov je zakázané." -#: ../flask_admin/contrib/fileadmin/__init__.py:956 +#: ../flask_admin/contrib/fileadmin/__init__.py:997 #, python-format msgid "Successfully created directory: %(directory)s" msgstr "Adresár: %(directory)s bol úspešne vytvorený" -#: ../flask_admin/contrib/fileadmin/__init__.py:960 +#: ../flask_admin/contrib/fileadmin/__init__.py:1001 #, python-format msgid "Failed to create directory: %(error)s" msgstr "Nepodarilo sa vytvoriť adresár: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:970 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:161 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:161 +#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:161 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:163 msgid "Create Directory" msgstr "Vytvoriť adresár" -#: ../flask_admin/contrib/fileadmin/__init__.py:996 +#: ../flask_admin/contrib/fileadmin/__init__.py:1037 msgid "Deletion is disabled." msgstr "Mazanie je zakázané." -#: ../flask_admin/contrib/fileadmin/__init__.py:1005 +#: ../flask_admin/contrib/fileadmin/__init__.py:1046 msgid "Directory deletion is disabled." msgstr "Mazanie adresárov je zakázané." -#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/contrib/fileadmin/__init__.py:1052 #, python-format msgid "Directory \"%(path)s\" was successfully deleted." msgstr "Adresár \"%(path)s\" bol úspešne odstránený." -#: ../flask_admin/contrib/fileadmin/__init__.py:1013 +#: ../flask_admin/contrib/fileadmin/__init__.py:1054 #, python-format msgid "Failed to delete directory: %(error)s" msgstr "Nepodarilo sa odstrániť adresár: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1019 -#: ../flask_admin/contrib/fileadmin/__init__.py:1176 +#: ../flask_admin/contrib/fileadmin/__init__.py:1060 +#: ../flask_admin/contrib/fileadmin/__init__.py:1215 #, python-format msgid "File \"%(name)s\" was successfully deleted." msgstr "Súbor s názvom \"%(name)s\" bol úspešne odstránený." -#: ../flask_admin/contrib/fileadmin/__init__.py:1021 -#: ../flask_admin/contrib/fileadmin/__init__.py:1178 +#: ../flask_admin/contrib/fileadmin/__init__.py:1062 +#: ../flask_admin/contrib/fileadmin/__init__.py:1217 #, python-format msgid "Failed to delete file: %(name)s" msgstr "Nepodarilo sa odstrániť súbor: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1043 +#: ../flask_admin/contrib/fileadmin/__init__.py:1084 msgid "Renaming is disabled." msgstr "Premenovanie je zakázané." -#: ../flask_admin/contrib/fileadmin/__init__.py:1051 +#: ../flask_admin/contrib/fileadmin/__init__.py:1092 msgid "Path does not exist." msgstr "Cesta k súboru neexistuje." -#: ../flask_admin/contrib/fileadmin/__init__.py:1061 +#: ../flask_admin/contrib/fileadmin/__init__.py:1102 #, python-format msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\"" msgstr "Úspešne premenované z \"%(src)s\" na \"%(dst)s\"" -#: ../flask_admin/contrib/fileadmin/__init__.py:1064 +#: ../flask_admin/contrib/fileadmin/__init__.py:1105 #, python-format msgid "Failed to rename: %(error)s" msgstr "Nepodarilo sa premenovať: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1078 +#: ../flask_admin/contrib/fileadmin/__init__.py:1119 #, python-format msgid "Rename %(name)s" msgstr "Premenovať %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1115 +#: ../flask_admin/contrib/fileadmin/__init__.py:1155 #, python-format msgid "Error saving changes to %(name)s." msgstr "Chyba pri ukladaní zmien do %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1119 +#: ../flask_admin/contrib/fileadmin/__init__.py:1159 #, python-format msgid "Changes to %(name)s saved successfully." msgstr "Zmeny %(name)s boli úspešne uložené." -#: ../flask_admin/contrib/fileadmin/__init__.py:1128 +#: ../flask_admin/contrib/fileadmin/__init__.py:1167 #, python-format msgid "Error reading %(name)s." msgstr "Chyba pri čítaní %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1131 -#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/contrib/fileadmin/__init__.py:1170 +#: ../flask_admin/contrib/fileadmin/__init__.py:1179 #, python-format msgid "Unexpected error while reading from %(name)s" msgstr "Neočakávaná chyba pri čítaní z %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1137 +#: ../flask_admin/contrib/fileadmin/__init__.py:1176 #, python-format msgid "Cannot edit %(name)s." msgstr "%(name)s sa nedá upraviť." -#: ../flask_admin/contrib/fileadmin/__init__.py:1155 +#: ../flask_admin/contrib/fileadmin/__init__.py:1194 #, python-format msgid "Editing %(path)s" msgstr "Editovať %(path)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/peewee/view.py:487 -#: ../flask_admin/contrib/pymongo/view.py:384 -#: ../flask_admin/contrib/sqla/view.py:1149 +#: ../flask_admin/contrib/fileadmin/__init__.py:1202 +#: ../flask_admin/contrib/peewee/view.py:510 +#: ../flask_admin/contrib/pymongo/view.py:385 +#: ../flask_admin/contrib/sqla/view.py:1241 msgid "Delete" msgstr "Vymazať" -#: ../flask_admin/contrib/fileadmin/__init__.py:1164 +#: ../flask_admin/contrib/fileadmin/__init__.py:1203 msgid "Are you sure you want to delete these files?" msgstr "Naozaj chcete odstrániť tieto súbory?" -#: ../flask_admin/contrib/fileadmin/__init__.py:1167 +#: ../flask_admin/contrib/fileadmin/__init__.py:1206 msgid "File deletion is disabled." msgstr "Mazanie súborov je zakázané." -#: ../flask_admin/contrib/fileadmin/__init__.py:1180 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:22 +#: ../flask_admin/contrib/fileadmin/__init__.py:1219 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:22 msgid "Edit" msgstr "Upraviť" -#: ../flask_admin/contrib/fileadmin/s3.py:153 +#: ../flask_admin/contrib/fileadmin/s3.py:162 msgid "Cannot operate on non empty directories" msgstr "Nedá sa pracovať s prázdnymi adresármi" #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 -#: ../flask_admin/contrib/sqla/filters.py:41 +#: ../flask_admin/contrib/sqla/filters.py:42 msgid "equals" msgstr "rovná sa" #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 -#: ../flask_admin/contrib/sqla/filters.py:49 +#: ../flask_admin/contrib/sqla/filters.py:50 msgid "not equal" msgstr "nerovná sa" #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 -#: ../flask_admin/contrib/sqla/filters.py:58 +#: ../flask_admin/contrib/sqla/filters.py:59 msgid "contains" msgstr "obsahuje" #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 -#: ../flask_admin/contrib/sqla/filters.py:67 +#: ../flask_admin/contrib/sqla/filters.py:68 msgid "not contains" msgstr "neobsahuje" #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 -#: ../flask_admin/contrib/sqla/filters.py:75 +#: ../flask_admin/contrib/sqla/filters.py:76 msgid "greater than" msgstr "viac než" #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 -#: ../flask_admin/contrib/sqla/filters.py:83 +#: ../flask_admin/contrib/sqla/filters.py:84 msgid "smaller than" msgstr "menej než" #: ../flask_admin/contrib/peewee/filters.py:88 -#: ../flask_admin/contrib/sqla/filters.py:94 +#: ../flask_admin/contrib/sqla/filters.py:95 msgid "empty" msgstr "prázdne" #: ../flask_admin/contrib/peewee/filters.py:102 -#: ../flask_admin/contrib/sqla/filters.py:108 +#: ../flask_admin/contrib/sqla/filters.py:109 msgid "in list" msgstr "v zozname" #: ../flask_admin/contrib/peewee/filters.py:111 -#: ../flask_admin/contrib/sqla/filters.py:118 +#: ../flask_admin/contrib/sqla/filters.py:119 msgid "not in list" msgstr "nie je v zozname" @@ -282,44 +271,37 @@ msgstr "nie je v zozname" msgid "not between" msgstr "nie je medzi" -msgid "ObjectId equals" -msgstr "" - -#, python-format -msgid "Failed to get model. %(error)s" -msgstr "Nepodarilo sa získať model. %(error)s" - -#: ../flask_admin/contrib/peewee/view.py:435 -#: ../flask_admin/contrib/pymongo/view.py:316 -#: ../flask_admin/contrib/sqla/view.py:1078 +#: ../flask_admin/contrib/peewee/view.py:458 +#: ../flask_admin/contrib/pymongo/view.py:317 +#: ../flask_admin/contrib/sqla/view.py:1170 #, python-format msgid "Failed to create record. %(error)s" msgstr "Nepodarilo sa vytvoriť záznam. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:454 -#: ../flask_admin/contrib/pymongo/view.py:341 -#: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 -#: ../flask_admin/model/base.py:2313 ../flask_admin/model/base.py:2315 +#: ../flask_admin/contrib/peewee/view.py:477 +#: ../flask_admin/contrib/pymongo/view.py:342 +#: ../flask_admin/contrib/sqla/view.py:1196 ../flask_admin/model/base.py:2463 +#: ../flask_admin/model/base.py:2471 ../flask_admin/model/base.py:2473 #, python-format msgid "Failed to update record. %(error)s" msgstr "Nepodarilo sa aktualizovať záznam. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:469 -#: ../flask_admin/contrib/pymongo/view.py:366 -#: ../flask_admin/contrib/sqla/view.py:1129 +#: ../flask_admin/contrib/peewee/view.py:492 +#: ../flask_admin/contrib/pymongo/view.py:367 +#: ../flask_admin/contrib/sqla/view.py:1221 #, python-format msgid "Failed to delete record. %(error)s" msgstr "Nepodarilo sa odstrániť záznam. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:488 -#: ../flask_admin/contrib/pymongo/view.py:385 -#: ../flask_admin/contrib/sqla/view.py:1150 +#: ../flask_admin/contrib/peewee/view.py:511 +#: ../flask_admin/contrib/pymongo/view.py:386 +#: ../flask_admin/contrib/sqla/view.py:1242 msgid "Are you sure you want to delete selected records?" msgstr "Naozaj chcete odstrániť vybrané záznamy?" -#: ../flask_admin/contrib/peewee/view.py:505 -#: ../flask_admin/contrib/pymongo/view.py:395 -#: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 +#: ../flask_admin/contrib/peewee/view.py:528 +#: ../flask_admin/contrib/pymongo/view.py:396 +#: ../flask_admin/contrib/sqla/view.py:1258 ../flask_admin/model/base.py:2272 #, python-format msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." @@ -327,33 +309,33 @@ msgstr[0] "Záznam bol úspešne odstránený." msgstr[1] "%(count)s záznamy boli úspešne odstránené." msgstr[2] "%(count)s záznamov bolo úspešne odstránených." -#: ../flask_admin/contrib/peewee/view.py:511 -#: ../flask_admin/contrib/pymongo/view.py:400 -#: ../flask_admin/contrib/sqla/view.py:1174 +#: ../flask_admin/contrib/peewee/view.py:534 +#: ../flask_admin/contrib/pymongo/view.py:401 +#: ../flask_admin/contrib/sqla/view.py:1266 #, python-format msgid "Failed to delete records. %(error)s" msgstr "Nepodarilo sa odstrániť záznam. %(error)s" -#: ../flask_admin/contrib/sqla/fields.py:126 -#: ../flask_admin/contrib/sqla/fields.py:176 -#: ../flask_admin/contrib/sqla/fields.py:181 ../flask_admin/model/fields.py:173 -#: ../flask_admin/model/fields.py:222 +#: ../flask_admin/contrib/sqla/fields.py:117 +#: ../flask_admin/contrib/sqla/fields.py:167 +#: ../flask_admin/contrib/sqla/fields.py:172 ../flask_admin/model/fields.py:174 +#: ../flask_admin/model/fields.py:223 msgid "Not a valid choice" msgstr "Nie je platným výberom" -#: ../flask_admin/contrib/sqla/fields.py:186 +#: ../flask_admin/contrib/sqla/fields.py:201 msgid "Key" msgstr "Kľúč" -#: ../flask_admin/contrib/sqla/fields.py:187 +#: ../flask_admin/contrib/sqla/fields.py:202 msgid "Value" msgstr "Hodnota" -#: ../flask_admin/contrib/sqla/validators.py:42 +#: ../flask_admin/contrib/sqla/validators.py:28 msgid "Already exists." msgstr "Už existuje." -#: ../flask_admin/contrib/sqla/validators.py:60 +#: ../flask_admin/contrib/sqla/validators.py:59 #, python-format msgid "At least %(num)d item is required" msgid_plural "At least %(num)d items are required" @@ -361,7 +343,15 @@ msgstr[0] "Minimálne %(num)d položka je povinná" msgstr[1] "Minimálne %(num)d položka je povinná" msgstr[2] "Minimálne %(num)d položky sú povinné" -#: ../flask_admin/contrib/sqla/view.py:1057 +#: ../flask_admin/contrib/sqla/validators.py:75 +msgid "Not a valid ISO currency code (e.g. USD, EUR, CNY)." +msgstr "" + +#: ../flask_admin/contrib/sqla/validators.py:83 +msgid "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." +msgstr "" + +#: ../flask_admin/contrib/sqla/view.py:1134 #, python-format msgid "Integrity error. %(message)s" msgstr "Chyba integrity. %(message)s" @@ -370,274 +360,242 @@ msgstr "Chyba integrity. %(message)s" msgid "Invalid time format" msgstr "Nesprávny formátu času" -#: ../flask_admin/form/fields.py:144 +#: ../flask_admin/form/fields.py:147 msgid "Invalid Choice: could not coerce" msgstr "Neplatný výber: Nepodarilo sa vynútiť konverziu" -#: ../flask_admin/form/fields.py:208 +#: ../flask_admin/form/fields.py:221 msgid "Invalid JSON" msgstr "Neplatný JSON" -#: ../flask_admin/form/upload.py:207 +#: ../flask_admin/form/upload.py:216 msgid "Invalid file extension" msgstr "Neplatná prípona súboru" -#: ../flask_admin/form/upload.py:214 ../flask_admin/form/upload.py:281 +#: ../flask_admin/form/upload.py:223 ../flask_admin/form/upload.py:293 #, python-format msgid "File \"%s\" already exists." msgstr "Súbor s názvom \"%s\" už existuje." -#: ../flask_admin/model/base.py:1649 +#: ../flask_admin/form/validators.py:16 +msgid "This field requires at least one item." +msgstr "" + +#: ../flask_admin/model/base.py:1737 msgid "There are no items in the table." msgstr "Neexistujú žiadne položky v tabuľke." -#: ../flask_admin/model/base.py:1673 +#: ../flask_admin/model/base.py:1746 #, python-format msgid "Invalid Filter Value: %(value)s" msgstr "Nesprávna hodnota filtra: %(value)s" -#: ../flask_admin/model/base.py:1984 +#: ../flask_admin/model/base.py:2136 msgid "Record was successfully created." msgstr "Záznam bol úspešne vytvorený." -#: ../flask_admin/model/base.py:2028 ../flask_admin/model/base.py:2080 -#: ../flask_admin/model/base.py:2113 ../flask_admin/model/base.py:2297 +#: ../flask_admin/model/base.py:2180 ../flask_admin/model/base.py:2232 +#: ../flask_admin/model/base.py:2265 ../flask_admin/model/base.py:2455 msgid "Record does not exist." msgstr "Záznam neexistuje." -#: ../flask_admin/model/base.py:2037 ../flask_admin/model/base.py:2301 +#: ../flask_admin/model/base.py:2189 ../flask_admin/model/base.py:2459 msgid "Record was successfully saved." msgstr "Záznam bol úspešne uložený." -#: ../flask_admin/model/base.py:2222 -msgid "Tablib dependency not installed." -msgstr "Tablib závislosti nie sú nainštalované." - -#: ../flask_admin/model/base.py:2249 +#: ../flask_admin/model/base.py:2407 #, python-format msgid "Export type \"%(type)s not supported." msgstr "Typ exportu \"%(type)s nie je podporovaný." -#: ../flask_admin/model/filters.py:103 ../flask_admin/model/widgets.py:111 +#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:119 msgid "Yes" msgstr "Áno" -#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:110 +#: ../flask_admin/model/filters.py:105 ../flask_admin/model/widgets.py:118 msgid "No" msgstr "Nie" -#: ../flask_admin/model/filters.py:172 ../flask_admin/model/filters.py:212 -#: ../flask_admin/model/filters.py:257 +#: ../flask_admin/model/filters.py:173 ../flask_admin/model/filters.py:213 +#: ../flask_admin/model/filters.py:258 msgid "between" msgstr "medzi" -#: ../flask_admin/model/template.py:81 ../flask_admin/model/template.py:88 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:37 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:8 +#: ../flask_admin/model/template.py:83 ../flask_admin/model/template.py:90 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:7 msgid "View Record" msgstr "Zobrazenie záznamu" -#: ../flask_admin/model/template.py:95 ../flask_admin/model/template.py:102 -#: ../flask_admin/model/template.py:109 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/edit.html:11 +#: ../flask_admin/model/template.py:97 ../flask_admin/model/template.py:104 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/edit.html:10 msgid "Edit Record" msgstr "Upraviť záznam" -#: ../flask_admin/model/widgets.py:61 +#: ../flask_admin/model/template.py:111 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Delete Record" +msgstr "" + +#: ../flask_admin/model/widgets.py:62 msgid "Please select model" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/actions.html:4 -#: ../flask_admin/templates/bootstrap3/admin/actions.html:4 +#: ../flask_admin/templates/bootstrap4/admin/actions.html:5 msgid "With selected" msgstr "S vybranými" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:200 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:190 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:216 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:227 msgid "Save" msgstr "Uložiť" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:205 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:195 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:221 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:232 msgid "Cancel" msgstr "Storno" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:256 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:247 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:290 msgid "Save and Add Another" msgstr "Uložiť a pridať ďalšie" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:259 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:250 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:293 msgid "Save and Continue Editing" msgstr "Uložiť a pokračovať v úpravách" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:9 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:9 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:10 msgid "Root" msgstr "Hlavný" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:90 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:99 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:89 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:98 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:42 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:51 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:89 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:98 #, python-format msgid "Sort by %(name)s" msgstr "Podľa %(name)s" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:77 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:79 msgid "Rename File" msgstr "Premenovať súbor" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:88 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:88 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:90 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\' recursively?" msgstr "Naozaj chcete odstrániť \\'%(name)s\\' rekurzívne?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:97 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:97 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:99 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\'?" msgstr "Naozaj chcete odstrániť \\'%(name)s\\'?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:125 -msgid "Size" -msgstr "" - -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:185 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:187 msgid "Please select at least one file." msgstr "Prosím, vyberte aspoň jeden súbor." -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:8 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:17 msgid "List" msgstr "Zoznam" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:12 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:18 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 msgid "Create" msgstr "Vytvoriť" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:26 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:26 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:21 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:26 msgid "Details" msgstr "Detaily" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:29 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:28 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:15 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:28 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:15 msgid "Filter" msgstr "Filter" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:13 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:14 msgid "Delete?" msgstr "Odstrániť?" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:33 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:16 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:35 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Are you sure you want to delete this record?" +msgstr "Ste si istý, že chcete odstrániť tento záznam?" + +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:33 msgid "New" msgstr "Nový" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:43 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:43 msgid "Add" msgstr "Pridať" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:3 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:3 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:2 msgid "Add Filter" msgstr "Pridať filter" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:30 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:19 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:26 msgid "Export" msgstr "Exportovať" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:38 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:38 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:49 msgid "Apply" msgstr "Aplikovať" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:40 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:51 msgid "Reset Filters" msgstr "Odstrániť filtre" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:66 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:64 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:80 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:93 +#, python-format +msgid "%(placeholder)s" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:88 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:94 msgid "Search" msgstr "Vyhľadávanie" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:74 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:77 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:78 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:79 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:72 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:75 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:76 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:77 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:102 msgid "items" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/create.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/create.html:10 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/create.html:10 msgid "Create New Record" msgstr "Vytvoriť nový záznam" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:76 msgid "Select all records" msgstr "Vybrať všetky záznamy" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:120 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:119 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:119 msgid "Select record" msgstr "Vyberte záznam" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:186 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:195 msgid "Please select at least one record." msgstr "Prosím, vyberte aspoň jeden záznam." -#: ../flask_admin/templates/bootstrap2/admin/model/row_actions.html:34 -#: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 -msgid "Are you sure you want to delete this record?" -msgstr "Ste si istý, že chcete odstrániť tento záznam?" +#~ msgid "ObjectId equals" +#~ msgstr "" + +#~ msgid "Failed to get model. %(error)s" +#~ msgstr "Nepodarilo sa získať model. %(error)s" + +#~ msgid "Tablib dependency not installed." +#~ msgstr "Tablib závislosti nie sú nainštalované." + +#~ msgid "Size" +#~ msgstr "" + diff --git a/flask_admin/translations/sr/LC_MESSAGES/admin.mo b/flask_admin/translations/sr/LC_MESSAGES/admin.mo index 19f4f89932bd82eeacb734fca4138c7ef5b4e62c..9e5e15c55ab3f8b7ec5c97076e510fea3fa81227 100644 GIT binary patch delta 1876 zcmYM!e`u9e9LMqRvma^u;dXCpb9Y;NZdRMqYunvy%~HqEG`Q-Z#FFN^?cVarewCY* zRM#kGls{$<tv^~sR)qA2>HSNIB2Wk_%#c<%LXZg-_@5JtviD~@(74;{oO93fJ>PTA z_u0{hCRb*E4;Q>={5;EVEx(C;_5S~P<u)@7y^2NnI+o!9EW}Cdz@r$$X>7rw1!l|f zVP^){)1N@5*fid0mbJ??8W^}aKVZ>?W;CrGHE}JL<0BZtZEie+nm3FDvX@-{5U!v< zf%SOSIfDiC3vV|o#v&|deXFEV#Xti_aV=`$B;JcV@oqfi`X^9<r`-4rTtYv>@zmfN zybHIZo_iTJe-fACS6Gc#Fv9wC=`4a8(vnT6Kpm(=wxTkB3Ux(E^zk)R;E%8bzrjlU z0mFFNjnCp8^z)gdI91MC%;qr=rJ)Dz!3u15{RH~-dr>>thg#qhH+~v7(Z7h=@zT=y z+SrJ!X-}Z8CWU-#FMpK4Th4=}oWB-)mjNBg=cpZji%RG_<YO24qZ+u1G5iacVI#+- zD|;M$+=I*UeN+NxoIfFt*fgq`|3KBwwMCpibz!p%sG4t~5-6m^*_4%_CRU>YM%{P} zxprIS#@D&=ZXEE;dQkDcCu>65c~k<IaBgAjq(7Ub(MF@4(tZ&8u@yhVIR1uRSi*7W z!7ZpO*oHn1qE7BGY9q%`8#sv(JcWd?3#jL>pypk3-)C>QFTzxasy%|b>rQ7M>VYxT z4i2NP>_gN7C$Ry4M9sU7+R(qKYHww->_N@jkBxYI-mLvfLsjfiDM}!UdSC<UZlA~d zFhIQ(r?CltLA|yf$D!A+8a014>gsw?cioSQKkOVw#rqOfe>O!!uhk3^)AESQ_1R+7 z(Ke#)vI`Y(Bj#ZO*`#ej&F@1F({`gaFotsrp{`&GmEcwE#Nx$lfb}gwLl35$FCw|v z+o&V|7`5<mR3bSfhMhv~{5<MzucH$B2UT<-vRB_nCDev`J9eN>`W?*H(KtclemsZD z^cHI25EslpDXT~AxCymT%()U(Y^z;=9jXQr&aJ5DcQ`Ys#70o@--r-S6OKf3O$+vU zxt|vfdO^DAQZ7||&Z|#kc8}QR<Uras5AhlClm4D$e<tPk?HtPVrGs6i1Gzs-H+VsN z*}-6@Y<sZ2ygT@yd?FNYi#2z|;%$CBzN)!nS#wL!6?!he_p$EaSZGPm86GZZd0<6z zE*Bp2f}V={+@}@eUhc`tke3^;YR&Vt?x;P=x`Qm8*_CG5vtOsr?9cd_z0VB25d2*| c8oU`94g8u5!OfZ@!56hp2cf!6L8@-ee_5i@%>V!Z delta 2530 zcma*neQ4EH7{Kv!H>YjR-EF>HH?@0oFFN(=z1wut?fOE_Hhf!|_NLOk-k;;zecOFm zZWvcI5-YR%VWJh37$HRj*I;D%M<%Jzi<BjWWl}K6l0qV>u<x^bB#0o#=I5OAJ1@^U z&pEz0?{Hi8o5~UU6+gZFP3G@Nq168QnLSD=Y4TtR`p}8(ScEHa0p5)sd<uQ|4$j6a z#;V(t>Y%<HM@l~&uT)mq6sFT~)OarcL0w12Dra$ifD6m1-;NbH*R(H1>DP%&sJcyk z3(lb)LpQ!;d=E!Zzlft*UtOjk6aS1Zyn$2E#damq1z3wqunsMphEJOMn<xu>ZrZP5 z4RzOOg2gtRgb$c{AIkXs=w^L2NTC5QU=<dWDpie>u?$;`%TXp;hZ0yX%1*YSr0!AF zcnBq+<H)c2ntvwX5LV(1(_T4-^B+rtn}X!H31z|-W4mcziUqWHpiIz-at9v7arm%l z-+`LCjk3dIDD!`b62On<djY#zMZKns^Oqy)r9mcq1~~-vGD<GrK*p%|Q3Ctacphcp zuTW0xD$0ozGl>LPjxw$WWt<Ns#q-gFcj7F}I5~gG^(!=JJZbzMXHzd?lmyg>a@!Y~ z`ZAOSx=~JU6UrqFBKKBpMd_bH39KJEb+rSf-(K^5f0lwQ@Pg^^8gl>CG1Gp+w4cR` z4vrFK;<wo*n^wnB0y&E^@daFhm#`V9a{jHj9-D9<HsVR#g4y3F$iR)9r{u`O>9`#= z9zi+cQz$$87G+06D3|mq%5y9sUoy{Rlzz1+-#w<i6Xo@Equh<YyjgXSf(&>UWhbYQ zIn`$<6AYmQR7iBvZx+^KGdAP>D6i*f;~+}^%Qyo|c++ANN&p*BUdPViI{80LK_)nj zau<HZdK@<~|J>SeCiQ!fPiiO1`#yxy{{%{IFQMFppHLR~#aO}d$$UPP4c>?HT({tO z)>peIaNpEH<X0W#ADQSRO0GXN^^c6_P@dy?Bzx)t%J?hBKaupSQjSkH=0*vi3#ESo zC1sCcR(9|_g&rJ4*`elt8JVEfxB@v%wFzYh8I%Bbp#-=aW!zqrlX(^8E}TJG@Epoz z{Q>1UUNi02C-MFz!ZDnOJhv8<9EDKh6F3E5$GLb0CGzVi3y<cb1XO|iudCcBCo>Zz z0FQAV%BA(2`ZAQev~o&ozOar4nQ#-zL?L4wCGr83h4z^C15<JXBX>CJ1F={<t>XzR z8Aw|?9@8=YtY{+LuS4OawK*M6hOJcY_fZK)ZO67mJek(%{)DBc)y)taQVdAzR3;&x ztk4|0r}(?#9xJV*@sJg<%StBXI!iurRIIT2)yi-xtyTx3mRfB+V(U_ub4_q7OLT>_ z)td=KQuh4P=-BRv6-Ze+WkvXupC)&>w9`=-9<c18G5g$sU?d#WAuD0ULRM^Z|8NB1 zSSlTeL?nVt*@nVEBx8SEwzepowxTIpI}cR&T0GuHkGDm8y$hv0-#+c^u^Y>4vfYtP zG7#}Bk0+z4g*uiPuBQA=Z8~4{&xqCeyneq=*Vk()dZ+q*KD}6bHQlK%@;Bc6)b4MV z;_wJ>yU(k)Z_f{*kGFv_KE^aQl&tDn)!|uhB~#(J{ZP48*fgg(cc%Pthdnr|)?QQT zo_@zICMH_>?5!mx_t)4;M`<V?3~#kea_$;eopX+FDrmi#oQ&$qCr8D|k#y_}oH}8B zusf{71HpJw{X1VlSLVO+Wq;x7v+E}QF=DOc%w6@IzUTjv_EuG(Xgyi8?DFc>CT$z5 G7yk_$l7UMA diff --git a/flask_admin/translations/sr/LC_MESSAGES/admin.po b/flask_admin/translations/sr/LC_MESSAGES/admin.po index 26908d7c5..46cb90988 100644 --- a/flask_admin/translations/sr/LC_MESSAGES/admin.po +++ b/flask_admin/translations/sr/LC_MESSAGES/admin.po @@ -1,275 +1,263 @@ + msgid "" msgstr "" -"Project-Id-Version: flask-admin\n" +"Project-Id-Version: flask-admin\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-02-07 00:17-0600\n" +"POT-Creation-Date: 2024-09-24 22:09+0100\n" "PO-Revision-Date: 2017-02-07 01:19-0500\n" "Last-Translator: mrjoes <serge.koval@gmail.com>\n" +"Language: sr_SP\n" "Language-Team: Serbian (Cyrillic)\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.1.1\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: flask-admin\n" -"X-Crowdin-Language: sr\n" -"X-Crowdin-File: admin.pot\n" -"Language: sr_SP\n" +"Generated-By: Babel 2.16.0\n" -#: ../flask_admin/base.py:440 +#: ../flask_admin/base.py:458 msgid "Home" msgstr "Dom" -#: ../flask_admin/contrib/rediscli.py:127 +#: ../flask_admin/contrib/rediscli.py:113 msgid "Cli: Invalid command." msgstr "Cli: Nevažećih komandu." -#: ../flask_admin/contrib/fileadmin/__init__.py:352 +#: ../flask_admin/contrib/fileadmin/__init__.py:376 msgid "File to upload" msgstr "Arhivski snimak, da možemo ubaciti" -#: ../flask_admin/contrib/fileadmin/__init__.py:360 +#: ../flask_admin/contrib/fileadmin/__init__.py:384 msgid "File required." msgstr "Arhivski snimak traži." -#: ../flask_admin/contrib/fileadmin/__init__.py:365 +#: ../flask_admin/contrib/fileadmin/__init__.py:389 msgid "Invalid file type." msgstr "Nevažećih fajl tip." -#: ../flask_admin/contrib/fileadmin/__init__.py:376 +#: ../flask_admin/contrib/fileadmin/__init__.py:400 msgid "Content" msgstr "Sadržaj" -#: ../flask_admin/contrib/fileadmin/__init__.py:390 +#: ../flask_admin/contrib/fileadmin/__init__.py:414 msgid "Invalid name" msgstr "Nevažećih ime" -#: ../flask_admin/contrib/fileadmin/__init__.py:398 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:106 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:112 -#: ../flask_admin/tests/sqla/test_translation.py:17 +#: ../flask_admin/contrib/fileadmin/__init__.py:422 +#: ../flask_admin/tests/sqla/test_translation.py:21 msgid "Name" msgstr "Ime" -#: ../flask_admin/contrib/fileadmin/__init__.py:757 +#: ../flask_admin/contrib/fileadmin/__init__.py:784 #, python-format msgid "File \"%(name)s\" already exists." msgstr "Dokument \"%(name)s\" već postoji." -#: ../flask_admin/contrib/fileadmin/__init__.py:802 -#: ../flask_admin/contrib/fileadmin/__init__.py:885 -#: ../flask_admin/contrib/fileadmin/__init__.py:947 -#: ../flask_admin/contrib/fileadmin/__init__.py:1000 -#: ../flask_admin/contrib/fileadmin/__init__.py:1047 -#: ../flask_admin/contrib/fileadmin/__init__.py:1099 -#: ../flask_admin/model/base.py:2168 +#: ../flask_admin/contrib/fileadmin/__init__.py:829 +#: ../flask_admin/contrib/fileadmin/__init__.py:926 +#: ../flask_admin/contrib/fileadmin/__init__.py:988 +#: ../flask_admin/contrib/fileadmin/__init__.py:1041 +#: ../flask_admin/contrib/fileadmin/__init__.py:1088 +#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/model/base.py:2324 msgid "Permission denied." msgstr "Zahtjev se odbija." -#: ../flask_admin/contrib/fileadmin/__init__.py:881 +#: ../flask_admin/contrib/fileadmin/__init__.py:922 msgid "File uploading is disabled." msgstr "Arhivski snimak dobijamo invalid." -#: ../flask_admin/contrib/fileadmin/__init__.py:892 +#: ../flask_admin/contrib/fileadmin/__init__.py:933 #, python-format msgid "Successfully saved file: %(name)s" msgstr "Uspešno sačuvana datoteka: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:896 +#: ../flask_admin/contrib/fileadmin/__init__.py:937 #, python-format msgid "Failed to save file: %(error)s" msgstr "Nije uspeo da spasi dosije: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:904 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:150 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:150 +#: ../flask_admin/contrib/fileadmin/__init__.py:945 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:150 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:152 msgid "Upload File" msgstr "Postavljanja fajl" -#: ../flask_admin/contrib/fileadmin/__init__.py:943 +#: ../flask_admin/contrib/fileadmin/__init__.py:984 msgid "Directory creation is disabled." msgstr "Režija kreacija sa invaliditetom." -#: ../flask_admin/contrib/fileadmin/__init__.py:956 +#: ../flask_admin/contrib/fileadmin/__init__.py:997 #, python-format msgid "Successfully created directory: %(directory)s" msgstr "Uspešno kreirano kataloga: %(directory)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:960 +#: ../flask_admin/contrib/fileadmin/__init__.py:1001 #, python-format msgid "Failed to create directory: %(error)s" msgstr "Nije uspela da stvori železničku upravu: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:970 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:161 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:161 +#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:161 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:163 msgid "Create Directory" msgstr "Stvori železničku upravu" -#: ../flask_admin/contrib/fileadmin/__init__.py:996 +#: ../flask_admin/contrib/fileadmin/__init__.py:1037 msgid "Deletion is disabled." msgstr "Brisanje sa invaliditetom." -#: ../flask_admin/contrib/fileadmin/__init__.py:1005 +#: ../flask_admin/contrib/fileadmin/__init__.py:1046 msgid "Directory deletion is disabled." msgstr "Režija brisanje sa invaliditetom." -#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/contrib/fileadmin/__init__.py:1052 #, python-format msgid "Directory \"%(path)s\" was successfully deleted." msgstr "Režija \"%(path)s\" uspešno izbriše." -#: ../flask_admin/contrib/fileadmin/__init__.py:1013 +#: ../flask_admin/contrib/fileadmin/__init__.py:1054 #, python-format msgid "Failed to delete directory: %(error)s" msgstr "Nije uspeo da obrišem režija: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1019 -#: ../flask_admin/contrib/fileadmin/__init__.py:1176 +#: ../flask_admin/contrib/fileadmin/__init__.py:1060 +#: ../flask_admin/contrib/fileadmin/__init__.py:1215 #, python-format msgid "File \"%(name)s\" was successfully deleted." msgstr "Dokument \"%(name)s\" uspešno izbriše." -#: ../flask_admin/contrib/fileadmin/__init__.py:1021 -#: ../flask_admin/contrib/fileadmin/__init__.py:1178 +#: ../flask_admin/contrib/fileadmin/__init__.py:1062 +#: ../flask_admin/contrib/fileadmin/__init__.py:1217 #, python-format msgid "Failed to delete file: %(name)s" msgstr "Nije uspeo da obrišem dosije: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1043 +#: ../flask_admin/contrib/fileadmin/__init__.py:1084 msgid "Renaming is disabled." msgstr "Preimenovanje invalid." -#: ../flask_admin/contrib/fileadmin/__init__.py:1051 +#: ../flask_admin/contrib/fileadmin/__init__.py:1092 msgid "Path does not exist." msgstr "Ne postoji put." -#: ../flask_admin/contrib/fileadmin/__init__.py:1061 +#: ../flask_admin/contrib/fileadmin/__init__.py:1102 #, python-format msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\"" msgstr "Uspešno preimenovane \"%(src)s\" da \"%(dst)s\"" -#: ../flask_admin/contrib/fileadmin/__init__.py:1064 +#: ../flask_admin/contrib/fileadmin/__init__.py:1105 #, python-format msgid "Failed to rename: %(error)s" msgstr "Nije uspeo da nazovu: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1078 +#: ../flask_admin/contrib/fileadmin/__init__.py:1119 #, python-format msgid "Rename %(name)s" msgstr "Preimenuj %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1115 +#: ../flask_admin/contrib/fileadmin/__init__.py:1155 #, python-format msgid "Error saving changes to %(name)s." msgstr "Greške spašavanje promene u %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1119 +#: ../flask_admin/contrib/fileadmin/__init__.py:1159 #, python-format msgid "Changes to %(name)s saved successfully." msgstr "Izmene %(name)s spasio uspešno." -#: ../flask_admin/contrib/fileadmin/__init__.py:1128 +#: ../flask_admin/contrib/fileadmin/__init__.py:1167 #, python-format msgid "Error reading %(name)s." msgstr "Greške čitanje %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1131 -#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/contrib/fileadmin/__init__.py:1170 +#: ../flask_admin/contrib/fileadmin/__init__.py:1179 #, python-format msgid "Unexpected error while reading from %(name)s" msgstr "Neočekivano greške dok čitajući iz %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1137 +#: ../flask_admin/contrib/fileadmin/__init__.py:1176 #, python-format msgid "Cannot edit %(name)s." msgstr "Ne mogu edit %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1155 +#: ../flask_admin/contrib/fileadmin/__init__.py:1194 #, python-format msgid "Editing %(path)s" msgstr "Uređivanje %(path)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/peewee/view.py:487 -#: ../flask_admin/contrib/pymongo/view.py:384 -#: ../flask_admin/contrib/sqla/view.py:1149 +#: ../flask_admin/contrib/fileadmin/__init__.py:1202 +#: ../flask_admin/contrib/peewee/view.py:510 +#: ../flask_admin/contrib/pymongo/view.py:385 +#: ../flask_admin/contrib/sqla/view.py:1241 msgid "Delete" msgstr "Čim je" -#: ../flask_admin/contrib/fileadmin/__init__.py:1164 +#: ../flask_admin/contrib/fileadmin/__init__.py:1203 msgid "Are you sure you want to delete these files?" msgstr "Da li si siguran da želiš da čim je ovi fajlovi?" -#: ../flask_admin/contrib/fileadmin/__init__.py:1167 +#: ../flask_admin/contrib/fileadmin/__init__.py:1206 msgid "File deletion is disabled." msgstr "Arhivski snimak brisanje sa invaliditetom." -#: ../flask_admin/contrib/fileadmin/__init__.py:1180 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:22 +#: ../flask_admin/contrib/fileadmin/__init__.py:1219 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:22 msgid "Edit" msgstr "Snimanje" -#: ../flask_admin/contrib/fileadmin/s3.py:153 +#: ../flask_admin/contrib/fileadmin/s3.py:162 msgid "Cannot operate on non empty directories" msgstr "" #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 -#: ../flask_admin/contrib/sqla/filters.py:41 +#: ../flask_admin/contrib/sqla/filters.py:42 msgid "equals" msgstr "jednaki" #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 -#: ../flask_admin/contrib/sqla/filters.py:49 +#: ../flask_admin/contrib/sqla/filters.py:50 msgid "not equal" msgstr "Ne ravnopravan" #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 -#: ../flask_admin/contrib/sqla/filters.py:58 +#: ../flask_admin/contrib/sqla/filters.py:59 msgid "contains" msgstr "sadrži" #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 -#: ../flask_admin/contrib/sqla/filters.py:67 +#: ../flask_admin/contrib/sqla/filters.py:68 msgid "not contains" msgstr "ne sadrži" #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 -#: ../flask_admin/contrib/sqla/filters.py:75 +#: ../flask_admin/contrib/sqla/filters.py:76 msgid "greater than" msgstr "veći od" #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 -#: ../flask_admin/contrib/sqla/filters.py:83 +#: ../flask_admin/contrib/sqla/filters.py:84 msgid "smaller than" msgstr "manji nego" #: ../flask_admin/contrib/peewee/filters.py:88 -#: ../flask_admin/contrib/sqla/filters.py:94 +#: ../flask_admin/contrib/sqla/filters.py:95 msgid "empty" msgstr "prazan" #: ../flask_admin/contrib/peewee/filters.py:102 -#: ../flask_admin/contrib/sqla/filters.py:108 +#: ../flask_admin/contrib/sqla/filters.py:109 msgid "in list" msgstr "na listi" #: ../flask_admin/contrib/peewee/filters.py:111 -#: ../flask_admin/contrib/sqla/filters.py:118 +#: ../flask_admin/contrib/sqla/filters.py:119 msgid "not in list" msgstr "nije na listi" @@ -282,86 +270,85 @@ msgstr "nije na listi" msgid "not between" msgstr "Ne između" -msgid "ObjectId equals" -msgstr "" - -#, python-format -msgid "Failed to get model. %(error)s" -msgstr "Nije uspeo da dobije model. %(error)s" - -#: ../flask_admin/contrib/peewee/view.py:435 -#: ../flask_admin/contrib/pymongo/view.py:316 -#: ../flask_admin/contrib/sqla/view.py:1078 +#: ../flask_admin/contrib/peewee/view.py:458 +#: ../flask_admin/contrib/pymongo/view.py:317 +#: ../flask_admin/contrib/sqla/view.py:1170 #, python-format msgid "Failed to create record. %(error)s" msgstr "Nije uspeo da se stvori rekord. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:454 -#: ../flask_admin/contrib/pymongo/view.py:341 -#: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 -#: ../flask_admin/model/base.py:2313 ../flask_admin/model/base.py:2315 +#: ../flask_admin/contrib/peewee/view.py:477 +#: ../flask_admin/contrib/pymongo/view.py:342 +#: ../flask_admin/contrib/sqla/view.py:1196 ../flask_admin/model/base.py:2463 +#: ../flask_admin/model/base.py:2471 ../flask_admin/model/base.py:2473 #, python-format msgid "Failed to update record. %(error)s" msgstr "Nije uspeo da se stvori rekord. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:469 -#: ../flask_admin/contrib/pymongo/view.py:366 -#: ../flask_admin/contrib/sqla/view.py:1129 +#: ../flask_admin/contrib/peewee/view.py:492 +#: ../flask_admin/contrib/pymongo/view.py:367 +#: ../flask_admin/contrib/sqla/view.py:1221 #, python-format msgid "Failed to delete record. %(error)s" msgstr "Nije uspeo da obrišem rekord. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:488 -#: ../flask_admin/contrib/pymongo/view.py:385 -#: ../flask_admin/contrib/sqla/view.py:1150 +#: ../flask_admin/contrib/peewee/view.py:511 +#: ../flask_admin/contrib/pymongo/view.py:386 +#: ../flask_admin/contrib/sqla/view.py:1242 msgid "Are you sure you want to delete selected records?" msgstr "Da li si siguran da želiš da obrišem odabrani ploče?" -#: ../flask_admin/contrib/peewee/view.py:505 -#: ../flask_admin/contrib/pymongo/view.py:395 -#: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 +#: ../flask_admin/contrib/peewee/view.py:528 +#: ../flask_admin/contrib/pymongo/view.py:396 +#: ../flask_admin/contrib/sqla/view.py:1258 ../flask_admin/model/base.py:2272 #, python-format msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." msgstr[0] "Rekord uspešno izbriše." msgstr[1] "%(count)s ploče su uspešno izbriše." -msgstr[2] "%(count)s ploče su uspešno izbriše." -#: ../flask_admin/contrib/peewee/view.py:511 -#: ../flask_admin/contrib/pymongo/view.py:400 -#: ../flask_admin/contrib/sqla/view.py:1174 +#: ../flask_admin/contrib/peewee/view.py:534 +#: ../flask_admin/contrib/pymongo/view.py:401 +#: ../flask_admin/contrib/sqla/view.py:1266 #, python-format msgid "Failed to delete records. %(error)s" msgstr "Nije uspeo da obrišem rekord. %(error)s" -#: ../flask_admin/contrib/sqla/fields.py:126 -#: ../flask_admin/contrib/sqla/fields.py:176 -#: ../flask_admin/contrib/sqla/fields.py:181 ../flask_admin/model/fields.py:173 -#: ../flask_admin/model/fields.py:222 +#: ../flask_admin/contrib/sqla/fields.py:117 +#: ../flask_admin/contrib/sqla/fields.py:167 +#: ../flask_admin/contrib/sqla/fields.py:172 ../flask_admin/model/fields.py:174 +#: ../flask_admin/model/fields.py:223 msgid "Not a valid choice" msgstr "Nije važeći izbor" -#: ../flask_admin/contrib/sqla/fields.py:186 +#: ../flask_admin/contrib/sqla/fields.py:201 msgid "Key" msgstr "" -#: ../flask_admin/contrib/sqla/fields.py:187 +#: ../flask_admin/contrib/sqla/fields.py:202 msgid "Value" msgstr "" -#: ../flask_admin/contrib/sqla/validators.py:42 +#: ../flask_admin/contrib/sqla/validators.py:28 msgid "Already exists." msgstr "Već postoji." -#: ../flask_admin/contrib/sqla/validators.py:60 +#: ../flask_admin/contrib/sqla/validators.py:59 #, python-format msgid "At least %(num)d item is required" msgid_plural "At least %(num)d items are required" msgstr[0] "Bar %(num)d zapisa je potrebno" msgstr[1] "" -msgstr[2] "" -#: ../flask_admin/contrib/sqla/view.py:1057 +#: ../flask_admin/contrib/sqla/validators.py:75 +msgid "Not a valid ISO currency code (e.g. USD, EUR, CNY)." +msgstr "" + +#: ../flask_admin/contrib/sqla/validators.py:83 +msgid "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." +msgstr "" + +#: ../flask_admin/contrib/sqla/view.py:1134 #, python-format msgid "Integrity error. %(message)s" msgstr "Integritet grešku. %(message)s" @@ -370,274 +357,242 @@ msgstr "Integritet grešku. %(message)s" msgid "Invalid time format" msgstr "Nevažećih vreme formatu" -#: ../flask_admin/form/fields.py:144 +#: ../flask_admin/form/fields.py:147 msgid "Invalid Choice: could not coerce" msgstr "Nevažećih izbor: ne mogu muza" -#: ../flask_admin/form/fields.py:208 +#: ../flask_admin/form/fields.py:221 msgid "Invalid JSON" msgstr "JSON važeći" -#: ../flask_admin/form/upload.py:207 +#: ../flask_admin/form/upload.py:216 msgid "Invalid file extension" msgstr "Produženje nevažećih fajl" -#: ../flask_admin/form/upload.py:214 ../flask_admin/form/upload.py:281 +#: ../flask_admin/form/upload.py:223 ../flask_admin/form/upload.py:293 #, python-format msgid "File \"%s\" already exists." msgstr "Dokument \"%s\" već postoji." -#: ../flask_admin/model/base.py:1649 +#: ../flask_admin/form/validators.py:16 +msgid "This field requires at least one item." +msgstr "" + +#: ../flask_admin/model/base.py:1737 msgid "There are no items in the table." msgstr "Postoje nema predmeti na sto." -#: ../flask_admin/model/base.py:1673 +#: ../flask_admin/model/base.py:1746 #, python-format msgid "Invalid Filter Value: %(value)s" msgstr "Nevažećih Filter vrednost: %(value)s" -#: ../flask_admin/model/base.py:1984 +#: ../flask_admin/model/base.py:2136 msgid "Record was successfully created." msgstr "Rekord je uspešno uspostavljena." -#: ../flask_admin/model/base.py:2028 ../flask_admin/model/base.py:2080 -#: ../flask_admin/model/base.py:2113 ../flask_admin/model/base.py:2297 +#: ../flask_admin/model/base.py:2180 ../flask_admin/model/base.py:2232 +#: ../flask_admin/model/base.py:2265 ../flask_admin/model/base.py:2455 msgid "Record does not exist." msgstr "Zapis ne postoji." -#: ../flask_admin/model/base.py:2037 ../flask_admin/model/base.py:2301 +#: ../flask_admin/model/base.py:2189 ../flask_admin/model/base.py:2459 msgid "Record was successfully saved." msgstr "Rekord uspešno spasao." -#: ../flask_admin/model/base.py:2222 -msgid "Tablib dependency not installed." -msgstr "" - -#: ../flask_admin/model/base.py:2249 +#: ../flask_admin/model/base.py:2407 #, python-format msgid "Export type \"%(type)s not supported." msgstr "" -#: ../flask_admin/model/filters.py:103 ../flask_admin/model/widgets.py:111 +#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:119 msgid "Yes" msgstr "Da" -#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:110 +#: ../flask_admin/model/filters.py:105 ../flask_admin/model/widgets.py:118 msgid "No" msgstr "ne" -#: ../flask_admin/model/filters.py:172 ../flask_admin/model/filters.py:212 -#: ../flask_admin/model/filters.py:257 +#: ../flask_admin/model/filters.py:173 ../flask_admin/model/filters.py:213 +#: ../flask_admin/model/filters.py:258 msgid "between" msgstr "između" -#: ../flask_admin/model/template.py:81 ../flask_admin/model/template.py:88 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:37 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:8 +#: ../flask_admin/model/template.py:83 ../flask_admin/model/template.py:90 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:7 msgid "View Record" msgstr "Prikaz zapisa" -#: ../flask_admin/model/template.py:95 ../flask_admin/model/template.py:102 -#: ../flask_admin/model/template.py:109 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/edit.html:11 +#: ../flask_admin/model/template.py:97 ../flask_admin/model/template.py:104 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/edit.html:10 msgid "Edit Record" msgstr "Uredite Zapis" -#: ../flask_admin/model/widgets.py:61 +#: ../flask_admin/model/template.py:111 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Delete Record" +msgstr "" + +#: ../flask_admin/model/widgets.py:62 msgid "Please select model" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/actions.html:4 -#: ../flask_admin/templates/bootstrap3/admin/actions.html:4 +#: ../flask_admin/templates/bootstrap4/admin/actions.html:5 msgid "With selected" msgstr "Sa izabran" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:200 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:190 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:216 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:227 msgid "Save" msgstr "Spasi" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:205 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:195 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:221 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:232 msgid "Cancel" msgstr "Otkaži" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:256 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:247 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:290 msgid "Save and Add Another" msgstr "Spremite i dodajte novi" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:259 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:250 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:293 msgid "Save and Continue Editing" msgstr "Spremite i nastavite s uređivanjem" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:9 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:9 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:10 msgid "Root" msgstr "Rut" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:90 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:99 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:89 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:98 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:42 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:51 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:89 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:98 #, python-format msgid "Sort by %(name)s" msgstr "Vrsta koju %(name)s" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:77 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:79 msgid "Rename File" msgstr "Preimenuj datoteku" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:88 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:88 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:90 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\' recursively?" msgstr "Jesi li siguran da hoćeš da obrišem \\'%(name)s\\' recursively?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:97 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:97 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:99 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\'?" msgstr "Jesi li siguran da hoćeš da obrišem \\'%(name)s\\'?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:125 -msgid "Size" -msgstr "" - -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:185 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:187 msgid "Please select at least one file." msgstr "Molim te izabere najmanje jedan dokument." -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:8 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:17 msgid "List" msgstr "Listu" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:12 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:18 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 msgid "Create" msgstr "Stvori" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:26 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:26 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:21 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:26 msgid "Details" msgstr "Detalji" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:29 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:28 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:15 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:28 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:15 msgid "Filter" msgstr "Филтер" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:13 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:14 msgid "Delete?" msgstr "Čim je?" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:33 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:16 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:35 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Are you sure you want to delete this record?" +msgstr "Da li ste sigurani da želite obrisati ovaj zapis?" + +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:33 msgid "New" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:43 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:43 msgid "Add" msgstr "Dodaj" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:3 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:3 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:2 msgid "Add Filter" msgstr "Dodajte Filter" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:30 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:19 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:26 msgid "Export" msgstr "Izvezite" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:38 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:38 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:49 msgid "Apply" msgstr "Primeni" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:40 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:51 msgid "Reset Filters" msgstr "Reset filteri" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:66 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:64 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:80 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:93 +#, python-format +msgid "%(placeholder)s" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:88 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:94 msgid "Search" msgstr "Potraga" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:74 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:77 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:78 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:79 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:72 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:75 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:76 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:77 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:102 msgid "items" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/create.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/create.html:10 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/create.html:10 msgid "Create New Record" msgstr "Stvori Novi Zapis" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:76 msgid "Select all records" msgstr "Izaberu sve podatke" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:120 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:119 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:119 msgid "Select record" msgstr "Izaberu rekord" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:186 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:195 msgid "Please select at least one record." msgstr "Molimo odaberite najmanje jedan zapis." -#: ../flask_admin/templates/bootstrap2/admin/model/row_actions.html:34 -#: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 -msgid "Are you sure you want to delete this record?" -msgstr "Da li ste sigurani da želite obrisati ovaj zapis?" +#~ msgid "ObjectId equals" +#~ msgstr "" + +#~ msgid "Failed to get model. %(error)s" +#~ msgstr "Nije uspeo da dobije model. %(error)s" + +#~ msgid "Tablib dependency not installed." +#~ msgstr "" + +#~ msgid "Size" +#~ msgstr "" + diff --git a/flask_admin/translations/sv/LC_MESSAGES/admin.mo b/flask_admin/translations/sv/LC_MESSAGES/admin.mo index 0acaeee605bab7ac2a223210472cba6734a13623..8429170f3e27b3417de30abcc77c7ac0b859e152 100644 GIT binary patch delta 1850 zcmYMzZ%9>l9LMqRF-tRV-amR*$6MVDHB0S!yR9^0%l>UiBa4t?<ywXG2W5kW&u)y3 zL1<JbSFIidJ(;7#I<)P<kU;9ekYX~}pt0(~f;p)uRxEn3_XmHFsIT+;o^yV`@9+Ej zo=2-Da``{wg#*UVLH<(w?VqO6o1ZH)%oMtcC3p?X@F$#(W7v%2*np))W=+_F^?1a2 z9yc()jXY|l#by;|c}s9nOQ3ElVC~2=)`fbo2cvitWB8SepGQ4+37N>gb>k6iWPBSJ z;J?m_nP!EISKusc!6@t7MlRkW(18oF2et4itj2R#g(GhK5H)cT<xsp97vW~C#BQ9A z$KCxw)bnFlhm$xLlVstuzGb+Wjcv|dsEH1u68RF9c^~SCPGK5{P!r$9Qhb6*e2sBT z5LCQ|e+gWUI?7F``PwkAi>>a)4lH226E(qySdKkz`~{{NpGEEbN7RD%T>KesVVsCe zRbVfwSB@b$*-6w<T||EEdW8Bbft!rvE!2WPqe^riRe}Fd38_q6S_0J*3$X#SxD-D^ z9bq4)aR}@2E-Hc7sHQC@D~)HDQGZS76HsXuqnfH7=^M+TURZ-lWF4|e+l+dy12s{n ziyubX!+Kr(a~D5>{hrwc<oK<QPF6GL^8D9MHlkkaz!kU`wWG7R3`cPZK1Vgte9EEE z={;0pCr~{zfa;NJsHVPyn)eZEBTrEqe&Ng)(iz%G9JON~HNhe`eiy45zwhEb&OX$_ zgUF_A7|G3UqIzN+)A%<kffCMD8z{$Gd<Qw2ymfJ*9i2h#c*Hq@dLc>2EXK8{7Z2e) zJdHZ*Vbo5?QHf5VjwDJJN+^Z;N*YlKe}Fpb9ayRFf2VukGfZ=10CmRS;~X4C?eGs& z=_Zlt*(=n95mr}e%TZ12qrRdAsD-MKy;u$MimgV?w+$;;-#&H^^eVu(AE}yM##a0R zwS!mgzE4(4AcLB49qRdAs0F)G34Mw__M(n7KqWYgdhZ72)s15=@EhuLdW<<t@eS5s zJF3*ZsH6A>Rf$nl1%5&G(C?_yKR{Jr(%paJ;xAAM7Lb*CVuo)kr_PFinlFW#pc?g6 zG$Eg?wW1bmM<v|phf9i%dEt0*w-+2Jc@XZO_0kItM~;O5L^gTB%Ci38ud?CbLiFoc zHrJ48Zph}+*=$Rud1<C8XpMDE>)gH}7>up;RtFQYPYRpfZp?&x;>W!(TE5Q<T9fhc hyNUuY{56><2wu+F7Ve(g<^@;%OF?(#P*9ax|33)ow`BkT delta 2304 zcma*nYiv|S7{>A0-e^nhF1@!DdP=X<wos`QkTkT~S`r!>wO>SuZTCPHw!7QzR$CKn zV`3zVO0p?5sPPgNHFycj2k{m|<0WVsHHxN25{VZ=QDb6)5)=GC-AVkQi8Q<WJ2U6Z z%=^AGrx#j(+%S1IFKycJH^R4^?{leY{qxtj#29roVK%m)7dK-%Zo`du3pU{aY{56N z5ieRxGmYt@-HjP~4hxN$G;uEK=y=KcS@MSY6B%o~S;+y#=%c+7m*E=Q-+_9r2bs|H z+4e4MrX9ixeA4<3rqTWum$JS&$Au>T1&i?tR$?*fD$<Quja#q=U0j6^+xDxd1-`KT zzhf2c;-v(OH{f!--L~&Wji1H});Di(u^PX|QcTG)rVPt57u&4esEPVffsLRt8Aom1 zK6LO1DxkNJkNJk5B0P_Ic*XYTT|@oz>8RjBd%O-cVViZc?eD-8`nymQ^q|hb4lKaE zwtos8+Hq8dCs6Z$g$iK7-cKQ`UfNZ;)L$hUp+gfMM2cXZM(yP>WQ;k53hYzsm#Bs3 zQ5E|YRgo+vQGh<wxGL1R7StB6$0ocPuf;Jh_19iMLx+R2*6*>Ab~>XJ&~>QO-fr7B zp%&;vRc<Hh5Dp^e*6cw&A4LT=fmGd0p`Lrh-k+Z2LJK@@A2^DfKXbzNziazX<9-jN zM9!DFi!}8X>_xiFKGe8J@p_y=WjKdx@G>@F1N)(~){lA}Cv^Z6;rpn=^$FJDdDNlu zQD?msO{fLBP?>E<RiNKGgvx9LRe=fA`1@`9DXgLWqV1ncI%yWTPym^1I8`@ZRAv>Z zL(_r|_Mid?U^PZj8O@*qo<(ih0xH822CD*{))4BsBdBqwuwL)~&-O+UX|CW#JL*i_ zfy(?oeiZp3)K<NX3h*P;Yc`Kc;4<ngcuJC$Oh?_XL<c)iXJ8Qdm@q#&e`Y@yD&-8a zP38sEgeOs@eh+nuKR~^PAEOqULyBiUM^)}8Bo}kZwsUzkD27>ydaf1ORkPLh--(Ow zf0T<(Zaj#J__TfC0xBT=H`2uUs0kWS0koq6>_k4Mhac_v5Gvp))VK#whxQ5Ef7JFL zE2I8;A7|-k#ow?NYdMJy_M)~Tg!On3RjHGx3Vnz=baSY!IfJUuIeY&H+kX)i@E@o% z^q1|=DBqAgt$Bp4OqQc2szkk3P00Ti(~erW7nRA5^2Ey-Q=Zy^P$(R8!V!0LAm%#Z zkQ3tT4o6}Wjz2K!4#mQw0XLec&y0AgyT&8o(U=pPh`7$GntHi9%7B;?9gFCe>u-)9 z&iXEEw;OYY!+tjyZ_h4DjAvi+c()JkVY01$#~m3P2u9<foZ<YwpgRzCov0h+R&qdM zKBvc%8o1YuJGqZl3=9SXgO1;gxFNqA8k$&KD-ept27*DY^-AvX^gzrVj>dO-564&d zvX`vg)Y8_pc6~g<w>uv3b;OVRMpD-`w<hYAJ>;po@hX#jJ<orY$!;kuNYoX0JlVTu ypHC(bjGrx7nW!(!Px)8Mn~HD!&y)`oZ%d|prsP@Yw*Sldp3>LS7E`V+>;4;euRJ;c diff --git a/flask_admin/translations/sv/LC_MESSAGES/admin.po b/flask_admin/translations/sv/LC_MESSAGES/admin.po index 8982f84d8..568a6cc24 100644 --- a/flask_admin/translations/sv/LC_MESSAGES/admin.po +++ b/flask_admin/translations/sv/LC_MESSAGES/admin.po @@ -1,275 +1,264 @@ + msgid "" msgstr "" -"Project-Id-Version: flask-admin\n" +"Project-Id-Version: flask-admin\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-02-07 00:17-0600\n" +"POT-Creation-Date: 2024-09-24 22:09+0100\n" "PO-Revision-Date: 2017-02-07 01:19-0500\n" "Last-Translator: mrjoes <serge.koval@gmail.com>\n" +"Language: sv_SE\n" "Language-Team: Swedish\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.1.1\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: flask-admin\n" -"X-Crowdin-Language: sv-SE\n" -"X-Crowdin-File: admin.pot\n" -"Language: sv_SE\n" +"Generated-By: Babel 2.16.0\n" -#: ../flask_admin/base.py:440 +#: ../flask_admin/base.py:458 msgid "Home" msgstr "Hem" -#: ../flask_admin/contrib/rediscli.py:127 +#: ../flask_admin/contrib/rediscli.py:113 msgid "Cli: Invalid command." msgstr "CLI: Ogiltigt kommando." -#: ../flask_admin/contrib/fileadmin/__init__.py:352 +#: ../flask_admin/contrib/fileadmin/__init__.py:376 msgid "File to upload" msgstr "Fil att ladda upp" -#: ../flask_admin/contrib/fileadmin/__init__.py:360 +#: ../flask_admin/contrib/fileadmin/__init__.py:384 msgid "File required." msgstr "Fil krävs." -#: ../flask_admin/contrib/fileadmin/__init__.py:365 +#: ../flask_admin/contrib/fileadmin/__init__.py:389 msgid "Invalid file type." msgstr "Ogiltig filtyp." -#: ../flask_admin/contrib/fileadmin/__init__.py:376 +#: ../flask_admin/contrib/fileadmin/__init__.py:400 msgid "Content" msgstr "Innehåll" -#: ../flask_admin/contrib/fileadmin/__init__.py:390 +#: ../flask_admin/contrib/fileadmin/__init__.py:414 msgid "Invalid name" msgstr "Ogiltigt namn" -#: ../flask_admin/contrib/fileadmin/__init__.py:398 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:106 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:112 -#: ../flask_admin/tests/sqla/test_translation.py:17 +#: ../flask_admin/contrib/fileadmin/__init__.py:422 +#: ../flask_admin/tests/sqla/test_translation.py:21 msgid "Name" msgstr "Namn" -#: ../flask_admin/contrib/fileadmin/__init__.py:757 +#: ../flask_admin/contrib/fileadmin/__init__.py:784 #, python-format msgid "File \"%(name)s\" already exists." msgstr "Filen \"%(name)s\" finns redan." -#: ../flask_admin/contrib/fileadmin/__init__.py:802 -#: ../flask_admin/contrib/fileadmin/__init__.py:885 -#: ../flask_admin/contrib/fileadmin/__init__.py:947 -#: ../flask_admin/contrib/fileadmin/__init__.py:1000 -#: ../flask_admin/contrib/fileadmin/__init__.py:1047 -#: ../flask_admin/contrib/fileadmin/__init__.py:1099 -#: ../flask_admin/model/base.py:2168 +#: ../flask_admin/contrib/fileadmin/__init__.py:829 +#: ../flask_admin/contrib/fileadmin/__init__.py:926 +#: ../flask_admin/contrib/fileadmin/__init__.py:988 +#: ../flask_admin/contrib/fileadmin/__init__.py:1041 +#: ../flask_admin/contrib/fileadmin/__init__.py:1088 +#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/model/base.py:2324 msgid "Permission denied." msgstr "Åtkomst nekad." -#: ../flask_admin/contrib/fileadmin/__init__.py:881 +#: ../flask_admin/contrib/fileadmin/__init__.py:922 msgid "File uploading is disabled." msgstr "Filuppladdning är inaktiverad." -#: ../flask_admin/contrib/fileadmin/__init__.py:892 +#: ../flask_admin/contrib/fileadmin/__init__.py:933 #, python-format msgid "Successfully saved file: %(name)s" msgstr "Framgångsrikt sparade filen: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:896 +#: ../flask_admin/contrib/fileadmin/__init__.py:937 #, python-format msgid "Failed to save file: %(error)s" msgstr "Det gick inte att spara filen: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:904 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:150 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:150 +#: ../flask_admin/contrib/fileadmin/__init__.py:945 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:150 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:152 msgid "Upload File" msgstr "Ladda upp fil" -#: ../flask_admin/contrib/fileadmin/__init__.py:943 +#: ../flask_admin/contrib/fileadmin/__init__.py:984 msgid "Directory creation is disabled." msgstr "Skapa Directory inaktiveras." -#: ../flask_admin/contrib/fileadmin/__init__.py:956 +#: ../flask_admin/contrib/fileadmin/__init__.py:997 #, python-format msgid "Successfully created directory: %(directory)s" msgstr "Framgångsrikt skapade katalog: %(directory)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:960 +#: ../flask_admin/contrib/fileadmin/__init__.py:1001 #, python-format msgid "Failed to create directory: %(error)s" msgstr "Det gick inte att skapa katalog: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:970 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:161 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:161 +#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:161 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:163 msgid "Create Directory" msgstr "Skapa katalog" -#: ../flask_admin/contrib/fileadmin/__init__.py:996 +#: ../flask_admin/contrib/fileadmin/__init__.py:1037 msgid "Deletion is disabled." msgstr "Strykningen är inaktiverad." -#: ../flask_admin/contrib/fileadmin/__init__.py:1005 +#: ../flask_admin/contrib/fileadmin/__init__.py:1046 msgid "Directory deletion is disabled." msgstr "Strykningen är inaktiverad." -#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/contrib/fileadmin/__init__.py:1052 #, python-format msgid "Directory \"%(path)s\" was successfully deleted." msgstr "Katalogen \"%(path)s\" har tagits bort." -#: ../flask_admin/contrib/fileadmin/__init__.py:1013 +#: ../flask_admin/contrib/fileadmin/__init__.py:1054 #, python-format msgid "Failed to delete directory: %(error)s" msgstr "Det gick inte att ta bort katalog: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1019 -#: ../flask_admin/contrib/fileadmin/__init__.py:1176 +#: ../flask_admin/contrib/fileadmin/__init__.py:1060 +#: ../flask_admin/contrib/fileadmin/__init__.py:1215 #, python-format msgid "File \"%(name)s\" was successfully deleted." msgstr "Filen \"%(name)s\" har tagits bort." -#: ../flask_admin/contrib/fileadmin/__init__.py:1021 -#: ../flask_admin/contrib/fileadmin/__init__.py:1178 +#: ../flask_admin/contrib/fileadmin/__init__.py:1062 +#: ../flask_admin/contrib/fileadmin/__init__.py:1217 #, python-format msgid "Failed to delete file: %(name)s" msgstr "Det gick inte att ta bort filen: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1043 +#: ../flask_admin/contrib/fileadmin/__init__.py:1084 msgid "Renaming is disabled." msgstr "Byta namn avaktiveras." -#: ../flask_admin/contrib/fileadmin/__init__.py:1051 +#: ../flask_admin/contrib/fileadmin/__init__.py:1092 msgid "Path does not exist." msgstr "Sökvägen finns inte." -#: ../flask_admin/contrib/fileadmin/__init__.py:1061 +#: ../flask_admin/contrib/fileadmin/__init__.py:1102 #, python-format msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\"" msgstr "Framgångsrikt omdöpt till \"%(src)s\" till \"%(dst)s\"" -#: ../flask_admin/contrib/fileadmin/__init__.py:1064 +#: ../flask_admin/contrib/fileadmin/__init__.py:1105 #, python-format msgid "Failed to rename: %(error)s" msgstr "Det gick inte att byta namn på: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1078 +#: ../flask_admin/contrib/fileadmin/__init__.py:1119 #, python-format msgid "Rename %(name)s" msgstr "Byt namn på %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1115 +#: ../flask_admin/contrib/fileadmin/__init__.py:1155 #, python-format msgid "Error saving changes to %(name)s." msgstr "Fel spara ändringar i %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1119 +#: ../flask_admin/contrib/fileadmin/__init__.py:1159 #, python-format msgid "Changes to %(name)s saved successfully." msgstr "Ändringar %(name)s sparats." -#: ../flask_admin/contrib/fileadmin/__init__.py:1128 +#: ../flask_admin/contrib/fileadmin/__init__.py:1167 #, python-format msgid "Error reading %(name)s." msgstr "Fel läsning %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1131 -#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/contrib/fileadmin/__init__.py:1170 +#: ../flask_admin/contrib/fileadmin/__init__.py:1179 #, python-format msgid "Unexpected error while reading from %(name)s" msgstr "Oväntat fel vid läsning från %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1137 +#: ../flask_admin/contrib/fileadmin/__init__.py:1176 #, python-format msgid "Cannot edit %(name)s." msgstr "Kan inte redigera %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1155 +#: ../flask_admin/contrib/fileadmin/__init__.py:1194 #, python-format msgid "Editing %(path)s" msgstr "Redigera %(path)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/peewee/view.py:487 -#: ../flask_admin/contrib/pymongo/view.py:384 -#: ../flask_admin/contrib/sqla/view.py:1149 +#: ../flask_admin/contrib/fileadmin/__init__.py:1202 +#: ../flask_admin/contrib/peewee/view.py:510 +#: ../flask_admin/contrib/pymongo/view.py:385 +#: ../flask_admin/contrib/sqla/view.py:1241 msgid "Delete" msgstr "Ta bort" -#: ../flask_admin/contrib/fileadmin/__init__.py:1164 +#: ../flask_admin/contrib/fileadmin/__init__.py:1203 msgid "Are you sure you want to delete these files?" msgstr "Är du säker du vill ta bort dessa filer?" -#: ../flask_admin/contrib/fileadmin/__init__.py:1167 +#: ../flask_admin/contrib/fileadmin/__init__.py:1206 msgid "File deletion is disabled." msgstr "Arkivera strykningen är inaktiverad." -#: ../flask_admin/contrib/fileadmin/__init__.py:1180 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:22 +#: ../flask_admin/contrib/fileadmin/__init__.py:1219 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:22 msgid "Edit" msgstr "Ändra" -#: ../flask_admin/contrib/fileadmin/s3.py:153 +#: ../flask_admin/contrib/fileadmin/s3.py:162 msgid "Cannot operate on non empty directories" msgstr "" #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 -#: ../flask_admin/contrib/sqla/filters.py:41 +#: ../flask_admin/contrib/sqla/filters.py:42 msgid "equals" msgstr "motsvarar" #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 -#: ../flask_admin/contrib/sqla/filters.py:49 +#: ../flask_admin/contrib/sqla/filters.py:50 msgid "not equal" msgstr "inte jämnlikt" #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 -#: ../flask_admin/contrib/sqla/filters.py:58 +#: ../flask_admin/contrib/sqla/filters.py:59 msgid "contains" msgstr "innehåller" #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 -#: ../flask_admin/contrib/sqla/filters.py:67 +#: ../flask_admin/contrib/sqla/filters.py:68 msgid "not contains" msgstr "innehåller inte" #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 -#: ../flask_admin/contrib/sqla/filters.py:75 +#: ../flask_admin/contrib/sqla/filters.py:76 msgid "greater than" msgstr "större än" #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 -#: ../flask_admin/contrib/sqla/filters.py:83 +#: ../flask_admin/contrib/sqla/filters.py:84 msgid "smaller than" msgstr "mindre än" #: ../flask_admin/contrib/peewee/filters.py:88 -#: ../flask_admin/contrib/sqla/filters.py:94 +#: ../flask_admin/contrib/sqla/filters.py:95 msgid "empty" msgstr "tom" #: ../flask_admin/contrib/peewee/filters.py:102 -#: ../flask_admin/contrib/sqla/filters.py:108 +#: ../flask_admin/contrib/sqla/filters.py:109 msgid "in list" msgstr "i listan" #: ../flask_admin/contrib/peewee/filters.py:111 -#: ../flask_admin/contrib/sqla/filters.py:118 +#: ../flask_admin/contrib/sqla/filters.py:119 msgid "not in list" msgstr "inte i listan" @@ -282,84 +271,85 @@ msgstr "inte i listan" msgid "not between" msgstr "inte mellan" -msgid "ObjectId equals" -msgstr "" - -#, python-format -msgid "Failed to get model. %(error)s" -msgstr "Det gick inte att få modell. %(error)s" - -#: ../flask_admin/contrib/peewee/view.py:435 -#: ../flask_admin/contrib/pymongo/view.py:316 -#: ../flask_admin/contrib/sqla/view.py:1078 +#: ../flask_admin/contrib/peewee/view.py:458 +#: ../flask_admin/contrib/pymongo/view.py:317 +#: ../flask_admin/contrib/sqla/view.py:1170 #, python-format msgid "Failed to create record. %(error)s" msgstr "Det gick inte att skapa post. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:454 -#: ../flask_admin/contrib/pymongo/view.py:341 -#: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 -#: ../flask_admin/model/base.py:2313 ../flask_admin/model/base.py:2315 +#: ../flask_admin/contrib/peewee/view.py:477 +#: ../flask_admin/contrib/pymongo/view.py:342 +#: ../flask_admin/contrib/sqla/view.py:1196 ../flask_admin/model/base.py:2463 +#: ../flask_admin/model/base.py:2471 ../flask_admin/model/base.py:2473 #, python-format msgid "Failed to update record. %(error)s" msgstr "Det gick inte att skapa post. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:469 -#: ../flask_admin/contrib/pymongo/view.py:366 -#: ../flask_admin/contrib/sqla/view.py:1129 +#: ../flask_admin/contrib/peewee/view.py:492 +#: ../flask_admin/contrib/pymongo/view.py:367 +#: ../flask_admin/contrib/sqla/view.py:1221 #, python-format msgid "Failed to delete record. %(error)s" msgstr "Det gick inte att ta bort posten. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:488 -#: ../flask_admin/contrib/pymongo/view.py:385 -#: ../flask_admin/contrib/sqla/view.py:1150 +#: ../flask_admin/contrib/peewee/view.py:511 +#: ../flask_admin/contrib/pymongo/view.py:386 +#: ../flask_admin/contrib/sqla/view.py:1242 msgid "Are you sure you want to delete selected records?" msgstr "Är du säker du vill ta bort markerade poster?" -#: ../flask_admin/contrib/peewee/view.py:505 -#: ../flask_admin/contrib/pymongo/view.py:395 -#: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 +#: ../flask_admin/contrib/peewee/view.py:528 +#: ../flask_admin/contrib/pymongo/view.py:396 +#: ../flask_admin/contrib/sqla/view.py:1258 ../flask_admin/model/base.py:2272 #, python-format msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." msgstr[0] "Posten har tagits bort." msgstr[1] "%(count)s poster togs framgångsrikt bort." -#: ../flask_admin/contrib/peewee/view.py:511 -#: ../flask_admin/contrib/pymongo/view.py:400 -#: ../flask_admin/contrib/sqla/view.py:1174 +#: ../flask_admin/contrib/peewee/view.py:534 +#: ../flask_admin/contrib/pymongo/view.py:401 +#: ../flask_admin/contrib/sqla/view.py:1266 #, python-format msgid "Failed to delete records. %(error)s" msgstr "Det gick inte att ta bort posten. %(error)s" -#: ../flask_admin/contrib/sqla/fields.py:126 -#: ../flask_admin/contrib/sqla/fields.py:176 -#: ../flask_admin/contrib/sqla/fields.py:181 ../flask_admin/model/fields.py:173 -#: ../flask_admin/model/fields.py:222 +#: ../flask_admin/contrib/sqla/fields.py:117 +#: ../flask_admin/contrib/sqla/fields.py:167 +#: ../flask_admin/contrib/sqla/fields.py:172 ../flask_admin/model/fields.py:174 +#: ../flask_admin/model/fields.py:223 msgid "Not a valid choice" msgstr "Inte ett giltigt val" -#: ../flask_admin/contrib/sqla/fields.py:186 +#: ../flask_admin/contrib/sqla/fields.py:201 msgid "Key" msgstr "Nyckel" -#: ../flask_admin/contrib/sqla/fields.py:187 +#: ../flask_admin/contrib/sqla/fields.py:202 msgid "Value" msgstr "Värde" -#: ../flask_admin/contrib/sqla/validators.py:42 +#: ../flask_admin/contrib/sqla/validators.py:28 msgid "Already exists." msgstr "Det finns redan." -#: ../flask_admin/contrib/sqla/validators.py:60 +#: ../flask_admin/contrib/sqla/validators.py:59 #, python-format msgid "At least %(num)d item is required" msgid_plural "At least %(num)d items are required" msgstr[0] "" msgstr[1] "" -#: ../flask_admin/contrib/sqla/view.py:1057 +#: ../flask_admin/contrib/sqla/validators.py:75 +msgid "Not a valid ISO currency code (e.g. USD, EUR, CNY)." +msgstr "" + +#: ../flask_admin/contrib/sqla/validators.py:83 +msgid "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." +msgstr "" + +#: ../flask_admin/contrib/sqla/view.py:1134 #, python-format msgid "Integrity error. %(message)s" msgstr "Integritet fel. %(message)s" @@ -368,274 +358,242 @@ msgstr "Integritet fel. %(message)s" msgid "Invalid time format" msgstr "Ogiltig tidsformat" -#: ../flask_admin/form/fields.py:144 +#: ../flask_admin/form/fields.py:147 msgid "Invalid Choice: could not coerce" msgstr "Ogiltigt val: kunde inte tvinga" -#: ../flask_admin/form/fields.py:208 +#: ../flask_admin/form/fields.py:221 msgid "Invalid JSON" msgstr "Ogiltig JSON" -#: ../flask_admin/form/upload.py:207 +#: ../flask_admin/form/upload.py:216 msgid "Invalid file extension" msgstr "Ogiltig filnamnstillägg" -#: ../flask_admin/form/upload.py:214 ../flask_admin/form/upload.py:281 +#: ../flask_admin/form/upload.py:223 ../flask_admin/form/upload.py:293 #, python-format msgid "File \"%s\" already exists." msgstr "Filen \"%s\" finns redan." -#: ../flask_admin/model/base.py:1649 +#: ../flask_admin/form/validators.py:16 +msgid "This field requires at least one item." +msgstr "" + +#: ../flask_admin/model/base.py:1737 msgid "There are no items in the table." msgstr "Det finns inga objekt i tabellen." -#: ../flask_admin/model/base.py:1673 +#: ../flask_admin/model/base.py:1746 #, python-format msgid "Invalid Filter Value: %(value)s" msgstr "Ogiltig filtervärdet: %(value)s" -#: ../flask_admin/model/base.py:1984 +#: ../flask_admin/model/base.py:2136 msgid "Record was successfully created." msgstr "Posten har skapats." -#: ../flask_admin/model/base.py:2028 ../flask_admin/model/base.py:2080 -#: ../flask_admin/model/base.py:2113 ../flask_admin/model/base.py:2297 +#: ../flask_admin/model/base.py:2180 ../flask_admin/model/base.py:2232 +#: ../flask_admin/model/base.py:2265 ../flask_admin/model/base.py:2455 msgid "Record does not exist." msgstr "Det finns ingen post." -#: ../flask_admin/model/base.py:2037 ../flask_admin/model/base.py:2301 +#: ../flask_admin/model/base.py:2189 ../flask_admin/model/base.py:2459 msgid "Record was successfully saved." msgstr "Posten sparades framgångsrikt." -#: ../flask_admin/model/base.py:2222 -msgid "Tablib dependency not installed." -msgstr "" - -#: ../flask_admin/model/base.py:2249 +#: ../flask_admin/model/base.py:2407 #, python-format msgid "Export type \"%(type)s not supported." msgstr "" -#: ../flask_admin/model/filters.py:103 ../flask_admin/model/widgets.py:111 +#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:119 msgid "Yes" msgstr "Ja" -#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:110 +#: ../flask_admin/model/filters.py:105 ../flask_admin/model/widgets.py:118 msgid "No" msgstr "Nej" -#: ../flask_admin/model/filters.py:172 ../flask_admin/model/filters.py:212 -#: ../flask_admin/model/filters.py:257 +#: ../flask_admin/model/filters.py:173 ../flask_admin/model/filters.py:213 +#: ../flask_admin/model/filters.py:258 msgid "between" msgstr "mellan" -#: ../flask_admin/model/template.py:81 ../flask_admin/model/template.py:88 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:37 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:8 +#: ../flask_admin/model/template.py:83 ../flask_admin/model/template.py:90 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:7 msgid "View Record" msgstr "Vy-post" -#: ../flask_admin/model/template.py:95 ../flask_admin/model/template.py:102 -#: ../flask_admin/model/template.py:109 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/edit.html:11 +#: ../flask_admin/model/template.py:97 ../flask_admin/model/template.py:104 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/edit.html:10 msgid "Edit Record" msgstr "Redigera Posten" -#: ../flask_admin/model/widgets.py:61 +#: ../flask_admin/model/template.py:111 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Delete Record" +msgstr "" + +#: ../flask_admin/model/widgets.py:62 msgid "Please select model" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/actions.html:4 -#: ../flask_admin/templates/bootstrap3/admin/actions.html:4 +#: ../flask_admin/templates/bootstrap4/admin/actions.html:5 msgid "With selected" msgstr "Med utvalda" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:200 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:190 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:216 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:227 msgid "Save" msgstr "Spara" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:205 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:195 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:221 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:232 msgid "Cancel" msgstr "Avbryt" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:256 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:247 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:290 msgid "Save and Add Another" msgstr "Spara och lägg till en ny" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:259 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:250 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:293 msgid "Save and Continue Editing" msgstr "Spara och fortsätt redigera" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:9 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:9 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:10 msgid "Root" msgstr "Rot" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:90 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:99 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:89 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:98 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:42 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:51 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:89 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:98 #, python-format msgid "Sort by %(name)s" msgstr "Sortera efter %(name)s" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:77 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:79 msgid "Rename File" msgstr "Byt namn på filen" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:88 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:88 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:90 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\' recursively?" msgstr "Är du säker du vill ta bort \\'%(name)s\\' rekursivt?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:97 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:97 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:99 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\'?" msgstr "Är du säker du vill ta bort \\'%(name)s\\'?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:125 -msgid "Size" -msgstr "" - -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:185 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:187 msgid "Please select at least one file." msgstr "Markera minst en fil." -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:8 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:17 msgid "List" msgstr "Lista" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:12 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:18 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 msgid "Create" msgstr "Skapa" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:26 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:26 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:21 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:26 msgid "Details" msgstr "Detaljer" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:29 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:28 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:15 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:28 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:15 msgid "Filter" msgstr "Filter" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:13 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:14 msgid "Delete?" msgstr "Ta bort?" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:33 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:16 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:35 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Are you sure you want to delete this record?" +msgstr "Är du säker du vill ta bort denna post?" + +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:33 msgid "New" msgstr "Ny" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:43 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:43 msgid "Add" msgstr "Lägg till" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:3 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:3 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:2 msgid "Add Filter" msgstr "Lägg till Filter" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:30 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:19 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:26 msgid "Export" msgstr "Exportera" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:38 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:38 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:49 msgid "Apply" msgstr "Tillämpa" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:40 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:51 msgid "Reset Filters" msgstr "Återställa filter" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:66 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:64 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:80 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:93 +#, python-format +msgid "%(placeholder)s" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:88 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:94 msgid "Search" msgstr "Sök" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:74 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:77 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:78 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:79 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:72 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:75 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:76 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:77 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:102 msgid "items" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/create.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/create.html:10 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/create.html:10 msgid "Create New Record" msgstr "Skapa Ny Post" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:76 msgid "Select all records" msgstr "Väljer du alla poster" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:120 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:119 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:119 msgid "Select record" msgstr "Välj post" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:186 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:195 msgid "Please select at least one record." msgstr "Välj minst en post." -#: ../flask_admin/templates/bootstrap2/admin/model/row_actions.html:34 -#: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 -msgid "Are you sure you want to delete this record?" -msgstr "Är du säker du vill ta bort denna post?" +#~ msgid "ObjectId equals" +#~ msgstr "" + +#~ msgid "Failed to get model. %(error)s" +#~ msgstr "Det gick inte att få modell. %(error)s" + +#~ msgid "Tablib dependency not installed." +#~ msgstr "" + +#~ msgid "Size" +#~ msgstr "" + diff --git a/flask_admin/translations/tr/LC_MESSAGES/admin.mo b/flask_admin/translations/tr/LC_MESSAGES/admin.mo index 116de214027d79fe4577b6227018ebdb18d977e9..cad7f6419afac67dbc591b842c42f32ba5d6501e 100644 GIT binary patch delta 1885 zcmYM!Sx8h-9LMqh*kp^T&9s;)Y1uZ|Of!R7W(x)(krAW>(S{^eM3U7@VN5|UMG-Yc z5ENQ3Mq$wPp@sH`sECRR?ZJVfl2%)wvU=$IV-7UT__^oYd(Z!W{^uOqD%&d(si6Ou z@!8C;kl)?`YW@Fw%rsNiCmf1jF&F>hKpZy6tOA1=#u|*_PMn74oiA`9?aaaa^c;>d zOIR%zQ|Q>}Je<B^myvhu5$c659F8drV4v&v4M{&Y7#YxpyY^&^(2igcu6FK1Kkbv4 zMSMHWg$C}xJiLM9u?rQrA19)wKM5w`1YGReO{f4zU4JK*(C)$l{Db2#FDw0CIqLZp z7$Uyy;36N-;8?tdIoR#&MGf==l~8b4dItHZB^!suScw{V74o$f{*1<b7{pfB@8JmA zH!-2Lea3}K((UX)^}oUle2W_39gf7mt{uou2cC$k$U@Y>8&H8;-2Egjq1}n9L<Y0d z9vYuR{h5@-=+N5DMV_%*R6_O6MpWQUs7mcdRpJCHu{P9uov5X}jbVI>rRXD?mNbmT zxD==1mR#zu1WwYS-Fz0+zJMC=DykCqP@C}~vhVCU>iHBZk=IC3>;vk#U+%uL(Ri7t z`$1$oS&{1xCESe}c+h9I05$W+Y;nE#9N9ni5*6qpF2e6vhI5(zEZmB5JckiXVHIYx z9(r#nYOgFu&3qe1G11C}O8*2kvtH*HBp2&Pm3}CHREZ)~f+ZNjsi^msp-#t2RDeA= z9Xs6p6q2*`B12j~@=aJa(dW@I0ac=U)J&RCYuJX`T#rxzzoAY^Av;Vnn(3@VCD4qe zcpUZK9n_|Ki&JqRXM7AsFr@Qe%?10!no$|<M*TxNf-2n=)SBJG5`2IfsL!>>Fq+<< zgGy{MlA|@ECe(t&wtc9*(TdtT?daF}@6ZK$sDPJ{(%21DX`i8%q6c-pKVvcGa1_YF zrla;sHLAZBwMVw2W_}%2sUGKV)Y9aUZ9;*nxljVDPzltdX1W0t@Bk{~^QeFqQK#cR zYG&Q2HSa?OF66(JD%6Nd;1HH$2dW}(P;tH$P=A%YpAMBUi!_zUSX9Z2P$dhw{urtv z<*0$?yZbe+zYbNY)u{2BP|xi`PNeNeC4K^}s-eNEy!fCIey<_xr_bAzeb<+qnS0QC zlUw5p#LL3big3KFI3AxJttgGgk_!Us2du4ImOLA%@>M3^2b%q{@<`NM6FlShLV4>l Syi@u9jAVPkRqsIIDBnNIIl7nt delta 2087 zcmYM!eN5X$9LMpaz?3}zWo|GY#?LXG2$Yr)9%Lb6WDX<SV&dXM;?}Oek&aSUC}8Id zME=?0d`LR}nPE6J=}e{uyFZ9BjnYM9qM1>%MdOUivKU!hH2Y^U5#JxVWTf<Ucfa4= zeeZjBJ=1==WBf`<-jv}l&VMEU@8+s@=db=QW7O1uD=~mYxDE6132etFu>p@`06)fh zykXsNw=vz+x8n-EhwF?PHz^8RXn4>1-SPu-8|iC`3YI&RVlnlN=*33c-i3N^2Qr}9 zZR-cnM?HqsIBh+TdDMTwRm^X$QqaJEVks`+y;#a}6=^$e#)t7fba4~DV(TBECiua& z-@+Q|rK<=QJFo(uwe?X{|0%3yeltg*7BAxl^sF|f94oO9Tdmts13iTbERI^q3#hGo z2^~C%3g{E$V}9mqJ^qd*xMbT)){y_TG*na29&ber*lOKo+q=+1dpBx;9jG(#9NvTd zwtWH}>M7I;&!NV@gbHBMKKHPyUg|Z4<X<U@)1U$0K$2kILha>Qq>uRm71%}VkEn@% zLS^hGDkB99q5z9g{c2GC0;nx+!3KN`>u{uq{A;gI)8OEO^%~Yw&!?9HYC@g%PFsHz zHNkFF=AK6#!Vq$9%|X=r!>GWLNY>2+>b+O(^QmzPn&3_QLK-=L=A3Q+)V6<(M{`Ie zYDN24ruw<ac{6d;L`Sd(C$Sm7!8Y`;4^7yCK8#@(j!#oi$6ry0=sIfUx#ZW6e$-Y3 zQ7ap>P9U+EW5~yx<V%_O5EWnsb*Sf1{jQ>J&mwAkFM~Gf{&!N)3o+Ea9z$X<$B=i; zG<M=gs1*K%TFJkty$o=&blCQyCVUxnd(NU3^riJ0ZlRvT9akW=Sf~5Hi-HDt5p@_( z;RARc%kVmC;3edonOYhZXd7z4$59y^!U9a9?*AleoV2Z9MD@Rg3NV+GyH59iBL%Ij z841#Kp$^H@s6(_5mC^&&e$<4AP#GFS1#}#h$y2DUNuz!T=Fq{*$QsOT)Y<V8#kd|+ zQRu-=R0fWsQkS-7k-aj%p(gb5E2Mz#M+H)cT5%I<!ab<KM^O_VLEV-Uw*76?LeEr? ze;tO;Xixw*P$_F+cDWb-4+vYRr%{=@f|_^{wer7Fsm-fe4s0!IE6Pxr++^DyL}jQE zHBMVq+wu$D_CYTyb$d_)_SqLlk)H%JiCRgjD)YyRioAk8H{lEnhTUl9=E^mmqFteb z?*2qi*m2_{!RT=2pVeRG<VFs=sm}{vuMUQyk&qL154o|h8{40BVuJ}M5*tngqfs~P z%j_)Lnd1$#Hu#$w{H>1P|B%WpsrQTfQl;Lm)HB|A?p9xO=3DPOd6m7I(+Nfgf=(!S zVJ0|~ogL239(D$!;gO8He$eB+6Uv2|NFos#%6wmz@5z5;FgcP)T`Hg7Oe~>bb|yPJ d5Y5i=QPD{*%=bqZ=7};p6N&mVuT_-i{0Hiz_2vKo diff --git a/flask_admin/translations/tr/LC_MESSAGES/admin.po b/flask_admin/translations/tr/LC_MESSAGES/admin.po index 74ed83710..4a6d99933 100644 --- a/flask_admin/translations/tr/LC_MESSAGES/admin.po +++ b/flask_admin/translations/tr/LC_MESSAGES/admin.po @@ -1,275 +1,264 @@ + msgid "" msgstr "" -"Project-Id-Version: flask-admin\n" +"Project-Id-Version: flask-admin\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-02-07 00:17-0600\n" +"POT-Creation-Date: 2024-09-24 22:09+0100\n" "PO-Revision-Date: 2017-02-13 09:18-0500\n" "Last-Translator: mrjoes <serge.koval@gmail.com>\n" +"Language: tr_TR\n" "Language-Team: Turkish\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.1.1\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: flask-admin\n" -"X-Crowdin-Language: tr\n" -"X-Crowdin-File: admin.pot\n" -"Language: tr_TR\n" +"Generated-By: Babel 2.16.0\n" -#: ../flask_admin/base.py:440 +#: ../flask_admin/base.py:458 msgid "Home" msgstr "Ana sayfa" -#: ../flask_admin/contrib/rediscli.py:127 +#: ../flask_admin/contrib/rediscli.py:113 msgid "Cli: Invalid command." msgstr "CLI: Geçersiz komut." -#: ../flask_admin/contrib/fileadmin/__init__.py:352 +#: ../flask_admin/contrib/fileadmin/__init__.py:376 msgid "File to upload" msgstr "Yüklenecek dosya" -#: ../flask_admin/contrib/fileadmin/__init__.py:360 +#: ../flask_admin/contrib/fileadmin/__init__.py:384 msgid "File required." msgstr "Gerekli dosya." -#: ../flask_admin/contrib/fileadmin/__init__.py:365 +#: ../flask_admin/contrib/fileadmin/__init__.py:389 msgid "Invalid file type." msgstr "Geçersiz dosya tipi." -#: ../flask_admin/contrib/fileadmin/__init__.py:376 +#: ../flask_admin/contrib/fileadmin/__init__.py:400 msgid "Content" msgstr "İçerik" -#: ../flask_admin/contrib/fileadmin/__init__.py:390 +#: ../flask_admin/contrib/fileadmin/__init__.py:414 msgid "Invalid name" msgstr "Geçersiz ad" -#: ../flask_admin/contrib/fileadmin/__init__.py:398 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:106 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:112 -#: ../flask_admin/tests/sqla/test_translation.py:17 +#: ../flask_admin/contrib/fileadmin/__init__.py:422 +#: ../flask_admin/tests/sqla/test_translation.py:21 msgid "Name" msgstr "Adı" -#: ../flask_admin/contrib/fileadmin/__init__.py:757 +#: ../flask_admin/contrib/fileadmin/__init__.py:784 #, python-format msgid "File \"%(name)s\" already exists." msgstr "\"%(name)s\" dosyası zaten var." -#: ../flask_admin/contrib/fileadmin/__init__.py:802 -#: ../flask_admin/contrib/fileadmin/__init__.py:885 -#: ../flask_admin/contrib/fileadmin/__init__.py:947 -#: ../flask_admin/contrib/fileadmin/__init__.py:1000 -#: ../flask_admin/contrib/fileadmin/__init__.py:1047 -#: ../flask_admin/contrib/fileadmin/__init__.py:1099 -#: ../flask_admin/model/base.py:2168 +#: ../flask_admin/contrib/fileadmin/__init__.py:829 +#: ../flask_admin/contrib/fileadmin/__init__.py:926 +#: ../flask_admin/contrib/fileadmin/__init__.py:988 +#: ../flask_admin/contrib/fileadmin/__init__.py:1041 +#: ../flask_admin/contrib/fileadmin/__init__.py:1088 +#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/model/base.py:2324 msgid "Permission denied." msgstr "İzin verilmedi." -#: ../flask_admin/contrib/fileadmin/__init__.py:881 +#: ../flask_admin/contrib/fileadmin/__init__.py:922 msgid "File uploading is disabled." msgstr "Karşıya dosya yükleme devre dışı." -#: ../flask_admin/contrib/fileadmin/__init__.py:892 +#: ../flask_admin/contrib/fileadmin/__init__.py:933 #, python-format msgid "Successfully saved file: %(name)s" msgstr "Başarıyla kaydedilmiş dosya: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:896 +#: ../flask_admin/contrib/fileadmin/__init__.py:937 #, python-format msgid "Failed to save file: %(error)s" msgstr "Dosya kaydetme başarısız oldu: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:904 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:150 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:150 +#: ../flask_admin/contrib/fileadmin/__init__.py:945 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:150 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:152 msgid "Upload File" msgstr "Dosya Yükle" -#: ../flask_admin/contrib/fileadmin/__init__.py:943 +#: ../flask_admin/contrib/fileadmin/__init__.py:984 msgid "Directory creation is disabled." msgstr "Dizin oluşturma devre dışı bırakıldı." -#: ../flask_admin/contrib/fileadmin/__init__.py:956 +#: ../flask_admin/contrib/fileadmin/__init__.py:997 #, python-format msgid "Successfully created directory: %(directory)s" msgstr "Dizin başarıya oluşturuldu: %(directory)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:960 +#: ../flask_admin/contrib/fileadmin/__init__.py:1001 #, python-format msgid "Failed to create directory: %(error)s" msgstr "Dizin oluşturma başarısız oldu: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:970 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:161 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:161 +#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:161 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:163 msgid "Create Directory" msgstr "Dizin oluşturma" -#: ../flask_admin/contrib/fileadmin/__init__.py:996 +#: ../flask_admin/contrib/fileadmin/__init__.py:1037 msgid "Deletion is disabled." msgstr "Silme işlemi devre dışı bırakıldı." -#: ../flask_admin/contrib/fileadmin/__init__.py:1005 +#: ../flask_admin/contrib/fileadmin/__init__.py:1046 msgid "Directory deletion is disabled." msgstr "Dizin silme işlemi devre dışı bırakıldı." -#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/contrib/fileadmin/__init__.py:1052 #, python-format msgid "Directory \"%(path)s\" was successfully deleted." msgstr "Dizin \"%(path)s\" başarıyla silindi." -#: ../flask_admin/contrib/fileadmin/__init__.py:1013 +#: ../flask_admin/contrib/fileadmin/__init__.py:1054 #, python-format msgid "Failed to delete directory: %(error)s" msgstr "Dizini silme başarısız oldu: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1019 -#: ../flask_admin/contrib/fileadmin/__init__.py:1176 +#: ../flask_admin/contrib/fileadmin/__init__.py:1060 +#: ../flask_admin/contrib/fileadmin/__init__.py:1215 #, python-format msgid "File \"%(name)s\" was successfully deleted." msgstr "\"%(name)s\" dosyası başarıyla silindi." -#: ../flask_admin/contrib/fileadmin/__init__.py:1021 -#: ../flask_admin/contrib/fileadmin/__init__.py:1178 +#: ../flask_admin/contrib/fileadmin/__init__.py:1062 +#: ../flask_admin/contrib/fileadmin/__init__.py:1217 #, python-format msgid "Failed to delete file: %(name)s" msgstr "Dosya silinemedi: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1043 +#: ../flask_admin/contrib/fileadmin/__init__.py:1084 msgid "Renaming is disabled." msgstr "Yeniden adlandırma devre dışı bırakılır." -#: ../flask_admin/contrib/fileadmin/__init__.py:1051 +#: ../flask_admin/contrib/fileadmin/__init__.py:1092 msgid "Path does not exist." msgstr "Yol yok." -#: ../flask_admin/contrib/fileadmin/__init__.py:1061 +#: ../flask_admin/contrib/fileadmin/__init__.py:1102 #, python-format msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\"" msgstr "Başarılı bir şekilde yeniden adlandırılan \"%(src)s\" \"%(dst)s\" için" -#: ../flask_admin/contrib/fileadmin/__init__.py:1064 +#: ../flask_admin/contrib/fileadmin/__init__.py:1105 #, python-format msgid "Failed to rename: %(error)s" msgstr "Yeniden adlandırılamadı: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1078 +#: ../flask_admin/contrib/fileadmin/__init__.py:1119 #, python-format msgid "Rename %(name)s" msgstr "%(name)s yeniden adlandırma" -#: ../flask_admin/contrib/fileadmin/__init__.py:1115 +#: ../flask_admin/contrib/fileadmin/__init__.py:1155 #, python-format msgid "Error saving changes to %(name)s." msgstr "%(name)s için değişiklikler kaydedilirken bir hata oluştu." -#: ../flask_admin/contrib/fileadmin/__init__.py:1119 +#: ../flask_admin/contrib/fileadmin/__init__.py:1159 #, python-format msgid "Changes to %(name)s saved successfully." msgstr "Değişiklikler başarıyla kaydedildi %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1128 +#: ../flask_admin/contrib/fileadmin/__init__.py:1167 #, python-format msgid "Error reading %(name)s." msgstr "Hata okuma %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1131 -#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/contrib/fileadmin/__init__.py:1170 +#: ../flask_admin/contrib/fileadmin/__init__.py:1179 #, python-format msgid "Unexpected error while reading from %(name)s" msgstr "%(name)s üzerinden okuma sırasında beklenmeyen hata" -#: ../flask_admin/contrib/fileadmin/__init__.py:1137 +#: ../flask_admin/contrib/fileadmin/__init__.py:1176 #, python-format msgid "Cannot edit %(name)s." msgstr "%(name)s düzenleyemezsiniz." -#: ../flask_admin/contrib/fileadmin/__init__.py:1155 +#: ../flask_admin/contrib/fileadmin/__init__.py:1194 #, python-format msgid "Editing %(path)s" msgstr "%(path)s düzenleme" -#: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/peewee/view.py:487 -#: ../flask_admin/contrib/pymongo/view.py:384 -#: ../flask_admin/contrib/sqla/view.py:1149 +#: ../flask_admin/contrib/fileadmin/__init__.py:1202 +#: ../flask_admin/contrib/peewee/view.py:510 +#: ../flask_admin/contrib/pymongo/view.py:385 +#: ../flask_admin/contrib/sqla/view.py:1241 msgid "Delete" msgstr "Sil" -#: ../flask_admin/contrib/fileadmin/__init__.py:1164 +#: ../flask_admin/contrib/fileadmin/__init__.py:1203 msgid "Are you sure you want to delete these files?" msgstr "Bu dosyaları silmek istediğinizden emin misiniz?" -#: ../flask_admin/contrib/fileadmin/__init__.py:1167 +#: ../flask_admin/contrib/fileadmin/__init__.py:1206 msgid "File deletion is disabled." msgstr "Dosya silmeyi devre dışı bırakılır." -#: ../flask_admin/contrib/fileadmin/__init__.py:1180 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:22 +#: ../flask_admin/contrib/fileadmin/__init__.py:1219 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:22 msgid "Edit" msgstr "Düzenle" -#: ../flask_admin/contrib/fileadmin/s3.py:153 +#: ../flask_admin/contrib/fileadmin/s3.py:162 msgid "Cannot operate on non empty directories" msgstr "Boş olmayan dizinler üzerinde çalışamaz" #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 -#: ../flask_admin/contrib/sqla/filters.py:41 +#: ../flask_admin/contrib/sqla/filters.py:42 msgid "equals" msgstr "eşittir" #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 -#: ../flask_admin/contrib/sqla/filters.py:49 +#: ../flask_admin/contrib/sqla/filters.py:50 msgid "not equal" msgstr "eşit değil" #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 -#: ../flask_admin/contrib/sqla/filters.py:58 +#: ../flask_admin/contrib/sqla/filters.py:59 msgid "contains" msgstr "içerir" #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 -#: ../flask_admin/contrib/sqla/filters.py:67 +#: ../flask_admin/contrib/sqla/filters.py:68 msgid "not contains" msgstr "değil içerir" #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 -#: ../flask_admin/contrib/sqla/filters.py:75 +#: ../flask_admin/contrib/sqla/filters.py:76 msgid "greater than" msgstr "daha büyük" #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 -#: ../flask_admin/contrib/sqla/filters.py:83 +#: ../flask_admin/contrib/sqla/filters.py:84 msgid "smaller than" msgstr "daha küçük" #: ../flask_admin/contrib/peewee/filters.py:88 -#: ../flask_admin/contrib/sqla/filters.py:94 +#: ../flask_admin/contrib/sqla/filters.py:95 msgid "empty" msgstr "boş" #: ../flask_admin/contrib/peewee/filters.py:102 -#: ../flask_admin/contrib/sqla/filters.py:108 +#: ../flask_admin/contrib/sqla/filters.py:109 msgid "in list" msgstr "listede" #: ../flask_admin/contrib/peewee/filters.py:111 -#: ../flask_admin/contrib/sqla/filters.py:118 +#: ../flask_admin/contrib/sqla/filters.py:119 msgid "not in list" msgstr "liste değildir" @@ -282,84 +271,85 @@ msgstr "liste değildir" msgid "not between" msgstr "arasında değil" -msgid "ObjectId equals" -msgstr "ObjectId eşittir" - -#, python-format -msgid "Failed to get model. %(error)s" -msgstr "Model alma başarısız oldu. %(error)s" - -#: ../flask_admin/contrib/peewee/view.py:435 -#: ../flask_admin/contrib/pymongo/view.py:316 -#: ../flask_admin/contrib/sqla/view.py:1078 +#: ../flask_admin/contrib/peewee/view.py:458 +#: ../flask_admin/contrib/pymongo/view.py:317 +#: ../flask_admin/contrib/sqla/view.py:1170 #, python-format msgid "Failed to create record. %(error)s" msgstr "Kayıt oluşturulamadı. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:454 -#: ../flask_admin/contrib/pymongo/view.py:341 -#: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 -#: ../flask_admin/model/base.py:2313 ../flask_admin/model/base.py:2315 +#: ../flask_admin/contrib/peewee/view.py:477 +#: ../flask_admin/contrib/pymongo/view.py:342 +#: ../flask_admin/contrib/sqla/view.py:1196 ../flask_admin/model/base.py:2463 +#: ../flask_admin/model/base.py:2471 ../flask_admin/model/base.py:2473 #, python-format msgid "Failed to update record. %(error)s" msgstr "Kaydı oluşturulamadı. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:469 -#: ../flask_admin/contrib/pymongo/view.py:366 -#: ../flask_admin/contrib/sqla/view.py:1129 +#: ../flask_admin/contrib/peewee/view.py:492 +#: ../flask_admin/contrib/pymongo/view.py:367 +#: ../flask_admin/contrib/sqla/view.py:1221 #, python-format msgid "Failed to delete record. %(error)s" msgstr "Kaydı silinemedi. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:488 -#: ../flask_admin/contrib/pymongo/view.py:385 -#: ../flask_admin/contrib/sqla/view.py:1150 +#: ../flask_admin/contrib/peewee/view.py:511 +#: ../flask_admin/contrib/pymongo/view.py:386 +#: ../flask_admin/contrib/sqla/view.py:1242 msgid "Are you sure you want to delete selected records?" msgstr "Seçili kayıtları silmek istediğinizden emin misiniz?" -#: ../flask_admin/contrib/peewee/view.py:505 -#: ../flask_admin/contrib/pymongo/view.py:395 -#: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 +#: ../flask_admin/contrib/peewee/view.py:528 +#: ../flask_admin/contrib/pymongo/view.py:396 +#: ../flask_admin/contrib/sqla/view.py:1258 ../flask_admin/model/base.py:2272 #, python-format msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." msgstr[0] "Kaydı başarıyla silindi." msgstr[1] "%(count)s kayıtlarını başarıyla silindi." -#: ../flask_admin/contrib/peewee/view.py:511 -#: ../flask_admin/contrib/pymongo/view.py:400 -#: ../flask_admin/contrib/sqla/view.py:1174 +#: ../flask_admin/contrib/peewee/view.py:534 +#: ../flask_admin/contrib/pymongo/view.py:401 +#: ../flask_admin/contrib/sqla/view.py:1266 #, python-format msgid "Failed to delete records. %(error)s" msgstr "Kaydı silinemedi. %(error)s" -#: ../flask_admin/contrib/sqla/fields.py:126 -#: ../flask_admin/contrib/sqla/fields.py:176 -#: ../flask_admin/contrib/sqla/fields.py:181 ../flask_admin/model/fields.py:173 -#: ../flask_admin/model/fields.py:222 +#: ../flask_admin/contrib/sqla/fields.py:117 +#: ../flask_admin/contrib/sqla/fields.py:167 +#: ../flask_admin/contrib/sqla/fields.py:172 ../flask_admin/model/fields.py:174 +#: ../flask_admin/model/fields.py:223 msgid "Not a valid choice" msgstr "Geçersiz bir seçim" -#: ../flask_admin/contrib/sqla/fields.py:186 +#: ../flask_admin/contrib/sqla/fields.py:201 msgid "Key" msgstr "Anahtar" -#: ../flask_admin/contrib/sqla/fields.py:187 +#: ../flask_admin/contrib/sqla/fields.py:202 msgid "Value" msgstr "Değer" -#: ../flask_admin/contrib/sqla/validators.py:42 +#: ../flask_admin/contrib/sqla/validators.py:28 msgid "Already exists." msgstr "Zaten var." -#: ../flask_admin/contrib/sqla/validators.py:60 +#: ../flask_admin/contrib/sqla/validators.py:59 #, python-format msgid "At least %(num)d item is required" msgid_plural "At least %(num)d items are required" msgstr[0] "En az %(num)d adet nesne gerekli" msgstr[1] "En az %(num)d adet nesne gerekli" -#: ../flask_admin/contrib/sqla/view.py:1057 +#: ../flask_admin/contrib/sqla/validators.py:75 +msgid "Not a valid ISO currency code (e.g. USD, EUR, CNY)." +msgstr "" + +#: ../flask_admin/contrib/sqla/validators.py:83 +msgid "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." +msgstr "" + +#: ../flask_admin/contrib/sqla/view.py:1134 #, python-format msgid "Integrity error. %(message)s" msgstr "Bütünlüğü hatası. %(message)s" @@ -368,274 +358,242 @@ msgstr "Bütünlüğü hatası. %(message)s" msgid "Invalid time format" msgstr "Geçersiz saat biçimi" -#: ../flask_admin/form/fields.py:144 +#: ../flask_admin/form/fields.py:147 msgid "Invalid Choice: could not coerce" msgstr "Geçersiz seçenek: dönüştürülemedi" -#: ../flask_admin/form/fields.py:208 +#: ../flask_admin/form/fields.py:221 msgid "Invalid JSON" msgstr "Geçersiz JSON" -#: ../flask_admin/form/upload.py:207 +#: ../flask_admin/form/upload.py:216 msgid "Invalid file extension" msgstr "Geçersiz dosya uzantısı" -#: ../flask_admin/form/upload.py:214 ../flask_admin/form/upload.py:281 +#: ../flask_admin/form/upload.py:223 ../flask_admin/form/upload.py:293 #, python-format msgid "File \"%s\" already exists." msgstr "\"%s\" dosyası zaten var." -#: ../flask_admin/model/base.py:1649 +#: ../flask_admin/form/validators.py:16 +msgid "This field requires at least one item." +msgstr "" + +#: ../flask_admin/model/base.py:1737 msgid "There are no items in the table." msgstr "Tabloda hiçbir öğe vardır." -#: ../flask_admin/model/base.py:1673 +#: ../flask_admin/model/base.py:1746 #, python-format msgid "Invalid Filter Value: %(value)s" msgstr "Geçersiz filtre değeri: %(value)s" -#: ../flask_admin/model/base.py:1984 +#: ../flask_admin/model/base.py:2136 msgid "Record was successfully created." msgstr "Kaydı başarıyla oluşturuldu." -#: ../flask_admin/model/base.py:2028 ../flask_admin/model/base.py:2080 -#: ../flask_admin/model/base.py:2113 ../flask_admin/model/base.py:2297 +#: ../flask_admin/model/base.py:2180 ../flask_admin/model/base.py:2232 +#: ../flask_admin/model/base.py:2265 ../flask_admin/model/base.py:2455 msgid "Record does not exist." msgstr "Kaydı yok." -#: ../flask_admin/model/base.py:2037 ../flask_admin/model/base.py:2301 +#: ../flask_admin/model/base.py:2189 ../flask_admin/model/base.py:2459 msgid "Record was successfully saved." msgstr "Kaydı başarıyla kaydedildi." -#: ../flask_admin/model/base.py:2222 -msgid "Tablib dependency not installed." -msgstr "Tablib bağımlılığı yüklü değil." - -#: ../flask_admin/model/base.py:2249 +#: ../flask_admin/model/base.py:2407 #, python-format msgid "Export type \"%(type)s not supported." msgstr "%(type)s türünde dışa aktarım desteklenmiyor." -#: ../flask_admin/model/filters.py:103 ../flask_admin/model/widgets.py:111 +#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:119 msgid "Yes" msgstr "Evet" -#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:110 +#: ../flask_admin/model/filters.py:105 ../flask_admin/model/widgets.py:118 msgid "No" msgstr "Hayır" -#: ../flask_admin/model/filters.py:172 ../flask_admin/model/filters.py:212 -#: ../flask_admin/model/filters.py:257 +#: ../flask_admin/model/filters.py:173 ../flask_admin/model/filters.py:213 +#: ../flask_admin/model/filters.py:258 msgid "between" msgstr "arasında" -#: ../flask_admin/model/template.py:81 ../flask_admin/model/template.py:88 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:37 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:8 +#: ../flask_admin/model/template.py:83 ../flask_admin/model/template.py:90 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:7 msgid "View Record" msgstr "Görünüm kaydı" -#: ../flask_admin/model/template.py:95 ../flask_admin/model/template.py:102 -#: ../flask_admin/model/template.py:109 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/edit.html:11 +#: ../flask_admin/model/template.py:97 ../flask_admin/model/template.py:104 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/edit.html:10 msgid "Edit Record" msgstr "Kaydı Düzenleme" -#: ../flask_admin/model/widgets.py:61 +#: ../flask_admin/model/template.py:111 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Delete Record" +msgstr "" + +#: ../flask_admin/model/widgets.py:62 msgid "Please select model" msgstr "Lütfen modelini seçin" -#: ../flask_admin/templates/bootstrap2/admin/actions.html:4 -#: ../flask_admin/templates/bootstrap3/admin/actions.html:4 +#: ../flask_admin/templates/bootstrap4/admin/actions.html:5 msgid "With selected" msgstr "İle işaretli" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:200 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:190 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:216 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:227 msgid "Save" msgstr "Kaydet" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:205 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:195 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:221 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:232 msgid "Cancel" msgstr "İptal" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:256 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:247 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:290 msgid "Save and Add Another" msgstr "Kaydet ve Başka bir tane daha ekle" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:259 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:250 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:293 msgid "Save and Continue Editing" msgstr "Kaydet ve düzenlemeye devam et" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:9 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:9 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:10 msgid "Root" msgstr "Kök" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:90 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:99 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:89 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:98 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:42 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:51 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:89 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:98 #, python-format msgid "Sort by %(name)s" msgstr "%(name)s göre sırala" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:77 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:79 msgid "Rename File" msgstr "Dosyayı Yeniden Adlandırma" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:88 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:88 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:90 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\' recursively?" msgstr "\\'%(name)s\\' silmek istedi─ƒinizden emin misiniz özyinelemeli olarak?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:97 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:97 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:99 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\'?" msgstr "\\'%(name)s\\' silmek istedi─ƒinizden emin misiniz?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:125 -msgid "Size" -msgstr "Boyut" - -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:185 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:187 msgid "Please select at least one file." msgstr "Lütfen en az bir dosya seçin." -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:8 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:17 msgid "List" msgstr "Liste" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:12 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:18 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 msgid "Create" msgstr "Oluştur" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:26 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:26 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:21 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:26 msgid "Details" msgstr "Detaylar" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:29 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:28 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:15 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:28 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:15 msgid "Filter" msgstr "Filtre" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:13 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:14 msgid "Delete?" msgstr "Sil?" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:33 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:16 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:35 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Are you sure you want to delete this record?" +msgstr "Bu kaydı silmek istediğinizden emin misiniz?" + +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:33 msgid "New" msgstr "Yeni" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:43 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:43 msgid "Add" msgstr "Ekle" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:3 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:3 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:2 msgid "Add Filter" msgstr "Filtre Ekle" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:30 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:19 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:26 msgid "Export" msgstr "Dışa Aktar" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:38 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:38 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:49 msgid "Apply" msgstr "Uygula" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:40 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:51 msgid "Reset Filters" msgstr "Filtreleri Sıfırla" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:66 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:64 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:80 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:93 +#, python-format +msgid "%(placeholder)s" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:88 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:94 msgid "Search" msgstr "Arama" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:74 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:77 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:78 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:79 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:72 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:75 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:76 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:77 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:102 msgid "items" msgstr "Öğeler" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/create.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/create.html:10 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/create.html:10 msgid "Create New Record" msgstr "Yeni Kayıt Oluştur" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:76 msgid "Select all records" msgstr "Tüm kayıtları seçme" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:120 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:119 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:119 msgid "Select record" msgstr "Çek'i seçin" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:186 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:195 msgid "Please select at least one record." msgstr "Lütfen en az bir kayıt seçin." -#: ../flask_admin/templates/bootstrap2/admin/model/row_actions.html:34 -#: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 -msgid "Are you sure you want to delete this record?" -msgstr "Bu kaydı silmek istediğinizden emin misiniz?" +#~ msgid "ObjectId equals" +#~ msgstr "ObjectId eşittir" + +#~ msgid "Failed to get model. %(error)s" +#~ msgstr "Model alma başarısız oldu. %(error)s" + +#~ msgid "Tablib dependency not installed." +#~ msgstr "Tablib bağımlılığı yüklü değil." + +#~ msgid "Size" +#~ msgstr "Boyut" + diff --git a/flask_admin/translations/uk/LC_MESSAGES/admin.mo b/flask_admin/translations/uk/LC_MESSAGES/admin.mo index 4c462f2d594b68795337b032617ebfdc0b6b9654..cebb78cbe37ec55d5070d01d8105b5477c58c993 100644 GIT binary patch delta 1890 zcmYM!e`u9e9LMqR-L7}e<*s*A)0x|Ix9MuvJMM;E+g!~#t<9fExRO8zT4GHwilARy z)~Y{*RqnAMDn*@;hB$msh!90Lx1g<ABPTVbq$rY5k$#Xw?@#wYm+ijJInQ~{kMH@O zd#>%RM>1E6!tWZNPX6!V|CL<T{{MUzF;mkdPQ&jpiq~-p-objz$umo0Bi7>6xClRV zevT`t|Bk$3jZ@8LnPsenLKO|0oL$)mb_D5bXHYK;;S3zb7+!VlH&OlmL<Tg=&(>#S z4b@UC!?n(x7^dEX1<Y@~6g2QYyc>^W9EVU7|ALix0~g>d!cdM&QT5HJ30`;YeON(# z2<PFiSc-WC+4mNr`nTbI%x^m=%taqd@E8{2u=5gXpr23+%DF4MgM8GH6{3d;)WB<y zKkMXcHok~O_>OBogvHeRF{85`prDWpJ4aCMUttb@gBsv6&cy4k9-5w=cqS?$_oD`W z95r#Ld)|#}srR8GaSN40u|nd{rYz2Ob#_VQnYEx6w87bqn)nG+q;{bqu^Y9pJ*fBk zP)B(JlXxBzcoTJ`^O@DdCR~IaQR1%!^w6Meejioej~eh3R3tt{CD~~t&ukFYe-yQl zaU>}AEvnzosBvz%_B%-WSU#&$doikiS%$*p5UX(w5w@cp7Nd5S<V&GkhMVy*Y{OHy z4i)d^upU=nFHYbkRK)uEs=+~g6mR2dY$e=^P-ZU$64cHiYp@Yi5?#TC_>XH}z$$d@ z(x}_eike_2uEf{yK^%5QxJr7y0(BcUp~ig`tMDUaBN-c{poyb%vODqcA?jPP0T1Fb zoWvzqN_f=X?%ad*)W5(7Fv1nm^Cr{=UcxjUKo2KSKTv;RneKmryLB%Ot5Fj_k2;$G z$s0S1Df|+(Q{A~1co?;#-KbC=bxxp1Ju*KV`YKe;w4=t|g35(XoW}h20tIDz7wUSv ziEPFWqpsB%)S3N&I^!BTX+h5+YqCCMPCJW-a1ynkE>@?|A4i4!Yg8`$jSOYg9`V<T zS}EuVHev#w!e;D6<;FPb%&(#*49BxO^iTsfqmpnJHei6&_#0~BbJ>L^d=fQJx2x|h zx9$J^V4R>q*XV+C1Qq&m)C<>~w^2zog>7-8tON_N8cBFdBl&8pkmI!u<f7Qi6+w00 zyl}9s;Ez!7%=Dp<za-k@{}}D}KbY}etZs2KRiCU|?A6sZr0Nr?T7P+Ld+wHv&Hj;C zPiU#1E_yaxo32R(M~f!&f`O8O+^J(9k9~IW?Tc^t2g-_rptK{`pHn^>#48#@{?^KP N`1IIG&+o2m`WOG!&mRB) delta 2133 zcmZY9eN5F=9LMp)lLRQ2hZ0DL-vtUuAkfB>$ONBYX|n8LR=NTAs>oBswPnjeYFk^7 zZ8yN#+A3MC#nQN76u}?nwACN|Zs~HSwVqsN;Xk$JR-^Z4_iX(UgZnz?dw;)kzUO<+ z;iXNdoBF>^iyb!n^zxU@-&l-#|NRul8>3JOCSo~yuomNRGgjjRSb~FCjvrw${$|a( z#h4BBH{v2ahqoEiZ-O)m3A|$sN4_vOk#~(JA@V{7rqI6wQ}G@fuSY%Chzw|&ZGRV* z((lGxe9bzGvGlKC67!oMXlUSh%)kZoVg}1qrqx)0Yw=F>V;;U}`|qJ9IB(;BU_Skf zB$CC|xC|e){ijgx4`VL#n`s(FcoDNOda*ILV>TvZrFA1}podV2^`chtG-~S(po7Oy z3C$qC<{Lhi;xCwn3pSp%g!-ow$fcn@UWFR4(pqcd^%zZj18RUq)ERgTZ^aH9A3%qG z5VgWd)c9Yc61Z-^k7iX{=;tR>f0d}0fChXSDS~+&wU^__JLWVhG1qzlHSr}>#crS~ zlE5HJFa`BqKI*-4)D~A@32wp_xX(lVwbySDaPSlBPgqPpj<=N1O4Mnuv;Fm`37S!r z+le}at;o4Gdr{B#p%UAVRNV}qo*S~?5BJm11h3i$-bT)!nY8ga8~+T?M^Q@KA7`0b z`G=?#f5nGNd=+=%KiGtiQ~&$%Eo{I)aXnU1zKhs@fQCx>F!e6Q4%~*v@IIVJm8^!* zIoM_ol7s0(9kRoC7mnHZ=cwy>84GY8HGVo*OZR^{uEFkz{brno9{3e?Z5B`i=VwO# zFRVkYqysha6lx`Bu?`a`Lk%|KT0Df6c*e&6wpMbbYKcFI)p!D{bpNl>s3DNY-O@^S zU<DpV2WL?K(JrGBOXjXE$5K=RkD&H;1UZN1IF{iAYQ;a|IxNbGyx)bY=#XT7Geg6{ zYp5+q<VxreRig%OK%I%Ls4duzI@Lbp*R=D&c{MK}i#114*KY!~g%?nJ?j?IAwhLK{ z8O45*Ga(ws(M4qza3WjrCKl2^i%M)B$<gF^BZ;j>ZAl}p!0lL%&!ZAOhdKjaq9*(c zm3TVYIhdJ8{WWkkfd<@z+KP9rSMhH8UJiy<vKf`YQPjkzZ2uf`u+7h?>vq$s*|jC{ zsOOhj3sGmTs-P-Tx-A5BUw2><wxI^>LA`hgIVR>6)O9;i5W2KzS!}{?f57SL@%cML z-z6@I_H1q4>u(D*`5b@mzLw6u(DlWiM#Z#0;}5={d?dG}wX?m|@%f+dcl-R^ZTp?> zo`BQd-4|%-?DYFegLR&Xxb}d*t1o!NGn!gnSyHyLq^!~@E2~kvA~>3|I~bKZ6g-mJ z8?&nP-cW4XmH6zr@WJqaJMDh#o(vy!ryUw|?xZ{A&V)yT;Y@Gn`>ZoD|I2GE=h>Lp zZAvWH`$f%zk<8o=+>`DMuby&e!z1D67<tffXWc0$JVJ!Nz7G#F!33>Ycdj(_yLU~L NO}Z#QFW8)4_b-2(CU^h< diff --git a/flask_admin/translations/uk/LC_MESSAGES/admin.po b/flask_admin/translations/uk/LC_MESSAGES/admin.po index 948ce3802..8bbb917dc 100644 --- a/flask_admin/translations/uk/LC_MESSAGES/admin.po +++ b/flask_admin/translations/uk/LC_MESSAGES/admin.po @@ -1,275 +1,265 @@ + msgid "" msgstr "" -"Project-Id-Version: flask-admin\n" +"Project-Id-Version: flask-admin\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-02-07 00:17-0600\n" +"POT-Creation-Date: 2024-09-24 22:09+0100\n" "PO-Revision-Date: 2017-02-07 01:19-0500\n" "Last-Translator: mrjoes <serge.koval@gmail.com>\n" +"Language: uk_UA\n" "Language-Team: Ukrainian\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.1.1\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: flask-admin\n" -"X-Crowdin-Language: uk\n" -"X-Crowdin-File: admin.pot\n" -"Language: uk_UA\n" +"Generated-By: Babel 2.16.0\n" -#: ../flask_admin/base.py:440 +#: ../flask_admin/base.py:458 msgid "Home" msgstr "Головна" -#: ../flask_admin/contrib/rediscli.py:127 +#: ../flask_admin/contrib/rediscli.py:113 msgid "Cli: Invalid command." msgstr "CLI: Неприпустима команда." -#: ../flask_admin/contrib/fileadmin/__init__.py:352 +#: ../flask_admin/contrib/fileadmin/__init__.py:376 msgid "File to upload" msgstr "Файл для завантаження" -#: ../flask_admin/contrib/fileadmin/__init__.py:360 +#: ../flask_admin/contrib/fileadmin/__init__.py:384 msgid "File required." msgstr "Файл, необхідний." -#: ../flask_admin/contrib/fileadmin/__init__.py:365 +#: ../flask_admin/contrib/fileadmin/__init__.py:389 msgid "Invalid file type." msgstr "Тип файлу неприпустимий." -#: ../flask_admin/contrib/fileadmin/__init__.py:376 +#: ../flask_admin/contrib/fileadmin/__init__.py:400 msgid "Content" msgstr "Зміст" -#: ../flask_admin/contrib/fileadmin/__init__.py:390 +#: ../flask_admin/contrib/fileadmin/__init__.py:414 msgid "Invalid name" msgstr "Неприпустиме ім'я" -#: ../flask_admin/contrib/fileadmin/__init__.py:398 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:106 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:112 -#: ../flask_admin/tests/sqla/test_translation.py:17 +#: ../flask_admin/contrib/fileadmin/__init__.py:422 +#: ../flask_admin/tests/sqla/test_translation.py:21 msgid "Name" msgstr "Ім’я" -#: ../flask_admin/contrib/fileadmin/__init__.py:757 +#: ../flask_admin/contrib/fileadmin/__init__.py:784 #, python-format msgid "File \"%(name)s\" already exists." msgstr "Файл \"%(name)s\" вже існує." -#: ../flask_admin/contrib/fileadmin/__init__.py:802 -#: ../flask_admin/contrib/fileadmin/__init__.py:885 -#: ../flask_admin/contrib/fileadmin/__init__.py:947 -#: ../flask_admin/contrib/fileadmin/__init__.py:1000 -#: ../flask_admin/contrib/fileadmin/__init__.py:1047 -#: ../flask_admin/contrib/fileadmin/__init__.py:1099 -#: ../flask_admin/model/base.py:2168 +#: ../flask_admin/contrib/fileadmin/__init__.py:829 +#: ../flask_admin/contrib/fileadmin/__init__.py:926 +#: ../flask_admin/contrib/fileadmin/__init__.py:988 +#: ../flask_admin/contrib/fileadmin/__init__.py:1041 +#: ../flask_admin/contrib/fileadmin/__init__.py:1088 +#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/model/base.py:2324 msgid "Permission denied." msgstr "Доступ заборонено." -#: ../flask_admin/contrib/fileadmin/__init__.py:881 +#: ../flask_admin/contrib/fileadmin/__init__.py:922 msgid "File uploading is disabled." msgstr "Завантаження файлу буде вимкнуто." -#: ../flask_admin/contrib/fileadmin/__init__.py:892 +#: ../flask_admin/contrib/fileadmin/__init__.py:933 #, python-format msgid "Successfully saved file: %(name)s" msgstr "Успішно збереженого файлу: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:896 +#: ../flask_admin/contrib/fileadmin/__init__.py:937 #, python-format msgid "Failed to save file: %(error)s" msgstr "Не вдалося зберегти файл: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:904 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:150 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:150 +#: ../flask_admin/contrib/fileadmin/__init__.py:945 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:150 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:152 msgid "Upload File" msgstr "Завантажте файл" -#: ../flask_admin/contrib/fileadmin/__init__.py:943 +#: ../flask_admin/contrib/fileadmin/__init__.py:984 msgid "Directory creation is disabled." msgstr "Створення каталогів вимикається." -#: ../flask_admin/contrib/fileadmin/__init__.py:956 +#: ../flask_admin/contrib/fileadmin/__init__.py:997 #, python-format msgid "Successfully created directory: %(directory)s" msgstr "Успішно витягтий: %(directory)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:960 +#: ../flask_admin/contrib/fileadmin/__init__.py:1001 #, python-format msgid "Failed to create directory: %(error)s" msgstr "Не вдалося створити каталог: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:970 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:161 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:161 +#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:161 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:163 msgid "Create Directory" msgstr "Створіть каталог" -#: ../flask_admin/contrib/fileadmin/__init__.py:996 +#: ../flask_admin/contrib/fileadmin/__init__.py:1037 msgid "Deletion is disabled." msgstr "Видалення вимкнуто." -#: ../flask_admin/contrib/fileadmin/__init__.py:1005 +#: ../flask_admin/contrib/fileadmin/__init__.py:1046 msgid "Directory deletion is disabled." msgstr "Видалення каталогів вимикається." -#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/contrib/fileadmin/__init__.py:1052 #, python-format msgid "Directory \"%(path)s\" was successfully deleted." msgstr "Довідник \"%(path)s\" було успішно вилучено." -#: ../flask_admin/contrib/fileadmin/__init__.py:1013 +#: ../flask_admin/contrib/fileadmin/__init__.py:1054 #, python-format msgid "Failed to delete directory: %(error)s" msgstr "Не вдалося видалити каталогу: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1019 -#: ../flask_admin/contrib/fileadmin/__init__.py:1176 +#: ../flask_admin/contrib/fileadmin/__init__.py:1060 +#: ../flask_admin/contrib/fileadmin/__init__.py:1215 #, python-format msgid "File \"%(name)s\" was successfully deleted." msgstr "Файл «%(name)s» успішно видалено." -#: ../flask_admin/contrib/fileadmin/__init__.py:1021 -#: ../flask_admin/contrib/fileadmin/__init__.py:1178 +#: ../flask_admin/contrib/fileadmin/__init__.py:1062 +#: ../flask_admin/contrib/fileadmin/__init__.py:1217 #, python-format msgid "Failed to delete file: %(name)s" msgstr "Не вдалося видалити файл: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1043 +#: ../flask_admin/contrib/fileadmin/__init__.py:1084 msgid "Renaming is disabled." msgstr "Перейменування вимкнуто." -#: ../flask_admin/contrib/fileadmin/__init__.py:1051 +#: ../flask_admin/contrib/fileadmin/__init__.py:1092 msgid "Path does not exist." msgstr "Шлях не існує." -#: ../flask_admin/contrib/fileadmin/__init__.py:1061 +#: ../flask_admin/contrib/fileadmin/__init__.py:1102 #, python-format msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\"" msgstr "Успішно перейменовано \"%(src)s\" до \"%(dst)s\"" -#: ../flask_admin/contrib/fileadmin/__init__.py:1064 +#: ../flask_admin/contrib/fileadmin/__init__.py:1105 #, python-format msgid "Failed to rename: %(error)s" msgstr "Не вдалося перейменувати: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1078 +#: ../flask_admin/contrib/fileadmin/__init__.py:1119 #, python-format msgid "Rename %(name)s" msgstr "Перейменувати %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1115 +#: ../flask_admin/contrib/fileadmin/__init__.py:1155 #, python-format msgid "Error saving changes to %(name)s." msgstr "Помилка під час збереження змін до %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1119 +#: ../flask_admin/contrib/fileadmin/__init__.py:1159 #, python-format msgid "Changes to %(name)s saved successfully." msgstr "Зміни, внесені до %(name)s успішно збережено." -#: ../flask_admin/contrib/fileadmin/__init__.py:1128 +#: ../flask_admin/contrib/fileadmin/__init__.py:1167 #, python-format msgid "Error reading %(name)s." msgstr "%(name)s помилка читання." -#: ../flask_admin/contrib/fileadmin/__init__.py:1131 -#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/contrib/fileadmin/__init__.py:1170 +#: ../flask_admin/contrib/fileadmin/__init__.py:1179 #, python-format msgid "Unexpected error while reading from %(name)s" msgstr "Неочікувана помилка під час читання %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1137 +#: ../flask_admin/contrib/fileadmin/__init__.py:1176 #, python-format msgid "Cannot edit %(name)s." msgstr "Не можна редагувати %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1155 +#: ../flask_admin/contrib/fileadmin/__init__.py:1194 #, python-format msgid "Editing %(path)s" msgstr "Редагування %(path)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/peewee/view.py:487 -#: ../flask_admin/contrib/pymongo/view.py:384 -#: ../flask_admin/contrib/sqla/view.py:1149 +#: ../flask_admin/contrib/fileadmin/__init__.py:1202 +#: ../flask_admin/contrib/peewee/view.py:510 +#: ../flask_admin/contrib/pymongo/view.py:385 +#: ../flask_admin/contrib/sqla/view.py:1241 msgid "Delete" msgstr "Видалити" -#: ../flask_admin/contrib/fileadmin/__init__.py:1164 +#: ../flask_admin/contrib/fileadmin/__init__.py:1203 msgid "Are you sure you want to delete these files?" msgstr "Ви дійсно бажаєте видалити ці файли?" -#: ../flask_admin/contrib/fileadmin/__init__.py:1167 +#: ../flask_admin/contrib/fileadmin/__init__.py:1206 msgid "File deletion is disabled." msgstr "Видалення файлів вимкнуто." -#: ../flask_admin/contrib/fileadmin/__init__.py:1180 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:22 +#: ../flask_admin/contrib/fileadmin/__init__.py:1219 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:22 msgid "Edit" msgstr "Редагувати" -#: ../flask_admin/contrib/fileadmin/s3.py:153 +#: ../flask_admin/contrib/fileadmin/s3.py:162 msgid "Cannot operate on non empty directories" msgstr "Не можу працювати с непорожніми директоріями" #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 -#: ../flask_admin/contrib/sqla/filters.py:41 +#: ../flask_admin/contrib/sqla/filters.py:42 msgid "equals" msgstr "дорівнює" #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 -#: ../flask_admin/contrib/sqla/filters.py:49 +#: ../flask_admin/contrib/sqla/filters.py:50 msgid "not equal" msgstr "не дорівнює" #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 -#: ../flask_admin/contrib/sqla/filters.py:58 +#: ../flask_admin/contrib/sqla/filters.py:59 msgid "contains" msgstr "містить" #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 -#: ../flask_admin/contrib/sqla/filters.py:67 +#: ../flask_admin/contrib/sqla/filters.py:68 msgid "not contains" msgstr "не містить" #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 -#: ../flask_admin/contrib/sqla/filters.py:75 +#: ../flask_admin/contrib/sqla/filters.py:76 msgid "greater than" msgstr "більше, ніж" #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 -#: ../flask_admin/contrib/sqla/filters.py:83 +#: ../flask_admin/contrib/sqla/filters.py:84 msgid "smaller than" msgstr "менше, ніж" #: ../flask_admin/contrib/peewee/filters.py:88 -#: ../flask_admin/contrib/sqla/filters.py:94 +#: ../flask_admin/contrib/sqla/filters.py:95 msgid "empty" msgstr "порожній" #: ../flask_admin/contrib/peewee/filters.py:102 -#: ../flask_admin/contrib/sqla/filters.py:108 +#: ../flask_admin/contrib/sqla/filters.py:109 msgid "in list" msgstr "у списку" #: ../flask_admin/contrib/peewee/filters.py:111 -#: ../flask_admin/contrib/sqla/filters.py:118 +#: ../flask_admin/contrib/sqla/filters.py:119 msgid "not in list" msgstr "немає у списку" @@ -282,44 +272,37 @@ msgstr "немає у списку" msgid "not between" msgstr "не між" -msgid "ObjectId equals" -msgstr "" - -#, python-format -msgid "Failed to get model. %(error)s" -msgstr "Не вдалося отримати моделі. %(error)s" - -#: ../flask_admin/contrib/peewee/view.py:435 -#: ../flask_admin/contrib/pymongo/view.py:316 -#: ../flask_admin/contrib/sqla/view.py:1078 +#: ../flask_admin/contrib/peewee/view.py:458 +#: ../flask_admin/contrib/pymongo/view.py:317 +#: ../flask_admin/contrib/sqla/view.py:1170 #, python-format msgid "Failed to create record. %(error)s" msgstr "Не вдалося створити запис. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:454 -#: ../flask_admin/contrib/pymongo/view.py:341 -#: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 -#: ../flask_admin/model/base.py:2313 ../flask_admin/model/base.py:2315 +#: ../flask_admin/contrib/peewee/view.py:477 +#: ../flask_admin/contrib/pymongo/view.py:342 +#: ../flask_admin/contrib/sqla/view.py:1196 ../flask_admin/model/base.py:2463 +#: ../flask_admin/model/base.py:2471 ../flask_admin/model/base.py:2473 #, python-format msgid "Failed to update record. %(error)s" msgstr "Не вдалося створити запис. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:469 -#: ../flask_admin/contrib/pymongo/view.py:366 -#: ../flask_admin/contrib/sqla/view.py:1129 +#: ../flask_admin/contrib/peewee/view.py:492 +#: ../flask_admin/contrib/pymongo/view.py:367 +#: ../flask_admin/contrib/sqla/view.py:1221 #, python-format msgid "Failed to delete record. %(error)s" msgstr "Не вдалося видалити запис. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:488 -#: ../flask_admin/contrib/pymongo/view.py:385 -#: ../flask_admin/contrib/sqla/view.py:1150 +#: ../flask_admin/contrib/peewee/view.py:511 +#: ../flask_admin/contrib/pymongo/view.py:386 +#: ../flask_admin/contrib/sqla/view.py:1242 msgid "Are you sure you want to delete selected records?" msgstr "Ви дійсно бажаєте видалити вибрані записи?" -#: ../flask_admin/contrib/peewee/view.py:505 -#: ../flask_admin/contrib/pymongo/view.py:395 -#: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 +#: ../flask_admin/contrib/peewee/view.py:528 +#: ../flask_admin/contrib/pymongo/view.py:396 +#: ../flask_admin/contrib/sqla/view.py:1258 ../flask_admin/model/base.py:2272 #, python-format msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." @@ -327,33 +310,33 @@ msgstr[0] "Запис успішно вилучено." msgstr[1] "%(count)s records були успішно вилучено." msgstr[2] "%(count)s records були успішно вилучено." -#: ../flask_admin/contrib/peewee/view.py:511 -#: ../flask_admin/contrib/pymongo/view.py:400 -#: ../flask_admin/contrib/sqla/view.py:1174 +#: ../flask_admin/contrib/peewee/view.py:534 +#: ../flask_admin/contrib/pymongo/view.py:401 +#: ../flask_admin/contrib/sqla/view.py:1266 #, python-format msgid "Failed to delete records. %(error)s" msgstr "Не вдалося видалити запис. %(error)s" -#: ../flask_admin/contrib/sqla/fields.py:126 -#: ../flask_admin/contrib/sqla/fields.py:176 -#: ../flask_admin/contrib/sqla/fields.py:181 ../flask_admin/model/fields.py:173 -#: ../flask_admin/model/fields.py:222 +#: ../flask_admin/contrib/sqla/fields.py:117 +#: ../flask_admin/contrib/sqla/fields.py:167 +#: ../flask_admin/contrib/sqla/fields.py:172 ../flask_admin/model/fields.py:174 +#: ../flask_admin/model/fields.py:223 msgid "Not a valid choice" msgstr "Не дійсний вибір" -#: ../flask_admin/contrib/sqla/fields.py:186 +#: ../flask_admin/contrib/sqla/fields.py:201 msgid "Key" msgstr "Ключ" -#: ../flask_admin/contrib/sqla/fields.py:187 +#: ../flask_admin/contrib/sqla/fields.py:202 msgid "Value" msgstr "Значення" -#: ../flask_admin/contrib/sqla/validators.py:42 +#: ../flask_admin/contrib/sqla/validators.py:28 msgid "Already exists." msgstr "Уже існує." -#: ../flask_admin/contrib/sqla/validators.py:60 +#: ../flask_admin/contrib/sqla/validators.py:59 #, python-format msgid "At least %(num)d item is required" msgid_plural "At least %(num)d items are required" @@ -361,7 +344,15 @@ msgstr[0] "Принаймні %(num)d елемент є обов'язковим" msgstr[1] "Принаймні %(num)d елемента є обов'язковими" msgstr[2] "Принаймні %(num)d елементів є обов'язковими" -#: ../flask_admin/contrib/sqla/view.py:1057 +#: ../flask_admin/contrib/sqla/validators.py:75 +msgid "Not a valid ISO currency code (e.g. USD, EUR, CNY)." +msgstr "" + +#: ../flask_admin/contrib/sqla/validators.py:83 +msgid "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." +msgstr "" + +#: ../flask_admin/contrib/sqla/view.py:1134 #, python-format msgid "Integrity error. %(message)s" msgstr "Цілісність помилка. %(message)s" @@ -370,274 +361,242 @@ msgstr "Цілісність помилка. %(message)s" msgid "Invalid time format" msgstr "Неприпустимий час формат" -#: ../flask_admin/form/fields.py:144 +#: ../flask_admin/form/fields.py:147 msgid "Invalid Choice: could not coerce" msgstr "Неправильний вибір: не вдалося звести" -#: ../flask_admin/form/fields.py:208 +#: ../flask_admin/form/fields.py:221 msgid "Invalid JSON" msgstr "Неприпустимий JSON" -#: ../flask_admin/form/upload.py:207 +#: ../flask_admin/form/upload.py:216 msgid "Invalid file extension" msgstr "Неприпустиме розширення" -#: ../flask_admin/form/upload.py:214 ../flask_admin/form/upload.py:281 +#: ../flask_admin/form/upload.py:223 ../flask_admin/form/upload.py:293 #, python-format msgid "File \"%s\" already exists." msgstr "Файл \"%s\" вже існує." -#: ../flask_admin/model/base.py:1649 +#: ../flask_admin/form/validators.py:16 +msgid "This field requires at least one item." +msgstr "" + +#: ../flask_admin/model/base.py:1737 msgid "There are no items in the table." msgstr "Нема записів у таблиці." -#: ../flask_admin/model/base.py:1673 +#: ../flask_admin/model/base.py:1746 #, python-format msgid "Invalid Filter Value: %(value)s" msgstr "Неприпустиме значення фільтру: %(value)s" -#: ../flask_admin/model/base.py:1984 +#: ../flask_admin/model/base.py:2136 msgid "Record was successfully created." msgstr "Запис створено." -#: ../flask_admin/model/base.py:2028 ../flask_admin/model/base.py:2080 -#: ../flask_admin/model/base.py:2113 ../flask_admin/model/base.py:2297 +#: ../flask_admin/model/base.py:2180 ../flask_admin/model/base.py:2232 +#: ../flask_admin/model/base.py:2265 ../flask_admin/model/base.py:2455 msgid "Record does not exist." msgstr "Запис не існує." -#: ../flask_admin/model/base.py:2037 ../flask_admin/model/base.py:2301 +#: ../flask_admin/model/base.py:2189 ../flask_admin/model/base.py:2459 msgid "Record was successfully saved." msgstr "Запис успішно збережено." -#: ../flask_admin/model/base.py:2222 -msgid "Tablib dependency not installed." -msgstr "Tablib залежність не інстальовано." - -#: ../flask_admin/model/base.py:2249 +#: ../flask_admin/model/base.py:2407 #, python-format msgid "Export type \"%(type)s not supported." msgstr "Експорт \"%(type)s типу не підтримується." -#: ../flask_admin/model/filters.py:103 ../flask_admin/model/widgets.py:111 +#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:119 msgid "Yes" msgstr "Так" -#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:110 +#: ../flask_admin/model/filters.py:105 ../flask_admin/model/widgets.py:118 msgid "No" msgstr "Ні" -#: ../flask_admin/model/filters.py:172 ../flask_admin/model/filters.py:212 -#: ../flask_admin/model/filters.py:257 +#: ../flask_admin/model/filters.py:173 ../flask_admin/model/filters.py:213 +#: ../flask_admin/model/filters.py:258 msgid "between" msgstr "між" -#: ../flask_admin/model/template.py:81 ../flask_admin/model/template.py:88 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:37 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:8 +#: ../flask_admin/model/template.py:83 ../flask_admin/model/template.py:90 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:7 msgid "View Record" msgstr "Перегляд запису" -#: ../flask_admin/model/template.py:95 ../flask_admin/model/template.py:102 -#: ../flask_admin/model/template.py:109 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/edit.html:11 +#: ../flask_admin/model/template.py:97 ../flask_admin/model/template.py:104 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/edit.html:10 msgid "Edit Record" msgstr "Редагування запису" -#: ../flask_admin/model/widgets.py:61 +#: ../flask_admin/model/template.py:111 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Delete Record" +msgstr "" + +#: ../flask_admin/model/widgets.py:62 msgid "Please select model" msgstr "Будь ласка, оберіть модель" -#: ../flask_admin/templates/bootstrap2/admin/actions.html:4 -#: ../flask_admin/templates/bootstrap3/admin/actions.html:4 +#: ../flask_admin/templates/bootstrap4/admin/actions.html:5 msgid "With selected" msgstr "З вибраних" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:200 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:190 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:216 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:227 msgid "Save" msgstr "Зберегти" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:205 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:195 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:221 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:232 msgid "Cancel" msgstr "\"Скасувати\"" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:256 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:247 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:290 msgid "Save and Add Another" msgstr "Зберегти й додати інший" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:259 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:250 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:293 msgid "Save and Continue Editing" msgstr "Зберегти та продовжити редагування" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:9 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:9 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:10 msgid "Root" msgstr "Корінь" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:90 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:99 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:89 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:98 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:42 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:51 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:89 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:98 #, python-format msgid "Sort by %(name)s" msgstr "Сортувати за %(name)s" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:77 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:79 msgid "Rename File" msgstr "Перейменування файлу" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:88 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:88 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:90 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\' recursively?" msgstr "Ви впевнені, що бажаєте видалити \\'%(name)s\\' рекурсивно?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:97 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:97 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:99 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\'?" msgstr "Ви впевнені, що бажаєте видалити \\'%(name)s\\'?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:125 -msgid "Size" -msgstr "" - -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:185 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:187 msgid "Please select at least one file." msgstr "Будь ласка, виберіть принаймні один файл." -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:8 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:17 msgid "List" msgstr "Список" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:12 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:18 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 msgid "Create" msgstr "Створити" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:26 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:26 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:21 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:26 msgid "Details" msgstr "Детальніше" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:29 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:28 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:15 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:28 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:15 msgid "Filter" msgstr "Фільтр" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:13 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:14 msgid "Delete?" msgstr "Видалити?" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:33 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:16 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:35 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Are you sure you want to delete this record?" +msgstr "Ви дійсно бажаєте видалити цей запис?" + +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:33 msgid "New" msgstr "Новий" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:43 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:43 msgid "Add" msgstr "Додати" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:3 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:3 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:2 msgid "Add Filter" msgstr "Додати фільтр" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:30 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:19 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:26 msgid "Export" msgstr "Зберегти" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:38 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:38 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:49 msgid "Apply" msgstr "Застосувати" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:40 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:51 msgid "Reset Filters" msgstr "Скинути фільтри" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:66 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:64 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:80 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:93 +#, python-format +msgid "%(placeholder)s" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:88 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:94 msgid "Search" msgstr "Пошук" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:74 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:77 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:78 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:79 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:72 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:75 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:76 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:77 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:102 msgid "items" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/create.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/create.html:10 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/create.html:10 msgid "Create New Record" msgstr "Створіть новий запис" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:76 msgid "Select all records" msgstr "Виберіть усі записи" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:120 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:119 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:119 msgid "Select record" msgstr "Виберіть запис" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:186 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:195 msgid "Please select at least one record." msgstr "Будь ласка, оберіть хоча б один запис." -#: ../flask_admin/templates/bootstrap2/admin/model/row_actions.html:34 -#: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 -msgid "Are you sure you want to delete this record?" -msgstr "Ви дійсно бажаєте видалити цей запис?" +#~ msgid "ObjectId equals" +#~ msgstr "" + +#~ msgid "Failed to get model. %(error)s" +#~ msgstr "Не вдалося отримати моделі. %(error)s" + +#~ msgid "Tablib dependency not installed." +#~ msgstr "Tablib залежність не інстальовано." + +#~ msgid "Size" +#~ msgstr "" + diff --git a/flask_admin/translations/vi/LC_MESSAGES/admin.mo b/flask_admin/translations/vi/LC_MESSAGES/admin.mo index 35a361527354886b244b7c95b2db9c055d196269..c341a9bfafc968d0497316cc6b72b475a69c3c4a 100644 GIT binary patch delta 1848 zcmYM!Z%oxy9LMo5-kTWo3oZf*Uh%3J23)vY6uOu=Sr*2`Y>PEVp(P_SL`xs|q+jJG za}(w~<(z*;I&-_G8+OZFwN*agNp4PSY&OR#vetOe10J>Up!a8;Ee7{>&bhyH&i8!J z_s8*#Uu44RlITaq&l~*3`Rk3S_y5nig=QK$j|F%Ei|{Hwg5O{UZ($PWu?cJQ&FZn& zdknYGzkxhr^H^pUT4a$~4FeV4&Bzxvh&*E<YQhK>;~2(p+>c*JJ$Dl|?>pb0!Up=& zxB`Pm|1*hE`rELO{q02>TKH95g2T8HM^GDQaScx3DxC8De^3jrAT1i-gsbs2T!u%n z3NQNazehd)J3figLJrOT)<B~YJMnRR-TO9bq4!aNoJU1|33XLjOyDGH;Xm;)%;%#V zOR)s&P~+`<EXFR>I(-<bv4@84cn}xh5NhInEX5<fe;O0?KSiDRHfp24{rJLww9>CZ zo%|50Rz5^xvrDKenm~SSG9dp7;3s<WK5D~htiU<c$pg}&fJ%`et3h4adQ9T8SceBu zSNAa{@D|qN3@U(PqLFdbI%|u_zfRu5fQqOMsTb=&Rd*LEfE~yo?Pb(+{iub8{P<y{ z9PFqcKjFvE;juif3bkG{m8-xrs3Lwo<db@^UTnhwOyNb`gg^T6#T@@B`rW7#j-cjc zu^K<e4R{~*I+k(Kx`OSf=k}ojIE)G)L}fZWK|`tk#6NHaRg4p;i9cWqPNAwcV3yv7 zR#XaKLA^D5QMGWydj@OiUq@x`0j|ZrPyv@v2sP|)tu$1<ecsSJj(VNG#V2qEHL-wQ z)NjP~*n<f?j{5!@F2#GOb!Sn56cVK}(1N<Ur?Fb^e<uy4ZV1zuMdsK8)WkW|LRGA) z@pe>Ey@blp2dE5=qBb~*s+rT+h~ub(+(FHsLuI0X3Qw}XHPg`hyc<c0y^GCw8I|&% zk*ryidm#x{fvSN<BsSZD+ISEZ$S^X+4x%<5^W&c(zxE{`)T7<QP!Ik_Ly^v72iEgn zM=2ggEpQ4|lwY9&nMK{HqNd&~zz8N#C$IL_A@yr%-+u;`u`W~*_QW}_ifF)paR}9a z581=U{P>l4t~S3s;`$4I$?Yk;ljmB4YPUCdD>oZFN2h4iJuKSkwiLhM&K94FrPn1> znPhrhBAsqaW$IE*t|K-O>Feos+1SRs4epQFfoM}pLn^nk<YvURme1t2F1fM5MJl(s pU6m&nb^iLbOT06A!3|fI<yJ52&vT>koZG$pO?P+sfNQVn{ukh!zvKV_ delta 2253 zcma*ndrXye9LMn=9Kk>Y<bHtUNp30^L5zzcX$zxi!MeGMIc|@F9&VjOf?J^_=@u>9 z6LXWbbz9{|<pw&9ax1JqvRq!e*>t1X=DOHw*4E}m?+^U8{-~|k;k=&T_j!J|@9+DZ zqgBIe2QMeg8!`O#@}J57Yd*F9{wthsj6y{ijinfe)fj=BunO<RA{@q2d>0GxC#(M^ zV`^z{z(_rZ$;J#CkBfW)hplJlZkRujz9ueeu0txu(_V~=aD|PpM?F`E3}_l`dn*>x z?!qj5(fU5lqkRb%Fu(bZ3k`e?Q*j1w!Bn=Zl~!R6uESh(aS1+S+i#;LxM1VgF`IVk z0v3yFFasa9?Z;64M=*=|&2cW4;n(QL@EBv#F%x64!ny%9&;zK2^`dstk2<=?(ZNHg z1x+F!^DSQ~coh?H#>NvClK(^kSzPFh%TNPWSgUP(J%$snMGa7gs)0u^33u4|ZggmS zs2xtA#{UYnfFJGsaCUV!?d(|cuN3tX(0~V!B$$^_XE}!SF(0B9_PO;7)WjE28T$p5 zkthby0^?ErvQhm?QAb>kMR+F`U|$^h*IB<zz`-f&6)dD3K`$+6C92wMZ2Jz>1P!Rn zZ9x@b3sSdcJL>r$YGDIN*3E9zbI;oQBZFLMf>Hax8%X_`2^&9Y<DcN(Fj9#cxRGsg zX<ATkLlCJuGlZ-00G8lsybW*Ics1uyNqZ-1<AX=IP{(tagO_j(hLc~t*EOgk>PJ0y z5Ve3;Pz!hy`Ir-YDb;6C_s^q>_#0He>sXF6sA4bYd~@~wH*uj<K8<?)UO*Mgm~{%5 z)4qsGVFWj|&;(qH6}H`k`Lu^n)&G|DGwaV-Onf1e==H3|JiY%-Txh_3vjHZ?TWOz1 z2cy#F?k`6^rk*cN(2iQze$<Y~QAc?KHQq<4O#Xl?F^@`R4dx+KzaE@@|3~eONmS9D zLlxBwDs?{csMN-yCQ3vVl^<82gVd{OK<%svHPK#FhDK3Ue+oHW^Bd~-B9b4IL8UC4 zi!$7ZI-5b{n9N}$>*ge?SS}z*F@K;I63ZxBSQ4^U<3}x^%*Hn(bD2ie0(aW@KGgHW zndDzPc%8uQ_$B6{|K_>WuR{&kjH>1#)WVLT7H}F>6K9bEH<wYF`xTX;->o-LZ;6je zRy-M%+04b2b5)#AKm%5yim}E%u*tSJBbzp^jqh1Jekd}<ms8u{)BR}32@UkP&XU}v za#_&n>JB-<z8>9j+lsw+qNby^xgn>syUh)Z?~49D%(u}U@V3O{#?`lMcUwbuwK;BY zUvnVnJsH!P*bs1=gRT>F1KhHmuEo@a`8syF-m2K=vYJ~09W73q+v9e%xm~RTv-5Ry z1w+k&fad!kw$axd==0L!?u+OMxt&2T5O>fkh>xCMvbwaQsHEIWir?lv5x>@ZFTU4T zR=jGwbkXtuxtFU+S5jK1#+_5oe|%(m^3_(Sb85nApBn3G_X?8z<DVuU3!mNGp0s=Z qvAHv8-oI|H$^X>c=BCq+I`{wA?nW|pL_Em$TyG|$-R^H|X8m7{1Ts$m diff --git a/flask_admin/translations/vi/LC_MESSAGES/admin.po b/flask_admin/translations/vi/LC_MESSAGES/admin.po index bc361494b..5a94e7771 100644 --- a/flask_admin/translations/vi/LC_MESSAGES/admin.po +++ b/flask_admin/translations/vi/LC_MESSAGES/admin.po @@ -1,275 +1,264 @@ + msgid "" msgstr "" -"Project-Id-Version: flask-admin\n" +"Project-Id-Version: flask-admin\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-02-07 00:17-0600\n" +"POT-Creation-Date: 2024-09-24 22:09+0100\n" "PO-Revision-Date: 2017-02-07 01:19-0500\n" "Last-Translator: mrjoes <serge.koval@gmail.com>\n" +"Language: vi_VN\n" "Language-Team: Vietnamese\n" +"Plural-Forms: nplurals=1; plural=0;\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.1.1\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: flask-admin\n" -"X-Crowdin-Language: vi\n" -"X-Crowdin-File: admin.pot\n" -"Language: vi_VN\n" +"Generated-By: Babel 2.16.0\n" -#: ../flask_admin/base.py:440 +#: ../flask_admin/base.py:458 msgid "Home" msgstr "Trang chủ" -#: ../flask_admin/contrib/rediscli.py:127 +#: ../flask_admin/contrib/rediscli.py:113 msgid "Cli: Invalid command." msgstr "CLI: Lệnh không hợp lệ." -#: ../flask_admin/contrib/fileadmin/__init__.py:352 +#: ../flask_admin/contrib/fileadmin/__init__.py:376 msgid "File to upload" msgstr "Các tập tin để tải lên" -#: ../flask_admin/contrib/fileadmin/__init__.py:360 +#: ../flask_admin/contrib/fileadmin/__init__.py:384 msgid "File required." msgstr "Tập tin cần thiết." -#: ../flask_admin/contrib/fileadmin/__init__.py:365 +#: ../flask_admin/contrib/fileadmin/__init__.py:389 msgid "Invalid file type." msgstr "Loại tệp không hợp lệ." -#: ../flask_admin/contrib/fileadmin/__init__.py:376 +#: ../flask_admin/contrib/fileadmin/__init__.py:400 msgid "Content" msgstr "Nội dung" -#: ../flask_admin/contrib/fileadmin/__init__.py:390 +#: ../flask_admin/contrib/fileadmin/__init__.py:414 msgid "Invalid name" msgstr "Tên không hợp lệ" -#: ../flask_admin/contrib/fileadmin/__init__.py:398 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:106 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:112 -#: ../flask_admin/tests/sqla/test_translation.py:17 +#: ../flask_admin/contrib/fileadmin/__init__.py:422 +#: ../flask_admin/tests/sqla/test_translation.py:21 msgid "Name" msgstr "Tên" -#: ../flask_admin/contrib/fileadmin/__init__.py:757 +#: ../flask_admin/contrib/fileadmin/__init__.py:784 #, python-format msgid "File \"%(name)s\" already exists." msgstr "Tập tin \"%(name)s\" đã tồn tại." -#: ../flask_admin/contrib/fileadmin/__init__.py:802 -#: ../flask_admin/contrib/fileadmin/__init__.py:885 -#: ../flask_admin/contrib/fileadmin/__init__.py:947 -#: ../flask_admin/contrib/fileadmin/__init__.py:1000 -#: ../flask_admin/contrib/fileadmin/__init__.py:1047 -#: ../flask_admin/contrib/fileadmin/__init__.py:1099 -#: ../flask_admin/model/base.py:2168 +#: ../flask_admin/contrib/fileadmin/__init__.py:829 +#: ../flask_admin/contrib/fileadmin/__init__.py:926 +#: ../flask_admin/contrib/fileadmin/__init__.py:988 +#: ../flask_admin/contrib/fileadmin/__init__.py:1041 +#: ../flask_admin/contrib/fileadmin/__init__.py:1088 +#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/model/base.py:2324 msgid "Permission denied." msgstr "Từ chối cho phép." -#: ../flask_admin/contrib/fileadmin/__init__.py:881 +#: ../flask_admin/contrib/fileadmin/__init__.py:922 msgid "File uploading is disabled." msgstr "Tập tin tải lên bị vô hiệu hóa." -#: ../flask_admin/contrib/fileadmin/__init__.py:892 +#: ../flask_admin/contrib/fileadmin/__init__.py:933 #, python-format msgid "Successfully saved file: %(name)s" msgstr "Tệp đã lưu thành công: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:896 +#: ../flask_admin/contrib/fileadmin/__init__.py:937 #, python-format msgid "Failed to save file: %(error)s" msgstr "Không thể lưu tập tin: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:904 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:150 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:150 +#: ../flask_admin/contrib/fileadmin/__init__.py:945 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:150 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:152 msgid "Upload File" msgstr "Tải lên tập tin" -#: ../flask_admin/contrib/fileadmin/__init__.py:943 +#: ../flask_admin/contrib/fileadmin/__init__.py:984 msgid "Directory creation is disabled." msgstr "Tạo ra thư mục bị vô hiệu hóa." -#: ../flask_admin/contrib/fileadmin/__init__.py:956 +#: ../flask_admin/contrib/fileadmin/__init__.py:997 #, python-format msgid "Successfully created directory: %(directory)s" msgstr "Thành công tạo ra thư mục: %(directory)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:960 +#: ../flask_admin/contrib/fileadmin/__init__.py:1001 #, python-format msgid "Failed to create directory: %(error)s" msgstr "Không thể tạo thư mục: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:970 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:161 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:161 +#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:161 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:163 msgid "Create Directory" msgstr "Tạo thư mục" -#: ../flask_admin/contrib/fileadmin/__init__.py:996 +#: ../flask_admin/contrib/fileadmin/__init__.py:1037 msgid "Deletion is disabled." msgstr "Xóa bị vô hiệu hóa." -#: ../flask_admin/contrib/fileadmin/__init__.py:1005 +#: ../flask_admin/contrib/fileadmin/__init__.py:1046 msgid "Directory deletion is disabled." msgstr "Xóa thư mục bị vô hiệu hóa." -#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/contrib/fileadmin/__init__.py:1052 #, python-format msgid "Directory \"%(path)s\" was successfully deleted." msgstr "Thư mục \"%(path)s\" đã được xóa thành công." -#: ../flask_admin/contrib/fileadmin/__init__.py:1013 +#: ../flask_admin/contrib/fileadmin/__init__.py:1054 #, python-format msgid "Failed to delete directory: %(error)s" msgstr "Không thể xoá thư mục: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1019 -#: ../flask_admin/contrib/fileadmin/__init__.py:1176 +#: ../flask_admin/contrib/fileadmin/__init__.py:1060 +#: ../flask_admin/contrib/fileadmin/__init__.py:1215 #, python-format msgid "File \"%(name)s\" was successfully deleted." msgstr "Tập tin \"%(name)s\" đã được xóa thành công." -#: ../flask_admin/contrib/fileadmin/__init__.py:1021 -#: ../flask_admin/contrib/fileadmin/__init__.py:1178 +#: ../flask_admin/contrib/fileadmin/__init__.py:1062 +#: ../flask_admin/contrib/fileadmin/__init__.py:1217 #, python-format msgid "Failed to delete file: %(name)s" msgstr "Không xóa tập tin: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1043 +#: ../flask_admin/contrib/fileadmin/__init__.py:1084 msgid "Renaming is disabled." msgstr "Đổi tên bị vô hiệu hóa." -#: ../flask_admin/contrib/fileadmin/__init__.py:1051 +#: ../flask_admin/contrib/fileadmin/__init__.py:1092 msgid "Path does not exist." msgstr "Đường dẫn không tồn tại." -#: ../flask_admin/contrib/fileadmin/__init__.py:1061 +#: ../flask_admin/contrib/fileadmin/__init__.py:1102 #, python-format msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\"" msgstr "Thành công được đổi tên thành \"%(src)s\" để \"%(dst)s\"" -#: ../flask_admin/contrib/fileadmin/__init__.py:1064 +#: ../flask_admin/contrib/fileadmin/__init__.py:1105 #, python-format msgid "Failed to rename: %(error)s" msgstr "Không thể đổi tên: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1078 +#: ../flask_admin/contrib/fileadmin/__init__.py:1119 #, python-format msgid "Rename %(name)s" msgstr "Đổi tên %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1115 +#: ../flask_admin/contrib/fileadmin/__init__.py:1155 #, python-format msgid "Error saving changes to %(name)s." msgstr "Lỗi khi lưu thay đổi để %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1119 +#: ../flask_admin/contrib/fileadmin/__init__.py:1159 #, python-format msgid "Changes to %(name)s saved successfully." msgstr "Thay đổi cho %(name)s đã được lưu thành công." -#: ../flask_admin/contrib/fileadmin/__init__.py:1128 +#: ../flask_admin/contrib/fileadmin/__init__.py:1167 #, python-format msgid "Error reading %(name)s." msgstr "Lỗi đọc %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1131 -#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/contrib/fileadmin/__init__.py:1170 +#: ../flask_admin/contrib/fileadmin/__init__.py:1179 #, python-format msgid "Unexpected error while reading from %(name)s" msgstr "Lỗi bất ngờ trong khi đọc từ %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1137 +#: ../flask_admin/contrib/fileadmin/__init__.py:1176 #, python-format msgid "Cannot edit %(name)s." msgstr "Không thể chỉnh sửa %(name)s." -#: ../flask_admin/contrib/fileadmin/__init__.py:1155 +#: ../flask_admin/contrib/fileadmin/__init__.py:1194 #, python-format msgid "Editing %(path)s" msgstr "Chỉnh sửa %(path)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/peewee/view.py:487 -#: ../flask_admin/contrib/pymongo/view.py:384 -#: ../flask_admin/contrib/sqla/view.py:1149 +#: ../flask_admin/contrib/fileadmin/__init__.py:1202 +#: ../flask_admin/contrib/peewee/view.py:510 +#: ../flask_admin/contrib/pymongo/view.py:385 +#: ../flask_admin/contrib/sqla/view.py:1241 msgid "Delete" msgstr "Xóa" -#: ../flask_admin/contrib/fileadmin/__init__.py:1164 +#: ../flask_admin/contrib/fileadmin/__init__.py:1203 msgid "Are you sure you want to delete these files?" msgstr "Bạn có chắc bạn muốn xóa các tệp này không?" -#: ../flask_admin/contrib/fileadmin/__init__.py:1167 +#: ../flask_admin/contrib/fileadmin/__init__.py:1206 msgid "File deletion is disabled." msgstr "Xóa tập tin bị vô hiệu hóa." -#: ../flask_admin/contrib/fileadmin/__init__.py:1180 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:22 +#: ../flask_admin/contrib/fileadmin/__init__.py:1219 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:22 msgid "Edit" msgstr "Chỉnh sửa" -#: ../flask_admin/contrib/fileadmin/s3.py:153 +#: ../flask_admin/contrib/fileadmin/s3.py:162 msgid "Cannot operate on non empty directories" msgstr "Không thể hoạt động trên thư mục không trống" #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 -#: ../flask_admin/contrib/sqla/filters.py:41 +#: ../flask_admin/contrib/sqla/filters.py:42 msgid "equals" msgstr "bằng" #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 -#: ../flask_admin/contrib/sqla/filters.py:49 +#: ../flask_admin/contrib/sqla/filters.py:50 msgid "not equal" msgstr "không bằng" #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 -#: ../flask_admin/contrib/sqla/filters.py:58 +#: ../flask_admin/contrib/sqla/filters.py:59 msgid "contains" msgstr "chứa" #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 -#: ../flask_admin/contrib/sqla/filters.py:67 +#: ../flask_admin/contrib/sqla/filters.py:68 msgid "not contains" msgstr "không có" #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 -#: ../flask_admin/contrib/sqla/filters.py:75 +#: ../flask_admin/contrib/sqla/filters.py:76 msgid "greater than" msgstr "lớn hơn" #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 -#: ../flask_admin/contrib/sqla/filters.py:83 +#: ../flask_admin/contrib/sqla/filters.py:84 msgid "smaller than" msgstr "nhỏ hơn" #: ../flask_admin/contrib/peewee/filters.py:88 -#: ../flask_admin/contrib/sqla/filters.py:94 +#: ../flask_admin/contrib/sqla/filters.py:95 msgid "empty" msgstr "sản phẩm nào" #: ../flask_admin/contrib/peewee/filters.py:102 -#: ../flask_admin/contrib/sqla/filters.py:108 +#: ../flask_admin/contrib/sqla/filters.py:109 msgid "in list" msgstr "trong danh sách" #: ../flask_admin/contrib/peewee/filters.py:111 -#: ../flask_admin/contrib/sqla/filters.py:118 +#: ../flask_admin/contrib/sqla/filters.py:119 msgid "not in list" msgstr "không có trong danh sách" @@ -282,82 +271,83 @@ msgstr "không có trong danh sách" msgid "not between" msgstr "không giữa" -msgid "ObjectId equals" -msgstr "" - -#, python-format -msgid "Failed to get model. %(error)s" -msgstr "Không thể có được mô hình. %(error)s" - -#: ../flask_admin/contrib/peewee/view.py:435 -#: ../flask_admin/contrib/pymongo/view.py:316 -#: ../flask_admin/contrib/sqla/view.py:1078 +#: ../flask_admin/contrib/peewee/view.py:458 +#: ../flask_admin/contrib/pymongo/view.py:317 +#: ../flask_admin/contrib/sqla/view.py:1170 #, python-format msgid "Failed to create record. %(error)s" msgstr "Hỏng khi tạo hồ sơ. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:454 -#: ../flask_admin/contrib/pymongo/view.py:341 -#: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 -#: ../flask_admin/model/base.py:2313 ../flask_admin/model/base.py:2315 +#: ../flask_admin/contrib/peewee/view.py:477 +#: ../flask_admin/contrib/pymongo/view.py:342 +#: ../flask_admin/contrib/sqla/view.py:1196 ../flask_admin/model/base.py:2463 +#: ../flask_admin/model/base.py:2471 ../flask_admin/model/base.py:2473 #, python-format msgid "Failed to update record. %(error)s" msgstr "Hỏng khi tạo hồ sơ. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:469 -#: ../flask_admin/contrib/pymongo/view.py:366 -#: ../flask_admin/contrib/sqla/view.py:1129 +#: ../flask_admin/contrib/peewee/view.py:492 +#: ../flask_admin/contrib/pymongo/view.py:367 +#: ../flask_admin/contrib/sqla/view.py:1221 #, python-format msgid "Failed to delete record. %(error)s" msgstr "Không xóa hồ sơ. %(error)s" -#: ../flask_admin/contrib/peewee/view.py:488 -#: ../flask_admin/contrib/pymongo/view.py:385 -#: ../flask_admin/contrib/sqla/view.py:1150 +#: ../flask_admin/contrib/peewee/view.py:511 +#: ../flask_admin/contrib/pymongo/view.py:386 +#: ../flask_admin/contrib/sqla/view.py:1242 msgid "Are you sure you want to delete selected records?" msgstr "Bạn có chắc bạn muốn xóa hồ sơ đã chọn không?" -#: ../flask_admin/contrib/peewee/view.py:505 -#: ../flask_admin/contrib/pymongo/view.py:395 -#: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 +#: ../flask_admin/contrib/peewee/view.py:528 +#: ../flask_admin/contrib/pymongo/view.py:396 +#: ../flask_admin/contrib/sqla/view.py:1258 ../flask_admin/model/base.py:2272 #, python-format msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." msgstr[0] "%(count)s hồ sơ đã được xóa thành công." -#: ../flask_admin/contrib/peewee/view.py:511 -#: ../flask_admin/contrib/pymongo/view.py:400 -#: ../flask_admin/contrib/sqla/view.py:1174 +#: ../flask_admin/contrib/peewee/view.py:534 +#: ../flask_admin/contrib/pymongo/view.py:401 +#: ../flask_admin/contrib/sqla/view.py:1266 #, python-format msgid "Failed to delete records. %(error)s" msgstr "Không xóa hồ sơ. %(error)s" -#: ../flask_admin/contrib/sqla/fields.py:126 -#: ../flask_admin/contrib/sqla/fields.py:176 -#: ../flask_admin/contrib/sqla/fields.py:181 ../flask_admin/model/fields.py:173 -#: ../flask_admin/model/fields.py:222 +#: ../flask_admin/contrib/sqla/fields.py:117 +#: ../flask_admin/contrib/sqla/fields.py:167 +#: ../flask_admin/contrib/sqla/fields.py:172 ../flask_admin/model/fields.py:174 +#: ../flask_admin/model/fields.py:223 msgid "Not a valid choice" msgstr "Không phải là một lựa chọn hợp lệ" -#: ../flask_admin/contrib/sqla/fields.py:186 +#: ../flask_admin/contrib/sqla/fields.py:201 msgid "Key" msgstr "" -#: ../flask_admin/contrib/sqla/fields.py:187 +#: ../flask_admin/contrib/sqla/fields.py:202 msgid "Value" msgstr "" -#: ../flask_admin/contrib/sqla/validators.py:42 +#: ../flask_admin/contrib/sqla/validators.py:28 msgid "Already exists." msgstr "Đã tồn tại." -#: ../flask_admin/contrib/sqla/validators.py:60 +#: ../flask_admin/contrib/sqla/validators.py:59 #, python-format msgid "At least %(num)d item is required" msgid_plural "At least %(num)d items are required" msgstr[0] "" -#: ../flask_admin/contrib/sqla/view.py:1057 +#: ../flask_admin/contrib/sqla/validators.py:75 +msgid "Not a valid ISO currency code (e.g. USD, EUR, CNY)." +msgstr "" + +#: ../flask_admin/contrib/sqla/validators.py:83 +msgid "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." +msgstr "" + +#: ../flask_admin/contrib/sqla/view.py:1134 #, python-format msgid "Integrity error. %(message)s" msgstr "Tính toàn vẹn lỗi. %(message)s" @@ -366,274 +356,242 @@ msgstr "Tính toàn vẹn lỗi. %(message)s" msgid "Invalid time format" msgstr "Định dạng thời gian không hợp lệ" -#: ../flask_admin/form/fields.py:144 +#: ../flask_admin/form/fields.py:147 msgid "Invalid Choice: could not coerce" msgstr "Lựa chọn không hợp lệ: không có thể ép buộc" -#: ../flask_admin/form/fields.py:208 +#: ../flask_admin/form/fields.py:221 msgid "Invalid JSON" msgstr "JSON không hợp lệ" -#: ../flask_admin/form/upload.py:207 +#: ../flask_admin/form/upload.py:216 msgid "Invalid file extension" msgstr "Phần mở rộng tệp không hợp lệ" -#: ../flask_admin/form/upload.py:214 ../flask_admin/form/upload.py:281 +#: ../flask_admin/form/upload.py:223 ../flask_admin/form/upload.py:293 #, python-format msgid "File \"%s\" already exists." msgstr "Tập tin \"%s\" đã tồn tại." -#: ../flask_admin/model/base.py:1649 +#: ../flask_admin/form/validators.py:16 +msgid "This field requires at least one item." +msgstr "" + +#: ../flask_admin/model/base.py:1737 msgid "There are no items in the table." msgstr "Không có mục nào trong bảng." -#: ../flask_admin/model/base.py:1673 +#: ../flask_admin/model/base.py:1746 #, python-format msgid "Invalid Filter Value: %(value)s" msgstr "Giá trị không hợp lệ bộ lọc: %(value)s" -#: ../flask_admin/model/base.py:1984 +#: ../flask_admin/model/base.py:2136 msgid "Record was successfully created." msgstr "Kỷ lục được tạo thành công." -#: ../flask_admin/model/base.py:2028 ../flask_admin/model/base.py:2080 -#: ../flask_admin/model/base.py:2113 ../flask_admin/model/base.py:2297 +#: ../flask_admin/model/base.py:2180 ../flask_admin/model/base.py:2232 +#: ../flask_admin/model/base.py:2265 ../flask_admin/model/base.py:2455 msgid "Record does not exist." msgstr "Hồ sơ không tồn tại." -#: ../flask_admin/model/base.py:2037 ../flask_admin/model/base.py:2301 +#: ../flask_admin/model/base.py:2189 ../flask_admin/model/base.py:2459 msgid "Record was successfully saved." msgstr "Hồ sơ đã được lưu thành công." -#: ../flask_admin/model/base.py:2222 -msgid "Tablib dependency not installed." -msgstr "" - -#: ../flask_admin/model/base.py:2249 +#: ../flask_admin/model/base.py:2407 #, python-format msgid "Export type \"%(type)s not supported." msgstr "" -#: ../flask_admin/model/filters.py:103 ../flask_admin/model/widgets.py:111 +#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:119 msgid "Yes" msgstr "Có" -#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:110 +#: ../flask_admin/model/filters.py:105 ../flask_admin/model/widgets.py:118 msgid "No" msgstr "Không" -#: ../flask_admin/model/filters.py:172 ../flask_admin/model/filters.py:212 -#: ../flask_admin/model/filters.py:257 +#: ../flask_admin/model/filters.py:173 ../flask_admin/model/filters.py:213 +#: ../flask_admin/model/filters.py:258 msgid "between" msgstr "giữa" -#: ../flask_admin/model/template.py:81 ../flask_admin/model/template.py:88 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:37 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:8 +#: ../flask_admin/model/template.py:83 ../flask_admin/model/template.py:90 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:7 msgid "View Record" msgstr "Xem hồ sơ" -#: ../flask_admin/model/template.py:95 ../flask_admin/model/template.py:102 -#: ../flask_admin/model/template.py:109 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/edit.html:11 +#: ../flask_admin/model/template.py:97 ../flask_admin/model/template.py:104 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/edit.html:10 msgid "Edit Record" msgstr "Chỉnh sửa bản ghi" -#: ../flask_admin/model/widgets.py:61 +#: ../flask_admin/model/template.py:111 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Delete Record" +msgstr "" + +#: ../flask_admin/model/widgets.py:62 msgid "Please select model" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/actions.html:4 -#: ../flask_admin/templates/bootstrap3/admin/actions.html:4 +#: ../flask_admin/templates/bootstrap4/admin/actions.html:5 msgid "With selected" msgstr "Với lựa chọn" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:200 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:190 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:216 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:227 msgid "Save" msgstr "Lưu" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:205 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:195 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:221 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:232 msgid "Cancel" msgstr "Hủy bỏ" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:256 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:247 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:290 msgid "Save and Add Another" msgstr "Lưu và thêm cái khác" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:259 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:250 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:293 msgid "Save and Continue Editing" msgstr "Lưu và tiếp tục chỉnh sửa" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:9 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:9 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:10 msgid "Root" msgstr "Gốc" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:90 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:99 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:89 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:98 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:42 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:51 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:89 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:98 #, python-format msgid "Sort by %(name)s" msgstr "Sắp xếp theo %(name)s" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:77 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:79 msgid "Rename File" msgstr "Đổi tên tập tin" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:88 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:88 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:90 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\' recursively?" msgstr "Bạn có chắc bạn muốn xóa \\'%(name)s\\' đệ quy?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:97 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:97 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:99 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\'?" msgstr "Bạn có chắc bạn muốn xóa \\'%(name)s\\'?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:125 -msgid "Size" -msgstr "" - -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:185 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:187 msgid "Please select at least one file." msgstr "Vui lòng chọn ít nhất một tệp." -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:8 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:17 msgid "List" msgstr "Danh sách" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:12 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:18 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 msgid "Create" msgstr "Tạo" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:26 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:26 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:21 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:26 msgid "Details" msgstr "Chi tiết" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:29 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:28 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:15 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:28 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:15 msgid "Filter" msgstr "Lọc" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:13 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:14 msgid "Delete?" msgstr "Xóa?" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:33 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:16 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:35 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Are you sure you want to delete this record?" +msgstr "Bạn có chắc bạn muốn xóa hồ sơ này không?" + +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:33 msgid "New" msgstr "Mới" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:43 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:43 msgid "Add" msgstr "Thêm" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:3 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:3 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:2 msgid "Add Filter" msgstr "Thêm bộ lọc" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:30 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:19 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:26 msgid "Export" msgstr "Kết xuất" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:38 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:38 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:49 msgid "Apply" msgstr "Áp dụng" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:40 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:51 msgid "Reset Filters" msgstr "Đặt lại bộ lọc" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:66 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:64 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:80 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:93 +#, python-format +msgid "%(placeholder)s" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:88 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:94 msgid "Search" msgstr "Tìm" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:74 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:77 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:78 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:79 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:72 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:75 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:76 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:77 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:102 msgid "items" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/create.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/create.html:10 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/create.html:10 msgid "Create New Record" msgstr "Tạo Hồ Sơ Mới" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:76 msgid "Select all records" msgstr "Chọn tất cả hồ sơ" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:120 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:119 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:119 msgid "Select record" msgstr "Chọn hồ sơ" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:186 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:195 msgid "Please select at least one record." msgstr "Vui lòng chọn ít nhất một kỷ lục." -#: ../flask_admin/templates/bootstrap2/admin/model/row_actions.html:34 -#: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 -msgid "Are you sure you want to delete this record?" -msgstr "Bạn có chắc bạn muốn xóa hồ sơ này không?" +#~ msgid "ObjectId equals" +#~ msgstr "" + +#~ msgid "Failed to get model. %(error)s" +#~ msgstr "Không thể có được mô hình. %(error)s" + +#~ msgid "Tablib dependency not installed." +#~ msgstr "" + +#~ msgid "Size" +#~ msgstr "" + diff --git a/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/admin.mo b/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/admin.mo index d1cfaa38f334dac7cb4222b0e90367a913da90e6..f5d767ab472f329a0a49b2c2cdfd91ff4ac381db 100644 GIT binary patch delta 1880 zcmYM!TS(MF6vy#d+pILT-7cn<T6VE?7hSwyQc)=dB|ca|R754wg`y(pg0U9$&=urg zJs4RTK|$!lY7`-bFA*U<WN1_tU5Sbaq6=E|{jmoUcR&9*|Cuv0XGTw#x0Xf+g8s9P zpY41m@i{U~t^Yrt6P;7&3nt+=Ov51@j-y97SAjtc;W8}716YVR%%@mQJ8>i*^~3Sb zMO_^aGYM=lo8m9rZDfplgc{I?V{iZi_|@XRQSp8wk%VrHwP#?Mb{KPTt$7grv@c*X z^Sf3al(-Gk@h(omKGej&aT;p-(_uPJ#iiEXftuiq#XB&Mb{}TpAZBBFa(rAFs{bmS z#r$qR4;gp`GqDR(vETfFO7sJ@py25E4l+<jmW{bsiAuZ%`E?C^O~7Lq#7h>B;aJ-D zFsifd<v}IsH(#LQuQ37NqY`|?aX4h{KuUb#X{d@+qY`gMP26DbJ*=VKfvQ9TyVD(- zl1lyAlq)8nvzv?badoH#tv5HJCf<gsR3oYq&8UT4Mvd!09c4F$@G%ykkJ)sjA<V^E zEX18@)L#p@KtQ+oI;!1{N_YoVi3h05*n`|V_XO2{0JV^}NKxD;RKH*LUaL{QMAZ8r za-Cd`#b-tBMJYD<oLh)W*vl0shkIszLd6F$9~0QN&bk1#)1|0Ox*t{I7PAXA?m14x zHx?g49a%Js15@eep*k)%SEClN!Q5@}!>An`LtRSG;_aw}H&F|DYW}tNd7PgrFdLP( z968FUTg-!Yv>vs9<ETHMCe)dAqITM6?VqSypTVlN(=u}fs{bBqpEEmA<9p5Ts5>-{ z8=9@Z|1b~QNexmJw*{4`0kzW>)WWXeWNb&3ya%=8LFAsfZ2ozW+l5g17NPR3Gk2r% z95qi$=69Y2no*bSGHT#e^OpG#wc`Qv52}=tI9T;BL@i)GYGErZzRx^?>feIO(}q#4 zsD}ql+>2`WBfst?UrPAP;;Gb46OBimWj?BurF`kkYjHO2K`r1SDo;0t@fm7d6945i zUwS6>S0IakN}X>nBB+IwnR6{(W$h(qEo%HqYj3pnR#d*d<{{M1PoVOiN4KE9-Ytkl zMvV2x>XU!^V%t*g`@HhBQ?Ykx%Y1=INvNnI6e-D#MCKG#6ciPE3j>?I_P}CarS~JS h%U@g;E{bgpwhoIGPN+(VHBLO}^Zc2oytd3&{{Xncw9)_o delta 2064 zcmYk+e@xVM9LMnwa6ljeN7%&=;SgJ)K%fMf*0fM*B|1yDYPNto4Lc5RcUso!Sj{z; zLG3I2VY;cgSWQ{&Y?dyUx>jqgUn^=gY9$zzWm~SzT(jp3-dnMQ$M^I8e!lPT`}6*M zj)OP#w<NzS@(ntEV*Hl#dniMr|9)z-ol~d|bFmQ%a0zDO-M9$XVjb?nMm&zSc-}0z z%DLr?S74Ur;VkEp&g0^G0<W5%P2X^rkY`;%&h!HTEM#1Pe!S7*%TV*$kc4iHjW=RF z<0w|*KJy*)F&@Jiyx;xEg%bac0lb1$7+|@obP>+QrFb2NaSlFb;}O&gzOeX3tY#dT zL9w_P%kX|1Z$mvlh?TtGy~RZhevKuVp66UCmSaA)m@80;)}acEp;q!3YU`fFAnrjG zbOQOfZ~1c#PGS*Wv3Su;`hPWnN-ng=3sDJM%q13IhUvtYqY|{C&cFj$jE`8n4}*+7 z)C!NH@_&UY;8(k!&Z<^1uFj|bYEg`U625>m!R<%w<zeI*cN$gLr{<Ta7k`85*acKa za!8^A3sKKiqn>L-ZE-W!;Yys3TMOvF_WA&UAf7SDv6gWrPpO~<sMCI%jayMKScB@^ zgQ!E;iJV)v88ttSDr`H_b=QZQ_q^R7Omd+YykrxGk@M${TKuHNKg8W>v=Wst!ZNAR z#m#3>aSw06J*YEq2DRd|I2ZlwhdSPDCf9MH2NQTLK4CX@qxLX`+KN%syz}Otr~>{r zbJ-8wFGVe&3UyfLTYM!dUpuOh*tAJEWD`!HT67wf_!HFLevewwCDaS%P>sG`HK?sy zg<5H^jR#QQhBr_v{n-2sH7}2osOM_2Lf`-PsSD?NP!o2UhfxK5WcSaZR+Py<3A*X3 zP>GsQD_)N(@FARyn^3Lafm5AC&Z!$kYH<@-#{1o6E|f4p|K&VXqFc>Y^Dc8O>d@VX zn!f?nu`M?4Gd)xXUNPT8%^SD-7cr?yvRS4ooQ+Dj)Vv4vz(!P}ZK%QqQ3dR^@qQ$i z8%E`O*W#n7d}FAs{lnt_ARp%|rT;n%75uxKhj*X~iK6!KMO5MutjG6JiT*+rkimXv zoQ>LoVpO~Wr_PF5WAO$XH<^peZk|qXy9HLG60S!j>@s^$op=<L_}Q}5FIi>2oK4|G zu%|Z^j-)Q+&P*>@-MKm3mAEq$49B*1MB=H-c^{-@bUz;UPUR0&c63I%JA<L{mT)u_ zj&^MiMtc*%?r1#G5s8FD^{MuP_B4NEOI^c)x`viuL&Gh)ZuX88KJ07jh{nBQf19_# zAIn%+-<0~?e=s9!vj5n`z>qgqT$)PEYW?5ae>$>r{CI!rSm3F&tcgRz6R!_=O(p&1 k_fA(ZesbUBn?pYzc>CPm*Cs}GPQJY3Y~Rz~sgfW51xrHi8vp<R diff --git a/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/admin.po b/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/admin.po index 6d35fa3b9..21127afc7 100644 --- a/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/admin.po +++ b/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/admin.po @@ -1,275 +1,264 @@ + msgid "" msgstr "" -"Project-Id-Version: flask-admin\n" +"Project-Id-Version: flask-admin\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-02-07 00:17-0600\n" +"POT-Creation-Date: 2024-09-24 22:09+0100\n" "PO-Revision-Date: 2017-02-13 09:18-0500\n" "Last-Translator: mrjoes <serge.koval@gmail.com>\n" +"Language: zh_CN\n" "Language-Team: Chinese Simplified\n" +"Plural-Forms: nplurals=1; plural=0;\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.1.1\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: flask-admin\n" -"X-Crowdin-Language: zh-CN\n" -"X-Crowdin-File: admin.pot\n" -"Language: zh_CN\n" +"Generated-By: Babel 2.16.0\n" -#: ../flask_admin/base.py:440 +#: ../flask_admin/base.py:458 msgid "Home" msgstr "首页" -#: ../flask_admin/contrib/rediscli.py:127 +#: ../flask_admin/contrib/rediscli.py:113 msgid "Cli: Invalid command." msgstr "Cli:无效命令。" -#: ../flask_admin/contrib/fileadmin/__init__.py:352 +#: ../flask_admin/contrib/fileadmin/__init__.py:376 msgid "File to upload" msgstr "要上传的文件" -#: ../flask_admin/contrib/fileadmin/__init__.py:360 +#: ../flask_admin/contrib/fileadmin/__init__.py:384 msgid "File required." msgstr "请上传有效的文件。" -#: ../flask_admin/contrib/fileadmin/__init__.py:365 +#: ../flask_admin/contrib/fileadmin/__init__.py:389 msgid "Invalid file type." msgstr "不允许的文件类型。" -#: ../flask_admin/contrib/fileadmin/__init__.py:376 +#: ../flask_admin/contrib/fileadmin/__init__.py:400 msgid "Content" msgstr "内容" -#: ../flask_admin/contrib/fileadmin/__init__.py:390 +#: ../flask_admin/contrib/fileadmin/__init__.py:414 msgid "Invalid name" msgstr "无效的名称。" -#: ../flask_admin/contrib/fileadmin/__init__.py:398 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:106 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:112 -#: ../flask_admin/tests/sqla/test_translation.py:17 +#: ../flask_admin/contrib/fileadmin/__init__.py:422 +#: ../flask_admin/tests/sqla/test_translation.py:21 msgid "Name" msgstr "名称" -#: ../flask_admin/contrib/fileadmin/__init__.py:757 +#: ../flask_admin/contrib/fileadmin/__init__.py:784 #, python-format msgid "File \"%(name)s\" already exists." msgstr "文件 %(name)s 已经存在。" -#: ../flask_admin/contrib/fileadmin/__init__.py:802 -#: ../flask_admin/contrib/fileadmin/__init__.py:885 -#: ../flask_admin/contrib/fileadmin/__init__.py:947 -#: ../flask_admin/contrib/fileadmin/__init__.py:1000 -#: ../flask_admin/contrib/fileadmin/__init__.py:1047 -#: ../flask_admin/contrib/fileadmin/__init__.py:1099 -#: ../flask_admin/model/base.py:2168 +#: ../flask_admin/contrib/fileadmin/__init__.py:829 +#: ../flask_admin/contrib/fileadmin/__init__.py:926 +#: ../flask_admin/contrib/fileadmin/__init__.py:988 +#: ../flask_admin/contrib/fileadmin/__init__.py:1041 +#: ../flask_admin/contrib/fileadmin/__init__.py:1088 +#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/model/base.py:2324 msgid "Permission denied." msgstr "权限被拒绝。" -#: ../flask_admin/contrib/fileadmin/__init__.py:881 +#: ../flask_admin/contrib/fileadmin/__init__.py:922 msgid "File uploading is disabled." msgstr "文件上传功能已被禁用。" -#: ../flask_admin/contrib/fileadmin/__init__.py:892 +#: ../flask_admin/contrib/fileadmin/__init__.py:933 #, python-format msgid "Successfully saved file: %(name)s" msgstr "已成功保存的文件: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:896 +#: ../flask_admin/contrib/fileadmin/__init__.py:937 #, python-format msgid "Failed to save file: %(error)s" msgstr "保存文件失败:%(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:904 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:150 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:150 +#: ../flask_admin/contrib/fileadmin/__init__.py:945 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:150 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:152 msgid "Upload File" msgstr "上传文件" -#: ../flask_admin/contrib/fileadmin/__init__.py:943 +#: ../flask_admin/contrib/fileadmin/__init__.py:984 msgid "Directory creation is disabled." msgstr "文件夹创建功能已被禁用。" -#: ../flask_admin/contrib/fileadmin/__init__.py:956 +#: ../flask_admin/contrib/fileadmin/__init__.py:997 #, python-format msgid "Successfully created directory: %(directory)s" msgstr "成功创建的目录: %(directory)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:960 +#: ../flask_admin/contrib/fileadmin/__init__.py:1001 #, python-format msgid "Failed to create directory: %(error)s" msgstr "创建文件夹失败:%(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:970 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:161 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:161 +#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:161 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:163 msgid "Create Directory" msgstr "创建文件夹" -#: ../flask_admin/contrib/fileadmin/__init__.py:996 +#: ../flask_admin/contrib/fileadmin/__init__.py:1037 msgid "Deletion is disabled." msgstr "删除功能已被禁用。" -#: ../flask_admin/contrib/fileadmin/__init__.py:1005 +#: ../flask_admin/contrib/fileadmin/__init__.py:1046 msgid "Directory deletion is disabled." msgstr "删除文件夹功能已被禁用。" -#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/contrib/fileadmin/__init__.py:1052 #, python-format msgid "Directory \"%(path)s\" was successfully deleted." msgstr "已成功删除目录\"%(path)s\"。" -#: ../flask_admin/contrib/fileadmin/__init__.py:1013 +#: ../flask_admin/contrib/fileadmin/__init__.py:1054 #, python-format msgid "Failed to delete directory: %(error)s" msgstr "删除文件夹失败:$(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1019 -#: ../flask_admin/contrib/fileadmin/__init__.py:1176 +#: ../flask_admin/contrib/fileadmin/__init__.py:1060 +#: ../flask_admin/contrib/fileadmin/__init__.py:1215 #, python-format msgid "File \"%(name)s\" was successfully deleted." msgstr "删除文件 %(name)s 成功。" -#: ../flask_admin/contrib/fileadmin/__init__.py:1021 -#: ../flask_admin/contrib/fileadmin/__init__.py:1178 +#: ../flask_admin/contrib/fileadmin/__init__.py:1062 +#: ../flask_admin/contrib/fileadmin/__init__.py:1217 #, python-format msgid "Failed to delete file: %(name)s" msgstr "删除文件 %(name)s 失败" -#: ../flask_admin/contrib/fileadmin/__init__.py:1043 +#: ../flask_admin/contrib/fileadmin/__init__.py:1084 msgid "Renaming is disabled." msgstr "重命名功能已被禁用。" -#: ../flask_admin/contrib/fileadmin/__init__.py:1051 +#: ../flask_admin/contrib/fileadmin/__init__.py:1092 msgid "Path does not exist." msgstr "路径不存在。" -#: ../flask_admin/contrib/fileadmin/__init__.py:1061 +#: ../flask_admin/contrib/fileadmin/__init__.py:1102 #, python-format msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\"" msgstr "重命名文件 %(src)s 为 %(dst)s 成功" -#: ../flask_admin/contrib/fileadmin/__init__.py:1064 +#: ../flask_admin/contrib/fileadmin/__init__.py:1105 #, python-format msgid "Failed to rename: %(error)s" msgstr "重命名文件失败:%(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1078 +#: ../flask_admin/contrib/fileadmin/__init__.py:1119 #, python-format msgid "Rename %(name)s" msgstr "重命名 %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1115 +#: ../flask_admin/contrib/fileadmin/__init__.py:1155 #, python-format msgid "Error saving changes to %(name)s." msgstr "保存修改到 %(name)s 出现错误。" -#: ../flask_admin/contrib/fileadmin/__init__.py:1119 +#: ../flask_admin/contrib/fileadmin/__init__.py:1159 #, python-format msgid "Changes to %(name)s saved successfully." msgstr "保存修改到 %(name)s 成功。" -#: ../flask_admin/contrib/fileadmin/__init__.py:1128 +#: ../flask_admin/contrib/fileadmin/__init__.py:1167 #, python-format msgid "Error reading %(name)s." msgstr "读取 %(name)s 错误。" -#: ../flask_admin/contrib/fileadmin/__init__.py:1131 -#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/contrib/fileadmin/__init__.py:1170 +#: ../flask_admin/contrib/fileadmin/__init__.py:1179 #, python-format msgid "Unexpected error while reading from %(name)s" msgstr "读取文件文件 %(name)s 出现未知错误" -#: ../flask_admin/contrib/fileadmin/__init__.py:1137 +#: ../flask_admin/contrib/fileadmin/__init__.py:1176 #, python-format msgid "Cannot edit %(name)s." msgstr "无法编辑 %(name)s。" -#: ../flask_admin/contrib/fileadmin/__init__.py:1155 +#: ../flask_admin/contrib/fileadmin/__init__.py:1194 #, python-format msgid "Editing %(path)s" msgstr "编辑 %(path)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/peewee/view.py:487 -#: ../flask_admin/contrib/pymongo/view.py:384 -#: ../flask_admin/contrib/sqla/view.py:1149 +#: ../flask_admin/contrib/fileadmin/__init__.py:1202 +#: ../flask_admin/contrib/peewee/view.py:510 +#: ../flask_admin/contrib/pymongo/view.py:385 +#: ../flask_admin/contrib/sqla/view.py:1241 msgid "Delete" msgstr "删除" -#: ../flask_admin/contrib/fileadmin/__init__.py:1164 +#: ../flask_admin/contrib/fileadmin/__init__.py:1203 msgid "Are you sure you want to delete these files?" msgstr "你打算要删除这些文件吗?" -#: ../flask_admin/contrib/fileadmin/__init__.py:1167 +#: ../flask_admin/contrib/fileadmin/__init__.py:1206 msgid "File deletion is disabled." msgstr "删除文件功能已被禁用" -#: ../flask_admin/contrib/fileadmin/__init__.py:1180 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:22 +#: ../flask_admin/contrib/fileadmin/__init__.py:1219 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:22 msgid "Edit" msgstr "编辑" -#: ../flask_admin/contrib/fileadmin/s3.py:153 +#: ../flask_admin/contrib/fileadmin/s3.py:162 msgid "Cannot operate on non empty directories" msgstr "无法对非空的目录操作" #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 -#: ../flask_admin/contrib/sqla/filters.py:41 +#: ../flask_admin/contrib/sqla/filters.py:42 msgid "equals" msgstr "等于" #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 -#: ../flask_admin/contrib/sqla/filters.py:49 +#: ../flask_admin/contrib/sqla/filters.py:50 msgid "not equal" msgstr "不等于" #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 -#: ../flask_admin/contrib/sqla/filters.py:58 +#: ../flask_admin/contrib/sqla/filters.py:59 msgid "contains" msgstr "包含" #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 -#: ../flask_admin/contrib/sqla/filters.py:67 +#: ../flask_admin/contrib/sqla/filters.py:68 msgid "not contains" msgstr "不包含" #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 -#: ../flask_admin/contrib/sqla/filters.py:75 +#: ../flask_admin/contrib/sqla/filters.py:76 msgid "greater than" msgstr "大于" #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 -#: ../flask_admin/contrib/sqla/filters.py:83 +#: ../flask_admin/contrib/sqla/filters.py:84 msgid "smaller than" msgstr "小于" #: ../flask_admin/contrib/peewee/filters.py:88 -#: ../flask_admin/contrib/sqla/filters.py:94 +#: ../flask_admin/contrib/sqla/filters.py:95 msgid "empty" msgstr "空" #: ../flask_admin/contrib/peewee/filters.py:102 -#: ../flask_admin/contrib/sqla/filters.py:108 +#: ../flask_admin/contrib/sqla/filters.py:109 msgid "in list" msgstr "在列表中" #: ../flask_admin/contrib/peewee/filters.py:111 -#: ../flask_admin/contrib/sqla/filters.py:118 +#: ../flask_admin/contrib/sqla/filters.py:119 msgid "not in list" msgstr "不在列表中" @@ -282,82 +271,83 @@ msgstr "不在列表中" msgid "not between" msgstr "不是之间" -msgid "ObjectId equals" -msgstr "ObjectId 等于" - -#, python-format -msgid "Failed to get model. %(error)s" -msgstr "获取 model 失败。%(error)s" - -#: ../flask_admin/contrib/peewee/view.py:435 -#: ../flask_admin/contrib/pymongo/view.py:316 -#: ../flask_admin/contrib/sqla/view.py:1078 +#: ../flask_admin/contrib/peewee/view.py:458 +#: ../flask_admin/contrib/pymongo/view.py:317 +#: ../flask_admin/contrib/sqla/view.py:1170 #, python-format msgid "Failed to create record. %(error)s" msgstr "创建 model 失败。%(error)s" -#: ../flask_admin/contrib/peewee/view.py:454 -#: ../flask_admin/contrib/pymongo/view.py:341 -#: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 -#: ../flask_admin/model/base.py:2313 ../flask_admin/model/base.py:2315 +#: ../flask_admin/contrib/peewee/view.py:477 +#: ../flask_admin/contrib/pymongo/view.py:342 +#: ../flask_admin/contrib/sqla/view.py:1196 ../flask_admin/model/base.py:2463 +#: ../flask_admin/model/base.py:2471 ../flask_admin/model/base.py:2473 #, python-format msgid "Failed to update record. %(error)s" msgstr "更新记录失败。%(error)s" -#: ../flask_admin/contrib/peewee/view.py:469 -#: ../flask_admin/contrib/pymongo/view.py:366 -#: ../flask_admin/contrib/sqla/view.py:1129 +#: ../flask_admin/contrib/peewee/view.py:492 +#: ../flask_admin/contrib/pymongo/view.py:367 +#: ../flask_admin/contrib/sqla/view.py:1221 #, python-format msgid "Failed to delete record. %(error)s" msgstr "删除记录失败。%(error)s" -#: ../flask_admin/contrib/peewee/view.py:488 -#: ../flask_admin/contrib/pymongo/view.py:385 -#: ../flask_admin/contrib/sqla/view.py:1150 +#: ../flask_admin/contrib/peewee/view.py:511 +#: ../flask_admin/contrib/pymongo/view.py:386 +#: ../flask_admin/contrib/sqla/view.py:1242 msgid "Are you sure you want to delete selected records?" msgstr "你打算要删除这些选中的记录吗?" -#: ../flask_admin/contrib/peewee/view.py:505 -#: ../flask_admin/contrib/pymongo/view.py:395 -#: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 +#: ../flask_admin/contrib/peewee/view.py:528 +#: ../flask_admin/contrib/pymongo/view.py:396 +#: ../flask_admin/contrib/sqla/view.py:1258 ../flask_admin/model/base.py:2272 #, python-format msgid "Record was successfully deleted." msgid_plural "%(count)s records were successfully deleted." msgstr[0] "%(count)s 记录被成功删除。" -#: ../flask_admin/contrib/peewee/view.py:511 -#: ../flask_admin/contrib/pymongo/view.py:400 -#: ../flask_admin/contrib/sqla/view.py:1174 +#: ../flask_admin/contrib/peewee/view.py:534 +#: ../flask_admin/contrib/pymongo/view.py:401 +#: ../flask_admin/contrib/sqla/view.py:1266 #, python-format msgid "Failed to delete records. %(error)s" msgstr "删除记录失败。%(error)s" -#: ../flask_admin/contrib/sqla/fields.py:126 -#: ../flask_admin/contrib/sqla/fields.py:176 -#: ../flask_admin/contrib/sqla/fields.py:181 ../flask_admin/model/fields.py:173 -#: ../flask_admin/model/fields.py:222 +#: ../flask_admin/contrib/sqla/fields.py:117 +#: ../flask_admin/contrib/sqla/fields.py:167 +#: ../flask_admin/contrib/sqla/fields.py:172 ../flask_admin/model/fields.py:174 +#: ../flask_admin/model/fields.py:223 msgid "Not a valid choice" msgstr "选择的值无效" -#: ../flask_admin/contrib/sqla/fields.py:186 +#: ../flask_admin/contrib/sqla/fields.py:201 msgid "Key" msgstr "名称" -#: ../flask_admin/contrib/sqla/fields.py:187 +#: ../flask_admin/contrib/sqla/fields.py:202 msgid "Value" msgstr "值" -#: ../flask_admin/contrib/sqla/validators.py:42 +#: ../flask_admin/contrib/sqla/validators.py:28 msgid "Already exists." msgstr "已经存在。" -#: ../flask_admin/contrib/sqla/validators.py:60 +#: ../flask_admin/contrib/sqla/validators.py:59 #, python-format msgid "At least %(num)d item is required" msgid_plural "At least %(num)d items are required" msgstr[0] "至少需要 %(num)d 个选项" -#: ../flask_admin/contrib/sqla/view.py:1057 +#: ../flask_admin/contrib/sqla/validators.py:75 +msgid "Not a valid ISO currency code (e.g. USD, EUR, CNY)." +msgstr "" + +#: ../flask_admin/contrib/sqla/validators.py:83 +msgid "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." +msgstr "" + +#: ../flask_admin/contrib/sqla/view.py:1134 #, python-format msgid "Integrity error. %(message)s" msgstr "完整性错误。%(message)s" @@ -366,274 +356,242 @@ msgstr "完整性错误。%(message)s" msgid "Invalid time format" msgstr "无效时间格式" -#: ../flask_admin/form/fields.py:144 +#: ../flask_admin/form/fields.py:147 msgid "Invalid Choice: could not coerce" msgstr "无效选择的值:强制格式转换失败" -#: ../flask_admin/form/fields.py:208 +#: ../flask_admin/form/fields.py:221 msgid "Invalid JSON" msgstr "无效的 JSON" -#: ../flask_admin/form/upload.py:207 +#: ../flask_admin/form/upload.py:216 msgid "Invalid file extension" msgstr "无效文件扩展名" -#: ../flask_admin/form/upload.py:214 ../flask_admin/form/upload.py:281 +#: ../flask_admin/form/upload.py:223 ../flask_admin/form/upload.py:293 #, python-format msgid "File \"%s\" already exists." msgstr "文件 %s 已经存在。" -#: ../flask_admin/model/base.py:1649 +#: ../flask_admin/form/validators.py:16 +msgid "This field requires at least one item." +msgstr "" + +#: ../flask_admin/model/base.py:1737 msgid "There are no items in the table." msgstr "表中没有任何记录" -#: ../flask_admin/model/base.py:1673 +#: ../flask_admin/model/base.py:1746 #, python-format msgid "Invalid Filter Value: %(value)s" msgstr "无效的筛选器值: %(value)s" -#: ../flask_admin/model/base.py:1984 +#: ../flask_admin/model/base.py:2136 msgid "Record was successfully created." msgstr "创建记录成功。" -#: ../flask_admin/model/base.py:2028 ../flask_admin/model/base.py:2080 -#: ../flask_admin/model/base.py:2113 ../flask_admin/model/base.py:2297 +#: ../flask_admin/model/base.py:2180 ../flask_admin/model/base.py:2232 +#: ../flask_admin/model/base.py:2265 ../flask_admin/model/base.py:2455 msgid "Record does not exist." msgstr "记录不存在。" -#: ../flask_admin/model/base.py:2037 ../flask_admin/model/base.py:2301 +#: ../flask_admin/model/base.py:2189 ../flask_admin/model/base.py:2459 msgid "Record was successfully saved." msgstr "保存记录成功" -#: ../flask_admin/model/base.py:2222 -msgid "Tablib dependency not installed." -msgstr "Tablib 依赖项未安装。" - -#: ../flask_admin/model/base.py:2249 +#: ../flask_admin/model/base.py:2407 #, python-format msgid "Export type \"%(type)s not supported." msgstr "不支持导出类型 \"%(type)s 。" -#: ../flask_admin/model/filters.py:103 ../flask_admin/model/widgets.py:111 +#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:119 msgid "Yes" msgstr "是" -#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:110 +#: ../flask_admin/model/filters.py:105 ../flask_admin/model/widgets.py:118 msgid "No" msgstr "否" -#: ../flask_admin/model/filters.py:172 ../flask_admin/model/filters.py:212 -#: ../flask_admin/model/filters.py:257 +#: ../flask_admin/model/filters.py:173 ../flask_admin/model/filters.py:213 +#: ../flask_admin/model/filters.py:258 msgid "between" msgstr "之间" -#: ../flask_admin/model/template.py:81 ../flask_admin/model/template.py:88 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:37 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:8 +#: ../flask_admin/model/template.py:83 ../flask_admin/model/template.py:90 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:7 msgid "View Record" msgstr "查看记录" -#: ../flask_admin/model/template.py:95 ../flask_admin/model/template.py:102 -#: ../flask_admin/model/template.py:109 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/edit.html:11 +#: ../flask_admin/model/template.py:97 ../flask_admin/model/template.py:104 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/edit.html:10 msgid "Edit Record" msgstr "编辑记录" -#: ../flask_admin/model/widgets.py:61 +#: ../flask_admin/model/template.py:111 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Delete Record" +msgstr "" + +#: ../flask_admin/model/widgets.py:62 msgid "Please select model" msgstr "请选择模型" -#: ../flask_admin/templates/bootstrap2/admin/actions.html:4 -#: ../flask_admin/templates/bootstrap3/admin/actions.html:4 +#: ../flask_admin/templates/bootstrap4/admin/actions.html:5 msgid "With selected" msgstr "选中的" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:200 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:190 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:216 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:227 msgid "Save" msgstr "保存" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:205 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:195 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:221 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:232 msgid "Cancel" msgstr "取消" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:256 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:247 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:290 msgid "Save and Add Another" msgstr "保存并添加另一个" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:259 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:250 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:293 msgid "Save and Continue Editing" msgstr "保存并继续编辑" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:9 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:9 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:10 msgid "Root" msgstr "根" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:90 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:99 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:89 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:98 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:42 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:51 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:89 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:98 #, python-format msgid "Sort by %(name)s" msgstr "按 %(name)s 进行排序" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:77 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:79 msgid "Rename File" msgstr "重命名文件" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:88 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:88 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:90 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\' recursively?" msgstr "你打算递归地删除 %(name)s 吗?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:97 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:97 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:99 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\'?" msgstr "你打算删除 %(name)s 吗?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:125 -msgid "Size" -msgstr "大小" - -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:185 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:187 msgid "Please select at least one file." msgstr "请至少选择一个文件。" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:8 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:17 msgid "List" msgstr "列表" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:12 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:18 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 msgid "Create" msgstr "创建" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:26 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:26 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:21 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:26 msgid "Details" msgstr "详情" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:29 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:28 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:15 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:28 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:15 msgid "Filter" msgstr "筛选器" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:13 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:14 msgid "Delete?" msgstr "删除?" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:33 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:16 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:35 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Are you sure you want to delete this record?" +msgstr "你打算删除这条记录?" + +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:33 msgid "New" msgstr "新增" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:43 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:43 msgid "Add" msgstr "增加" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:3 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:3 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:2 msgid "Add Filter" msgstr "新增筛选器" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:30 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:19 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:26 msgid "Export" msgstr "导出" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:38 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:38 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:49 msgid "Apply" msgstr "应用" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:40 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:51 msgid "Reset Filters" msgstr "重置" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:66 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:64 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:80 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:93 +#, python-format +msgid "%(placeholder)s" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:88 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:94 msgid "Search" msgstr "搜索" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:74 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:77 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:78 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:79 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:72 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:75 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:76 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:77 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:102 msgid "items" msgstr "项目" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/create.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/create.html:10 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/create.html:10 msgid "Create New Record" msgstr "创建新记录" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:76 msgid "Select all records" msgstr "选择所有记录" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:120 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:119 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:119 msgid "Select record" msgstr "选择记录" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:186 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:195 msgid "Please select at least one record." msgstr "请至少选择一个 model。" -#: ../flask_admin/templates/bootstrap2/admin/model/row_actions.html:34 -#: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 -msgid "Are you sure you want to delete this record?" -msgstr "你打算删除这条记录?" +#~ msgid "ObjectId equals" +#~ msgstr "ObjectId 等于" + +#~ msgid "Failed to get model. %(error)s" +#~ msgstr "获取 model 失败。%(error)s" + +#~ msgid "Tablib dependency not installed." +#~ msgstr "Tablib 依赖项未安装。" + +#~ msgid "Size" +#~ msgstr "大小" + diff --git a/flask_admin/translations/zh_Hant_TW/LC_MESSAGES/admin.mo b/flask_admin/translations/zh_Hant_TW/LC_MESSAGES/admin.mo index 8020cb9aeeb7a2a0caa4c4b11d095645df1c829c..afb19bc9a4ba9b19a72f5faae2f6c0f4ee82c5ca 100644 GIT binary patch delta 1855 zcmYM!e`wTo9LMp`*Id(^x7%&*cH3>;wVXe9>vm4IS>y~FjB*UhFtOO!UDrf+xy==( zoJF!M6!YWk2S#K>D<q3Ag4qZ{r09<{`#n(l!JODX>jy=Y(DT(k(DA+R<MVlczu))w z{rPcsu<g0kh0Eph#|@th-&(%6-=N<ApDi~UqtJsGz&;G&HY~#3*p5$O5+|`4uVEwB z7SGv*chMh3E}2QJG^SwA(pW~|ySaez78pa*RH1H+V;L^RFt)mQ7wWzqB$3(V`h(a+ ze-z{RhVvZGr$3D)cn!;Vzxjhk6@lV~#@vi?Y{2zck2%+W*7e`TTZn&wG5iy6!V0EG z_oq=W-iRx3CsyODScC6lDSjz=zxj!V68(xAaVh1g(n{2l)L;TzQHeL<B77VpxDU(m zn2Vpp3i^|%JQti_;XL|NsQWKrVKI$a7bqfYf_@Y=l6KS!wz&8(ZlHezHR2ypd%+9N zO=%dl6m`g9R&!DT>z$pb_uY+}k=`KluMzJepo*SE4s(Q)*8Dgo(Z^Nz18Rwa%wGa; z#YXHw#$fh1_anEOan$C09ko~9L{{6JL~Y*Fntv7WApr(s&bb>eq7qKI_!VTC&2KJ# z-NhF&{9_)ogv#SnwPxfDY9>BK#lJ@tI)f{5F*|t)t}D1k#<?Fg!go*)Uce}RgW8m{ zsHuxEUAmrfwxV8qhqK$oA3_zLMHQ4s4RjxBi3^8mETeG>wFxhw690v|Q9DVAgQyqR z;c{%n7VJeW(YW)h^A~5F1=sZrn8GJq{{%A7f|;VB0{%f2u!J&IX$L22F!wtLP}g^( zM)V@8(BoK#Z=rr2AEQP#gRGJXu!HqnHEPqYLFK*gKUx1A4UKdcD&ZJv(;P%{n8T<C zCS3mmRHDzFv+jC`KM~zu?`%UYUAOD!P<i&C3Oa-#-fvFO(9dKNRlrB6M4vb>yZG;@ z1b?FnE+xB`B!=2dYj7=YM$N=Ha+p(`n(#B!bJv{#9)6hr98*O@Bd$jku+*7!@fO!_ zbFM=r>U7?VT9RJpR@9yuLFIe8+Fx0`*Yhtf$ayv!*lUYQI{Zw@c`ts?!0?Fa?%SR< z-Fc3YL|<aGZ`(j7(f>$(pg(K32DjUvgAYU+miOm(4vwrCP7G!H^Fx{8#ADf^tWB1F zYXhMJ_H<~ojh6M;!LnDv>6T=wJ(+Gvq|<9t?W<DFwl?g0x7qXI9bU8FQGTcAzg_XD zXFDsOw+)ddef^<Ga$dz%f9%T9m!_Y2;p%G>X8O>9nThx8nP|*TM{|B}^&-#isCn5o O#x~lqSeN}e*7h$g)YR_) delta 2466 zcma*nTWnNS6vpvAr3HrGTj&+&;ZnJ^r4_XlQ9x`1+909ILm`1_=OClgnYJ?^h3FtY z6fHMBTq24{FbYj1;9wviG0_L!5E2!PmqfA92tr5<pozi%M|Wa0CepP1oxRT9>#V)b zp6QvkWqRU=ywn|rpAP;;^7q~#jsE_r7-Eb<l{gG*FdJuL8a84bF2YLOgf(~qEAXnd zc&IV;j2m#U=HUoq62{|V0)d0pa|1Wb@5ow{?H^cBh&hZ$V=hj$@j0k@^N@sQp&hTl zD#j5k!#&nhn9BHjOy~LLCoYuu8W!Rm9D{{ySC!V`c$|&p=;B!HvExIi2YhMczu`E> zh3OQF4`V4d+wp4D`W;xt^UZNCCgBAv#*_?WN^m4*VXd_RmFO8%VI8QQtU<lH7tz7p zsDe%+zvf&16<|N+;T;>#%cTGL1j@M3JD!G0SZkeW<8v^Dcs(k?Jk%Ljg2VB78()tO zV-K~%qp1AnQ3YJF_fy!F!+2a4{a1?~C!mC_NE1v9^)3_08nXjc*naB))Pp}nb?h@# zN4`T9coDVkCTd+O$@Pl;ScxS#1?Oecf4%EC0S9+lk6{Jl3#fw9Sgq5Ziy9ZA9xx8o zxf;|Vd=NRe<`LBV22^2<NY_mhYTj~te`SITC5+e!YmxJ3x^4V*8{dPwea7^n64tX# zYBP<fPAx^nJ5hyq;beRt$KyHcO=~IdMH^4d=0Xcwun0pq0XLvddoQZRXHoNhvED!x zaN9bR_o4ems11~%3Y&!5`7G3#Xhh|YB8NF)c5$JFNz}v>sKlpH4?d3*@dj#M30bwH zG57#Bpx)^^>p|4%KX1pktmT|QowX*^{7$Ua=l@+BIEQM<9aM#5_%hJPZ9bC2xJdWR zI_nmDe;;bcr%(l+#!+|%RmfG;&NFB)=g~|><$V-K^L*3Hg%WpJH=z#IUQ|c+qY@vs z@nhDLsKP!)b?hrto<1ADjoNV*ZIqSB+cJ%)dCM`O1Tik;tH>I&*N%^)CZ0i6{3Gf? zf1*BCnS4vBusqcIV(U~JuSczKL~UdlYF!vfVLD3azusjJff;xh)v_z-U^-7#K^0hq z^{7N~)W_>(JMKolb<K9X+c{KW`>nk;e#DMHwtiANeIViI1eEYB>H%M)-swf_uc)2h zLM0wDGTA(Mz3;w2Bod7~(RQ~p5O<wu#EJ0dwzbE*oM5QaZH-4eLvAd2VMxd~xqeN1 zv@>o7aN=F<t~0iLqMQ_CUEGPSYS#=m=*{wP$XF2yyEB~fiIG5?>z(zNc=Ly4dOiLe z?`Qug|Fdq~X^RHku=kR`An6<Sg|GHWx63q!VsW#81!jT!f>{vdH|_+S)q!v*=(Mhk zhFV?oRLgVJH9zRM9jgN2n0GzBEq`Iy4a8h0=7zat6EDeV_O@pfd4FUa928pXdiyfB zmIYeEp%y3Tw!4v_8)@yjTXrZCiwDACH(2FWWi1^P2(R+GvzpREaknkzeUtT0ZcS}v z_5GFAwN7>QjGDU2>W93I*-39^PDk=k&SSm_bMLW<*K<33Q|`TqRo=4vH@w&Ux&Q3s zwftoxF1_8`|H`S$n?LH?y0bsoeQD>L7uRn{&K+KxQmQTvg!(q_>fd+3^ljUG`M?qN z)7xB7n*HzYeNeFSzq*&qD$MkyHmPqVMQ=Gz|6k*d7A;O&Oy^wBU;Kn^-J;^UzX0d1 Bf3yGq diff --git a/flask_admin/translations/zh_Hant_TW/LC_MESSAGES/admin.po b/flask_admin/translations/zh_Hant_TW/LC_MESSAGES/admin.po index ba876be3f..433726958 100644 --- a/flask_admin/translations/zh_Hant_TW/LC_MESSAGES/admin.po +++ b/flask_admin/translations/zh_Hant_TW/LC_MESSAGES/admin.po @@ -8,270 +8,262 @@ msgid "" msgstr "" "Project-Id-Version: Flask-Admin VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-02-07 00:19-0600\n" +"POT-Creation-Date: 2024-09-24 22:09+0100\n" "PO-Revision-Date: 2018-11-05 05:43+0800\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: zh_Hant_TW\n" "Language-Team: zh_Hant_TW <LL@li.org>\n" -"Plural-Forms: nplurals=1; plural=0\n" +"Plural-Forms: nplurals=1; plural=0;\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.6.0\n" +"Generated-By: Babel 2.16.0\n" -#: ../flask_admin/base.py:440 +#: ../flask_admin/base.py:458 msgid "Home" msgstr "首頁" -#: ../flask_admin/contrib/rediscli.py:127 +#: ../flask_admin/contrib/rediscli.py:113 msgid "Cli: Invalid command." msgstr "Cli: 錯誤的指令。" -#: ../flask_admin/contrib/fileadmin/__init__.py:352 +#: ../flask_admin/contrib/fileadmin/__init__.py:376 msgid "File to upload" msgstr "要上傳的檔案" -#: ../flask_admin/contrib/fileadmin/__init__.py:360 +#: ../flask_admin/contrib/fileadmin/__init__.py:384 msgid "File required." msgstr "必要的檔案。" -#: ../flask_admin/contrib/fileadmin/__init__.py:365 +#: ../flask_admin/contrib/fileadmin/__init__.py:389 msgid "Invalid file type." msgstr "檔案格式不允許上傳。" -#: ../flask_admin/contrib/fileadmin/__init__.py:376 +#: ../flask_admin/contrib/fileadmin/__init__.py:400 msgid "Content" msgstr "內容" -#: ../flask_admin/contrib/fileadmin/__init__.py:390 +#: ../flask_admin/contrib/fileadmin/__init__.py:414 msgid "Invalid name" msgstr "不正確的名稱" -#: ../flask_admin/contrib/fileadmin/__init__.py:398 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:106 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:112 -#: ../flask_admin/tests/sqla/test_translation.py:17 +#: ../flask_admin/contrib/fileadmin/__init__.py:422 +#: ../flask_admin/tests/sqla/test_translation.py:21 msgid "Name" msgstr "名稱" -#: ../flask_admin/contrib/fileadmin/__init__.py:757 +#: ../flask_admin/contrib/fileadmin/__init__.py:784 #, python-format msgid "File \"%(name)s\" already exists." msgstr "檔案 \"%(name)s\" 已經存在。" -#: ../flask_admin/contrib/fileadmin/__init__.py:802 -#: ../flask_admin/contrib/fileadmin/__init__.py:885 -#: ../flask_admin/contrib/fileadmin/__init__.py:947 -#: ../flask_admin/contrib/fileadmin/__init__.py:1000 -#: ../flask_admin/contrib/fileadmin/__init__.py:1047 -#: ../flask_admin/contrib/fileadmin/__init__.py:1099 -#: ../flask_admin/model/base.py:2168 +#: ../flask_admin/contrib/fileadmin/__init__.py:829 +#: ../flask_admin/contrib/fileadmin/__init__.py:926 +#: ../flask_admin/contrib/fileadmin/__init__.py:988 +#: ../flask_admin/contrib/fileadmin/__init__.py:1041 +#: ../flask_admin/contrib/fileadmin/__init__.py:1088 +#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/model/base.py:2324 msgid "Permission denied." msgstr "許可權被拒絕。" -#: ../flask_admin/contrib/fileadmin/__init__.py:881 +#: ../flask_admin/contrib/fileadmin/__init__.py:922 msgid "File uploading is disabled." msgstr "上傳檔案已被禁用。" -#: ../flask_admin/contrib/fileadmin/__init__.py:892 +#: ../flask_admin/contrib/fileadmin/__init__.py:933 #, python-format msgid "Successfully saved file: %(name)s" msgstr "已成功保存的檔: %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:896 +#: ../flask_admin/contrib/fileadmin/__init__.py:937 #, python-format msgid "Failed to save file: %(error)s" msgstr "在儲存檔案的時候發生異常:%(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:904 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:150 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:148 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:150 +#: ../flask_admin/contrib/fileadmin/__init__.py:945 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:150 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:152 msgid "Upload File" msgstr "上傳檔案" -#: ../flask_admin/contrib/fileadmin/__init__.py:943 +#: ../flask_admin/contrib/fileadmin/__init__.py:984 msgid "Directory creation is disabled." msgstr "建立資料夾的功能已被禁用。" -#: ../flask_admin/contrib/fileadmin/__init__.py:956 +#: ../flask_admin/contrib/fileadmin/__init__.py:997 #, python-format msgid "Successfully created directory: %(directory)s" msgstr "成功創建的目錄: %(directory)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:960 +#: ../flask_admin/contrib/fileadmin/__init__.py:1001 #, python-format msgid "Failed to create directory: %(error)s" msgstr "在建立資料夾的時候發生異常: %(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:970 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:161 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:159 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:161 +#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:161 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:163 msgid "Create Directory" msgstr "建立資料夾" -#: ../flask_admin/contrib/fileadmin/__init__.py:996 +#: ../flask_admin/contrib/fileadmin/__init__.py:1037 msgid "Deletion is disabled." msgstr "刪除已被禁用。" -#: ../flask_admin/contrib/fileadmin/__init__.py:1005 +#: ../flask_admin/contrib/fileadmin/__init__.py:1046 msgid "Directory deletion is disabled." msgstr "刪除目錄已被禁用。" -#: ../flask_admin/contrib/fileadmin/__init__.py:1011 +#: ../flask_admin/contrib/fileadmin/__init__.py:1052 #, python-format msgid "Directory \"%(path)s\" was successfully deleted." msgstr "已成功刪除目錄\"%(path)s\"。" -#: ../flask_admin/contrib/fileadmin/__init__.py:1013 +#: ../flask_admin/contrib/fileadmin/__init__.py:1054 #, python-format msgid "Failed to delete directory: %(error)s" msgstr "刪除檔案的時候發生異常:%(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1019 -#: ../flask_admin/contrib/fileadmin/__init__.py:1176 +#: ../flask_admin/contrib/fileadmin/__init__.py:1060 +#: ../flask_admin/contrib/fileadmin/__init__.py:1215 #, python-format msgid "File \"%(name)s\" was successfully deleted." msgstr "檔案 \"%(name)s\" 已被成功刪除。" -#: ../flask_admin/contrib/fileadmin/__init__.py:1021 -#: ../flask_admin/contrib/fileadmin/__init__.py:1178 +#: ../flask_admin/contrib/fileadmin/__init__.py:1062 +#: ../flask_admin/contrib/fileadmin/__init__.py:1217 #, python-format msgid "Failed to delete file: %(name)s" msgstr "" -#: ../flask_admin/contrib/fileadmin/__init__.py:1043 +#: ../flask_admin/contrib/fileadmin/__init__.py:1084 msgid "Renaming is disabled." msgstr "重新命名已被禁用。" -#: ../flask_admin/contrib/fileadmin/__init__.py:1051 +#: ../flask_admin/contrib/fileadmin/__init__.py:1092 msgid "Path does not exist." msgstr "路徑不存在。" -#: ../flask_admin/contrib/fileadmin/__init__.py:1061 +#: ../flask_admin/contrib/fileadmin/__init__.py:1102 #, python-format msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\"" msgstr "將 \"%(src)s\" 重新命名為 \"%(dst)s\" 的作業成功。" -#: ../flask_admin/contrib/fileadmin/__init__.py:1064 +#: ../flask_admin/contrib/fileadmin/__init__.py:1105 #, python-format msgid "Failed to rename: %(error)s" msgstr "重新命名的時候發生異常:%(error)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1078 +#: ../flask_admin/contrib/fileadmin/__init__.py:1119 #, python-format msgid "Rename %(name)s" msgstr "重新命名 %(name)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1115 +#: ../flask_admin/contrib/fileadmin/__init__.py:1155 #, python-format msgid "Error saving changes to %(name)s." msgstr "將更改保存到 %(name)s 時出錯。" -#: ../flask_admin/contrib/fileadmin/__init__.py:1119 +#: ../flask_admin/contrib/fileadmin/__init__.py:1159 #, python-format msgid "Changes to %(name)s saved successfully." msgstr "對 %(name)s 成功保存的更改。" -#: ../flask_admin/contrib/fileadmin/__init__.py:1128 +#: ../flask_admin/contrib/fileadmin/__init__.py:1167 #, python-format msgid "Error reading %(name)s." msgstr "讀取 %(name)s 錯誤。" -#: ../flask_admin/contrib/fileadmin/__init__.py:1131 -#: ../flask_admin/contrib/fileadmin/__init__.py:1140 +#: ../flask_admin/contrib/fileadmin/__init__.py:1170 +#: ../flask_admin/contrib/fileadmin/__init__.py:1179 #, python-format msgid "Unexpected error while reading from %(name)s" msgstr "從 %(name)s 中讀取時出現意外的錯誤" -#: ../flask_admin/contrib/fileadmin/__init__.py:1137 +#: ../flask_admin/contrib/fileadmin/__init__.py:1176 #, python-format msgid "Cannot edit %(name)s." msgstr "無法編輯 %(name)s。" -#: ../flask_admin/contrib/fileadmin/__init__.py:1155 +#: ../flask_admin/contrib/fileadmin/__init__.py:1194 #, python-format msgid "Editing %(path)s" msgstr "編輯 %(path)s" -#: ../flask_admin/contrib/fileadmin/__init__.py:1163 -#: ../flask_admin/contrib/peewee/view.py:487 -#: ../flask_admin/contrib/pymongo/view.py:384 -#: ../flask_admin/contrib/sqla/view.py:1149 +#: ../flask_admin/contrib/fileadmin/__init__.py:1202 +#: ../flask_admin/contrib/peewee/view.py:510 +#: ../flask_admin/contrib/pymongo/view.py:385 +#: ../flask_admin/contrib/sqla/view.py:1241 msgid "Delete" msgstr "刪除" -#: ../flask_admin/contrib/fileadmin/__init__.py:1164 +#: ../flask_admin/contrib/fileadmin/__init__.py:1203 msgid "Are you sure you want to delete these files?" msgstr "您確定要刪除這些檔案嗎?" -#: ../flask_admin/contrib/fileadmin/__init__.py:1167 +#: ../flask_admin/contrib/fileadmin/__init__.py:1206 msgid "File deletion is disabled." msgstr "刪除檔案被禁用" -#: ../flask_admin/contrib/fileadmin/__init__.py:1180 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:22 +#: ../flask_admin/contrib/fileadmin/__init__.py:1219 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:22 msgid "Edit" msgstr "編輯" -#: ../flask_admin/contrib/fileadmin/s3.py:153 +#: ../flask_admin/contrib/fileadmin/s3.py:162 msgid "Cannot operate on non empty directories" msgstr "" #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 -#: ../flask_admin/contrib/sqla/filters.py:41 +#: ../flask_admin/contrib/sqla/filters.py:42 msgid "equals" msgstr "等於" #: ../flask_admin/contrib/peewee/filters.py:43 #: ../flask_admin/contrib/pymongo/filters.py:47 -#: ../flask_admin/contrib/sqla/filters.py:49 +#: ../flask_admin/contrib/sqla/filters.py:50 msgid "not equal" msgstr "不等於" #: ../flask_admin/contrib/peewee/filters.py:52 #: ../flask_admin/contrib/pymongo/filters.py:57 -#: ../flask_admin/contrib/sqla/filters.py:58 +#: ../flask_admin/contrib/sqla/filters.py:59 msgid "contains" msgstr "包含" #: ../flask_admin/contrib/peewee/filters.py:61 #: ../flask_admin/contrib/pymongo/filters.py:67 -#: ../flask_admin/contrib/sqla/filters.py:67 +#: ../flask_admin/contrib/sqla/filters.py:68 msgid "not contains" msgstr "不包含" #: ../flask_admin/contrib/peewee/filters.py:69 #: ../flask_admin/contrib/pymongo/filters.py:80 -#: ../flask_admin/contrib/sqla/filters.py:75 +#: ../flask_admin/contrib/sqla/filters.py:76 msgid "greater than" msgstr "大於" #: ../flask_admin/contrib/peewee/filters.py:77 #: ../flask_admin/contrib/pymongo/filters.py:93 -#: ../flask_admin/contrib/sqla/filters.py:83 +#: ../flask_admin/contrib/sqla/filters.py:84 msgid "smaller than" msgstr "小於" #: ../flask_admin/contrib/peewee/filters.py:88 -#: ../flask_admin/contrib/sqla/filters.py:94 +#: ../flask_admin/contrib/sqla/filters.py:95 msgid "empty" msgstr "空" #: ../flask_admin/contrib/peewee/filters.py:102 -#: ../flask_admin/contrib/sqla/filters.py:108 +#: ../flask_admin/contrib/sqla/filters.py:109 msgid "in list" msgstr "在清單中" #: ../flask_admin/contrib/peewee/filters.py:111 -#: ../flask_admin/contrib/sqla/filters.py:118 +#: ../flask_admin/contrib/sqla/filters.py:119 msgid "not in list" msgstr "不在清單中" @@ -284,81 +276,83 @@ msgstr "不在清單中" msgid "not between" msgstr "不是之間" -msgid "ObjectId equals" -msgstr "" - -#, python-format -msgid "Failed to get model. %(error)s" -msgstr "未能獲取資料。%(error)s" - -#: ../flask_admin/contrib/peewee/view.py:435 -#: ../flask_admin/contrib/pymongo/view.py:316 -#: ../flask_admin/contrib/sqla/view.py:1078 +#: ../flask_admin/contrib/peewee/view.py:458 +#: ../flask_admin/contrib/pymongo/view.py:317 +#: ../flask_admin/contrib/sqla/view.py:1170 #, python-format msgid "Failed to create record. %(error)s" msgstr "建立紀錄的時候發生異常:%(error)s" -#: ../flask_admin/contrib/peewee/view.py:454 -#: ../flask_admin/contrib/pymongo/view.py:341 -#: ../flask_admin/contrib/sqla/view.py:1104 ../flask_admin/model/base.py:2305 -#: ../flask_admin/model/base.py:2313 ../flask_admin/model/base.py:2315 +#: ../flask_admin/contrib/peewee/view.py:477 +#: ../flask_admin/contrib/pymongo/view.py:342 +#: ../flask_admin/contrib/sqla/view.py:1196 ../flask_admin/model/base.py:2463 +#: ../flask_admin/model/base.py:2471 ../flask_admin/model/base.py:2473 #, python-format msgid "Failed to update record. %(error)s" msgstr "更新紀錄的時候發生異常:%(error)s" -#: ../flask_admin/contrib/peewee/view.py:469 -#: ../flask_admin/contrib/pymongo/view.py:366 -#: ../flask_admin/contrib/sqla/view.py:1129 +#: ../flask_admin/contrib/peewee/view.py:492 +#: ../flask_admin/contrib/pymongo/view.py:367 +#: ../flask_admin/contrib/sqla/view.py:1221 #, python-format msgid "Failed to delete record. %(error)s" msgstr "刪除紀錄的時候發生異常:%(error)s" -#: ../flask_admin/contrib/peewee/view.py:488 -#: ../flask_admin/contrib/pymongo/view.py:385 -#: ../flask_admin/contrib/sqla/view.py:1150 +#: ../flask_admin/contrib/peewee/view.py:511 +#: ../flask_admin/contrib/pymongo/view.py:386 +#: ../flask_admin/contrib/sqla/view.py:1242 msgid "Are you sure you want to delete selected records?" msgstr "您確定要刪除這些紀錄嗎?" -#: ../flask_admin/contrib/peewee/view.py:505 -#: ../flask_admin/contrib/pymongo/view.py:395 -#: ../flask_admin/contrib/sqla/view.py:1166 ../flask_admin/model/base.py:2118 -#, python-format +#: ../flask_admin/contrib/peewee/view.py:528 +#: ../flask_admin/contrib/pymongo/view.py:396 +#: ../flask_admin/contrib/sqla/view.py:1258 ../flask_admin/model/base.py:2272 +#, fuzzy, python-format msgid "Record was successfully deleted." -msgstr "紀錄刪除成功。" +msgid_plural "%(count)s records were successfully deleted." +msgstr[0] "紀錄刪除成功。" -#: ../flask_admin/contrib/peewee/view.py:511 -#: ../flask_admin/contrib/pymongo/view.py:400 -#: ../flask_admin/contrib/sqla/view.py:1174 +#: ../flask_admin/contrib/peewee/view.py:534 +#: ../flask_admin/contrib/pymongo/view.py:401 +#: ../flask_admin/contrib/sqla/view.py:1266 #, python-format msgid "Failed to delete records. %(error)s" msgstr "刪除紀錄的時候發生異常:%(error)s" -#: ../flask_admin/contrib/sqla/fields.py:126 -#: ../flask_admin/contrib/sqla/fields.py:176 -#: ../flask_admin/contrib/sqla/fields.py:181 ../flask_admin/model/fields.py:173 -#: ../flask_admin/model/fields.py:222 +#: ../flask_admin/contrib/sqla/fields.py:117 +#: ../flask_admin/contrib/sqla/fields.py:167 +#: ../flask_admin/contrib/sqla/fields.py:172 ../flask_admin/model/fields.py:174 +#: ../flask_admin/model/fields.py:223 msgid "Not a valid choice" msgstr "選擇的值不正確" -#: ../flask_admin/contrib/sqla/fields.py:186 +#: ../flask_admin/contrib/sqla/fields.py:201 msgid "Key" msgstr "" -#: ../flask_admin/contrib/sqla/fields.py:187 +#: ../flask_admin/contrib/sqla/fields.py:202 msgid "Value" msgstr "" -#: ../flask_admin/contrib/sqla/validators.py:42 +#: ../flask_admin/contrib/sqla/validators.py:28 msgid "Already exists." msgstr "資料已經存在。" -#: ../flask_admin/contrib/sqla/validators.py:60 +#: ../flask_admin/contrib/sqla/validators.py:59 #, python-format msgid "At least %(num)d item is required" msgid_plural "At least %(num)d items are required" +msgstr[0] "" + +#: ../flask_admin/contrib/sqla/validators.py:75 +msgid "Not a valid ISO currency code (e.g. USD, EUR, CNY)." +msgstr "" + +#: ../flask_admin/contrib/sqla/validators.py:83 +msgid "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." msgstr "" -#: ../flask_admin/contrib/sqla/view.py:1057 +#: ../flask_admin/contrib/sqla/view.py:1134 #, python-format msgid "Integrity error. %(message)s" msgstr "完整性錯誤。%(message)s" @@ -367,274 +361,242 @@ msgstr "完整性錯誤。%(message)s" msgid "Invalid time format" msgstr "時間格式錯誤" -#: ../flask_admin/form/fields.py:144 +#: ../flask_admin/form/fields.py:147 msgid "Invalid Choice: could not coerce" msgstr "不正確選擇: 不能強迫" -#: ../flask_admin/form/fields.py:208 +#: ../flask_admin/form/fields.py:221 msgid "Invalid JSON" msgstr "JSON 不正確" -#: ../flask_admin/form/upload.py:207 +#: ../flask_admin/form/upload.py:216 msgid "Invalid file extension" msgstr "不正確的檔案副檔名" -#: ../flask_admin/form/upload.py:214 ../flask_admin/form/upload.py:281 +#: ../flask_admin/form/upload.py:223 ../flask_admin/form/upload.py:293 #, python-format msgid "File \"%s\" already exists." msgstr "檔案 \"%s\" 已經存在。" -#: ../flask_admin/model/base.py:1649 +#: ../flask_admin/form/validators.py:16 +msgid "This field requires at least one item." +msgstr "" + +#: ../flask_admin/model/base.py:1737 msgid "There are no items in the table." msgstr "在表中沒有項目。" -#: ../flask_admin/model/base.py:1673 +#: ../flask_admin/model/base.py:1746 #, python-format msgid "Invalid Filter Value: %(value)s" msgstr "不正確篩選器值: %(value)s" -#: ../flask_admin/model/base.py:1984 +#: ../flask_admin/model/base.py:2136 msgid "Record was successfully created." msgstr "資料新增成功。" -#: ../flask_admin/model/base.py:2028 ../flask_admin/model/base.py:2080 -#: ../flask_admin/model/base.py:2113 ../flask_admin/model/base.py:2297 +#: ../flask_admin/model/base.py:2180 ../flask_admin/model/base.py:2232 +#: ../flask_admin/model/base.py:2265 ../flask_admin/model/base.py:2455 msgid "Record does not exist." msgstr "記錄不存在。" -#: ../flask_admin/model/base.py:2037 ../flask_admin/model/base.py:2301 +#: ../flask_admin/model/base.py:2189 ../flask_admin/model/base.py:2459 msgid "Record was successfully saved." msgstr "記錄已成功保存。" -#: ../flask_admin/model/base.py:2222 -msgid "Tablib dependency not installed." -msgstr "" - -#: ../flask_admin/model/base.py:2249 +#: ../flask_admin/model/base.py:2407 #, python-format msgid "Export type \"%(type)s not supported." msgstr "" -#: ../flask_admin/model/filters.py:103 ../flask_admin/model/widgets.py:111 +#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:119 msgid "Yes" msgstr "是" -#: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:110 +#: ../flask_admin/model/filters.py:105 ../flask_admin/model/widgets.py:118 msgid "No" msgstr "否" -#: ../flask_admin/model/filters.py:172 ../flask_admin/model/filters.py:212 -#: ../flask_admin/model/filters.py:257 +#: ../flask_admin/model/filters.py:173 ../flask_admin/model/filters.py:213 +#: ../flask_admin/model/filters.py:258 msgid "between" msgstr "之間" -#: ../flask_admin/model/template.py:81 ../flask_admin/model/template.py:88 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:37 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:8 +#: ../flask_admin/model/template.py:83 ../flask_admin/model/template.py:90 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:7 msgid "View Record" msgstr "查看記錄" -#: ../flask_admin/model/template.py:95 ../flask_admin/model/template.py:102 -#: ../flask_admin/model/template.py:109 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/edit.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/edit.html:11 +#: ../flask_admin/model/template.py:97 ../flask_admin/model/template.py:104 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/edit.html:10 msgid "Edit Record" msgstr "編輯紀錄" -#: ../flask_admin/model/widgets.py:61 +#: ../flask_admin/model/template.py:111 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Delete Record" +msgstr "" + +#: ../flask_admin/model/widgets.py:62 msgid "Please select model" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/actions.html:4 -#: ../flask_admin/templates/bootstrap3/admin/actions.html:4 +#: ../flask_admin/templates/bootstrap4/admin/actions.html:5 msgid "With selected" msgstr "選中的 " -#: ../flask_admin/templates/bootstrap2/admin/lib.html:200 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:190 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:216 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:227 msgid "Save" msgstr "保存" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:205 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:195 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:221 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:232 msgid "Cancel" msgstr "取消" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:256 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:247 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:290 msgid "Save and Add Another" msgstr "儲存後繼續新增" -#: ../flask_admin/templates/bootstrap2/admin/lib.html:259 -#: ../flask_admin/templates/bootstrap3/admin/lib.html:250 +#: ../flask_admin/templates/bootstrap4/admin/lib.html:293 msgid "Save and Continue Editing" msgstr "儲存後繼續編輯" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:9 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:9 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:10 msgid "Root" msgstr "Root" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:90 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:99 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:40 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:49 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:89 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:98 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:42 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:51 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:89 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:98 #, python-format msgid "Sort by %(name)s" msgstr "按 %(name)s 進行排序" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:74 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:77 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:79 msgid "Rename File" msgstr "重新命名檔案" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:88 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:88 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:90 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\' recursively?" msgstr "您確定要遞歸刪除 \\'%(name)s\\' 嗎?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:97 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:97 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:99 #, python-format msgid "Are you sure you want to delete \\'%(name)s\\'?" msgstr "您確定要遞歸刪除 \\'%(name)s\\' 嗎?" -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:125 -msgid "Size" -msgstr "" - -#: ../flask_admin/templates/bootstrap2/admin/file/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/file/list.html:185 +#: ../flask_admin/templates/bootstrap4/admin/file/list.html:187 msgid "Please select at least one file." msgstr "請至少選擇一個檔案。" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:14 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:8 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:17 msgid "List" msgstr "資料列表" -#: ../flask_admin/templates/bootstrap2/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/create.html:17 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:12 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/create.html:17 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:12 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:18 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 msgid "Create" msgstr "建立" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:26 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:21 -#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:26 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:21 +#: ../flask_admin/templates/bootstrap4/admin/model/edit.html:26 msgid "Details" msgstr "詳細資訊" -#: ../flask_admin/templates/bootstrap2/admin/model/details.html:29 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/details.html:8 -#: ../flask_admin/templates/bootstrap3/admin/model/details.html:28 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/details.html:15 +#: ../flask_admin/templates/bootstrap4/admin/model/details.html:28 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:15 msgid "Filter" msgstr "篩選器" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:13 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:14 msgid "Delete?" msgstr "刪除?" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:33 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:16 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:35 +#: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 +msgid "Are you sure you want to delete this record?" +msgstr "您確定要刪除這筆記錄嗎?" + +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:33 msgid "New" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:43 +#: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:43 msgid "Add" msgstr "新增" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:3 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:3 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:2 msgid "Add Filter" msgstr "新增過濾器" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:30 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:18 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:30 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:14 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:19 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:26 msgid "Export" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:38 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:38 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:49 msgid "Apply" msgstr "套用" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:40 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:40 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:51 msgid "Reset Filters" msgstr "重置過濾器" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:66 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:59 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:64 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:80 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:93 +#, python-format +msgid "%(placeholder)s" +msgstr "" + +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:88 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:94 msgid "Search" msgstr "搜尋" -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:74 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:77 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:78 -#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:79 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:72 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:75 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:76 -#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:77 +#: ../flask_admin/templates/bootstrap4/admin/model/layout.html:102 msgid "items" msgstr "" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap2/admin/model/modals/create.html:22 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:23 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:25 -#: ../flask_admin/templates/bootstrap3/admin/model/modals/create.html:10 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 +#: ../flask_admin/templates/bootstrap4/admin/model/modals/create.html:10 msgid "Create New Record" msgstr "創建新記錄" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:77 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:76 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:76 msgid "Select all records" msgstr "選擇所有紀錄" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:120 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:119 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:119 msgid "Select record" msgstr "選擇記錄" -#: ../flask_admin/templates/bootstrap2/admin/model/list.html:185 -#: ../flask_admin/templates/bootstrap3/admin/model/list.html:186 +#: ../flask_admin/templates/bootstrap4/admin/model/list.html:195 msgid "Please select at least one record." msgstr "請至少選擇一筆資料。" -#: ../flask_admin/templates/bootstrap2/admin/model/row_actions.html:34 -#: ../flask_admin/templates/bootstrap3/admin/model/row_actions.html:34 -msgid "Are you sure you want to delete this record?" -msgstr "您確定要刪除這筆記錄嗎?" +#~ msgid "ObjectId equals" +#~ msgstr "" + +#~ msgid "Failed to get model. %(error)s" +#~ msgstr "未能獲取資料。%(error)s" + +#~ msgid "Tablib dependency not installed." +#~ msgstr "" + +#~ msgid "Size" +#~ msgstr "" + From 16f3462f6afeb364e88f744a7b5220a0f6b94d5b Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Tue, 24 Sep 2024 22:14:15 +0100 Subject: [PATCH 136/156] Update some translations --- .../translations/de/LC_MESSAGES/admin.mo | Bin 7558 -> 7607 bytes .../translations/de/LC_MESSAGES/admin.po | 3 +- .../translations/en/LC_MESSAGES/admin.mo | Bin 5793 -> 7374 bytes .../translations/en/LC_MESSAGES/admin.po | 55 +++++++++--------- .../translations/fr/LC_MESSAGES/admin.mo | Bin 7292 -> 7349 bytes .../translations/fr/LC_MESSAGES/admin.po | 3 +- .../translations/ru/LC_MESSAGES/admin.mo | Bin 9190 -> 9248 bytes .../translations/ru/LC_MESSAGES/admin.po | 3 +- 8 files changed, 30 insertions(+), 34 deletions(-) diff --git a/flask_admin/translations/de/LC_MESSAGES/admin.mo b/flask_admin/translations/de/LC_MESSAGES/admin.mo index 622816cc6f626343f8cf826ab1dd44196057f918..70114ef95ba842d1e0534359dc3f4d0fac883f28 100644 GIT binary patch delta 1839 zcmYM!duYvJ9LMqRjx)y`8|K)IUCxGG*bT{LBsP(2E{RNGlxeo6Etx-#KZa<@C8@c@ zlqLRQVl}zsepxalT1KI@gf{FCrg?wtDW`MJ>$&`%=lMRj-`>3Id7-vw?=j<3$}gT@ zO+V%Se|q|xspt<5#4w-PU>t<u7?0C11+%aaC*T3h#2d~IoJ&4tfEis`Ar3bSSrLge z3U)fr_Ep$pq>a5pHE72n_!Wm@uPYxKVHQb#1nT)zq+`o=`2x%)zX+3Xm-7UA8Q+>n z_^G&!8sHhm;#*9{pQr$0nf@3|#Icx<DOl|CHK+luxbhYpP5vj2!Z-#=#L1|3D=~@j zZ3l@AJdSaA2S;KnMq#%zd{AFU0aQS_=*20ht($>CT!RXv3i(<se=%5((RkC9zrfHi z3ff3$kGoJEb~}H&a;>k2axba_9|mxw%jaN_{2bKGictOTMGai*>M!GB@-3*92u88~ zI!v>eCX=+KsJ&Z@JY(gkfI`k{)WG{uD|H&R5{;<9ZlT(>ptkZoW??6e$0P>RmM+8~ zZX3+{XOcKbfdXhko$7}!-;C<;4QhqjQHSg^a{lZ)>iHg2ARb0#(JTV>Tnwr{5!L?~ zSD%X<E1MZ|74uxh3akk;TkrB;IO>|&FJ~kfbri%on2EZ6WjG%%;B@T5Jj`Mr)?hJe zz`K}=%{T=^KS<<~$Yfo$ck56y*^O$j549zSQMaNVHS=4@81@MDTq|lzKA~pbi<8ht zW36zWa|?1I>=@EMWM@dI;|5d!PjMoCMFo<~2};LwRQWQ@!D^SkisQ()qb3qfXL<qU zqpoWu>I~GP0(ykHmOcN<+5g}Ovjhs3pzd`EvM6>0^`bfN>Kjo3y+ZBjThulCfC``= z)7J#Dk=?Up$RgNA<PqE9$`2v2+FA57zBQ6ihxbsY{R!%@J$Lz+s0Oc*MX_(F0K<7n zq+uLtMP?(DvU1db`%yEk!&UeIwf70UjnuvXb^dHM3BFd$pCaCant3g1Z!aNVyT+e7 zZb1e7*_C&q+C}mfQUEEafTp9iY%40zQ>Y2tM_tF(c=lh{#mD+<<^kj;Ssdz=XP^fs zqYm9v=WNvT3s76K6xGivS6}2TL9V`4I;&mzQI|iNz){se7aKbIkM;P1%QqL5ZQs=3 Zi#X@^7i_55Tw1lEqAFO@P#5?(;4i;ks_Os% delta 1819 zcmYM!e`w877{~Ev*R@}lyX$T<W1IOgGd5iE^CqT|8cA28NVMcOKa)QUT`|_;AI*{# z*|bEW+(l@}e-et>$gGB#OyeIWl=r85%G$lJ?|Hu8bIx;~^F8-g_;@(h6ZAG3e>?c( z@u?l6*8ji$WHW`nVmf}u4E%#baafAkd<<e4uD}r1U@2a8zQ(1rlT-QVIm|YTS%iyX z0#WCw#0|TR^s#5C4qX_)9vp!KE}oQ@crFzg&;qVK38&GXhGTJ~^ALJzpF<z>TMHK& z_!{QmeH@2fsEL2!MAY(&pa{ofrEBj*O>o-9+i(KyE*yiuu>f;?iGFiX&#%W4=C}P^ z<l;pfjqT{iSI$qUfqtM83Jy!GAQ!b|1z3n-)W92%e>=$6NUX;oUU2a^X3~CuG3{*! z7b?js=UY_#9eVI1YJks}g@0Uo#PGz#6HygeiW+zuYT|?Legm$g-G-`!ht=sF8t13} zEXqOzw08@UXDotBXtQ%GYT{~Cr4FMi(S%B@8P%^1wUrOC3}4_>Oky@|X&DycDlEm_ z8Ps11oFkyO`7)|~9W~%xR3#pvUdAWLduK0E&-b7b`G6F~zM!5PboZ5w#!E)s4<fIV zjdk&on7c6>PbQfyaqVZk;#yg^a{x7vhu{+QqmJEbT#hGj0d`;*GuVgqSc#gj6(`|! zoQs_}17m*bs=Zr;TFDkvhbU@G_M%QjJ!<96?*0|jR<xm3{1j(lC#tmRbe40G17KB1 zZng_G-VtQpm^E=RlR!Hvfp0h&f4X=fZ_;$y5!7=>aSGl<t)Le}7-Uo((+bqyM^Oo# zK^@1(E<S+ywDU*lIJ5s@E~tiWMyhQ4P!H6h5^6>5^;OjIx`9gIIjVAhkzKPw%E96- zgoJDvD!vKH(RQP@unsj|1A3X?&T^rb?7RZlg6ePyDT3WYCD?(**oUe}fFBDMV~bG} zu0ySK53a>V)SmaF`e*VZqJ)Z3zbEtfiYenYTxjJ{)ZQOJ{_PlF8n_vi@f{a`fa=$c zO5i&xp)`Jtv_<n#iEc+N;51IfE2vY@iCXCUJnGL$u|5JS%^-TvOa1k-r8onq4!Ni; zDL@TW<nGUOhLIz070!r@Z*lEv)I2q4<yBQy9`~f=d4?>qiiTcacDy33))#-1)t&ke DwUDI3 diff --git a/flask_admin/translations/de/LC_MESSAGES/admin.po b/flask_admin/translations/de/LC_MESSAGES/admin.po index 32aae063e..629105f1d 100644 --- a/flask_admin/translations/de/LC_MESSAGES/admin.po +++ b/flask_admin/translations/de/LC_MESSAGES/admin.po @@ -432,7 +432,7 @@ msgstr "Eintrag bearbeiten" #: ../flask_admin/model/template.py:111 #: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 msgid "Delete Record" -msgstr "" +msgstr "Datenzatz löschen" #: ../flask_admin/model/widgets.py:62 msgid "Please select model" @@ -596,4 +596,3 @@ msgstr "Bitte wählen Sie mindestens einen Eintrag aus." #~ msgid "Size" #~ msgstr "Größe" - diff --git a/flask_admin/translations/en/LC_MESSAGES/admin.mo b/flask_admin/translations/en/LC_MESSAGES/admin.mo index 17ee0e6b42f1cd62d6a99ded80ee3b3ed9bff6f1..3d29f3a95649f3249c4a02eece5d0a3c2def1f31 100644 GIT binary patch literal 7374 zcmeH~U2Ggz6@YI;8^CSTHk3k|3T~XZw&l#$-u#fP>o!ijX-(tA^-oGrBsAH%yF1D3 z%rY};XL&$<fTD=<K>1S(6of!3qz@oK{0NYEpioLBBDF;-RTZQ{B>DmZ+9HbJJ2Q9J zaqZCZhJ-DzzrAP9oO|xM=bU@}{Km^aqxgyW+{EY6H_2$}=hinXbq&KYD37LK54_vT zkHae%2XHTpp#vX<Bk)<c9bWa8oO@xJaTTr?J@|I`ZP*VVxBRn}Z+fdzm{7Ms(SHxT z7TyN0gGa2~g;z7KL(yM=V)w&#{ApNV`~~=K_=M$)@N&jivZyQJwNUKe1m6K2xCNG> z%wL1sU<mu*r(iGqfgL{w#r`^siM$tXg=M%I`tV)wqxSh%q3Hh{4#Ep?6TI#!rEY{n za05JOIS<8-2gRRzq4@tXDEoIm)bQ(2?EVt+tNzHJ8{o@uBiul+M7{;S4Hls6?|vxu z4qD!2<<oE-@;SHz-UG$X$6*mZ46ldhto#p9GyXf2INZo0WS%i7e%uW;tivgI21;Ch z10~;Hf`me?XCV8y5n@UWK=E(4<tUVS_d$u<Je0UZQ2bkf^4=LJ`}#TPz(?Q^d<M$? zuH&JG+u+Tx47bAoiXRU`$@8z-@mVN#zXv65KZBBYk3&*dor9wPEEIpvLy7kVD0+Xj z&tHXNe;vsz&o@9)Qf-DJ@3Zm|_=(HNdx*>GS1eBEeGZax>O2(ri%{nM2b6lejG)VU zN8t$cp{(okmcM{y#(#t2=P1FHc<+b(@O_r|TKOYT{Qn6Q{l_3nP)|Z!Q_oxZpP<C& zWhnYrU{vg0%^w+Wg#|bSB~RaP`5`F#`w*1%e+i2Hvry{sM^N_bDJb*51h>I|!amqb za!J1331xf=iv3So`M03d<5N)T=oKh=cRj}Cy&X{Wk3y-(1t@v-WhnLdLr7|>r!8NA zV&^YV{JG|xx&JpnsmIMw!#z;!9)q&aZOGK>KFC(7FIxFGAzPt-3?&ZdET6IbEtGvf z52YSofIHv?D0VjEY!Mb9p;s;x`2y7N43u?#1Ij#4Lh<8w_W3Jtit#2ED{-ko$*cRI z?8j#zp;ljkvcKPl;^$+QPe7UX*AP?c_fX>UFDQPjCs^{{CMf&b4;{D%4#6sv{e1vx z_#JpNd>TsLz6!;UL4qrJz6;8D6pGzDpu}e$N}e5qQjaba{gY7qX+qhDMJRe7vCr>^ zV($U_{9!2dc-G3lYvn(Ms&AkfxD`{60?)*Qi5mAj`RIdwkeXPH2eEOzwl=5zBuxrx zyx9!eYCJZ&9kq1QvR@Y6Fx6?KJrkJJ=;Qr;1EJe6gURuJ9h*ukPW%NEv~T~f-h6%S zgy|}&@nnuD_LA3sBdwdn=&B!>H>B(*)-;w=9T+!BHA`zX20iVkrlB*154QZ+5VqAc z673SB*jSwdZdfsa0%4SD<N2ArEL4S#G-{gIC5lm~Lq4X_OxxOHib@*AzDd-9x*OI^ zA_4EjStsrSaY$N~ib;}cD+t=y3;dFv3>VzM_jDy{G~Ccb8ilC|Q+0ryO^t<~u=d*> z!C|wgXR@%WiELLbmJ4ssr9OTV3eQj66M<op36r{hkf^R%-AksqX?-y1)r)Sj%u|~- z@><6WT@mkAn(aQ%GHu24G67Zcr{kr3_rn@-$|qOlIF4fW!}W4;o~8vWCyFAjtPC(3 zr<+lX^$a>~H;t@GIGC_eDNAaKhAjUei)TC7plltcyM65vt{CxwT3ex&r*UCb6<b=J zJh+4*t0f68Gv%whXd?Uk4NR1)B&$0U8?n6lS|k&*3S0egtLaH{ui^ndOGI;@d$s$T z)<Z{H_WaUWWHrgORc)-EI@wE|I%NlCHukU83?kRdhxvC&kY%}!s<g^GqlQtF)K)F_ zDcEe2C3+1C(yfssJj_e+Kt1v+M6VLH0xwIQN@U`SyqzoL7WGj#Xk|f0+Pc`lduNXv z?kZQsQ*)Y{PN;|FV#&@zS0s_`4pP6tHbrs6P1Rkdtq#%P)nU<~^3~yp-&DIgcW83< zh^C9P?UgoedqxkKLam_ZXD7Dn^8Czpec<r1!NRh4D%mQRi=u$y%U|uKW%h2@y<4lp z!#VlFSFB9aC$tyQ;j$(vM-M_1H~d7FNV^Dqsj_Kl$VTU<fOb3WHwyFo`;Q7X|6XIG z!O{XXleN7S9$4{;yvs`*e=env7aa<H18jMi(l7Gq6TN6S9WL(LOTF+?*0N47lgV~2 z)wmr?-saC%<mn7YUuqBbM9oA|s%ELx?2qPX&~omN6Y@IQEKf3_92b7rGTOFMHEZ0s zQU`MOQei=7F&$C9HZ@Bx)F;|Y9?o8LIN84FEpLq7=0>qB)6V;iC+#7LD{_WVnhd;z zVD>K8&EnH-KzTP&bF7K=@Cl>r<W967YF4UKIk5^TP}5c4P>{9>aB^RqQF7cD)O=`8 zH}gA3R^WQEF6GxbPpWa$SX%IW);lEPMrF0Ej`~Zd>ODSL-nqf3W1Q<JOuA@Hs49fq z^}|GEN5A6k;Bu7KvhzB|X*X0jA4tK9SBa7`>AWo8y9ToQk=HYo&Pz#yT{G6wbR3;z zLC&P-95vk2qOhcOHE@$tj_Wo2uxG}|spd>2HQ#ggw`z$q7nO8*YJBq0zVV5Pneyyx z&-9TwC%aGZx-&t4FX`fNai=r9*D3DQ#bRlA@6hnb@Gy$bj9Ktyny%i+E@ybBQ!MJ@ zNNLw@zN2@Do0c;dyI~Tz+<Hp75ucQXaBE`Xnkk%$=u7)*4UX9Y7n|GA4{I&DY)PB& z1M{=pu`_4f2Hu7>!d35?4qCArI0tEaNlAyzY?zD{M|J*nY#`KI#`MVGXwTH-RCy^P zBZc7}dvS8+XsRWh(sFO%?(B!7a$kt4t+7^Gb@nXjiThO(JLQm;NjaAEo)doBbB77D z3m(zr6yNWjFo7->Ms_m=9b)Y|eyRT|QYq2AxvX8s&DwQ*?K;lElKqpBACIfwx8*qO io`x&`^H{r%>;Jv$_~P1qJilG8-N)DN<Ns&(@qYvSzxz%A delta 1683 zcmc)J|7*=r9LMqZHq4#7?QS+>WS{vO?#B3mD@(DZWt%BcGP%vomVJ{^(p>Qa@}+c; zG{q0LlwX*l{2(dc%9nikNt;YU<_G*>k$AqgQ~m_Ev(Mwa&*yy3`F!5zy(h7YCCUEW zQKyaH2L7h-_cB${zu&RZW@&`SF#}IxHg+M+u5gLrH7vnFEW^SvW>Kv6?!ijpZlu{D zmwdCNeWx><fl&JJfR!Q5R&mk9H5kG5KHi2jYvsZMwi`?F7#86z?`s@I{0j@v#+ntw zM4X9BaT@#E7C&$hwZP@!8)gr2I`JS*#z@F)Dn@Y{u13vo#W{Ea3-Kmq;S28o>iMsz z7s@1!%5*LU>~HhwXrVd`V>?d3PRzwqe!K_A6JJLy^uYTVb!yL1^Iu^ee)REg42UD+ zMqa!O6|ci&4V_(d^ksKZDILH}971h0hPRUAP)8C$ZB&4oHy3q8OK=`mVSu|Zif53e z>@I5lQ&dg$g~>n1V{aKC%k~MWANz*dXb5Tchl}Qgd0GqQp~eFwt5)L27yI#*cszxS zqBiR1JV=5Kpo;ekYM<X(<X_dB#%KwaqpEj1M)AD&5vqEBpkAz;&sC->a5irA@d4C} zo<+^OfHdpz@lDkI+o<R7C+U>Z=|j~(IA_EtD&^Iv>RpS)*o3Oyqo^Xh>f@KF=YRU~ zLe59UTaGHeIO>QyQO|Xu<|l8{nM3Cds(M3I7}>EI-bJVdR-j&JGpc$UFu?t&g)X9w z<PNHMpCC)xdp|yeG#gE2YMn_VCT%JmRqu4v1GA83F(21rKpaQC`2ina!W!axs4vSS zpGxT>E*!g6p*Gs!-Gn-lIBK6p%+&w?UOHsoj-aad90qs~RRbSzxajySEgYbVsuXpW z3sJ?p6jf9!Q5#jEGE#?{SC3jJ;m3DiNN2mx-#F}VoWkDf^nEGr+t~U@MWQ*;k+2b# zTZJnN=ey6L4A&jn?n*Oay)NTmidzt_bBDsWimID-c35q^C1JH~w2mMi?2b1#Z4DY4 z+nO2@?pbDwYs_-4AbYNB&#rXuvWwh|NU>{<#N3TYWp8TEqm<s7^v?gVw@b}g_7~OW B%0vJF diff --git a/flask_admin/translations/en/LC_MESSAGES/admin.po b/flask_admin/translations/en/LC_MESSAGES/admin.po index ef93fa2ed..07dca4974 100644 --- a/flask_admin/translations/en/LC_MESSAGES/admin.po +++ b/flask_admin/translations/en/LC_MESSAGES/admin.po @@ -69,7 +69,7 @@ msgstr "File uploading is disabled." #: ../flask_admin/contrib/fileadmin/__init__.py:933 #, python-format msgid "Successfully saved file: %(name)s" -msgstr "" +msgstr "Successfully saved file: %(name)s" #: ../flask_admin/contrib/fileadmin/__init__.py:937 #, python-format @@ -89,7 +89,7 @@ msgstr "Directory creation is disabled." #: ../flask_admin/contrib/fileadmin/__init__.py:997 #, python-format msgid "Successfully created directory: %(directory)s" -msgstr "" +msgstr "Successfully created directory: %(directory)s" #: ../flask_admin/contrib/fileadmin/__init__.py:1001 #, python-format @@ -153,7 +153,7 @@ msgstr "Failed to rename: %(error)s" #: ../flask_admin/contrib/fileadmin/__init__.py:1119 #, python-format msgid "Rename %(name)s" -msgstr "" +msgstr "Rename %(name)s" #: ../flask_admin/contrib/fileadmin/__init__.py:1155 #, python-format @@ -184,7 +184,7 @@ msgstr "Cannot edit %(name)s." #: ../flask_admin/contrib/fileadmin/__init__.py:1194 #, python-format msgid "Editing %(path)s" -msgstr "" +msgstr "Editing %(path)s" #: ../flask_admin/contrib/fileadmin/__init__.py:1202 #: ../flask_admin/contrib/peewee/view.py:510 @@ -209,7 +209,7 @@ msgstr "Edit" #: ../flask_admin/contrib/fileadmin/s3.py:162 msgid "Cannot operate on non empty directories" -msgstr "" +msgstr "Cannot operate on non empty directories" #: ../flask_admin/contrib/peewee/filters.py:35 #: ../flask_admin/contrib/pymongo/filters.py:38 @@ -324,11 +324,11 @@ msgstr "Not a valid choice" #: ../flask_admin/contrib/sqla/fields.py:201 msgid "Key" -msgstr "" +msgstr "Kwey" #: ../flask_admin/contrib/sqla/fields.py:202 msgid "Value" -msgstr "" +msgstr "Value" #: ../flask_admin/contrib/sqla/validators.py:28 msgid "Already exists." @@ -343,11 +343,11 @@ msgstr[1] "" #: ../flask_admin/contrib/sqla/validators.py:75 msgid "Not a valid ISO currency code (e.g. USD, EUR, CNY)." -msgstr "" +msgstr "Not a valid ISO currency code (e.g. USD, EUR, CNY)." #: ../flask_admin/contrib/sqla/validators.py:83 msgid "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." -msgstr "" +msgstr "Not a valid color (e.g. \"red\", \"#f00\", \"#ff0000\")." #: ../flask_admin/contrib/sqla/view.py:1134 #, python-format @@ -373,11 +373,11 @@ msgstr "Invalid file extension" #: ../flask_admin/form/upload.py:223 ../flask_admin/form/upload.py:293 #, python-format msgid "File \"%s\" already exists." -msgstr "" +msgstr "File \"%s\" already exists." #: ../flask_admin/form/validators.py:16 msgid "This field requires at least one item." -msgstr "" +msgstr "This field requires at least one item." #: ../flask_admin/model/base.py:1737 msgid "There are no items in the table." @@ -395,7 +395,7 @@ msgstr "Record was successfully created." #: ../flask_admin/model/base.py:2180 ../flask_admin/model/base.py:2232 #: ../flask_admin/model/base.py:2265 ../flask_admin/model/base.py:2455 msgid "Record does not exist." -msgstr "" +msgstr "Record does not exist." #: ../flask_admin/model/base.py:2189 ../flask_admin/model/base.py:2459 msgid "Record was successfully saved." @@ -404,7 +404,7 @@ msgstr "Record was successfully saved." #: ../flask_admin/model/base.py:2407 #, python-format msgid "Export type \"%(type)s not supported." -msgstr "" +msgstr "Export type \"%(type)s not supported." #: ../flask_admin/model/filters.py:104 ../flask_admin/model/widgets.py:119 msgid "Yes" @@ -422,21 +422,21 @@ msgstr "between" #: ../flask_admin/model/template.py:83 ../flask_admin/model/template.py:90 #: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:7 msgid "View Record" -msgstr "" +msgstr "View Record" #: ../flask_admin/model/template.py:97 ../flask_admin/model/template.py:104 #: ../flask_admin/templates/bootstrap4/admin/model/modals/edit.html:10 msgid "Edit Record" -msgstr "" +msgstr "Edit Record" #: ../flask_admin/model/template.py:111 #: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 msgid "Delete Record" -msgstr "" +msgstr "Delete Record" #: ../flask_admin/model/widgets.py:62 msgid "Please select model" -msgstr "" +msgstr "Please select model" #: ../flask_admin/templates/bootstrap4/admin/actions.html:5 msgid "With selected" @@ -454,11 +454,11 @@ msgstr "Cancel" #: ../flask_admin/templates/bootstrap4/admin/lib.html:290 msgid "Save and Add Another" -msgstr "" +msgstr "Save and Add Another" #: ../flask_admin/templates/bootstrap4/admin/lib.html:293 msgid "Save and Continue Editing" -msgstr "" +msgstr "Save and Continue Editing" #: ../flask_admin/templates/bootstrap4/admin/file/list.html:10 msgid "Root" @@ -475,7 +475,7 @@ msgstr "Sort by %(name)s" #: ../flask_admin/templates/bootstrap4/admin/file/list.html:76 #: ../flask_admin/templates/bootstrap4/admin/file/list.html:79 msgid "Rename File" -msgstr "" +msgstr "Rename File" #: ../flask_admin/templates/bootstrap4/admin/file/list.html:90 #, python-format @@ -509,12 +509,12 @@ msgstr "Create" #: ../flask_admin/templates/bootstrap4/admin/model/details.html:21 #: ../flask_admin/templates/bootstrap4/admin/model/edit.html:26 msgid "Details" -msgstr "" +msgstr "Details" #: ../flask_admin/templates/bootstrap4/admin/model/details.html:28 #: ../flask_admin/templates/bootstrap4/admin/model/modals/details.html:15 msgid "Filter" -msgstr "" +msgstr "Filter" #: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:14 msgid "Delete?" @@ -528,7 +528,7 @@ msgstr "Are you sure you want to delete this record?" #: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:33 msgid "New" -msgstr "" +msgstr "New" #: ../flask_admin/templates/bootstrap4/admin/model/inline_list_base.html:43 msgid "Add" @@ -542,7 +542,7 @@ msgstr "Add Filter" #: ../flask_admin/templates/bootstrap4/admin/model/layout.html:19 #: ../flask_admin/templates/bootstrap4/admin/model/layout.html:26 msgid "Export" -msgstr "" +msgstr "Export" #: ../flask_admin/templates/bootstrap4/admin/model/layout.html:49 msgid "Apply" @@ -556,7 +556,7 @@ msgstr "Reset Filters" #: ../flask_admin/templates/bootstrap4/admin/model/layout.html:93 #, python-format msgid "%(placeholder)s" -msgstr "" +msgstr "%(placeholder)s" #: ../flask_admin/templates/bootstrap4/admin/model/layout.html:88 #: ../flask_admin/templates/bootstrap4/admin/model/layout.html:94 @@ -565,13 +565,13 @@ msgstr "Search" #: ../flask_admin/templates/bootstrap4/admin/model/layout.html:102 msgid "items" -msgstr "" +msgstr "items" #: ../flask_admin/templates/bootstrap4/admin/model/list.html:23 #: ../flask_admin/templates/bootstrap4/admin/model/list.html:25 #: ../flask_admin/templates/bootstrap4/admin/model/modals/create.html:10 msgid "Create New Record" -msgstr "" +msgstr "Create New Record" #: ../flask_admin/templates/bootstrap4/admin/model/list.html:76 msgid "Select all records" @@ -616,4 +616,3 @@ msgstr "Please select at least one record." #~ msgid "Delete record" #~ msgstr "Delete record" - diff --git a/flask_admin/translations/fr/LC_MESSAGES/admin.mo b/flask_admin/translations/fr/LC_MESSAGES/admin.mo index 06d895af67b6eda1689ede78442928be577a6067..3fb13d650b0b3149dc44f7c29a11a44dffac4651 100644 GIT binary patch delta 1748 zcmYM!Z)nX?9LMqR%*@6xn{nOYH`|Pvac$b2NtSK-Hxv24TH-RgEO(+Lca1O}3?VYK zR<pA5XLz6+k;rN#l04y&)Y=H;fhOLcI^}lneVude@0{~J=X}o{3O*=}ejGpiqVcNd zlgXzxUbX+Pwh?A(x`xTvj$^SK6EKFQ_zdUZ5C$+m(X0S#oh?{N{UP#*4dDc{sKt*o z%cH@EG*~(En{7lrScl_qC#K>d*WQ9D)X$=xzmDqP>FO~or2ZVI;ZJ8;lG$+TML3H2 zEl5EVRNzEhk6E}E6+kQI;w7ApF<1YD8aRP%QF|_C<1+MP7^mVX_xnxM^Sw9=`_aez zmOjdCG8W<(T<+Y28fX_PkYlLGPos{i6+P@m4cv#LaS$``H;%_t8r7b|R~iOT<5Xf) zg%uQZ#x*z$*P%LYz;xX0>POL|eh#(bd#H)tx%L69rk=vNXysc`xpEkZ#ZIG+=o0d_ z?iBW40X(86pP(jujz0W=TKP{@K);c<rLavpGC$720-TLoP)BzHJ?z2)e1!_&mvb0V zX`C@**?+A(lLjS`hvbRPL}hmX6+j8HI9rT*ZY65Kb*{Y*Ne2tN_Jgjy8PCLVRH%M_ zGFVBR%@?uQf+z)btiUQ<jU{*y7hs>O$FqFZ%WxI$M-BKGJ$!)y{DR6Q9|x`9i%|<$ zgxdP0sNC6%nm2lof;u!I329f+!%oyryhPpa*Ql*d=6vR25H)Z;>ee)%j^rdx!pj)M zyQt^-u@JvIJ)$Yr{jZ^*0gvN6yzl&sx=tBnn0{Y~THzkd!8TMtPq7@oVLk?khTXPW zBxVbvhfSzJ+EF{xg;~1)cPMD$H<*X<gs%Z+;}k4ICF5pP4m2WfYvM~eas`z`H&6q2 zxcV*BIJc3Z?Fka2y+<YMSIpJ@pUmjGE=y2nQ-{@f1a-}Nku<PD)QbM10!!oEG;jd5 zvgN3xT!ZRYi`u~`>L@#K26m(7dy7%>#ePsI!UX<pbX`hO5$;6&Q=LccPz)8oAQFSc z5v}_BQ9DqG+L8IF34^F>UGA(xW&KLj_1lt3Jj%j)8njgr)JmJ37f>BKds;^PiA(g> mhPF3EcJxF?4kV{~;k?kkNNCsY#siVi-q5}SJ=@a!N&f&`$DV@# delta 1706 zcmYM!OGwp06vy$S`7Z6MscCB0OeNnJGauDLB1L>HiZBY2UWzDTLMkn85QM!1p$J2y zKqN?zQhU&<O;kwHLWr=SNZbfUVi;xi{pCP%y`P!!|DQQ?=8ThNzf1j}VuEfOKh69m z^LucedjEf}g_vpRI!0hWZp1+h#!)Q8hnR=+=)<H?vs|oo_TYZ{Bgi8*k8x&xTcnZ2 zKzP`{0rMe4R)u=70X=vKqp{hI_n@A;fJ|h)u0MqN^ha<jPCJ({h<;qS*?LSu59?bd zjRXctFbx|}3wK}!cH=f2a{cG1iRavSC}~NjpN(6v9#gRu_1<OF^P{)}r!WzJU=r(_ zhj5}W$61b=s2UZ>DOBWbs3Yn?FZQ7(9>Wdz7UOXSV{p-phw#T(`mv~avYff-*V+1L z1Y$Aj#ZugaHLl-;UizJ=9o;}J^w^ER!8-a2sGaYPT&t0zNDS77I-+jmV|{!nkikgu zuf|;lwBQITHP28xpGE~VgM4g(FV(^d=3x|R%fUUUqiaDgUcp?vj|$+u^DAneZ>Wv` zi6Z|hqCiTT`mhL8RmY+NNJKVeUet4Ws0oYRcm+}hR`13e-S|no8o*JZ-diDR6>l(K ztZfOX_cHx7DrppA33g#Ij=BD<>!*;0TE-8cCcJ}QyoWw~g-Q6!{XL!o*9KBisn0;w z&TiDgjY$2O|2PdVjdoN9`cU`z7AnQ>umD$46Bckzx-Gj<M^TTP@fen3H|n_un2%4K zbGVa!Jke;r8Z6ZPKfl(nQPeg1=pG25!n89VZpRa-fO@e4A7M5wBU!d|q9R5sLN8XK z0%<{I><p%17qYMoV3zLxYZ{v1JEmYD+ffmEQD<L{e5{Hu)kYJlcuu1xZgu^$sCmvI zQ`sdXHXA|}=_Km^$!F9p31yLF-TzD)b+`|8z50=3w+YmaUZ4W|fSPz2wKER~u3}6; zy_b&4U?u7(TQL(mQ48Ki%EO*w5l*3B*F^tq6k#6fKh$AViY}r8m_XLFm#7K8pfa$8 z%E(XDf~%<O97d(dNL01QpsrmSs`v^}nJP;rLE33G1M&#!h4%4*kd=V(;jr0=@!{C$ F@V}iLl3oA+ diff --git a/flask_admin/translations/fr/LC_MESSAGES/admin.po b/flask_admin/translations/fr/LC_MESSAGES/admin.po index 9189a55ab..ce25c6681 100644 --- a/flask_admin/translations/fr/LC_MESSAGES/admin.po +++ b/flask_admin/translations/fr/LC_MESSAGES/admin.po @@ -432,7 +432,7 @@ msgstr "Modifier enregistrement" #: ../flask_admin/model/template.py:111 #: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 msgid "Delete Record" -msgstr "" +msgstr "Supprimer l'enregistrement" #: ../flask_admin/model/widgets.py:62 msgid "Please select model" @@ -596,4 +596,3 @@ msgstr "Veuillez choisir au moins un modèle." #~ msgid "Size" #~ msgstr "" - diff --git a/flask_admin/translations/ru/LC_MESSAGES/admin.mo b/flask_admin/translations/ru/LC_MESSAGES/admin.mo index 07a8cd868baa72b31878cf3fcc061cc54e64d2e3..c65ce7a408ff5c3c0d0fb66a8ac08b94ba360716 100644 GIT binary patch delta 1832 zcmYM!duYvJ9LMqRj<e0!#axb=V>{c9A#8Kmh0J|7qlqbFf2a+~Wh{|Poqv{PM3JVE z%OA);!u&zzR<wv@C9&92h6#<fKbUxb+EY&F{9e!V{C>aZ@_oL~=_)!`9C|n0d&2l^ z<LBphc#vxUKm8GAYWjmiFf7t64x=#~{WuF#aVl2gG;F{r*y8+*1=M|m&FIQ1ag<re zswhmLVUP3tzzuthyki}x7e3-J{D$%P*R{t-nZ-~~Ks}$1bZi-}z8Ev8FU4fs=RAd8 z#<$xPhH~RRYJjIW8sB0H_M#>*n&k&E3CH6iOvO#Eei${tb=Tg8Y1DghERJE2B+N#= zSB}YyZ@Vc>!bTi}4=@qiF&6ur;n4#fjYLf-3%!_&+PXOyzzWnv_99<v;^M<gI2`Y~ z_7@l$LBl%=+T$On4*Q(HUAyAzq1}t>AQDGnqN`_Ofciqz%BoQP9zYG;<nCX?Wz^eH zkqE>Re<jmAmdPTm47GP_k!NfNYC<7r9cti%s7RebMdBuEV)sz*wV}4M6Q^PiPR3*g z)0UQE0Jp{w|0xuX(4Yz2MrC!Yt3N|^_!<?VkEkU3g5;n5L_Ob+nuv!{37SQrp7WvZ zC!zWey8Bs3T3LR`-6(Q5R^qELvvtVV@>te5EJ5w@M$}5{xKv;xF2)|r!yMvXf;Cu* zx9|;y6E;n(6EpBDuELO?crTz(iwe~ZRPww>qGld8P+1(0>6ndbuS8|_W@PbJk3noi zO|S*$;d9gk<2X|KpD0Hy><CWK`9DiR$Eg)H&{r(R_=JHKufe6%cVj+2#BB7C0IKKV zblin%zl^i717~6)M=2M}a2D3%e0+ctb^bjpV>S(wQU6>UP&siD1Ng|bcOi?h1olA@ z$iyt1i_5VF7vX)>mU+1-qN%9lTaJqCe$+%y<6y?OHVWFCc2p95LjE)CyQ}{~y%@%s zQG`-Z$ESeHe5^)=_yW$rZX~pp#7l~7As)posQ;OMR6pqf;;#pmP|!-YBa5{2s0rOc z?d21ki*K<A{V4+ztVW&p8f1=k43z^{QK5c`IT*)7+M+^KWcQ$w^I|IT*ML80P*TJ) zEp?QP<e%lE7gwSpvKsYVm8<V`hLA+J22?VhK|OcH)$gJDd+zEVP+QrX#v#^=(ZS~K dh@dAjuws2xO>K2^WK?;~@hqRed9CkI%s((rtGfUI delta 1819 zcmYM!duYvJ9LMqRE@o`AIc&3;Ih(o6E*Z`+W*b|xW|>eFisshb{*aocBiC3$Od>Uw zKSZO>6fIdxxs(*vL0PQX2uUKM<^AbA<#f(@{l3rd`8}8K^E|(nMg5ij9#3Sm@!7^N zjo-ltMgKpaqs&zF1&8A|jK{w?1Y?Jq%|Q?5;bJVnJ(!Evov*NhI4YW->S3ap-<EMP znSw3OQ=uDn2YJSxq8<oh0`}lY{OZcXhK1@yBMn-Dizi_|aXya6HO{>lNqiAw=-)1L zp@!Qq8Sh~R22maV#w^tIC&EO`#A+9BM|E(<mAB&r;vkO2KbVfmF`?%QQT110HvL-z z7b)0^sdyJh;7jKKs-d5#0eNCWGe|)#Svq=gE~??x$k!VAOTwe*!4_8@z){4V=-1l5 z;6f>R>3oAK@5ONJM>X&fN8?`?kBkd-oQ29r1*+lAsE!-m{nJ=O+>XjbIJ46p${0cZ znUob!ptUPT>ew>WfYv!TqB^ceWojQP6X#I_yM%hK9krBQn1|0X2gB%1OPYsXT!Oi{ zGoJiw02e9HZoZ0&Z=f3NKxN_)YBN4T_MLU3>i3`q(uX9)KB4OUa`!bFwHJlD??JYc zjd$hQes{x%!7#H0$k$St);P>Tt#K7<rW^TNg$-Da&v7=6A@5bV6sz$9zQzGm$6cf^ zAD`k19K<s8FDLIx)mhZ$xsPPc`cS+0J5Iu67F6Z)k;z#N>Qt;j4QxM_U^8l9-Kh6M zDo08aT8=vA8&Id{IMTk~0$ePjAc&f&cMLBFEXHCyhCY1g;z68FJdcf_@*P-&S8yi2 z#aWohQJRA_Sc*q*3O>Xl{DuWO|GAv4Tng5r7n@LTu<OVqtOqsoA2<yo8D%Z{a3LN> zE!AUGCO=>fCQ+!2E<g=*J!<cqLoLZAjG}*Q<AQgD-BJN|q8@yJT7m)8v5DcY6sMw6 zT#qyGCMvaksMN;t@Clrb+1Q0@=QHYlf;TjgLi95!+r))NbO5!MCviTuVkP#X1~@e% zbk2Rqm~16#59~&z`T`bWH)@GuGeemzL2b&dsQzxF_QZ=!@~?*8Q@}p62!<JnDX0$9 zQ5CaYT;!}kHn!EGHe(&C-Yyp(LbccI;%lg->_9#D46UrL&dLJeL({?|O04|!yO_j4 N`7mExpgE~2?jLh}tp@-A diff --git a/flask_admin/translations/ru/LC_MESSAGES/admin.po b/flask_admin/translations/ru/LC_MESSAGES/admin.po index d0e25830e..6e00ebd21 100644 --- a/flask_admin/translations/ru/LC_MESSAGES/admin.po +++ b/flask_admin/translations/ru/LC_MESSAGES/admin.po @@ -435,7 +435,7 @@ msgstr "Редактировать запись" #: ../flask_admin/model/template.py:111 #: ../flask_admin/templates/bootstrap4/admin/model/row_actions.html:34 msgid "Delete Record" -msgstr "" +msgstr "Удалить запись" #: ../flask_admin/model/widgets.py:62 msgid "Please select model" @@ -599,4 +599,3 @@ msgstr "Выберите по крайней мере одну запись." #~ msgid "Size" #~ msgstr "Размер" - From eff73c3478937f6c45260f5b289db3604c9d8483 Mon Sep 17 00:00:00 2001 From: LeXofLeviafan <lexofleviafan@gmail.com> Date: Thu, 26 Sep 2024 09:35:20 +0200 Subject: [PATCH 137/156] add translations_path test & changelog entry --- doc/changelog.rst | 1 + flask_admin/tests/test_babel.py | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 flask_admin/tests/test_babel.py diff --git a/doc/changelog.rst b/doc/changelog.rst index 05f979f2f..10f0fd54f 100644 --- a/doc/changelog.rst +++ b/doc/changelog.rst @@ -7,6 +7,7 @@ Changelog Fixes: * The `Apply` button for filters will show/hide correctly again +* Fix `translations_path` attribute when Flask-Admin is used with Flask-Babel 2.0.0a0 ------- diff --git a/flask_admin/tests/test_babel.py b/flask_admin/tests/test_babel.py new file mode 100644 index 000000000..b9fe5c11f --- /dev/null +++ b/flask_admin/tests/test_babel.py @@ -0,0 +1,33 @@ +from unittest import mock + +import pytest + +from flask_admin import babel, translations + +from . import flask_babel_test_decorator + + +@flask_babel_test_decorator +@pytest.mark.parametrize("dirname", [None, "foo/bar"]) +@mock.patch("flask_admin.babel.get_current_view") +@mock.patch("flask_babel.Domain.get_translations_cache") +@mock.patch("flask_babel._get_current_context") +@mock.patch("flask_babel.get_locale", return_value="qux") +@mock.patch("babel.support.Translations") +def test_translations_path( + _Translations, + _get_locale, + _get_current_context, + _get_translations_cache, + _get_current_view, + dirname, +): + _get_current_view.return_value.admin.translations_path = dirname + _get_translations_cache.return_value = {} + _dirname = dirname or translations.__path__[0] + domain = babel.CustomDomain() + assert domain.get_translations() == _Translations.return_value + calls = [mock.call.load(translations.__path__[0], ["qux"], "admin")] + if dirname: + calls = [mock.call.load(dirname, ["qux"], "admin")] + calls + assert _Translations.method_calls == calls From 9feb433ac06d89971247b251bac40327bf6f2a91 Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Fri, 4 Oct 2024 18:27:18 +0100 Subject: [PATCH 138/156] Update Sphinx source_suffix --- doc/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/conf.py b/doc/conf.py index 016c2715f..34338f5f0 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -33,7 +33,7 @@ templates_path = ['_templates'] # The suffix of source filenames. -source_suffix = '.rst' +source_suffix = {'.rst': 'restructuredtext'} # The encoding of source files. #source_encoding = 'utf-8-sig' From fe6fe82c36282ebc3796814e8196fd0c131ad19b Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Fri, 4 Oct 2024 18:27:18 +0100 Subject: [PATCH 139/156] Use flask Sphinx theme from pallets_sphinx_themes --- .gitmodules | 0 doc/_static/flask-admin.css | 5 + doc/_themes/.gitignore | 3 - doc/_themes/LICENSE | 37 -- doc/_themes/README | 31 -- doc/_themes/flask/layout.html | 24 - doc/_themes/flask/relations.html | 19 - doc/_themes/flask/static/flasky.css_t | 583 -------------------- doc/_themes/flask/theme.conf | 10 - doc/_themes/flask_small/layout.html | 22 - doc/_themes/flask_small/static/flasky.css_t | 287 ---------- doc/_themes/flask_small/theme.conf | 10 - doc/_themes/flask_theme_support.py | 86 --- doc/conf.py | 29 +- 14 files changed, 15 insertions(+), 1131 deletions(-) delete mode 100644 .gitmodules create mode 100644 doc/_static/flask-admin.css delete mode 100644 doc/_themes/.gitignore delete mode 100644 doc/_themes/LICENSE delete mode 100644 doc/_themes/README delete mode 100644 doc/_themes/flask/layout.html delete mode 100644 doc/_themes/flask/relations.html delete mode 100644 doc/_themes/flask/static/flasky.css_t delete mode 100644 doc/_themes/flask/theme.conf delete mode 100644 doc/_themes/flask_small/layout.html delete mode 100644 doc/_themes/flask_small/static/flasky.css_t delete mode 100644 doc/_themes/flask_small/theme.conf delete mode 100644 doc/_themes/flask_theme_support.py diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index e69de29bb..000000000 diff --git a/doc/_static/flask-admin.css b/doc/_static/flask-admin.css new file mode 100644 index 000000000..19daed19e --- /dev/null +++ b/doc/_static/flask-admin.css @@ -0,0 +1,5 @@ +#flask-admin h1 { + text-indent: -999999px; + background: url('flask-admin.png') no-repeat center center; + height: 140px; +} diff --git a/doc/_themes/.gitignore b/doc/_themes/.gitignore deleted file mode 100644 index 66b6e4c2f..000000000 --- a/doc/_themes/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -*.pyc -*.pyo -.DS_Store diff --git a/doc/_themes/LICENSE b/doc/_themes/LICENSE deleted file mode 100644 index 8daab7ee6..000000000 --- a/doc/_themes/LICENSE +++ /dev/null @@ -1,37 +0,0 @@ -Copyright (c) 2010 by Armin Ronacher. - -Some rights reserved. - -Redistribution and use in source and binary forms of the theme, with or -without modification, are permitted provided that the following conditions -are met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - -* The names of the contributors may not be used to endorse or - promote products derived from this software without specific - prior written permission. - -We kindly ask you to only use these themes in an unmodified manner just -for Flask and Flask-related products, not for unrelated projects. If you -like the visual style and want to use it for your own projects, please -consider making some larger changes to the themes (such as changing -font faces, sizes, colors or margins). - -THIS THEME IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS THEME, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. diff --git a/doc/_themes/README b/doc/_themes/README deleted file mode 100644 index b3292bdff..000000000 --- a/doc/_themes/README +++ /dev/null @@ -1,31 +0,0 @@ -Flask Sphinx Styles -=================== - -This repository contains sphinx styles for Flask and Flask related -projects. To use this style in your Sphinx documentation, follow -this guide: - -1. put this folder as _themes into your docs folder. Alternatively - you can also use git submodules to check out the contents there. -2. add this to your conf.py: - - sys.path.append(os.path.abspath('_themes')) - html_theme_path = ['_themes'] - html_theme = 'flask' - -The following themes exist: - -- 'flask' - the standard flask documentation theme for large - projects -- 'flask_small' - small one-page theme. Intended to be used by - very small addon libraries for flask. - -The following options exist for the flask_small theme: - - [options] - index_logo = '' filename of a picture in _static - to be used as replacement for the - h1 in the index.rst file. - index_logo_height = 120px height of the index logo - github_fork = '' repository name on github for the - "fork me" badge diff --git a/doc/_themes/flask/layout.html b/doc/_themes/flask/layout.html deleted file mode 100644 index ddf4f70b9..000000000 --- a/doc/_themes/flask/layout.html +++ /dev/null @@ -1,24 +0,0 @@ -{%- extends "basic/layout.html" %} -{%- block extrahead %} - {{ super() }} - {% if theme_touch_icon %} - <link rel="apple-touch-icon" href="{{ pathto('_static/' ~ theme_touch_icon, 1) }}" /> - {% endif %} - <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9"> -{% endblock %} -{%- block relbar2 %}{% endblock %} -{% block header %} - {{ super() }} - {% if pagename == 'index' %} - <div class=indexwrapper> - {% endif %} -{% endblock %} -{%- block footer %} - <div class="footer"> - © Copyright {{ copyright }}. - Created using <a href="https://www.sphinx-doc.org/">Sphinx</a>. - </div> - {% if pagename == 'index' %} - </div> - {% endif %} -{%- endblock %} diff --git a/doc/_themes/flask/relations.html b/doc/_themes/flask/relations.html deleted file mode 100644 index 3bbcde85b..000000000 --- a/doc/_themes/flask/relations.html +++ /dev/null @@ -1,19 +0,0 @@ -<h3>Related Topics</h3> -<ul> - <li><a href="{{ pathto(master_doc) }}">Documentation overview</a><ul> - {%- for parent in parents %} - <li><a href="{{ parent.link|e }}">{{ parent.title }}</a><ul> - {%- endfor %} - {%- if prev %} - <li>Previous: <a href="{{ prev.link|e }}" title="{{ _('previous chapter') - }}">{{ prev.title }}</a></li> - {%- endif %} - {%- if next %} - <li>Next: <a href="{{ next.link|e }}" title="{{ _('next chapter') - }}">{{ next.title }}</a></li> - {%- endif %} - {%- for parent in parents %} - </ul></li> - {%- endfor %} - </ul></li> -</ul> diff --git a/doc/_themes/flask/static/flasky.css_t b/doc/_themes/flask/static/flasky.css_t deleted file mode 100644 index 0840bb57e..000000000 --- a/doc/_themes/flask/static/flasky.css_t +++ /dev/null @@ -1,583 +0,0 @@ -/* - * flasky.css_t - * ~~~~~~~~~~~~ - * - * :copyright: Copyright 2010 by Armin Ronacher. - * :license: Flask Design License, see LICENSE for details. - */ - -{% set page_width = '940px' %} -{% set sidebar_width = '220px' %} - -@import url("basic.css"); - -/* -- page layout ----------------------------------------------------------- */ - -body { - font-family: 'Georgia', serif; - font-size: 17px; - background-color: white; - color: #000; - margin: 0; - padding: 0; -} - -div.document { - width: {{ page_width }}; - margin: 30px auto 0 auto; -} - -div.documentwrapper { - float: left; - width: 100%; -} - -div.bodywrapper { - margin: 0 0 0 {{ sidebar_width }}; -} - -div.sphinxsidebar { - width: {{ sidebar_width }}; -} - -hr { - border: 1px solid #B1B4B6; -} - -div.body { - background-color: #ffffff; - color: #3E4349; - padding: 0 30px 0 30px; -} - -img.floatingflask { - padding: 0 0 10px 10px; - float: right; -} - -div.footer { - width: {{ page_width }}; - margin: 20px auto 30px auto; - font-size: 14px; - color: #888; - text-align: right; -} - -div.footer a { - color: #888; -} - -div.related { - display: none; -} - -div.sphinxsidebar a { - color: #444; - text-decoration: none; - border-bottom: 1px dotted #999; -} - -div.sphinxsidebar a:hover { - border-bottom: 1px solid #999; -} - -div.sphinxsidebar { - font-size: 14px; - line-height: 1.5; -} - -div.sphinxsidebarwrapper { - padding: 18px 10px; -} - -div.sphinxsidebarwrapper p.logo { - padding: 0 0 20px 0; - margin: 0; - text-align: center; -} - -div.sphinxsidebar h3, -div.sphinxsidebar h4 { - font-family: 'Garamond', 'Georgia', serif; - color: #444; - font-size: 24px; - font-weight: normal; - margin: 0 0 5px 0; - padding: 0; -} - -div.sphinxsidebar h4 { - font-size: 20px; -} - -div.sphinxsidebar h3 a { - color: #444; -} - -div.sphinxsidebar p.logo a, -div.sphinxsidebar h3 a, -div.sphinxsidebar p.logo a:hover, -div.sphinxsidebar h3 a:hover { - border: none; -} - -div.sphinxsidebar p { - color: #555; - margin: 10px 0; -} - -div.sphinxsidebar ul { - margin: 10px 0; - padding: 0; - color: #000; -} - -div.sphinxsidebar input { - border: 1px solid #ccc; - font-family: 'Georgia', serif; - font-size: 1em; -} - -/* -- body styles ----------------------------------------------------------- */ - -a { - color: #004B6B; - text-decoration: underline; -} - -a:hover { - color: #6D4100; - text-decoration: underline; -} - -div.body h1, -div.body h2, -div.body h3, -div.body h4, -div.body h5, -div.body h6 { - font-family: 'Garamond', 'Georgia', serif; - font-weight: normal; - margin: 30px 0px 10px 0px; - padding: 0; -} - -{% if theme_index_logo %} -div.indexwrapper h1 { - text-indent: -999999px; - background: url({{ theme_index_logo }}) no-repeat center center; - height: {{ theme_index_logo_height }}; -} -{% endif %} -div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } -div.body h2 { font-size: 180%; } -div.body h3 { font-size: 150%; } -div.body h4 { font-size: 130%; } -div.body h5 { font-size: 100%; } -div.body h6 { font-size: 100%; } - -a.headerlink { - color: #ddd; - padding: 0 4px; - text-decoration: none; -} - -a.headerlink:hover { - color: #444; - background: #eaeaea; -} - -div.body p, div.body dd, div.body li { - line-height: 1.4em; -} - -div.admonition { - background: #fafafa; - margin: 20px -30px; - padding: 10px 30px; - border-top: 1px solid #ccc; - border-bottom: 1px solid #ccc; -} - -div.admonition tt.xref, div.admonition a tt { - border-bottom: 1px solid #fafafa; -} - -dd div.admonition { - margin-left: -60px; - padding-left: 60px; -} - -div.admonition p.admonition-title { - font-family: 'Garamond', 'Georgia', serif; - font-weight: normal; - font-size: 24px; - margin: 0 0 10px 0; - padding: 0; - line-height: 1; -} - -div.admonition p.last { - margin-bottom: 0; -} - -div.highlight { - background-color: white; -} - -dt:target, .highlight { - background: #FAF3E8; -} - -div.note { - background-color: #eee; - border: 1px solid #ccc; -} - -div.seealso { - background-color: #ffc; - border: 1px solid #ff6; -} - -div.topic { - background-color: #eee; -} - -p.admonition-title { - display: inline; -} - -p.admonition-title:after { - content: ":"; -} - -pre, tt { - font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; - font-size: 0.9em; -} - -img.screenshot { -} - -tt.descname, tt.descclassname { - font-size: 0.95em; -} - -tt.descname { - padding-right: 0.08em; -} - -img.screenshot { - -moz-box-shadow: 2px 2px 4px #eee; - -webkit-box-shadow: 2px 2px 4px #eee; - box-shadow: 2px 2px 4px #eee; -} - -table.docutils { - border: 1px solid #888; - -moz-box-shadow: 2px 2px 4px #eee; - -webkit-box-shadow: 2px 2px 4px #eee; - box-shadow: 2px 2px 4px #eee; -} - -table.docutils td, table.docutils th { - border: 1px solid #888; - padding: 0.25em 0.7em; -} - -table.field-list, table.footnote { - border: none; - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - -table.footnote { - margin: 15px 0; - width: 100%; - border: 1px solid #eee; - background: #fdfdfd; - font-size: 0.9em; -} - -table.footnote + table.footnote { - margin-top: -15px; - border-top: none; -} - -table.field-list th { - padding: 0 0.8em 0 0; -} - -table.field-list td { - padding: 0; -} - -table.footnote td.label { - width: 0px; - padding: 0.3em 0 0.3em 0.5em; -} - -table.footnote td { - padding: 0.3em 0.5em; -} - -dl { - margin: 0; - padding: 0; -} - -dl dd { - margin-left: 30px; -} - -blockquote { - margin: 0 0 0 30px; - padding: 0; -} - -ul, ol { - margin: 10px 0 10px 30px; - padding: 0; -} - -pre { - background: #eee; - padding: 7px 30px; - margin: 15px -30px; - line-height: 1.3em; -} - -dl pre, blockquote pre, li pre { - margin-left: -60px; - padding-left: 60px; -} - -dl dl pre { - margin-left: -90px; - padding-left: 90px; -} - -tt { - background-color: #ecf0f3; - color: #222; - /* padding: 1px 2px; */ -} - -tt.xref, a tt { - background-color: #FBFBFB; - border-bottom: 1px solid white; -} - -a.reference { - text-decoration: none; - border-bottom: 1px dotted #004B6B; -} - -a.reference:hover { - border-bottom: 1px solid #6D4100; -} - -a.footnote-reference { - text-decoration: none; - font-size: 0.7em; - vertical-align: top; - border-bottom: 1px dotted #004B6B; -} - -a.footnote-reference:hover { - border-bottom: 1px solid #6D4100; -} - -a:hover tt { - background: #EEE; -} - - -@media screen and (max-width: 870px) { - - div.sphinxsidebar { - display: none; - } - - div.document { - width: 100%; - - } - - div.documentwrapper { - margin-left: 0; - margin-top: 0; - margin-right: 0; - margin-bottom: 0; - } - - div.bodywrapper { - margin-top: 0; - margin-right: 0; - margin-bottom: 0; - margin-left: 0; - } - - ul { - margin-left: 0; - } - - .document { - width: auto; - } - - .footer { - width: auto; - } - - .bodywrapper { - margin: 0; - } - - .footer { - width: auto; - } - - .github { - display: none; - } - - - -} - -@media screen and (max-width: 768px) { - {% if theme_index_logo %} - div.indexwrapper h1 { - background-size: 100%; - } - {% endif %} -} - -@media screen and (max-width: 875px) { - - body { - margin: 0; - padding: 20px 30px; - } - - div.documentwrapper { - float: none; - background: white; - } - - div.sphinxsidebar { - display: block; - float: none; - width: 102.5%; - margin: 50px -30px -20px -30px; - padding: 10px 20px; - background: #333; - color: white; - } - - div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, - div.sphinxsidebar h3 a { - color: white; - } - - div.sphinxsidebar a { - color: #aaa; - } - - div.sphinxsidebar p.logo { - display: none; - } - - div.document { - width: 100%; - margin: 0; - } - - div.related { - display: block; - margin: 0; - padding: 10px 0 20px 0; - } - - div.related ul, - div.related ul li { - margin: 0; - padding: 0; - } - - div.footer { - display: none; - } - - div.bodywrapper { - margin: 0; - } - - div.body { - min-height: 0; - padding: 0; - } - - .rtd_doc_footer { - display: none; - } - - .document { - width: auto; - } - - .footer { - width: auto; - } - - .footer { - width: auto; - } - - .github { - display: none; - } -} - - -/* scrollbars */ - -::-webkit-scrollbar { - width: 6px; - height: 6px; -} - -::-webkit-scrollbar-button:start:decrement, -::-webkit-scrollbar-button:end:increment { - display: block; - height: 10px; -} - -::-webkit-scrollbar-button:vertical:increment { - background-color: #fff; -} - -::-webkit-scrollbar-track-piece { - background-color: #eee; - -webkit-border-radius: 3px; -} - -::-webkit-scrollbar-thumb:vertical { - height: 50px; - background-color: #ccc; - -webkit-border-radius: 3px; -} - -::-webkit-scrollbar-thumb:horizontal { - width: 50px; - background-color: #ccc; - -webkit-border-radius: 3px; -} - -/* misc. */ - -.revsys-inline { - display: none!important; -} \ No newline at end of file diff --git a/doc/_themes/flask/theme.conf b/doc/_themes/flask/theme.conf deleted file mode 100644 index 397a9c6e1..000000000 --- a/doc/_themes/flask/theme.conf +++ /dev/null @@ -1,10 +0,0 @@ -[theme] -inherit = basic -stylesheet = flasky.css -pygments_style = flask_theme_support.FlaskyStyle - -[options] -index_logo = 'flask-admin.png' -index_logo_height = 140px -touch_icon = -github_fork = 'pallets-eco/flask-admin' \ No newline at end of file diff --git a/doc/_themes/flask_small/layout.html b/doc/_themes/flask_small/layout.html deleted file mode 100644 index 8c1dd9efd..000000000 --- a/doc/_themes/flask_small/layout.html +++ /dev/null @@ -1,22 +0,0 @@ -{% extends "basic/layout.html" %} -{% block header %} - {{ super() }} - {% if pagename == 'index' %} - <div class=indexwrapper> - {% endif %} -{% endblock %} -{% block footer %} - {% if pagename == 'index' %} - </div> - {% endif %} -{% endblock %} -{# do not display relbars #} -{% block relbar1 %}{% endblock %} -{% block relbar2 %} - {% if theme_github_fork %} - <a href="https://github.com/{{ theme_github_fork }}"><img style="position: fixed; top: 0; right: 0; border: 0;" - src="https://github.blog/wp-content/uploads/2008/12/forkme_right_darkblue_121621.png" alt="Fork me on GitHub" /></a> - {% endif %} -{% endblock %} -{% block sidebar1 %}{% endblock %} -{% block sidebar2 %}{% endblock %} diff --git a/doc/_themes/flask_small/static/flasky.css_t b/doc/_themes/flask_small/static/flasky.css_t deleted file mode 100644 index fe2141c56..000000000 --- a/doc/_themes/flask_small/static/flasky.css_t +++ /dev/null @@ -1,287 +0,0 @@ -/* - * flasky.css_t - * ~~~~~~~~~~~~ - * - * Sphinx stylesheet -- flasky theme based on nature theme. - * - * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -@import url("basic.css"); - -/* -- page layout ----------------------------------------------------------- */ - -body { - font-family: 'Georgia', serif; - font-size: 17px; - color: #000; - background: white; - margin: 0; - padding: 0; -} - -div.documentwrapper { - float: left; - width: 100%; -} - -div.bodywrapper { - margin: 40px auto 0 auto; - width: 700px; -} - -hr { - border: 1px solid #B1B4B6; -} - -div.body { - background-color: #ffffff; - color: #3E4349; - padding: 0 30px 30px 30px; -} - -img.floatingflask { - padding: 0 0 10px 10px; - float: right; -} - -div.footer { - text-align: right; - color: #888; - padding: 10px; - font-size: 14px; - width: 650px; - margin: 0 auto 40px auto; -} - -div.footer a { - color: #888; - text-decoration: underline; -} - -div.related { - line-height: 32px; - color: #888; -} - -div.related ul { - padding: 0 0 0 10px; -} - -div.related a { - color: #444; -} - -/* -- body styles ----------------------------------------------------------- */ - -a { - color: #004B6B; - text-decoration: underline; -} - -a:hover { - color: #6D4100; - text-decoration: underline; -} - -div.body { - padding-bottom: 40px; /* saved for footer */ -} - -div.body h1, -div.body h2, -div.body h3, -div.body h4, -div.body h5, -div.body h6 { - font-family: 'Garamond', 'Georgia', serif; - font-weight: normal; - margin: 30px 0px 10px 0px; - padding: 0; -} - -{% if theme_index_logo %} -div.indexwrapper h1 { - text-indent: -999999px; - background: url({{ theme_index_logo }}) no-repeat center center; - height: {{ theme_index_logo_height }}; -} -{% endif %} - -div.body h2 { font-size: 180%; } -div.body h3 { font-size: 150%; } -div.body h4 { font-size: 130%; } -div.body h5 { font-size: 100%; } -div.body h6 { font-size: 100%; } - -a.headerlink { - color: white; - padding: 0 4px; - text-decoration: none; -} - -a.headerlink:hover { - color: #444; - background: #eaeaea; -} - -div.body p, div.body dd, div.body li { - line-height: 1.4em; -} - -div.admonition { - background: #fafafa; - margin: 20px -30px; - padding: 10px 30px; - border-top: 1px solid #ccc; - border-bottom: 1px solid #ccc; -} - -div.admonition p.admonition-title { - font-family: 'Garamond', 'Georgia', serif; - font-weight: normal; - font-size: 24px; - margin: 0 0 10px 0; - padding: 0; - line-height: 1; -} - -div.admonition p.last { - margin-bottom: 0; -} - -div.highlight{ - background-color: white; -} - -dt:target, .highlight { - background: #FAF3E8; -} - -div.note { - background-color: #eee; - border: 1px solid #ccc; -} - -div.seealso { - background-color: #ffc; - border: 1px solid #ff6; -} - -div.topic { - background-color: #eee; -} - -div.warning { - background-color: #ffe4e4; - border: 1px solid #f66; -} - -p.admonition-title { - display: inline; -} - -p.admonition-title:after { - content: ":"; -} - -pre, tt { - font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; - font-size: 0.85em; -} - -img.screenshot { -} - -tt.descname, tt.descclassname { - font-size: 0.95em; -} - -tt.descname { - padding-right: 0.08em; -} - -img.screenshot { - -moz-box-shadow: 2px 2px 4px #eee; - -webkit-box-shadow: 2px 2px 4px #eee; - box-shadow: 2px 2px 4px #eee; -} - -table.docutils { - border: 1px solid #888; - -moz-box-shadow: 2px 2px 4px #eee; - -webkit-box-shadow: 2px 2px 4px #eee; - box-shadow: 2px 2px 4px #eee; -} - -table.docutils td, table.docutils th { - border: 1px solid #888; - padding: 0.25em 0.7em; -} - -table.field-list, table.footnote { - border: none; - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - -table.footnote { - margin: 15px 0; - width: 100%; - border: 1px solid #eee; -} - -table.field-list th { - padding: 0 0.8em 0 0; -} - -table.field-list td { - padding: 0; -} - -table.footnote td { - padding: 0.5em; -} - -dl { - margin: 0; - padding: 0; -} - -dl dd { - margin-left: 30px; -} - -pre { - padding: 0; - margin: 15px -30px; - padding: 8px; - line-height: 1.3em; - padding: 7px 30px; - background: #eee; - border-radius: 2px; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; -} - -dl pre { - margin-left: -60px; - padding-left: 60px; -} - -tt { - background-color: #ecf0f3; - color: #222; - /* padding: 1px 2px; */ -} - -tt.xref, a tt { - background-color: #FBFBFB; -} - -a:hover tt { - background: #EEE; -} diff --git a/doc/_themes/flask_small/theme.conf b/doc/_themes/flask_small/theme.conf deleted file mode 100644 index 542b46251..000000000 --- a/doc/_themes/flask_small/theme.conf +++ /dev/null @@ -1,10 +0,0 @@ -[theme] -inherit = basic -stylesheet = flasky.css -nosidebar = true -pygments_style = flask_theme_support.FlaskyStyle - -[options] -index_logo = '' -index_logo_height = 120px -github_fork = '' diff --git a/doc/_themes/flask_theme_support.py b/doc/_themes/flask_theme_support.py deleted file mode 100644 index 33f47449c..000000000 --- a/doc/_themes/flask_theme_support.py +++ /dev/null @@ -1,86 +0,0 @@ -# flasky extensions. flasky pygments style based on tango style -from pygments.style import Style -from pygments.token import Keyword, Name, Comment, String, Error, \ - Number, Operator, Generic, Whitespace, Punctuation, Other, Literal - - -class FlaskyStyle(Style): - background_color = "#f8f8f8" - default_style = "" - - styles = { - # No corresponding class for the following: - #Text: "", # class: '' - Whitespace: "underline #f8f8f8", # class: 'w' - Error: "#a40000 border:#ef2929", # class: 'err' - Other: "#000000", # class 'x' - - Comment: "italic #8f5902", # class: 'c' - Comment.Preproc: "noitalic", # class: 'cp' - - Keyword: "bold #004461", # class: 'k' - Keyword.Constant: "bold #004461", # class: 'kc' - Keyword.Declaration: "bold #004461", # class: 'kd' - Keyword.Namespace: "bold #004461", # class: 'kn' - Keyword.Pseudo: "bold #004461", # class: 'kp' - Keyword.Reserved: "bold #004461", # class: 'kr' - Keyword.Type: "bold #004461", # class: 'kt' - - Operator: "#582800", # class: 'o' - Operator.Word: "bold #004461", # class: 'ow' - like keywords - - Punctuation: "bold #000000", # class: 'p' - - # because special names such as Name.Class, Name.Function, etc. - # are not recognized as such later in the parsing, we choose them - # to look the same as ordinary variables. - Name: "#000000", # class: 'n' - Name.Attribute: "#c4a000", # class: 'na' - to be revised - Name.Builtin: "#004461", # class: 'nb' - Name.Builtin.Pseudo: "#3465a4", # class: 'bp' - Name.Class: "#000000", # class: 'nc' - to be revised - Name.Constant: "#000000", # class: 'no' - to be revised - Name.Decorator: "#888", # class: 'nd' - to be revised - Name.Entity: "#ce5c00", # class: 'ni' - Name.Exception: "bold #cc0000", # class: 'ne' - Name.Function: "#000000", # class: 'nf' - Name.Property: "#000000", # class: 'py' - Name.Label: "#f57900", # class: 'nl' - Name.Namespace: "#000000", # class: 'nn' - to be revised - Name.Other: "#000000", # class: 'nx' - Name.Tag: "bold #004461", # class: 'nt' - like a keyword - Name.Variable: "#000000", # class: 'nv' - to be revised - Name.Variable.Class: "#000000", # class: 'vc' - to be revised - Name.Variable.Global: "#000000", # class: 'vg' - to be revised - Name.Variable.Instance: "#000000", # class: 'vi' - to be revised - - Number: "#990000", # class: 'm' - - Literal: "#000000", # class: 'l' - Literal.Date: "#000000", # class: 'ld' - - String: "#4e9a06", # class: 's' - String.Backtick: "#4e9a06", # class: 'sb' - String.Char: "#4e9a06", # class: 'sc' - String.Doc: "italic #8f5902", # class: 'sd' - like a comment - String.Double: "#4e9a06", # class: 's2' - String.Escape: "#4e9a06", # class: 'se' - String.Heredoc: "#4e9a06", # class: 'sh' - String.Interpol: "#4e9a06", # class: 'si' - String.Other: "#4e9a06", # class: 'sx' - String.Regex: "#4e9a06", # class: 'sr' - String.Single: "#4e9a06", # class: 's1' - String.Symbol: "#4e9a06", # class: 'ss' - - Generic: "#000000", # class: 'g' - Generic.Deleted: "#a40000", # class: 'gd' - Generic.Emph: "italic #000000", # class: 'ge' - Generic.Error: "#ef2929", # class: 'gr' - Generic.Heading: "bold #000080", # class: 'gh' - Generic.Inserted: "#00A000", # class: 'gi' - Generic.Output: "#888", # class: 'go' - Generic.Prompt: "#745334", # class: 'gp' - Generic.Strong: "bold #000000", # class: 'gs' - Generic.Subheading: "bold #800080", # class: 'gu' - Generic.Traceback: "bold #a40000", # class: 'gt' - } diff --git a/doc/conf.py b/doc/conf.py index 34338f5f0..05fdbf113 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -27,7 +27,13 @@ # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. -extensions = ['sphinx.ext.autodoc', 'sphinx.ext.intersphinx', 'sphinx.ext.ifconfig', 'sphinx.ext.viewcode'] +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.ifconfig', + 'sphinx.ext.intersphinx', + 'sphinx.ext.viewcode', + 'pallets_sphinx_themes', +] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] @@ -84,7 +90,7 @@ #show_authors = False # The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' +#pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] @@ -94,10 +100,8 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -sys.path.append(os.path.abspath('_themes')) html_theme = 'flask' -html_theme_path = ['_themes'] # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the @@ -128,6 +132,8 @@ # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] +html_css_files = ['flask-admin.css'] + # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. html_last_updated_fmt = '%b %d, %Y' @@ -252,18 +258,3 @@ # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = {'python': ('https://docs.python.org/3', None)} - -# fall back if theme is not there -try: - __import__('flask_theme_support') -except ImportError as e: - print('-' * 74) - print('Warning: Flask themes unavailable. Building with default theme') - print('If you want the Flask themes, run this command and build again:') - print() - print(' git submodule update --init') - print('-' * 74) - - pygments_style = 'tango' - html_theme = 'default' - html_theme_options = {} From 737a8616314f2cb4a780c3f41a57ccf9278b0f41 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Fri, 11 Oct 2024 21:12:17 +0100 Subject: [PATCH 140/156] Enable style checks via tox --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index 5f63673ee..2366c3fdc 100644 --- a/tox.ini +++ b/tox.ini @@ -5,7 +5,7 @@ envlist = py3{8,12}-sqlalchemy1 py312-noflaskbabel # only tested against latest of all configurations, sans flask-babel py38-min -# style + style typing docs skip_missing_interpreters = true From ca2523073d52f8eb930fb368a5631c9019a1494b Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Fri, 11 Oct 2024 21:12:27 +0100 Subject: [PATCH 141/156] Run precommit over the codebase --- .github/release.yml | 1 - babel/admin.pot | 1 - doc/conf.py | 155 +- examples/auth-flask-login/app.py | 158 +- examples/auth/app.py | 145 +- examples/auth/config.py | 6 +- examples/auth/templates/security/_macros.html | 2 +- .../auth/templates/security/_messages.html | 2 +- .../auth/templates/security/login_user.html | 2 +- .../templates/security/register_user.html | 2 +- examples/babel/app.py | 36 +- examples/bootstrap4/app.py | 114 +- examples/csp-nonce/app.py | 34 +- examples/custom-layout/app.py | 115 +- examples/custom-layout/static/layout.css | 2 +- examples/custom-layout/templates/list.html | 6 +- examples/datetime-timezone/app.py | 66 +- examples/forms-files-images/__init__.py | 2 +- examples/forms-files-images/app.py | 173 +- .../templates/admin/index.html | 2 +- .../forms-files-images/templates/macros.html | 2 +- examples/geo_alchemy/app.py | 36 +- examples/geo_alchemy/config.py | 12 +- examples/host-matching/app.py | 35 +- examples/methodview/app.py | 29 +- examples/multiple-admin-instances/app.py | 21 +- examples/peewee/app.py | 31 +- examples/pymongo/app.py | 82 +- examples/simple/app.py | 29 +- examples/sqla-association_proxy/app.py | 71 +- examples/sqla-custom-inline-forms/app.py | 54 +- examples/sqla/admin/__init__.py | 16 +- examples/sqla/admin/config.py | 6 +- examples/sqla/admin/data.py | 105 +- examples/sqla/admin/main.py | 286 +- examples/sqla/admin/models.py | 72 +- examples/sqla/app.py | 11 +- examples/tinymongo/app.py | 77 +- flask_admin/__init__.py | 12 +- flask_admin/_backwards.py | 47 +- flask_admin/_compat.py | 20 +- flask_admin/_types.py | 7 +- flask_admin/actions.py | 78 +- flask_admin/babel.py | 17 +- flask_admin/base.py | 674 ++-- flask_admin/blueprints.py | 7 +- flask_admin/consts.py | 8 +- flask_admin/contrib/__init__.py | 2 +- flask_admin/contrib/fileadmin/__init__.py | 824 ++--- flask_admin/contrib/fileadmin/azure.py | 92 +- flask_admin/contrib/fileadmin/s3.py | 111 +- flask_admin/contrib/geoa/__init__.py | 4 +- flask_admin/contrib/geoa/fields.py | 35 +- flask_admin/contrib/geoa/form.py | 15 +- flask_admin/contrib/geoa/typefmt.py | 15 +- flask_admin/contrib/geoa/view.py | 3 +- flask_admin/contrib/geoa/widgets.py | 27 +- flask_admin/contrib/peewee/__init__.py | 4 +- flask_admin/contrib/peewee/ajax.py | 25 +- flask_admin/contrib/peewee/filters.py | 168 +- flask_admin/contrib/peewee/form.py | 139 +- flask_admin/contrib/peewee/tools.py | 10 +- flask_admin/contrib/peewee/view.py | 255 +- flask_admin/contrib/peeweemodel/__init__.py | 10 +- flask_admin/contrib/pymongo/__init__.py | 4 +- flask_admin/contrib/pymongo/filters.py | 49 +- flask_admin/contrib/pymongo/tools.py | 14 +- flask_admin/contrib/pymongo/view.py | 269 +- flask_admin/contrib/rediscli.py | 130 +- flask_admin/contrib/sqla/ajax.py | 60 +- flask_admin/contrib/sqla/fields.py | 120 +- flask_admin/contrib/sqla/filters.py | 252 +- flask_admin/contrib/sqla/form.py | 640 ++-- flask_admin/contrib/sqla/tools.py | 86 +- flask_admin/contrib/sqla/typefmt.py | 43 +- flask_admin/contrib/sqla/validators.py | 42 +- flask_admin/contrib/sqla/view.py | 687 ++-- flask_admin/contrib/sqla/widgets.py | 17 +- flask_admin/contrib/sqlamodel/__init__.py | 10 +- flask_admin/form/__init__.py | 33 +- flask_admin/form/fields.py | 179 +- flask_admin/form/rules.py | 372 ++- flask_admin/form/upload.py | 462 +-- flask_admin/form/validators.py | 12 +- flask_admin/form/widgets.py | 89 +- flask_admin/helpers.py | 93 +- flask_admin/menu.py | 49 +- flask_admin/model/ajax.py | 37 +- flask_admin/model/base.py | 1251 ++++---- flask_admin/model/fields.py | 87 +- flask_admin/model/filters.py | 213 +- flask_admin/model/form.py | 170 +- flask_admin/model/helpers.py | 30 +- flask_admin/model/template.py | 45 +- flask_admin/model/typefmt.py | 56 +- flask_admin/model/widgets.py | 204 +- .../bootstrap4/admin/rediscli/response.html | 2 +- flask_admin/tests/conftest.py | 7 +- flask_admin/tests/fileadmin/test_fileadmin.py | 161 +- .../tests/fileadmin/test_fileadmin_azure.py | 15 +- flask_admin/tests/geoa/conftest.py | 10 +- flask_admin/tests/geoa/test_basic.py | 99 +- flask_admin/tests/peeweemodel/conftest.py | 6 +- flask_admin/tests/peeweemodel/test_basic.py | 1193 +++---- flask_admin/tests/pymongo/test_basic.py | 49 +- flask_admin/tests/sqla/conftest.py | 22 +- flask_admin/tests/sqla/test_basic.py | 2848 +++++++++-------- flask_admin/tests/sqla/test_form_rules.py | 120 +- flask_admin/tests/sqla/test_inlineform.py | 156 +- flask_admin/tests/sqla/test_multi_pk.py | 115 +- flask_admin/tests/sqla/test_postgres.py | 110 +- flask_admin/tests/sqla/test_translation.py | 50 +- flask_admin/tests/templates/method.html | 2 +- flask_admin/tests/templates/mock.html | 2 +- flask_admin/tests/test_babel.py | 3 +- flask_admin/tests/test_base.py | 284 +- flask_admin/tests/test_csp.py | 15 +- flask_admin/tests/test_form_upload.py | 203 +- flask_admin/tests/test_helpers.py | 30 +- flask_admin/tests/test_host_matching.py | 79 +- flask_admin/tests/test_model.py | 585 ++-- flask_admin/tests/test_tools.py | 18 +- flask_admin/theme.py | 10 +- flask_admin/tools.py | 110 +- .../translations/af/LC_MESSAGES/admin.po | 1 - .../translations/ar/LC_MESSAGES/admin.po | 1 - .../translations/be/LC_MESSAGES/admin.po | 1 - .../translations/ca_ES/LC_MESSAGES/admin.po | 1 - .../translations/cs/LC_MESSAGES/admin.po | 1 - .../translations/da/LC_MESSAGES/admin.po | 1 - .../translations/el/LC_MESSAGES/admin.po | 1 - .../translations/es/LC_MESSAGES/admin.po | 1 - .../translations/et/LC_MESSAGES/admin.po | 1 - .../translations/fa/LC_MESSAGES/admin.po | 1 - .../translations/fi/LC_MESSAGES/admin.po | 1 - .../translations/he/LC_MESSAGES/admin.po | 1 - .../translations/hu/LC_MESSAGES/admin.po | 1 - .../translations/it/LC_MESSAGES/admin.po | 1 - .../translations/ja/LC_MESSAGES/admin.po | 1 - .../translations/ko/LC_MESSAGES/admin.po | 1 - .../translations/nl/LC_MESSAGES/admin.po | 1 - .../translations/no/LC_MESSAGES/admin.po | 1 - .../translations/pa/LC_MESSAGES/admin.po | 1 - .../translations/pl/LC_MESSAGES/admin.po | 1 - .../translations/pt/LC_MESSAGES/admin.po | 1 - .../translations/pt_BR/LC_MESSAGES/admin.po | 1 - .../translations/ro/LC_MESSAGES/admin.po | 1 - .../translations/sk/LC_MESSAGES/admin.po | 1 - .../translations/sr/LC_MESSAGES/admin.po | 1 - .../translations/sv/LC_MESSAGES/admin.po | 1 - .../translations/tr/LC_MESSAGES/admin.po | 1 - .../translations/uk/LC_MESSAGES/admin.po | 1 - .../translations/vi/LC_MESSAGES/admin.po | 1 - .../zh_Hans_CN/LC_MESSAGES/admin.po | 1 - .../zh_Hans_CN/LC_MESSAGES/introduction.po | 1 - .../zh_Hant_TW/LC_MESSAGES/admin.po | 1 - 156 files changed, 9312 insertions(+), 7437 deletions(-) diff --git a/.github/release.yml b/.github/release.yml index b4640bfb6..05bf88c5f 100644 --- a/.github/release.yml +++ b/.github/release.yml @@ -22,4 +22,3 @@ changelog: - title: Other changes labels: - "*" - diff --git a/babel/admin.pot b/babel/admin.pot index 6648ed1a5..5255e0dcf 100644 --- a/babel/admin.pot +++ b/babel/admin.pot @@ -588,4 +588,3 @@ msgstr "" #: ../flask_admin/templates/bootstrap4/admin/model/list.html:195 msgid "Please select at least one record." msgstr "" - diff --git a/doc/conf.py b/doc/conf.py index 05fdbf113..461451a9b 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # # flask-admin documentation build configuration file, created by # sphinx-quickstart on Tue Nov 01 18:35:30 2011. @@ -11,45 +10,45 @@ # All configuration values have a default; values that are commented out # serve to show the default. -import sys, os +import os +import sys # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. -sys.path.insert(0, os.path.abspath('..')) -import flask_admin +sys.path.insert(0, os.path.abspath("..")) from flask_admin import __version__ # -- General configuration ----------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. -#needs_sphinx = '1.0' +# needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.ifconfig', - 'sphinx.ext.intersphinx', - 'sphinx.ext.viewcode', - 'pallets_sphinx_themes', + "sphinx.ext.autodoc", + "sphinx.ext.ifconfig", + "sphinx.ext.intersphinx", + "sphinx.ext.viewcode", + "pallets_sphinx_themes", ] # Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +templates_path = ["_templates"] # The suffix of source filenames. -source_suffix = {'.rst': 'restructuredtext'} +source_suffix = {".rst": "restructuredtext"} # The encoding of source files. -#source_encoding = 'utf-8-sig' +# source_encoding = 'utf-8-sig' # The master toctree document. -master_doc = 'index' +master_doc = "index" # General information about the project. -project = u'flask-admin' -copyright = u'2012-2024, Flask-Admin Team' +project = "flask-admin" +copyright = "2012-2024, Flask-Admin Team" # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the @@ -62,24 +61,24 @@ # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. -#language = None -locale_dirs = ['../flask_admin/translations/'] +# language = None +locale_dirs = ["../flask_admin/translations/"] # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: -#today = '' +# today = '' # Else, today_fmt is used as the format for a strftime call. -#today_fmt = '%B %d, %Y' +# today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = [] # The reST default role (used for this markup: `text`) to use for all documents. -#default_role = None +# default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. -#add_function_parentheses = True +# add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). @@ -87,13 +86,13 @@ # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. -#show_authors = False +# show_authors = False # The name of the Pygments (syntax highlighting) style to use. -#pygments_style = 'sphinx' +# pygments_style = "sphinx" # A list of ignored prefixes for module index sorting. -#modindex_common_prefix = [] +# modindex_common_prefix = [] # -- Options for HTML output --------------------------------------------------- @@ -101,125 +100,128 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -html_theme = 'flask' +html_theme = "flask" # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. -#html_theme_options = {} +# html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. -#html_theme_path = [] +# html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # "<project> v<release> documentation". -#html_title = None +# html_title = None # A shorter title for the navigation bar. Default is the same as html_title. -#html_short_title = None +# html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. -html_logo = '_static/logo.png' +html_logo = "_static/logo.png" # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. -html_favicon = 'favicon.ico' +html_favicon = "favicon.ico" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] +html_static_path = ["_static"] -html_css_files = ['flask-admin.css'] +html_css_files = ["flask-admin.css"] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. -html_last_updated_fmt = '%b %d, %Y' +html_last_updated_fmt = "%b %d, %Y" # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. -#html_use_smartypants = True +# html_use_smartypants = True # Custom sidebar templates, maps document names to template names. html_sidebars = { - 'index': ['sidebarintro.html', 'searchbox.html'], - '**': ['toc.html', 'relations.html', 'searchbox.html'] + "index": ["sidebarintro.html", "searchbox.html"], + "**": ["toc.html", "relations.html", "searchbox.html"], } # Additional templates that should be rendered to pages, maps page names to # template names. -#html_additional_pages = {} +# html_additional_pages = {} # If false, no module index is generated. -#html_domain_indices = True +# html_domain_indices = True # If false, no index is generated. -#html_use_index = True +# html_use_index = True # If true, the index is split into individual pages for each letter. -#html_split_index = False +# html_split_index = False # If true, links to the reST sources are added to the pages. -#html_show_sourcelink = True +# html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -#html_show_sphinx = True +# html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -#html_show_copyright = True +# html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a <link> tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. -#html_use_opensearch = '' +# html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). -#html_file_suffix = None +# html_file_suffix = None # Output file base name for HTML help builder. -htmlhelp_basename = 'flask-admin' +htmlhelp_basename = "flask-admin" # -- Options for LaTeX output -------------------------------------------------- latex_elements = { -# The paper size ('letterpaper' or 'a4paper'). -# 'papersize': 'letterpaper', - -# The font size ('10pt', '11pt' or '12pt'). -# 'pointsize': '10pt', - -# Additional stuff for the LaTeX preamble. -#'preamble': '', + # The paper size ('letterpaper' or 'a4paper'). + # 'papersize': 'letterpaper', + # The font size ('10pt', '11pt' or '12pt'). + # 'pointsize': '10pt', + # Additional stuff for the LaTeX preamble. + #'preamble': '', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ - ('index', 'flask-admin.tex', u'Flask-Admin documentation', - u'Serge S. Koval', 'manual'), + ( + "index", + "flask-admin.tex", + "Flask-Admin documentation", + "Serge S. Koval", + "manual", + ), ] # The name of an image file (relative to this directory) to place at the top of # the title page. -#latex_logo = None +# latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. -#latex_use_parts = False +# latex_use_parts = False # If true, show page references after internal links. -#latex_show_pagerefs = False +# latex_show_pagerefs = False # If true, show URL addresses after external links. -#latex_show_urls = False +# latex_show_urls = False # Documents to append as an appendix to all manuals. -#latex_appendices = [] +# latex_appendices = [] # If false, no module index is generated. -#latex_domain_indices = True +# latex_domain_indices = True # -- Options for manual page output -------------------------------------------- @@ -227,12 +229,11 @@ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - ('index', 'flask-admin', u'Flask-Admin documentation', - [u'Serge S. Koval'], 1) + ("index", "flask-admin", "Flask-Admin documentation", ["Serge S. Koval"], 1) ] # If true, show URL addresses after external links. -#man_show_urls = False +# man_show_urls = False # -- Options for Texinfo output ------------------------------------------------ @@ -241,20 +242,26 @@ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - ('index', 'flask-admin', u'Flask-Admin documentation', - u'Serge S. Koval', 'Flask-Admin', 'One line description of project.', - 'Miscellaneous'), + ( + "index", + "flask-admin", + "Flask-Admin documentation", + "Serge S. Koval", + "Flask-Admin", + "One line description of project.", + "Miscellaneous", + ), ] # Documents to append as an appendix to all manuals. -#texinfo_appendices = [] +# texinfo_appendices = [] # If false, no module index is generated. -#texinfo_domain_indices = True +# texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. -#texinfo_show_urls = 'footnote' +# texinfo_show_urls = 'footnote' # Example configuration for intersphinx: refer to the Python standard library. -intersphinx_mapping = {'python': ('https://docs.python.org/3', None)} +intersphinx_mapping = {"python": ("https://docs.python.org/3", None)} diff --git a/examples/auth-flask-login/app.py b/examples/auth-flask-login/app.py index 2d1ca25f5..3cd59750f 100644 --- a/examples/auth-flask-login/app.py +++ b/examples/auth-flask-login/app.py @@ -1,26 +1,33 @@ import os -from flask import Flask, url_for, redirect, render_template, request -from flask_sqlalchemy import SQLAlchemy -from wtforms import form, fields, validators + import flask_admin as admin import flask_login as login - -from flask_admin.theme import Bootstrap4Theme +from flask import Flask +from flask import redirect +from flask import render_template +from flask import request +from flask import url_for +from flask_admin import expose +from flask_admin import helpers from flask_admin.contrib import sqla -from flask_admin import helpers, expose -from werkzeug.security import generate_password_hash, check_password_hash - +from flask_admin.theme import Bootstrap4Theme +from flask_sqlalchemy import SQLAlchemy +from werkzeug.security import check_password_hash +from werkzeug.security import generate_password_hash +from wtforms import fields +from wtforms import form +from wtforms import validators # Create Flask application app = Flask(__name__) # Create dummy secrey key so we can use sessions -app.config['SECRET_KEY'] = '123456790' +app.config["SECRET_KEY"] = "123456790" # Create in-memory database -app.config['DATABASE_FILE'] = 'sample_db.sqlite' -app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + app.config['DATABASE_FILE'] -app.config['SQLALCHEMY_ECHO'] = True +app.config["DATABASE_FILE"] = "sample_db.sqlite" +app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///" + app.config["DATABASE_FILE"] +app.config["SQLALCHEMY_ECHO"] = True db = SQLAlchemy(app) @@ -65,13 +72,13 @@ def validate_login(self, field): user = self.get_user() if user is None: - raise validators.ValidationError('Invalid user') + raise validators.ValidationError("Invalid user") # we're comparing the plaintext pw with the the hash from the db if not check_password_hash(user.password, self.password.data): - # to compare plain text passwords use - # if user.password != self.password.data: - raise validators.ValidationError('Invalid password') + # to compare plain text passwords use + # if user.password != self.password.data: + raise validators.ValidationError("Invalid password") def get_user(self): return db.session.query(User).filter_by(login=self.login.data).first() @@ -84,7 +91,7 @@ class RegistrationForm(form.Form): def validate_login(self, field): if db.session.query(User).filter_by(login=self.login.data).count() > 0: - raise validators.ValidationError('Duplicate username') + raise validators.ValidationError("Duplicate username") # Initialize flask-login @@ -100,21 +107,19 @@ def load_user(user_id): # Create customized model view class class MyModelView(sqla.ModelView): - def is_accessible(self): return login.current_user.is_authenticated # Create customized index view class that handles login & registration class MyAdminIndexView(admin.AdminIndexView): - - @expose('/') + @expose("/") def index(self): if not login.current_user.is_authenticated: - return redirect(url_for('.login_view')) + return redirect(url_for(".login_view")) return super(MyAdminIndexView, self).index() - @expose('/login/', methods=('GET', 'POST')) + @expose("/login/", methods=("GET", "POST")) def login_view(self): # handle user login form = LoginForm(request.form) @@ -123,13 +128,17 @@ def login_view(self): login.login_user(user) if login.current_user.is_authenticated: - return redirect(url_for('.index')) - link = '<p>Don\'t have an account? <a href="' + url_for('.register_view') + '">Click here to register.</a></p>' - self._template_args['form'] = form - self._template_args['link'] = link + return redirect(url_for(".index")) + link = ( + "<p>Don't have an account? <a href=\"" + + url_for(".register_view") + + '">Click here to register.</a></p>' + ) + self._template_args["form"] = form + self._template_args["link"] = link return super(MyAdminIndexView, self).index() - @expose('/register/', methods=('GET', 'POST')) + @expose("/register/", methods=("GET", "POST")) def register_view(self): form = RegistrationForm(request.form) if helpers.validate_form_on_submit(form): @@ -144,29 +153,38 @@ def register_view(self): db.session.commit() login.login_user(user) - return redirect(url_for('.index')) - link = '<p>Already have an account? <a href="' + url_for('.login_view') + '">Click here to log in.</a></p>' - self._template_args['form'] = form - self._template_args['link'] = link + return redirect(url_for(".index")) + link = ( + '<p>Already have an account? <a href="' + + url_for(".login_view") + + '">Click here to log in.</a></p>' + ) + self._template_args["form"] = form + self._template_args["link"] = link return super(MyAdminIndexView, self).index() - @expose('/logout/') + @expose("/logout/") def logout_view(self): login.logout_user() - return redirect(url_for('.index')) + return redirect(url_for(".index")) # Flask views -@app.route('/') +@app.route("/") def index(): - return render_template('index.html') + return render_template("index.html") # Initialize flask-login init_login() # Create admin -admin = admin.Admin(app, 'Example: Auth', index_view=MyAdminIndexView(), theme=Bootstrap4Theme(base_template='my_master.html')) +admin = admin.Admin( + app, + "Example: Auth", + index_view=MyAdminIndexView(), + theme=Bootstrap4Theme(base_template="my_master.html"), +) # Add view admin.add_view(MyModelView(User, db.session)) @@ -177,8 +195,8 @@ def build_sample_db(): Populate a small db with some example entries. """ - import string import random + import string db.drop_all() db.create_all() @@ -188,14 +206,58 @@ def build_sample_db(): db.session.add(test_user) first_names = [ - 'Harry', 'Amelia', 'Oliver', 'Jack', 'Isabella', 'Charlie','Sophie', 'Mia', - 'Jacob', 'Thomas', 'Emily', 'Lily', 'Ava', 'Isla', 'Alfie', 'Olivia', 'Jessica', - 'Riley', 'William', 'James', 'Geoffrey', 'Lisa', 'Benjamin', 'Stacey', 'Lucy' + "Harry", + "Amelia", + "Oliver", + "Jack", + "Isabella", + "Charlie", + "Sophie", + "Mia", + "Jacob", + "Thomas", + "Emily", + "Lily", + "Ava", + "Isla", + "Alfie", + "Olivia", + "Jessica", + "Riley", + "William", + "James", + "Geoffrey", + "Lisa", + "Benjamin", + "Stacey", + "Lucy", ] last_names = [ - 'Brown', 'Smith', 'Patel', 'Jones', 'Williams', 'Johnson', 'Taylor', 'Thomas', - 'Roberts', 'Khan', 'Lewis', 'Jackson', 'Clarke', 'James', 'Phillips', 'Wilson', - 'Ali', 'Mason', 'Mitchell', 'Rose', 'Davis', 'Davies', 'Rodriguez', 'Cox', 'Alexander' + "Brown", + "Smith", + "Patel", + "Jones", + "Williams", + "Johnson", + "Taylor", + "Thomas", + "Roberts", + "Khan", + "Lewis", + "Jackson", + "Clarke", + "James", + "Phillips", + "Wilson", + "Ali", + "Mason", + "Mitchell", + "Rose", + "Davis", + "Davies", + "Rodriguez", + "Cox", + "Alexander", ] for i in range(len(first_names)): @@ -204,17 +266,21 @@ def build_sample_db(): user.last_name = last_names[i] user.login = user.first_name.lower() user.email = user.login + "@example.com" - user.password = generate_password_hash(''.join(random.choice(string.ascii_lowercase + string.digits) for i in range(10))) + user.password = generate_password_hash( + "".join( + random.choice(string.ascii_lowercase + string.digits) for i in range(10) + ) + ) db.session.add(user) db.session.commit() return -if __name__ == '__main__': +if __name__ == "__main__": # Build a sample db on the fly, if one does not exist yet. app_dir = os.path.realpath(os.path.dirname(__file__)) - database_path = os.path.join(app_dir, app.config['DATABASE_FILE']) + database_path = os.path.join(app_dir, app.config["DATABASE_FILE"]) if not os.path.exists(database_path): with app.app_context(): build_sample_db() diff --git a/examples/auth/app.py b/examples/auth/app.py index 134ca6873..a852a49eb 100644 --- a/examples/auth/app.py +++ b/examples/auth/app.py @@ -1,26 +1,34 @@ import os -from flask import Flask, url_for, redirect, render_template, request, abort -from flask_sqlalchemy import SQLAlchemy -from flask_security import Security, SQLAlchemyUserDatastore, \ - UserMixin, RoleMixin, current_user -from flask_security.utils import hash_password + import flask_admin -from flask_admin.theme import Bootstrap4Theme -from flask_admin.contrib import sqla +from flask import abort +from flask import Flask +from flask import redirect +from flask import render_template +from flask import request +from flask import url_for from flask_admin import helpers as admin_helpers - +from flask_admin.contrib import sqla +from flask_admin.theme import Bootstrap4Theme +from flask_security import current_user +from flask_security import RoleMixin +from flask_security import Security +from flask_security import SQLAlchemyUserDatastore +from flask_security import UserMixin +from flask_security.utils import hash_password +from flask_sqlalchemy import SQLAlchemy # Create Flask application app = Flask(__name__) -app.config.from_pyfile('config.py') +app.config.from_pyfile("config.py") db = SQLAlchemy(app) # Define models roles_users = db.Table( - 'roles_users', - db.Column('user_id', db.Integer(), db.ForeignKey('user.id')), - db.Column('role_id', db.Integer(), db.ForeignKey('role.id')) + "roles_users", + db.Column("user_id", db.Integer(), db.ForeignKey("user.id")), + db.Column("role_id", db.Integer(), db.ForeignKey("role.id")), ) @@ -41,8 +49,9 @@ class User(db.Model, UserMixin): password = db.Column(db.String(255)) active = db.Column(db.Boolean()) confirmed_at = db.Column(db.DateTime()) - roles = db.relationship('Role', secondary=roles_users, - backref=db.backref('users', lazy='dynamic')) + roles = db.relationship( + "Role", secondary=roles_users, backref=db.backref("users", lazy="dynamic") + ) fs_uniquifier = db.Column(db.String(64), unique=True, nullable=False) def __str__(self): @@ -57,9 +66,10 @@ def __str__(self): # Create customized model view class class MyModelView(sqla.ModelView): def is_accessible(self): - return (current_user.is_active and - current_user.is_authenticated and - current_user.has_role('superuser') + return ( + current_user.is_active + and current_user.is_authenticated + and current_user.has_role("superuser") ) def _handle_view(self, name, **kwargs): @@ -72,24 +82,27 @@ def _handle_view(self, name, **kwargs): abort(403) else: # login - return redirect(url_for('security.login', next=request.url)) + return redirect(url_for("security.login", next=request.url)) + # Flask views -@app.route('/') +@app.route("/") def index(): - return render_template('index.html') + return render_template("index.html") + # Create admin admin = flask_admin.Admin( app, - 'Example: Auth', - theme=Bootstrap4Theme(base_template='my_master.html'), + "Example: Auth", + theme=Bootstrap4Theme(base_template="my_master.html"), ) # Add model views admin.add_view(MyModelView(Role, db.session)) admin.add_view(MyModelView(User, db.session)) + # define a context processor for merging flask-admin's template context into the # flask-security views. @security.context_processor @@ -99,7 +112,7 @@ def security_context_processor(): admin_view=admin.index_view, theme=admin.theme, h=admin_helpers, - get_url=url_for + get_url=url_for, ) @@ -108,55 +121,105 @@ def build_sample_db(): Populate a small db with some example entries. """ - import string import random + import string db.drop_all() db.create_all() with app.app_context(): - user_role = Role(name='user') - super_user_role = Role(name='superuser') + user_role = Role(name="user") + super_user_role = Role(name="superuser") db.session.add(user_role) db.session.add(super_user_role) db.session.commit() test_user = user_datastore.create_user( - first_name='Admin', - email='admin@example.com', - password=hash_password('admin'), - roles=[user_role, super_user_role] + first_name="Admin", + email="admin@example.com", + password=hash_password("admin"), + roles=[user_role, super_user_role], ) first_names = [ - 'Harry', 'Amelia', 'Oliver', 'Jack', 'Isabella', 'Charlie', 'Sophie', 'Mia', - 'Jacob', 'Thomas', 'Emily', 'Lily', 'Ava', 'Isla', 'Alfie', 'Olivia', 'Jessica', - 'Riley', 'William', 'James', 'Geoffrey', 'Lisa', 'Benjamin', 'Stacey', 'Lucy' + "Harry", + "Amelia", + "Oliver", + "Jack", + "Isabella", + "Charlie", + "Sophie", + "Mia", + "Jacob", + "Thomas", + "Emily", + "Lily", + "Ava", + "Isla", + "Alfie", + "Olivia", + "Jessica", + "Riley", + "William", + "James", + "Geoffrey", + "Lisa", + "Benjamin", + "Stacey", + "Lucy", ] last_names = [ - 'Brown', 'Smith', 'Patel', 'Jones', 'Williams', 'Johnson', 'Taylor', 'Thomas', - 'Roberts', 'Khan', 'Lewis', 'Jackson', 'Clarke', 'James', 'Phillips', 'Wilson', - 'Ali', 'Mason', 'Mitchell', 'Rose', 'Davis', 'Davies', 'Rodriguez', 'Cox', 'Alexander' + "Brown", + "Smith", + "Patel", + "Jones", + "Williams", + "Johnson", + "Taylor", + "Thomas", + "Roberts", + "Khan", + "Lewis", + "Jackson", + "Clarke", + "James", + "Phillips", + "Wilson", + "Ali", + "Mason", + "Mitchell", + "Rose", + "Davis", + "Davies", + "Rodriguez", + "Cox", + "Alexander", ] for i in range(len(first_names)): - tmp_email = first_names[i].lower() + "." + last_names[i].lower() + "@example.com" - tmp_pass = ''.join(random.choice(string.ascii_lowercase + string.digits) for i in range(10)) + tmp_email = ( + first_names[i].lower() + "." + last_names[i].lower() + "@example.com" + ) + tmp_pass = "".join( + random.choice(string.ascii_lowercase + string.digits) for i in range(10) + ) user_datastore.create_user( first_name=first_names[i], last_name=last_names[i], email=tmp_email, password=hash_password(tmp_pass), - roles=[user_role, ] + roles=[ + user_role, + ], ) db.session.commit() return -if __name__ == '__main__': +if __name__ == "__main__": # Build a sample db on the fly, if one does not exist yet. app_dir = os.path.realpath(os.path.dirname(__file__)) - database_path = os.path.join(app_dir, app.config['DATABASE_FILE']) + database_path = os.path.join(app_dir, app.config["DATABASE_FILE"]) if not os.path.exists(database_path): with app.app_context(): build_sample_db() diff --git a/examples/auth/config.py b/examples/auth/config.py index c25c011ff..15bb5f60b 100644 --- a/examples/auth/config.py +++ b/examples/auth/config.py @@ -1,9 +1,9 @@ # Create dummy secrey key so we can use sessions -SECRET_KEY = '123456790' +SECRET_KEY = "123456790" # Create in-memory database -DATABASE_FILE = 'sample_db.sqlite' -SQLALCHEMY_DATABASE_URI = 'sqlite:///' + DATABASE_FILE +DATABASE_FILE = "sample_db.sqlite" +SQLALCHEMY_DATABASE_URI = "sqlite:///" + DATABASE_FILE SQLALCHEMY_ECHO = True # Flask-Security config diff --git a/examples/auth/templates/security/_macros.html b/examples/auth/templates/security/_macros.html index b584e1135..a5d3b9f25 100644 --- a/examples/auth/templates/security/_macros.html +++ b/examples/auth/templates/security/_macros.html @@ -24,4 +24,4 @@ </label> </div> </div> -{%- endmacro %} \ No newline at end of file +{%- endmacro %} diff --git a/examples/auth/templates/security/_messages.html b/examples/auth/templates/security/_messages.html index 1589a8b6f..15beb2190 100644 --- a/examples/auth/templates/security/_messages.html +++ b/examples/auth/templates/security/_messages.html @@ -6,4 +6,4 @@ {% endfor %} </ul> {% endif %} -{%- endwith %} \ No newline at end of file +{%- endwith %} diff --git a/examples/auth/templates/security/login_user.html b/examples/auth/templates/security/login_user.html index 6bd0c179a..ce7e338f1 100644 --- a/examples/auth/templates/security/login_user.html +++ b/examples/auth/templates/security/login_user.html @@ -19,4 +19,4 @@ <h1>Login</h1> </div> </div> </div> -{% endblock body %} \ No newline at end of file +{% endblock body %} diff --git a/examples/auth/templates/security/register_user.html b/examples/auth/templates/security/register_user.html index 1677beb29..db0e71991 100644 --- a/examples/auth/templates/security/register_user.html +++ b/examples/auth/templates/security/register_user.html @@ -20,4 +20,4 @@ <h1>Register</h1> </div> </div> </div> -{% endblock body %} \ No newline at end of file +{% endblock body %} diff --git a/examples/babel/app.py b/examples/babel/app.py index b7b36abba..69f1a6472 100644 --- a/examples/babel/app.py +++ b/examples/babel/app.py @@ -1,30 +1,31 @@ -from flask import Flask, request, session -from flask_sqlalchemy import SQLAlchemy - import flask_admin as admin -from flask_babel import Babel - +from flask import Flask +from flask import request +from flask import session from flask_admin.contrib import sqla +from flask_babel import Babel +from flask_sqlalchemy import SQLAlchemy # Create application app = Flask(__name__) # Create dummy secrey key so we can use sessions -app.config['SECRET_KEY'] = '12345678' +app.config["SECRET_KEY"] = "12345678" # Create in-memory database -app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///sample_db.sqlite' -app.config['SQLALCHEMY_ECHO'] = True +app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///sample_db.sqlite" +app.config["SQLALCHEMY_ECHO"] = True db = SQLAlchemy(app) def get_locale(): - override = request.args.get('lang') + override = request.args.get("lang") if override: - session['lang'] = override + session["lang"] = override + + return session.get("lang", "en") - return session.get('lang', 'en') # Initialize babel babel = Babel(app, locale_selector=get_locale) @@ -48,16 +49,16 @@ class Post(db.Model): date = db.Column(db.DateTime) user_id = db.Column(db.Integer(), db.ForeignKey(User.id)) - user = db.relationship(User, backref='posts') + user = db.relationship(User, backref="posts") def __unicode__(self): return self.title # Flask views -@app.route('/') +@app.route("/") def index(): - tmp = u""" + tmp = """ <p><a href="/admin/?lang=en">Click me to get to Admin! (English)</a></p> <p><a href="/admin/?lang=cs">Click me to get to Admin! (Czech)</a></p> <p><a href="/admin/?lang=de">Click me to get to Admin! (German)</a></p> @@ -72,11 +73,12 @@ def index(): """ return tmp -if __name__ == '__main__': + +if __name__ == "__main__": # Create admin - admin = admin.Admin(app, 'Example: Babel') + admin = admin.Admin(app, "Example: Babel") - #admin.locale_selector(get_locale) + # admin.locale_selector(get_locale) # Add views admin.add_view(sqla.ModelView(User, db.session)) diff --git a/examples/bootstrap4/app.py b/examples/bootstrap4/app.py index 972991fe1..3b4ecd38d 100644 --- a/examples/bootstrap4/app.py +++ b/examples/bootstrap4/app.py @@ -1,24 +1,23 @@ import datetime import os import os.path as op -from flask import Flask -from flask_sqlalchemy import SQLAlchemy import flask_admin as admin -from flask_admin.theme import Bootstrap4Theme +from flask import Flask from flask_admin.contrib.sqla import ModelView - +from flask_admin.theme import Bootstrap4Theme +from flask_sqlalchemy import SQLAlchemy # Create application app = Flask(__name__) # Create dummy secrey key so we can use sessions -app.config['SECRET_KEY'] = '123456790' +app.config["SECRET_KEY"] = "123456790" # Create in-memory database -app.config['DATABASE_FILE'] = 'sample_db.sqlite' -app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + app.config['DATABASE_FILE'] -app.config['SQLALCHEMY_ECHO'] = True +app.config["DATABASE_FILE"] = "sample_db.sqlite" +app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///" + app.config["DATABASE_FILE"] +app.config["SQLALCHEMY_ECHO"] = True db = SQLAlchemy(app) @@ -49,24 +48,24 @@ class CustomView(ModelView): class UserAdmin(CustomView): - column_searchable_list = ('name',) - column_filters = ('name', 'email') + column_searchable_list = ("name",) + column_filters = ("name", "email") can_export = True - export_types = ['csv', 'xlsx'] + export_types = ["csv", "xlsx"] # Flask views -@app.route('/') +@app.route("/") def index(): return '<a href="/admin/">Click me to get to Admin!</a>' # Create admin with custom base template -admin = admin.Admin(app, 'Example: Bootstrap4', theme=Bootstrap4Theme(swatch='flatly')) +admin = admin.Admin(app, "Example: Bootstrap4", theme=Bootstrap4Theme(swatch="flatly")) # Add views -admin.add_view(UserAdmin(User, db.session, category='Menu')) -admin.add_view(CustomView(Page, db.session, category='Menu')) +admin.add_view(UserAdmin(User, db.session, category="Menu")) +admin.add_view(CustomView(Page, db.session, category="Menu")) def build_sample_db(): @@ -78,14 +77,58 @@ def build_sample_db(): db.create_all() first_names = [ - 'Harry', 'Amelia', 'Oliver', 'Jack', 'Isabella', 'Charlie','Sophie', 'Mia', - 'Jacob', 'Thomas', 'Emily', 'Lily', 'Ava', 'Isla', 'Alfie', 'Olivia', 'Jessica', - 'Riley', 'William', 'James', 'Geoffrey', 'Lisa', 'Benjamin', 'Stacey', 'Lucy' + "Harry", + "Amelia", + "Oliver", + "Jack", + "Isabella", + "Charlie", + "Sophie", + "Mia", + "Jacob", + "Thomas", + "Emily", + "Lily", + "Ava", + "Isla", + "Alfie", + "Olivia", + "Jessica", + "Riley", + "William", + "James", + "Geoffrey", + "Lisa", + "Benjamin", + "Stacey", + "Lucy", ] last_names = [ - 'Brown', 'Smith', 'Patel', 'Jones', 'Williams', 'Johnson', 'Taylor', 'Thomas', - 'Roberts', 'Khan', 'Lewis', 'Jackson', 'Clarke', 'James', 'Phillips', 'Wilson', - 'Ali', 'Mason', 'Mitchell', 'Rose', 'Davis', 'Davies', 'Rodriguez', 'Cox', 'Alexander' + "Brown", + "Smith", + "Patel", + "Jones", + "Williams", + "Johnson", + "Taylor", + "Thomas", + "Roberts", + "Khan", + "Lewis", + "Jackson", + "Clarke", + "James", + "Phillips", + "Wilson", + "Ali", + "Mason", + "Mitchell", + "Rose", + "Davis", + "Davies", + "Rodriguez", + "Cox", + "Alexander", ] for i in range(len(first_names)): @@ -96,17 +139,17 @@ def build_sample_db(): sample_text = [ { - 'title': "de Finibus Bonorum et Malorum - Part I", - 'content': "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor \ + "title": "de Finibus Bonorum et Malorum - Part I", + "content": "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor \ incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud \ exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \ dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. \ Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt \ - mollit anim id est laborum." + mollit anim id est laborum.", }, { - 'title': "de Finibus Bonorum et Malorum - Part II", - 'content': "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque \ + "title": "de Finibus Bonorum et Malorum - Part II", + "content": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque \ laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto \ beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur \ aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi \ @@ -115,11 +158,11 @@ def build_sample_db(): aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam \ corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum \ iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum \ - qui dolorem eum fugiat quo voluptas nulla pariatur?" + qui dolorem eum fugiat quo voluptas nulla pariatur?", }, { - 'title': "de Finibus Bonorum et Malorum - Part III", - 'content': "At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium \ + "title": "de Finibus Bonorum et Malorum - Part III", + "content": "At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium \ voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati \ cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id \ est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam \ @@ -128,25 +171,24 @@ def build_sample_db(): Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet \ ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur \ a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis \ - doloribus asperiores repellat." - } + doloribus asperiores repellat.", + }, ] for entry in sample_text: page = Page() - page.title = entry['title'] - page.content = entry['content'] + page.title = entry["title"] + page.content = entry["content"] db.session.add(page) db.session.commit() return -if __name__ == '__main__': - +if __name__ == "__main__": # Build a sample db on the fly, if one does not exist yet. app_dir = op.realpath(os.path.dirname(__file__)) - database_path = op.join(app_dir, app.config['DATABASE_FILE']) + database_path = op.join(app_dir, app.config["DATABASE_FILE"]) if not os.path.exists(database_path): with app.app_context(): build_sample_db() diff --git a/examples/csp-nonce/app.py b/examples/csp-nonce/app.py index a08b25793..5811dc23d 100644 --- a/examples/csp-nonce/app.py +++ b/examples/csp-nonce/app.py @@ -1,39 +1,41 @@ -from flask import Flask - import flask_admin as admin -from flask_talisman import Talisman - +from flask import Flask # Create custom admin view from flask_admin.theme import Bootstrap4Theme - +from flask_talisman import Talisman # Create flask app -app = Flask(__name__, template_folder='templates') +app = Flask(__name__, template_folder="templates") app.debug = True talisman = Talisman( app, content_security_policy={ - 'default-src': '\'self\'', - 'object-src': '\'none\'', - 'script-src': '\'self\'', - 'style-src': '\'self\'', + "default-src": "'self'", + "object-src": "'none'", + "script-src": "'self'", + "style-src": "'self'", }, - content_security_policy_nonce_in=['script-src', 'style-src'] + content_security_policy_nonce_in=["script-src", "style-src"], ) -csp_nonce_generator = app.jinja_env.globals['csp_nonce'] # this is added by talisman +csp_nonce_generator = app.jinja_env.globals["csp_nonce"] # this is added by talisman + # Flask views -@app.route('/') +@app.route("/") def index(): return '<a href="/admin/">Click me to get to Admin!</a>' + # Create admin interface -admin = admin.Admin(name="Example: Simple Views", theme=Bootstrap4Theme(), csp_nonce_generator=csp_nonce_generator) +admin = admin.Admin( + name="Example: Simple Views", + theme=Bootstrap4Theme(), + csp_nonce_generator=csp_nonce_generator, +) admin.init_app(app) -if __name__ == '__main__': - +if __name__ == "__main__": # Start app app.run() diff --git a/examples/custom-layout/app.py b/examples/custom-layout/app.py index 183ebbe95..5753c1dba 100644 --- a/examples/custom-layout/app.py +++ b/examples/custom-layout/app.py @@ -1,23 +1,22 @@ import os import os.path as op -from flask import Flask -from flask_sqlalchemy import SQLAlchemy import flask_admin as admin -from flask_admin.theme import Bootstrap4Theme +from flask import Flask from flask_admin.contrib.sqla import ModelView - +from flask_admin.theme import Bootstrap4Theme +from flask_sqlalchemy import SQLAlchemy # Create application app = Flask(__name__) # Create dummy secrey key so we can use sessions -app.config['SECRET_KEY'] = '123456790' +app.config["SECRET_KEY"] = "123456790" # Create in-memory database -app.config['DATABASE_FILE'] = 'sample_db.sqlite' -app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + app.config['DATABASE_FILE'] -app.config['SQLALCHEMY_ECHO'] = True +app.config["DATABASE_FILE"] = "sample_db.sqlite" +app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///" + app.config["DATABASE_FILE"] +app.config["SQLALCHEMY_ECHO"] = True db = SQLAlchemy(app) @@ -42,24 +41,26 @@ def __unicode__(self): # Customized admin interface class CustomView(ModelView): - list_template = 'list.html' - create_template = 'create.html' - edit_template = 'edit.html' + list_template = "list.html" + create_template = "create.html" + edit_template = "edit.html" class UserAdmin(CustomView): - column_searchable_list = ('name',) - column_filters = ('name', 'email') + column_searchable_list = ("name",) + column_filters = ("name", "email") # Flask views -@app.route('/') +@app.route("/") def index(): return '<a href="/admin/">Click me to get to Admin!</a>' # Create admin with custom base template -admin = admin.Admin(app, 'Example: Layout-BS4', theme=Bootstrap4Theme(base_template='layout.html')) +admin = admin.Admin( + app, "Example: Layout-BS4", theme=Bootstrap4Theme(base_template="layout.html") +) # Add views admin.add_view(UserAdmin(User, db.session)) @@ -75,14 +76,58 @@ def build_sample_db(): db.create_all() first_names = [ - 'Harry', 'Amelia', 'Oliver', 'Jack', 'Isabella', 'Charlie','Sophie', 'Mia', - 'Jacob', 'Thomas', 'Emily', 'Lily', 'Ava', 'Isla', 'Alfie', 'Olivia', 'Jessica', - 'Riley', 'William', 'James', 'Geoffrey', 'Lisa', 'Benjamin', 'Stacey', 'Lucy' + "Harry", + "Amelia", + "Oliver", + "Jack", + "Isabella", + "Charlie", + "Sophie", + "Mia", + "Jacob", + "Thomas", + "Emily", + "Lily", + "Ava", + "Isla", + "Alfie", + "Olivia", + "Jessica", + "Riley", + "William", + "James", + "Geoffrey", + "Lisa", + "Benjamin", + "Stacey", + "Lucy", ] last_names = [ - 'Brown', 'Smith', 'Patel', 'Jones', 'Williams', 'Johnson', 'Taylor', 'Thomas', - 'Roberts', 'Khan', 'Lewis', 'Jackson', 'Clarke', 'James', 'Phillips', 'Wilson', - 'Ali', 'Mason', 'Mitchell', 'Rose', 'Davis', 'Davies', 'Rodriguez', 'Cox', 'Alexander' + "Brown", + "Smith", + "Patel", + "Jones", + "Williams", + "Johnson", + "Taylor", + "Thomas", + "Roberts", + "Khan", + "Lewis", + "Jackson", + "Clarke", + "James", + "Phillips", + "Wilson", + "Ali", + "Mason", + "Mitchell", + "Rose", + "Davis", + "Davies", + "Rodriguez", + "Cox", + "Alexander", ] for i in range(len(first_names)): @@ -93,17 +138,17 @@ def build_sample_db(): sample_text = [ { - 'title': "de Finibus Bonorum et Malorum - Part I", - 'content': "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor \ + "title": "de Finibus Bonorum et Malorum - Part I", + "content": "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor \ incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud \ exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \ dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. \ Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt \ - mollit anim id est laborum." + mollit anim id est laborum.", }, { - 'title': "de Finibus Bonorum et Malorum - Part II", - 'content': "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque \ + "title": "de Finibus Bonorum et Malorum - Part II", + "content": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque \ laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto \ beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur \ aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi \ @@ -112,11 +157,11 @@ def build_sample_db(): aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam \ corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum \ iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum \ - qui dolorem eum fugiat quo voluptas nulla pariatur?" + qui dolorem eum fugiat quo voluptas nulla pariatur?", }, { - 'title': "de Finibus Bonorum et Malorum - Part III", - 'content': "At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium \ + "title": "de Finibus Bonorum et Malorum - Part III", + "content": "At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium \ voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati \ cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id \ est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam \ @@ -125,24 +170,24 @@ def build_sample_db(): Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet \ ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur \ a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis \ - doloribus asperiores repellat." - } + doloribus asperiores repellat.", + }, ] for entry in sample_text: page = Page() - page.title = entry['title'] - page.content = entry['content'] + page.title = entry["title"] + page.content = entry["content"] db.session.add(page) db.session.commit() return -if __name__ == '__main__': +if __name__ == "__main__": # Build a sample db on the fly, if one does not exist yet. app_dir = op.realpath(os.path.dirname(__file__)) - database_path = op.join(app_dir, app.config['DATABASE_FILE']) + database_path = op.join(app_dir, app.config["DATABASE_FILE"]) if not os.path.exists(database_path): with app.app_context(): build_sample_db() diff --git a/examples/custom-layout/static/layout.css b/examples/custom-layout/static/layout.css index cd191017d..dd4ba7a78 100644 --- a/examples/custom-layout/static/layout.css +++ b/examples/custom-layout/static/layout.css @@ -53,4 +53,4 @@ body { a.dropdown-toggle b.caret { margin-left: 5px; -} \ No newline at end of file +} diff --git a/examples/custom-layout/templates/list.html b/examples/custom-layout/templates/list.html index f6e037bdc..415e1fb35 100644 --- a/examples/custom-layout/templates/list.html +++ b/examples/custom-layout/templates/list.html @@ -8,19 +8,19 @@ <h2 id="brand">{{ admin_view.name|capitalize }} list</h2> <a href="{{ url_for('.create_view', url=return_url) }}" class="btn btn-primary pull-right">{{ _gettext('Create') }}</a> </div> {% endif %} - + {% if filter_groups %} <div class="btn-group btn-menu"> {{ model_layout.filter_options(btn_class='btn dropdown-toggle btn-title') }} </div> {% endif %} - + {% if actions %} <div class="btn-group btn-menu"> {{ actionlib.dropdown(actions, btn_class='btn dropdown-toggle btn-title') }} </div> {% endif %} - + {% if search_supported %} <div class="search-form btn-menu"> {{ model_layout.search_form(input_class='span2 btn-title') }} diff --git a/examples/datetime-timezone/app.py b/examples/datetime-timezone/app.py index 0d113ab73..b72d8047c 100644 --- a/examples/datetime-timezone/app.py +++ b/examples/datetime-timezone/app.py @@ -1,15 +1,20 @@ from datetime import datetime -from zoneinfo import ZoneInfo - -from flask import Flask, request, session, jsonify -from flask_sqlalchemy import SQLAlchemy -from markupsafe import Markup -from sqlalchemy import DateTime, String -from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column +from flask import Flask +from flask import jsonify +from flask import request +from flask import session from flask_admin import Admin from flask_admin.contrib.sqla import ModelView from flask_admin.model import typefmt +from flask_sqlalchemy import SQLAlchemy +from markupsafe import Markup +from sqlalchemy import DateTime +from sqlalchemy import String +from sqlalchemy.orm import DeclarativeBase +from sqlalchemy.orm import Mapped +from sqlalchemy.orm import mapped_column +from zoneinfo import ZoneInfo # model @@ -21,7 +26,7 @@ class Base(DeclarativeBase): app = Flask(__name__) app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///default.sqlite" # Create dummy secret key so we can use sessions -app.config['SECRET_KEY'] = '123456789' +app.config["SECRET_KEY"] = "123456789" db = SQLAlchemy(model_class=Base) db.init_app(app) @@ -38,21 +43,23 @@ def date_format(view, value): Ensure consistent date format and inject class for timezone.js parser. """ if value is None: - return '' + return "" return Markup( f'<span class="timezone-aware">{value.strftime("%Y-%m-%d %H:%M:%S")}</span>' ) MY_DEFAULT_FORMATTERS = dict(typefmt.BASE_FORMATTERS) -MY_DEFAULT_FORMATTERS.update({ - datetime: date_format, -}) +MY_DEFAULT_FORMATTERS.update( + { + datetime: date_format, + } +) class TimezoneAwareModelView(ModelView): column_type_formatters = MY_DEFAULT_FORMATTERS - extra_js = ['/static/js/timezone.js'] + extra_js = ["/static/js/timezone.js"] def on_model_change(self, form, model, is_created): """ @@ -66,7 +73,7 @@ def on_model_change(self, form, model, is_created): aware_time = field_value.replace(tzinfo=ZoneInfo(user_timezone)) # Convert the time to UTC - utc_time = aware_time.astimezone(ZoneInfo('UTC')) + utc_time = aware_time.astimezone(ZoneInfo("UTC")) # Assign the UTC time to the model setattr(model, field_name, utc_time) @@ -89,12 +96,12 @@ class BlogModelView(ModelView): # Flask views -@app.route('/') +@app.route("/") def index(): return '<a href="/admin/timezone_aware_article">Click me to get to Admin!</a>' -@app.route('/set_timezone', methods=['POST']) +@app.route("/set_timezone", methods=["POST"]) def set_timezone(): """ Save timezone to session so that datetime inputs can be correctly converted to UTC. @@ -102,25 +109,32 @@ def set_timezone(): session.permanent = True timezone = request.get_json() if timezone: - session['timezone'] = timezone - return jsonify({'message': 'Timezone set successfully'}), 200 + session["timezone"] = timezone + return jsonify({"message": "Timezone set successfully"}), 200 else: - return jsonify({'error': 'Invalid timezone'}), 400 + return jsonify({"error": "Invalid timezone"}), 400 # create db on the fly with app.app_context(): Base.metadata.drop_all(db.engine) Base.metadata.create_all(db.engine) - db.session.add(Article(text="Written at 9:00 UTC", - last_edit=datetime(2024, 8, 8, 9, 0, 0))) + db.session.add( + Article(text="Written at 9:00 UTC", last_edit=datetime(2024, 8, 8, 9, 0, 0)) + ) db.session.commit() - admin = Admin(app, name='microblog') + admin = Admin(app, name="microblog") admin.add_view( - BlogModelView(Article, db.session, name="Article", endpoint="article")) + BlogModelView(Article, db.session, name="Article", endpoint="article") + ) admin.add_view( - TimezoneAwareBlogModelView(Article, db.session, name="Timezone Aware Article", - endpoint="timezone_aware_article")) + TimezoneAwareBlogModelView( + Article, + db.session, + name="Timezone Aware Article", + endpoint="timezone_aware_article", + ) + ) -if __name__ == '__main__': +if __name__ == "__main__": app.run(debug=True) diff --git a/examples/forms-files-images/__init__.py b/examples/forms-files-images/__init__.py index bc6af4c90..ee2c5c6fe 100644 --- a/examples/forms-files-images/__init__.py +++ b/examples/forms-files-images/__init__.py @@ -1 +1 @@ -__author__ = 'petrus' +__author__ = "petrus" diff --git a/examples/forms-files-images/app.py b/examples/forms-files-images/app.py index ce7929455..2f850a32e 100644 --- a/examples/forms-files-images/app.py +++ b/examples/forms-files-images/app.py @@ -1,34 +1,35 @@ import os import os.path as op -from flask import Flask, url_for +from flask import Flask +from flask import url_for +from flask_admin import Admin +from flask_admin import form +from flask_admin.contrib import rediscli +from flask_admin.contrib import sqla +from flask_admin.form import rules +from flask_admin.theme import Bootstrap4Theme from flask_sqlalchemy import SQLAlchemy +from markupsafe import Markup from redis import Redis -from wtforms import fields, widgets - from sqlalchemy.event import listens_for -from markupsafe import Markup - -from flask_admin import Admin, form -from flask_admin.theme import Bootstrap4Theme -from flask_admin.form import rules -from flask_admin.contrib import sqla, rediscli - +from wtforms import fields +from wtforms import widgets # Create application -app = Flask(__name__, static_folder='files') +app = Flask(__name__, static_folder="files") # Create dummy secrey key so we can use sessions -app.config['SECRET_KEY'] = '123456790' +app.config["SECRET_KEY"] = "123456790" # Create in-memory database -app.config['DATABASE_FILE'] = 'sample_db.sqlite' -app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + app.config['DATABASE_FILE'] -app.config['SQLALCHEMY_ECHO'] = True +app.config["DATABASE_FILE"] = "sample_db.sqlite" +app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///" + app.config["DATABASE_FILE"] +app.config["SQLALCHEMY_ECHO"] = True db = SQLAlchemy(app) # Create directory for file fields to use -file_path = op.join(op.dirname(__file__), 'files') +file_path = op.join(op.dirname(__file__), "files") try: os.mkdir(file_path) except OSError: @@ -76,7 +77,7 @@ def __unicode__(self): # Delete hooks for models, delete files if models are getting deleted -@listens_for(File, 'after_delete') +@listens_for(File, "after_delete") def del_file(mapper, connection, target): if target.path: try: @@ -86,7 +87,7 @@ def del_file(mapper, connection, target): pass -@listens_for(Image, 'after_delete') +@listens_for(Image, "after_delete") def del_image(mapper, connection, target): if target.path: # Delete image @@ -97,8 +98,7 @@ def del_image(mapper, connection, target): # Delete thumbnail try: - os.remove(op.join(file_path, - form.thumbgen_filename(target.path))) + os.remove(op.join(file_path, form.thumbgen_filename(target.path))) except OSError: pass @@ -108,8 +108,8 @@ def del_image(mapper, connection, target): class CKTextAreaWidget(widgets.TextArea): def __call__(self, field, **kwargs): # add WYSIWYG class to existing classes - existing_classes = kwargs.pop('class', '') or kwargs.pop('class_', '') - kwargs['class'] = '{} {}'.format(existing_classes, "ckeditor") + existing_classes = kwargs.pop("class", "") or kwargs.pop("class_", "") + kwargs["class"] = "{} {}".format(existing_classes, "ckeditor") return super(CKTextAreaWidget, self).__call__(field, **kwargs) @@ -119,46 +119,39 @@ class CKTextAreaField(fields.TextAreaField): # Administrative views class PageView(sqla.ModelView): - form_overrides = { - 'text': CKTextAreaField - } - create_template = 'create_page.html' - edit_template = 'edit_page.html' + form_overrides = {"text": CKTextAreaField} + create_template = "create_page.html" + edit_template = "edit_page.html" + class FileView(sqla.ModelView): # Override form field to use Flask-Admin FileUploadField - form_overrides = { - 'path': form.FileUploadField - } + form_overrides = {"path": form.FileUploadField} # Pass additional parameters to 'path' to FileUploadField constructor form_args = { - 'path': { - 'label': 'File', - 'base_path': file_path, - 'allow_overwrite': False - } + "path": {"label": "File", "base_path": file_path, "allow_overwrite": False} } class ImageView(sqla.ModelView): def _list_thumbnail(view, context, model, name): if not model.path: - return '' + return "" - return Markup('<img src="%s">' % url_for('static', - filename=form.thumbgen_filename(model.path))) + return Markup( + '<img src="%s">' + % url_for("static", filename=form.thumbgen_filename(model.path)) + ) - column_formatters = { - 'path': _list_thumbnail - } + column_formatters = {"path": _list_thumbnail} # Alternative way to contribute field is to override it completely. # In this case, Flask-Admin won't attempt to merge various parameters for the field. form_extra_fields = { - 'path': form.ImageUploadField('Image', - base_path=file_path, - thumbnail_size=(100, 100, True)) + "path": form.ImageUploadField( + "Image", base_path=file_path, thumbnail_size=(100, 100, True) + ) } @@ -166,23 +159,26 @@ class UserView(sqla.ModelView): """ This class demonstrates the use of 'rules' for controlling the rendering of forms. """ + form_create_rules = [ # Header and four fields. Email field will go above phone field. - rules.FieldSet(('first_name', 'last_name', 'email', 'phone', 'is_admin'), 'Personal'), + rules.FieldSet( + ("first_name", "last_name", "email", "phone", "is_admin"), "Personal" + ), # Separate header and few fields - rules.Header('Location'), - rules.Field('city'), + rules.Header("Location"), + rules.Field("city"), # String is resolved to form field, so there's no need to explicitly use `rules.Field` - 'country', + "country", # Show macro that's included in the templates - rules.Container('rule_demo.wrap', rules.Field('notes')) + rules.Container("rule_demo.wrap", rules.Field("notes")), ] # Use same rule set for edit page form_edit_rules = form_create_rules - create_template = 'create_user.html' - edit_template = 'edit_user.html' + create_template = "create_user.html" + edit_template = "edit_user.html" column_descriptions = { "is_admin": "Is this an admin user?", @@ -190,12 +186,13 @@ class UserView(sqla.ModelView): # Flask views -@app.route('/') +@app.route("/") def index(): return '<a href="/admin/">Click me to get to Admin!</a>' + # Create admin -admin = Admin(app, 'Example: Forms', theme=Bootstrap4Theme(swatch='cerulean')) +admin = Admin(app, "Example: Forms", theme=Bootstrap4Theme(swatch="cerulean")) # Add views admin.add_view(FileView(File, db.session)) @@ -217,14 +214,58 @@ def build_sample_db(): db.create_all() first_names = [ - 'Harry', 'Amelia', 'Oliver', 'Jack', 'Isabella', 'Charlie','Sophie', 'Mia', - 'Jacob', 'Thomas', 'Emily', 'Lily', 'Ava', 'Isla', 'Alfie', 'Olivia', 'Jessica', - 'Riley', 'William', 'James', 'Geoffrey', 'Lisa', 'Benjamin', 'Stacey', 'Lucy' + "Harry", + "Amelia", + "Oliver", + "Jack", + "Isabella", + "Charlie", + "Sophie", + "Mia", + "Jacob", + "Thomas", + "Emily", + "Lily", + "Ava", + "Isla", + "Alfie", + "Olivia", + "Jessica", + "Riley", + "William", + "James", + "Geoffrey", + "Lisa", + "Benjamin", + "Stacey", + "Lucy", ] last_names = [ - 'Brown', 'Smith', 'Patel', 'Jones', 'Williams', 'Johnson', 'Taylor', 'Thomas', - 'Roberts', 'Khan', 'Lewis', 'Jackson', 'Clarke', 'James', 'Phillips', 'Wilson', - 'Ali', 'Mason', 'Mitchell', 'Rose', 'Davis', 'Davies', 'Rodriguez', 'Cox', 'Alexander' + "Brown", + "Smith", + "Patel", + "Jones", + "Williams", + "Johnson", + "Taylor", + "Thomas", + "Roberts", + "Khan", + "Lewis", + "Jackson", + "Clarke", + "James", + "Phillips", + "Wilson", + "Ali", + "Mason", + "Mitchell", + "Rose", + "Davis", + "Davies", + "Rodriguez", + "Cox", + "Alexander", ] locations = [ ("Shanghai", "China"), @@ -252,14 +293,14 @@ def build_sample_db(): ("Lagos", "Nigeria"), ("Lima", "Peru"), ("Ho Chi Minh City", "Vietnam"), - ] + ] for i in range(len(first_names)): user = User() user.first_name = first_names[i] user.last_name = last_names[i] user.email = user.first_name.lower() + "@example.com" - tmp = ''.join(random.choice(string.digits) for i in range(10)) + tmp = "".join(random.choice(string.digits) for i in range(10)) user.phone = "(" + tmp[0:3] + ") " + tmp[3:6] + " " + tmp[6::] user.city = locations[i][0] user.country = locations[i][1] @@ -278,18 +319,20 @@ def build_sample_db(): file.path = "example_" + str(i) + ".pdf" db.session.add(file) - sample_text = "<h2>This is a test</h2>" + \ - "<p>Create HTML content in a text area field with the help of <i>WTForms</i> and <i>CKEditor</i>.</p>" + sample_text = ( + "<h2>This is a test</h2>" + + "<p>Create HTML content in a text area field with the help of <i>WTForms</i> and <i>CKEditor</i>.</p>" + ) db.session.add(Page(name="Test Page", text=sample_text)) db.session.commit() return -if __name__ == '__main__': +if __name__ == "__main__": # Build a sample db on the fly, if one does not exist yet. app_dir = op.realpath(os.path.dirname(__file__)) - database_path = op.join(app_dir, app.config['DATABASE_FILE']) + database_path = op.join(app_dir, app.config["DATABASE_FILE"]) if not os.path.exists(database_path): with app.app_context(): build_sample_db() diff --git a/examples/forms-files-images/templates/admin/index.html b/examples/forms-files-images/templates/admin/index.html index 6b2f17015..d3a6345f3 100644 --- a/examples/forms-files-images/templates/admin/index.html +++ b/examples/forms-files-images/templates/admin/index.html @@ -18,4 +18,4 @@ <h1>Flask-Admin example</h1> </div> </div> </div> -{% endblock body %} \ No newline at end of file +{% endblock body %} diff --git a/examples/forms-files-images/templates/macros.html b/examples/forms-files-images/templates/macros.html index edff56416..24122e8e7 100644 --- a/examples/forms-files-images/templates/macros.html +++ b/examples/forms-files-images/templates/macros.html @@ -2,4 +2,4 @@ <div style="border: 1px solid gray; background-color: #f0f0f0; padding-top: 8px; margin-bottom: 8px"> {{ caller() }} </div> -{% endmacro %} \ No newline at end of file +{% endmacro %} diff --git a/examples/geo_alchemy/app.py b/examples/geo_alchemy/app.py index 397145229..c464f3e78 100644 --- a/examples/geo_alchemy/app.py +++ b/examples/geo_alchemy/app.py @@ -1,16 +1,13 @@ +import flask_admin as admin from flask import Flask +from flask_admin.contrib.geoa import ModelView +from flask_admin.theme import Bootstrap4Theme from flask_sqlalchemy import SQLAlchemy - -import flask_admin as admin from geoalchemy2.types import Geometry -from flask_admin.theme import Bootstrap4Theme -from flask_admin.contrib.geoa import ModelView - - # Create application app = Flask(__name__) -app.config.from_pyfile('config.py') +app.config.from_pyfile("config.py") db = SQLAlchemy(app) @@ -51,12 +48,13 @@ class MultiLineString(db.Model): # Flask views -@app.route('/') +@app.route("/") def index(): return '<a href="/admin/">Click me to get to Admin!</a>' + # Create admin -admin = admin.Admin(app, name='Example: GeoAlchemy', theme=Bootstrap4Theme()) +admin = admin.Admin(app, name="Example: GeoAlchemy", theme=Bootstrap4Theme()) class LeafletModelView(ModelView): @@ -64,19 +62,19 @@ class LeafletModelView(ModelView): class OSMModelView(ModelView): - tile_layer_url = '{s}.tile.openstreetmap.org/{z}/{x}/{y}.png' + tile_layer_url = "{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" tile_layer_attribution = '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors' -# Add views -admin.add_view(LeafletModelView(Point, db.session, category='Points')) -admin.add_view(OSMModelView(MultiPoint, db.session, category='Points')) -admin.add_view(LeafletModelView(Polygon, db.session, category='Polygons')) -admin.add_view(OSMModelView(MultiPolygon, db.session, category='Polygons')) -admin.add_view(LeafletModelView(LineString, db.session, category='Lines')) -admin.add_view(OSMModelView(MultiLineString, db.session, category='Lines')) - -if __name__ == '__main__': +# Add views +admin.add_view(LeafletModelView(Point, db.session, category="Points")) +admin.add_view(OSMModelView(MultiPoint, db.session, category="Points")) +admin.add_view(LeafletModelView(Polygon, db.session, category="Polygons")) +admin.add_view(OSMModelView(MultiPolygon, db.session, category="Polygons")) +admin.add_view(LeafletModelView(LineString, db.session, category="Lines")) +admin.add_view(OSMModelView(MultiLineString, db.session, category="Lines")) + +if __name__ == "__main__": with app.app_context(): db.create_all() diff --git a/examples/geo_alchemy/config.py b/examples/geo_alchemy/config.py index 29d529f6a..657209314 100644 --- a/examples/geo_alchemy/config.py +++ b/examples/geo_alchemy/config.py @@ -1,18 +1,20 @@ # Create dummy secrey key so we can use sessions -SECRET_KEY = '123456790' +SECRET_KEY = "123456790" # database connection -SQLALCHEMY_DATABASE_URI = 'postgresql+psycopg2://flask_admin_geo:flask_admin_geo@localhost/flask_admin_geo' +SQLALCHEMY_DATABASE_URI = ( + "postgresql+psycopg2://flask_admin_geo:flask_admin_geo@localhost/flask_admin_geo" +) SQLALCHEMY_ECHO = True # credentials for loading map tiles from mapbox FLASK_ADMIN_MAPS = True FLASK_ADMIN_MAPS_SEARCH = False -FLASK_ADMIN_MAPBOX_MAP_ID = 'light-v10' # example map id -FLASK_ADMIN_MAPBOX_ACCESS_TOKEN = '...' +FLASK_ADMIN_MAPBOX_MAP_ID = "light-v10" # example map id +FLASK_ADMIN_MAPBOX_ACCESS_TOKEN = "..." # when the creating new shapes, use this default map center FLASK_ADMIN_DEFAULT_CENTER_LAT = -33.918861 FLASK_ADMIN_DEFAULT_CENTER_LONG = 18.423300 -FLASK_ADMIN_GOOGLE_MAPS_API_KEY = '...' +FLASK_ADMIN_GOOGLE_MAPS_API_KEY = "..." diff --git a/examples/host-matching/app.py b/examples/host-matching/app.py index 1214c1108..9739f85ce 100644 --- a/examples/host-matching/app.py +++ b/examples/host-matching/app.py @@ -1,33 +1,38 @@ -from flask import Flask, url_for - import flask_admin as admin +from flask import Flask +from flask import url_for # Views class FirstView(admin.BaseView): - @admin.expose('/') + @admin.expose("/") def index(self): - return self.render('first.html') + return self.render("first.html") class SecondView(admin.BaseView): - @admin.expose('/') + @admin.expose("/") def index(self): - return self.render('second.html') + return self.render("second.html") class ThirdViewAllHosts(admin.BaseView): - @admin.expose('/') + @admin.expose("/") def index(self): - return self.render('third.html') + return self.render("third.html") # Create flask app -app = Flask(__name__, template_folder='templates', host_matching=True, static_host='static.localhost:5000') +app = Flask( + __name__, + template_folder="templates", + host_matching=True, + static_host="static.localhost:5000", +) # Flask views -@app.route('/', host='<anyhost>') +@app.route("/", host="<anyhost>") def index(anyhost): return ( f'<a href="{url_for("admin.index")}">Click me to get to Admin 1</a>' @@ -38,17 +43,19 @@ def index(anyhost): ) -if __name__ == '__main__': +if __name__ == "__main__": # Create first administrative interface at `first.localhost:5000/admin1` - admin1 = admin.Admin(app, url='/admin1', host='first.localhost:5000') + admin1 = admin.Admin(app, url="/admin1", host="first.localhost:5000") admin1.add_view(FirstView()) # Create second administrative interface at `second.localhost:5000/admin2` - admin2 = admin.Admin(app, url='/admin2', endpoint='admin2', host='second.localhost:5000') + admin2 = admin.Admin( + app, url="/admin2", endpoint="admin2", host="second.localhost:5000" + ) admin2.add_view(SecondView()) # Create third administrative interface, available on any domain at `/admin3` - admin3 = admin.Admin(app, url='/admin3', endpoint='admin3', host='*') + admin3 = admin.Admin(app, url="/admin3", endpoint="admin3", host="*") admin3.add_view(ThirdViewAllHosts()) # Start app diff --git a/examples/methodview/app.py b/examples/methodview/app.py index a6b6fcbaf..482767b89 100644 --- a/examples/methodview/app.py +++ b/examples/methodview/app.py @@ -1,42 +1,43 @@ -from flask import Flask, redirect, request - import flask_admin as admin +from flask import Flask +from flask import redirect +from flask import request from flask.views import MethodView class ViewWithMethodViews(admin.BaseView): - @admin.expose('/') + @admin.expose("/") def index(self): - return self.render('methodtest.html') + return self.render("methodtest.html") - @admin.expose_plugview('/_api/1') + @admin.expose_plugview("/_api/1") class API_v1(MethodView): def get(self, cls): - return cls.render('test.html', request=request, name="API_v1") + return cls.render("test.html", request=request, name="API_v1") def post(self, cls): - return cls.render('test.html', request=request, name="API_v1") + return cls.render("test.html", request=request, name="API_v1") - @admin.expose_plugview('/_api/2') + @admin.expose_plugview("/_api/2") class API_v2(MethodView): def get(self, cls): - return cls.render('test.html', request=request, name="API_v2") + return cls.render("test.html", request=request, name="API_v2") def post(self, cls): - return cls.render('test.html', request=request, name="API_v2") + return cls.render("test.html", request=request, name="API_v2") # Create flask app -app = Flask(__name__, template_folder='templates') +app = Flask(__name__, template_folder="templates") # Flask views -@app.route('/') +@app.route("/") def index(): - return redirect('/admin') + return redirect("/admin") -if __name__ == '__main__': +if __name__ == "__main__": # Create admin interface admin = admin.Admin(name="Example: MethodView") admin.add_view(ViewWithMethodViews()) diff --git a/examples/multiple-admin-instances/app.py b/examples/multiple-admin-instances/app.py index db80cf815..49fbc937a 100644 --- a/examples/multiple-admin-instances/app.py +++ b/examples/multiple-admin-instances/app.py @@ -1,38 +1,37 @@ -from flask import Flask - import flask_admin as admin +from flask import Flask # Views class FirstView(admin.BaseView): - @admin.expose('/') + @admin.expose("/") def index(self): - return self.render('first.html') + return self.render("first.html") class SecondView(admin.BaseView): - @admin.expose('/') + @admin.expose("/") def index(self): - return self.render('second.html') + return self.render("second.html") # Create flask app -app = Flask(__name__, template_folder='templates') +app = Flask(__name__, template_folder="templates") # Flask views -@app.route('/') +@app.route("/") def index(): return '<a href="/admin1">Click me to get to Admin 1</a><br/><a href="/admin2">Click me to get to Admin 2</a>' -if __name__ == '__main__': +if __name__ == "__main__": # Create first administrative interface under /admin1 - admin1 = admin.Admin(app, url='/admin1') + admin1 = admin.Admin(app, url="/admin1") admin1.add_view(FirstView()) # Create second administrative interface under /admin2 - admin2 = admin.Admin(app, url='/admin2', endpoint='admin2') + admin2 = admin.Admin(app, url="/admin2", endpoint="admin2") admin2.add_view(SecondView()) # Start app diff --git a/examples/peewee/app.py b/examples/peewee/app.py index 82833c752..e14264f56 100644 --- a/examples/peewee/app.py +++ b/examples/peewee/app.py @@ -1,15 +1,14 @@ import uuid +import flask_admin as admin import peewee from flask import Flask - -import flask_admin as admin from flask_admin.contrib.peewee import ModelView app = Flask(__name__) -app.config['SECRET_KEY'] = '123456790' +app.config["SECRET_KEY"] = "123456790" -db = peewee.SqliteDatabase('test.sqlite', check_same_thread=False) +db = peewee.SqliteDatabase("test.sqlite", check_same_thread=False) class BaseModel(peewee.Model): @@ -32,7 +31,7 @@ class UserInfo(BaseModel): user = peewee.ForeignKeyField(User) def __str__(self): - return f'{self.key} - {self.value}' + return f"{self.key} - {self.value}" class Post(BaseModel): @@ -53,39 +52,33 @@ class UserAdmin(ModelView): class PostAdmin(ModelView): # Visible columns in the list view - column_exclude_list = ['text'] + column_exclude_list = ["text"] # List of columns that can be sorted. For 'user' column, use User.email as # a column. - column_sortable_list = ('title', ('user', User.email), 'date') + column_sortable_list = ("title", ("user", User.email), "date") # Full text search - column_searchable_list = ('title', User.username) + column_searchable_list = ("title", User.username) # Column filters - column_filters = ('title', - 'date', - User.username) + column_filters = ("title", "date", User.username) - form_ajax_refs = { - 'user': { - 'fields': (User.username, 'email') - } - } + form_ajax_refs = {"user": {"fields": (User.username, "email")}} -@app.route('/') +@app.route("/") def index(): return '<a href="/admin/">Click me to get to Admin!</a>' -if __name__ == '__main__': +if __name__ == "__main__": import logging logging.basicConfig() logging.getLogger().setLevel(logging.DEBUG) - admin = admin.Admin(app, name='Example: Peewee') + admin = admin.Admin(app, name="Example: Peewee") admin.add_view(UserAdmin(User)) admin.add_view(PostAdmin(Post)) diff --git a/examples/pymongo/app.py b/examples/pymongo/app.py index cdcc72393..554b44260 100644 --- a/examples/pymongo/app.py +++ b/examples/pymongo/app.py @@ -1,20 +1,20 @@ +import flask_admin as admin import pymongo from bson.objectid import ObjectId - from flask import Flask -import flask_admin as admin - -from wtforms import form, fields - +from flask_admin.contrib.pymongo import filters +from flask_admin.contrib.pymongo import ModelView from flask_admin.form import Select2Widget -from flask_admin.contrib.pymongo import ModelView, filters -from flask_admin.model.fields import InlineFormField, InlineFieldList +from flask_admin.model.fields import InlineFieldList +from flask_admin.model.fields import InlineFormField +from wtforms import fields +from wtforms import form # Create application app = Flask(__name__) # Create dummy secrey key so we can use sessions -app.config['SECRET_KEY'] = '123456790' +app.config["SECRET_KEY"] = "123456790" # Create models conn = pymongo.MongoClient() @@ -23,14 +23,14 @@ # User admin class InnerForm(form.Form): - name = fields.StringField('Name') - test = fields.StringField('Test') + name = fields.StringField("Name") + test = fields.StringField("Test") class UserForm(form.Form): - name = fields.StringField('Name') - email = fields.StringField('Email') - password = fields.StringField('Password') + name = fields.StringField("Name") + email = fields.StringField("Email") + password = fields.StringField("Password") # Inner form inner = InlineFormField(InnerForm) @@ -40,32 +40,34 @@ class UserForm(form.Form): class UserView(ModelView): - column_list = ('name', 'email', 'password') - column_sortable_list = ('name', 'email', 'password') + column_list = ("name", "email", "password") + column_sortable_list = ("name", "email", "password") form = UserForm # Tweet view class TweetForm(form.Form): - name = fields.StringField('Name') - user_id = fields.SelectField('User', widget=Select2Widget()) - text = fields.StringField('Text') + name = fields.StringField("Name") + user_id = fields.SelectField("User", widget=Select2Widget()) + text = fields.StringField("Text") - testie = fields.BooleanField('Test') + testie = fields.BooleanField("Test") class TweetView(ModelView): - column_list = ('name', 'user_name', 'text') - column_sortable_list = ('name', 'text') + column_list = ("name", "user_name", "text") + column_sortable_list = ("name", "text") - column_filters = (filters.FilterEqual('name', 'Name'), - filters.FilterNotEqual('name', 'Name'), - filters.FilterLike('name', 'Name'), - filters.FilterNotLike('name', 'Name'), - filters.BooleanEqualFilter('testie', 'Testie')) + column_filters = ( + filters.FilterEqual("name", "Name"), + filters.FilterNotEqual("name", "Name"), + filters.FilterLike("name", "Name"), + filters.FilterNotLike("name", "Name"), + filters.BooleanEqualFilter("testie", "Testie"), + ) - column_searchable_list = ('name', 'text') + column_searchable_list = ("name", "text") form = TweetForm @@ -73,21 +75,21 @@ def get_list(self, *args, **kwargs): count, data = super(TweetView, self).get_list(*args, **kwargs) # Grab user names - query = {'_id': {'$in': [x['user_id'] for x in data]}} - users = db.user.find(query, projection=('name',)) + query = {"_id": {"$in": [x["user_id"] for x in data]}} + users = db.user.find(query, projection=("name",)) # Contribute user names to the models - users_map = dict((x['_id'], x['name']) for x in users) + users_map = dict((x["_id"], x["name"]) for x in users) for item in data: - item['user_name'] = users_map.get(item['user_id']) + item["user_name"] = users_map.get(item["user_id"]) return count, data # Contribute list of user choices to the forms def _feed_user_choices(self, form): - users = db.user.find(projection=('name',)) - form.user_id.choices = [(str(x['_id']), x['name']) for x in users] + users = db.user.find(projection=("name",)) + form.user_id.choices = [(str(x["_id"]), x["name"]) for x in users] return form def create_form(self): @@ -100,25 +102,25 @@ def edit_form(self, obj): # Correct user_id reference before saving def on_model_change(self, form, model, is_created): - user_id = model.get('user_id') - model['user_id'] = ObjectId(user_id) + user_id = model.get("user_id") + model["user_id"] = ObjectId(user_id) return model # Flask views -@app.route('/') +@app.route("/") def index(): return '<a href="/admin/">Click me to get to Admin!</a>' -if __name__ == '__main__': +if __name__ == "__main__": # Create admin - admin = admin.Admin(app, name='Example: PyMongo') + admin = admin.Admin(app, name="Example: PyMongo") # Add views - admin.add_view(UserView(db.user, 'User')) - admin.add_view(TweetView(db.tweet, 'Tweets')) + admin.add_view(UserView(db.user, "User")) + admin.add_view(TweetView(db.tweet, "Tweets")) # Start app app.run(debug=True) diff --git a/examples/simple/app.py b/examples/simple/app.py index 20fb84c49..f5b216256 100644 --- a/examples/simple/app.py +++ b/examples/simple/app.py @@ -1,44 +1,43 @@ -from flask import Flask - import flask_admin as admin - +from flask import Flask # Create custom admin view from flask_admin.theme import Bootstrap4Theme class MyAdminView(admin.BaseView): - @admin.expose('/') + @admin.expose("/") def index(self): - return self.render('myadmin.html') + return self.render("myadmin.html") class AnotherAdminView(admin.BaseView): - @admin.expose('/') + @admin.expose("/") def index(self): - return self.render('anotheradmin.html') + return self.render("anotheradmin.html") - @admin.expose('/test/') + @admin.expose("/test/") def test(self): - return self.render('test.html') + return self.render("test.html") # Create flask app -app = Flask(__name__, template_folder='templates') +app = Flask(__name__, template_folder="templates") app.debug = True + # Flask views -@app.route('/') +@app.route("/") def index(): return '<a href="/admin/">Click me to get to Admin!</a>' + # Create admin interface admin = admin.Admin(name="Example: Simple Views", theme=Bootstrap4Theme()) -admin.add_view(MyAdminView(name="view1", category='Test')) -admin.add_view(AnotherAdminView(name="view2", category='Test')) +admin.add_view(MyAdminView(name="view1", category="Test")) +admin.add_view(AnotherAdminView(name="view2", category="Test")) admin.init_app(app) -if __name__ == '__main__': - +if __name__ == "__main__": # Start app app.run() diff --git a/examples/sqla-association_proxy/app.py b/examples/sqla-association_proxy/app.py index e40f14b5e..16984e2c5 100644 --- a/examples/sqla-association_proxy/app.py +++ b/examples/sqla-association_proxy/app.py @@ -1,57 +1,59 @@ +import flask_admin as admin from flask import Flask +from flask_admin.contrib import sqla +from flask_admin.theme import Bootstrap4Theme from flask_sqlalchemy import SQLAlchemy from sqlalchemy.ext.associationproxy import association_proxy -from sqlalchemy.orm import relationship, backref - -import flask_admin as admin -from flask_admin.theme import Bootstrap4Theme -from flask_admin.contrib import sqla +from sqlalchemy.orm import backref +from sqlalchemy.orm import relationship # Create application app = Flask(__name__) # Create dummy secrey key so we can use sessions -app.config['SECRET_KEY'] = '123456790' +app.config["SECRET_KEY"] = "123456790" # Create in-memory database -app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://' -app.config['SQLALCHEMY_ECHO'] = True +app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite://" +app.config["SQLALCHEMY_ECHO"] = True db = SQLAlchemy(app) # Flask views -@app.route('/') +@app.route("/") def index(): return '<a href="/admin/">Click me to get to Admin!</a>' class User(db.Model): - __tablename__ = 'user' + __tablename__ = "user" id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64)) # Association proxy of "user_keywords" collection to "keyword" attribute - a list of keywords objects. - keywords = association_proxy('user_keywords', 'keyword') + keywords = association_proxy("user_keywords", "keyword") # Association proxy to association proxy - a list of keywords strings. - keywords_values = association_proxy('user_keywords', 'keyword_value') + keywords_values = association_proxy("user_keywords", "keyword_value") def __init__(self, name=None): self.name = name class UserKeyword(db.Model): - __tablename__ = 'user_keyword' - user_id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True) - keyword_id = db.Column(db.Integer, db.ForeignKey('keyword.id'), primary_key=True) + __tablename__ = "user_keyword" + user_id = db.Column(db.Integer, db.ForeignKey("user.id"), primary_key=True) + keyword_id = db.Column(db.Integer, db.ForeignKey("keyword.id"), primary_key=True) special_key = db.Column(db.String(50)) # bidirectional attribute/collection of "user"/"user_keywords" - user = relationship(User, backref=backref("user_keywords", cascade="all, delete-orphan")) + user = relationship( + User, backref=backref("user_keywords", cascade="all, delete-orphan") + ) # reference to the "Keyword" object keyword = relationship("Keyword") # Reference to the "keyword" column inside the "Keyword" object. - keyword_value = association_proxy('keyword', 'keyword') + keyword_value = association_proxy("keyword", "keyword") def __init__(self, keyword=None, user=None, special_key=None): self.user = user @@ -60,47 +62,48 @@ def __init__(self, keyword=None, user=None, special_key=None): class Keyword(db.Model): - __tablename__ = 'keyword' + __tablename__ = "keyword" id = db.Column(db.Integer, primary_key=True) - keyword = db.Column('keyword', db.String(64)) + keyword = db.Column("keyword", db.String(64)) def __init__(self, keyword=None): self.keyword = keyword def __repr__(self): - return 'Keyword(%s)' % repr(self.keyword) + return "Keyword(%s)" % repr(self.keyword) class UserAdmin(sqla.ModelView): - """ Flask-admin can not automatically find a association_proxy yet. You will - need to manually define the column in list_view/filters/sorting/etc. - Moreover, support for association proxies to association proxies - (e.g.: keywords_values) is currently limited to column_list only.""" + """Flask-admin can not automatically find a association_proxy yet. You will + need to manually define the column in list_view/filters/sorting/etc. + Moreover, support for association proxies to association proxies + (e.g.: keywords_values) is currently limited to column_list only.""" - column_list = ('id', 'name', 'keywords', 'keywords_values') - column_sortable_list = ('id', 'name') - column_filters = ('id', 'name', 'keywords') - form_columns = ('name', 'keywords') + column_list = ("id", "name", "keywords", "keywords_values") + column_sortable_list = ("id", "name") + column_filters = ("id", "name", "keywords") + form_columns = ("name", "keywords") class KeywordAdmin(sqla.ModelView): - column_list = ('id', 'keyword') + column_list = ("id", "keyword") # Create admin -admin = admin.Admin(app, name='Example: SQLAlchemy Association Proxy', theme=Bootstrap4Theme()) +admin = admin.Admin( + app, name="Example: SQLAlchemy Association Proxy", theme=Bootstrap4Theme() +) admin.add_view(UserAdmin(User, db.session)) admin.add_view(KeywordAdmin(Keyword, db.session)) -if __name__ == '__main__': - +if __name__ == "__main__": # Create DB with app.app_context(): db.create_all() # Add sample data - user = User('log') - for kw in (Keyword('new_from_blammo'), Keyword('its_big')): + user = User("log") + for kw in (Keyword("new_from_blammo"), Keyword("its_big")): user.keywords.append(kw) with app.app_context(): diff --git a/examples/sqla-custom-inline-forms/app.py b/examples/sqla-custom-inline-forms/app.py index 686130526..3e1517051 100644 --- a/examples/sqla-custom-inline-forms/app.py +++ b/examples/sqla-custom-inline-forms/app.py @@ -1,35 +1,34 @@ import os import os.path as op -from werkzeug.utils import secure_filename -from sqlalchemy import event - -from flask import Flask, request, render_template -from flask_sqlalchemy import SQLAlchemy - -from wtforms import fields - import flask_admin as admin +from flask import Flask +from flask import render_template +from flask import request +from flask_admin.contrib.sqla import ModelView from flask_admin.contrib.sqla.ajax import QueryAjaxModelLoader +from flask_admin.contrib.sqla.fields import InlineModelFormList +from flask_admin.contrib.sqla.form import InlineModelConverter from flask_admin.form import RenderTemplateWidget from flask_admin.model.form import InlineFormAdmin -from flask_admin.contrib.sqla import ModelView -from flask_admin.contrib.sqla.form import InlineModelConverter -from flask_admin.contrib.sqla.fields import InlineModelFormList +from flask_sqlalchemy import SQLAlchemy +from sqlalchemy import event +from werkzeug.utils import secure_filename +from wtforms import fields # Create application app = Flask(__name__) # Create dummy secret key so we can use sessions -app.config['SECRET_KEY'] = '123456790' +app.config["SECRET_KEY"] = "123456790" # Create in-memory database -app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.sqlite' -app.config['SQLALCHEMY_ECHO'] = True +app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///test.sqlite" +app.config["SQLALCHEMY_ECHO"] = True db = SQLAlchemy(app) # Figure out base upload path -base_path = op.join(op.dirname(__file__), 'static') +base_path = op.join(op.dirname(__file__), "static") # Create models @@ -43,6 +42,7 @@ class ImageType(db.Model): Just so the LocationImage can have another foreign key, so we can test the "form_ajax_refs" inside the "inline_models" """ + id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64)) @@ -60,14 +60,14 @@ class LocationImage(db.Model): path = db.Column(db.String(64)) location_id = db.Column(db.Integer, db.ForeignKey(Location.id)) - location = db.relation(Location, backref='images') + location = db.relation(Location, backref="images") image_type_id = db.Column(db.Integer, db.ForeignKey(ImageType.id)) - image_type = db.relation(ImageType, backref='images') + image_type = db.relation(ImageType, backref="images") # Register after_delete handler which will delete image file after model gets deleted -@event.listens_for(Location, 'after_delete') +@event.listens_for(Location, "after_delete") def _handle_image_delete(mapper, conn, target): for location_image in target.images: try: @@ -80,7 +80,7 @@ def _handle_image_delete(mapper, conn, target): # This widget uses custom template for inline field list class CustomInlineFieldListWidget(RenderTemplateWidget): def __init__(self): - super(CustomInlineFieldListWidget, self).__init__('field_list.html') + super(CustomInlineFieldListWidget, self).__init__("field_list.html") # This InlineModelFormList will use our custom widget and hide row controls @@ -98,9 +98,9 @@ class CustomInlineModelConverter(InlineModelConverter): # Customized inline form handler class LocationImageInlineModelForm(InlineFormAdmin): - form_excluded_columns = ('path',) + form_excluded_columns = ("path",) - form_label = 'Image' + form_label = "Image" # Setup AJAX lazy-loading for the ImageType inside the inline model form_ajax_refs = { @@ -119,7 +119,7 @@ def __init__(self): super(LocationImageInlineModelForm, self).__init__(LocationImage) def postprocess_form(self, form_class): - form_class.upload = fields.FileField('Image') + form_class.upload = fields.FileField("Image") return form_class def on_model_change(self, form, model, is_created): @@ -137,14 +137,14 @@ class LocationAdmin(ModelView): inline_models = (LocationImageInlineModelForm(),) def __init__(self): - super().__init__(Location, db.session, name='Locations') + super().__init__(Location, db.session, name="Locations") # Simple page to show images -@app.route('/') +@app.route("/") def index(): locations = db.session.query(Location).all() - return render_template('locations.html', locations=locations) + return render_template("locations.html", locations=locations) def first_time_setup(): @@ -163,7 +163,7 @@ def first_time_setup(): db.session.commit() -if __name__ == '__main__': +if __name__ == "__main__": # Create upload directory try: os.mkdir(base_path) @@ -174,7 +174,7 @@ def first_time_setup(): first_time_setup() # Create admin - admin = admin.Admin(app, name='Example: Inline Models') + admin = admin.Admin(app, name="Example: Inline Models") admin.add_view(LocationAdmin()) # Start app diff --git a/examples/sqla/admin/__init__.py b/examples/sqla/admin/__init__.py index 36f432731..54e37e597 100644 --- a/examples/sqla/admin/__init__.py +++ b/examples/sqla/admin/__init__.py @@ -1,20 +1,22 @@ -from flask import Flask, request, session -from flask_sqlalchemy import SQLAlchemy +from flask import Flask +from flask import request +from flask import session from flask_babel import Babel - +from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) -app.config.from_pyfile('config.py') +app.config.from_pyfile("config.py") db = SQLAlchemy(app) def get_locale(): - override = request.args.get('lang') + override = request.args.get("lang") if override: - session['lang'] = override + session["lang"] = override + + return session.get("lang", "en") - return session.get('lang', 'en') # Initialize babel babel = Babel(app, locale_selector=get_locale) diff --git a/examples/sqla/admin/config.py b/examples/sqla/admin/config.py index ae3759b03..21487532f 100644 --- a/examples/sqla/admin/config.py +++ b/examples/sqla/admin/config.py @@ -1,8 +1,8 @@ # Create dummy secrey key so we can use sessions -SECRET_KEY = '123456790' +SECRET_KEY = "123456790" # Create in-memory database -DATABASE_FILE = 'sample_db.sqlite' -SQLALCHEMY_DATABASE_URI = 'sqlite:///' + DATABASE_FILE +DATABASE_FILE = "sample_db.sqlite" +SQLALCHEMY_DATABASE_URI = "sqlite:///" + DATABASE_FILE SQLALCHEMY_ECHO = True SQLALCHEMY_TRACK_MODIFICATIONS = False diff --git a/examples/sqla/admin/data.py b/examples/sqla/admin/data.py index 0cb461356..ced1a1b12 100644 --- a/examples/sqla/admin/data.py +++ b/examples/sqla/admin/data.py @@ -1,7 +1,12 @@ -from admin import db -from admin.models import User, Post, Tag, Tree, AVAILABLE_USER_TYPES -import random import datetime +import random + +from admin import db +from admin.models import AVAILABLE_USER_TYPES +from admin.models import Post +from admin.models import Tag +from admin.models import Tree +from admin.models import User def build_sample_db(): @@ -14,14 +19,58 @@ def build_sample_db(): # Create sample Users first_names = [ - 'Harry', 'Amelia', 'Oliver', 'Jack', 'Isabella', 'Charlie', 'Sophie', 'Mia', - 'Jacob', 'Thomas', 'Emily', 'Lily', 'Ava', 'Isla', 'Alfie', 'Olivia', 'Jessica', - 'Riley', 'William', 'James', 'Geoffrey', 'Lisa', 'Benjamin', 'Stacey', 'Lucy' + "Harry", + "Amelia", + "Oliver", + "Jack", + "Isabella", + "Charlie", + "Sophie", + "Mia", + "Jacob", + "Thomas", + "Emily", + "Lily", + "Ava", + "Isla", + "Alfie", + "Olivia", + "Jessica", + "Riley", + "William", + "James", + "Geoffrey", + "Lisa", + "Benjamin", + "Stacey", + "Lucy", ] last_names = [ - 'Brown', 'Brown', 'Patel', 'Jones', 'Williams', 'Johnson', 'Taylor', 'Thomas', - 'Roberts', 'Khan', 'Clarke', 'Clarke', 'Clarke', 'James', 'Phillips', 'Wilson', - 'Ali', 'Mason', 'Mitchell', 'Rose', 'Davis', 'Davies', 'Rodriguez', 'Cox', 'Alexander' + "Brown", + "Brown", + "Patel", + "Jones", + "Williams", + "Johnson", + "Taylor", + "Thomas", + "Roberts", + "Khan", + "Clarke", + "Clarke", + "Clarke", + "James", + "Phillips", + "Wilson", + "Ali", + "Mason", + "Mitchell", + "Rose", + "Davis", + "Davies", + "Rodriguez", + "Cox", + "Alexander", ] countries = [ @@ -51,14 +100,24 @@ def build_sample_db(): user.timezone = country[4] user.dialling_code = country[2] - user.local_phone_number = '0' + ''.join(random.choices('123456789', k=9)) + user.local_phone_number = "0" + "".join(random.choices("123456789", k=9)) user_list.append(user) db.session.add(user) # Create sample Tags tag_list = [] - for tmp in ["YELLOW", "WHITE", "BLUE", "GREEN", "RED", "BLACK", "BROWN", "PURPLE", "ORANGE"]: + for tmp in [ + "YELLOW", + "WHITE", + "BLUE", + "GREEN", + "RED", + "BLACK", + "BROWN", + "PURPLE", + "ORANGE", + ]: tag = Tag() tag.name = tmp tag_list.append(tag) @@ -67,17 +126,17 @@ def build_sample_db(): # Create sample Posts sample_text = [ { - 'title': "de Finibus Bonorum et Malorum - Part I", - 'content': "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor \ + "title": "de Finibus Bonorum et Malorum - Part I", + "content": "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor \ incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud \ exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \ dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. \ Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt \ -mollit anim id est laborum." +mollit anim id est laborum.", }, { - 'title': "de Finibus Bonorum et Malorum - Part II", - 'content': "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque \ + "title": "de Finibus Bonorum et Malorum - Part II", + "content": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque \ laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto \ beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur \ aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi \ @@ -86,11 +145,11 @@ def build_sample_db(): aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam \ corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum \ iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum \ -qui dolorem eum fugiat quo voluptas nulla pariatur?" +qui dolorem eum fugiat quo voluptas nulla pariatur?", }, { - 'title': "de Finibus Bonorum et Malorum - Part III", - 'content': "At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium \ + "title": "de Finibus Bonorum et Malorum - Part III", + "content": "At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium \ voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati \ cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id \ est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam \ @@ -99,16 +158,16 @@ def build_sample_db(): Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet \ ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur \ a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis \ -doloribus asperiores repellat." - } +doloribus asperiores repellat.", + }, ] for user in user_list: entry = random.choice(sample_text) # select text at random post = Post() post.user = user - post.title = "{}'s opinion on {}".format(user.first_name, entry['title']) - post.text = entry['content'] + post.title = "{}'s opinion on {}".format(user.first_name, entry["title"]) + post.text = entry["content"] post.background_color = random.choice(["#cccccc", "red", "lightblue", "#0f0"]) tmp = int(1000 * random.random()) # random number between 0 and 1000: post.date = datetime.datetime.now() - datetime.timedelta(days=tmp) diff --git a/examples/sqla/admin/main.py b/examples/sqla/admin/main.py index 40c7b236c..e7a48349e 100644 --- a/examples/sqla/admin/main.py +++ b/examples/sqla/admin/main.py @@ -1,23 +1,28 @@ -from admin import app, db -from admin.models import AVAILABLE_USER_TYPES, User, Post, Tag, Tree -from flask import send_file -from markupsafe import Markup - -from wtforms import validators - import flask_admin as admin +from flask import send_file +from flask_admin.babel import gettext from flask_admin.base import MenuLink -from flask_admin.theme import BootstrapTheme, Bootstrap4Theme from flask_admin.contrib import sqla from flask_admin.contrib.sqla import filters -from flask_admin.contrib.sqla.filters import BaseSQLAFilter, FilterEqual -from flask_admin.babel import gettext +from flask_admin.contrib.sqla.filters import BaseSQLAFilter +from flask_admin.contrib.sqla.filters import FilterEqual +from flask_admin.theme import Bootstrap4Theme +from markupsafe import Markup +from wtforms import validators + +from admin import app +from admin import db +from admin.models import AVAILABLE_USER_TYPES +from admin.models import Post +from admin.models import Tag +from admin.models import Tree +from admin.models import User # Flask views -@app.route('/') +@app.route("/") def index(): - tmp = u""" + tmp = """ <p><a href="/admin/?lang=en">Click me to get to Admin! (English)</a></p> <p><a href="/admin/?lang=cs">Click me to get to Admin! (Czech)</a></p> <p><a href="/admin/?lang=de">Click me to get to Admin! (German)</a></p> @@ -33,195 +38,202 @@ def index(): return tmp -@app.route('/favicon.ico') +@app.route("/favicon.ico") def favicon(): - return send_file('static/favicon.ico') + return send_file("static/favicon.ico") # Custom filter class class FilterLastNameBrown(BaseSQLAFilter): def apply(self, query, value, alias=None): - if value == '1': + if value == "1": return query.filter(self.column == "Brown") else: return query.filter(self.column != "Brown") def operation(self): - return 'is Brown' + return "is Brown" # Customized User model admin def phone_number_formatter(view, context, model, name): - return Markup("<nobr>{}</nobr>".format(model.phone_number)) if model.phone_number else None + return Markup(f"<nobr>{model.phone_number}</nobr>") if model.phone_number else None def is_numberic_validator(form, field): if field.data and not field.data.isdigit(): - raise validators.ValidationError(gettext('Only numbers are allowed.')) + raise validators.ValidationError(gettext("Only numbers are allowed.")) class UserAdmin(sqla.ModelView): - can_set_page_size = True page_size = 5 - page_size_options = (5,10,15) + page_size_options = (5, 10, 15) can_view_details = True # show a modal dialog with records details - action_disallowed_list = ['delete', ] + action_disallowed_list = [ + "delete", + ] form_choices = { - 'type': AVAILABLE_USER_TYPES, + "type": AVAILABLE_USER_TYPES, } form_args = { - 'dialling_code': {'label': 'Dialling code'}, - 'local_phone_number': { - 'label': 'Phone number', - 'validators': [is_numberic_validator] + "dialling_code": {"label": "Dialling code"}, + "local_phone_number": { + "label": "Phone number", + "validators": [is_numberic_validator], }, } - form_widget_args = { - 'id': { - 'readonly': True - } - } + form_widget_args = {"id": {"readonly": True}} column_list = [ - 'type', - 'first_name', - 'last_name', - 'email', - 'ip_address', - 'currency', - 'timezone', - 'phone_number', + "type", + "first_name", + "last_name", + "email", + "ip_address", + "currency", + "timezone", + "phone_number", ] column_searchable_list = [ - 'first_name', - 'last_name', - 'phone_number', - 'email', + "first_name", + "last_name", + "phone_number", + "email", ] - column_editable_list = ['type', 'currency', 'timezone'] + column_editable_list = ["type", "currency", "timezone"] column_details_list = [ - 'id', - 'featured_post', - 'website', - 'enum_choice_field', - 'sqla_utils_choice_field', - 'sqla_utils_enum_choice_field', + "id", + "featured_post", + "website", + "enum_choice_field", + "sqla_utils_choice_field", + "sqla_utils_enum_choice_field", ] + column_list form_columns = [ - 'id', - 'type', - 'featured_post', - 'enum_choice_field', - 'sqla_utils_choice_field', - 'sqla_utils_enum_choice_field', - 'last_name', - 'first_name', - 'email', - 'website', - 'dialling_code', - 'local_phone_number', + "id", + "type", + "featured_post", + "enum_choice_field", + "sqla_utils_choice_field", + "sqla_utils_enum_choice_field", + "last_name", + "first_name", + "email", + "website", + "dialling_code", + "local_phone_number", ] form_create_rules = [ - 'last_name', - 'first_name', - 'type', - 'email', + "last_name", + "first_name", + "type", + "email", ] column_auto_select_related = True - column_default_sort = [('last_name', False), ('first_name', False)] # sort on multiple columns + column_default_sort = [ + ("last_name", False), + ("first_name", False), + ] # sort on multiple columns # custom filter: each filter in the list is a filter operation (equals, not equals, etc) # filters with the same name will appear as operations under the same filter column_filters = [ - 'first_name', - FilterEqual(column=User.last_name, name='Last Name'), - FilterLastNameBrown(column=User.last_name, name='Last Name', - options=(('1', 'Yes'), ('0', 'No'))), - 'phone_number', - 'email', - 'ip_address', - 'currency', - 'timezone', + "first_name", + FilterEqual(column=User.last_name, name="Last Name"), + FilterLastNameBrown( + column=User.last_name, name="Last Name", options=(("1", "Yes"), ("0", "No")) + ), + "phone_number", + "email", + "ip_address", + "currency", + "timezone", ] - column_formatters = {'phone_number': phone_number_formatter} + column_formatters = {"phone_number": phone_number_formatter} # setup edit forms so that only posts created by this user can be selected as 'featured' def edit_form(self, obj): - return self._filtered_posts( - super(UserAdmin, self).edit_form(obj) - ) + return self._filtered_posts(super(UserAdmin, self).edit_form(obj)) def _filtered_posts(self, form): - form.featured_post.query_factory = lambda: Post.query.filter(Post.user_id == form._obj.id).all() + form.featured_post.query_factory = lambda: Post.query.filter( + Post.user_id == form._obj.id + ).all() return form # Customized Post model admin class PostAdmin(sqla.ModelView): column_display_pk = True - column_list = ['id', 'user', 'title', 'date', 'tags', 'background_color', 'created_at', ] - column_editable_list = ['background_color', ] - column_default_sort = ('date', True) + column_list = [ + "id", + "user", + "title", + "date", + "tags", + "background_color", + "created_at", + ] + column_editable_list = [ + "background_color", + ] + column_default_sort = ("date", True) create_modal = True edit_modal = True column_sortable_list = [ - 'id', - 'title', - 'date', - ('user', ('user.last_name', 'user.first_name')), # sort on multiple columns + "id", + "title", + "date", + ("user", ("user.last_name", "user.first_name")), # sort on multiple columns ] column_labels = { - 'title': 'Post Title' # Rename 'title' column in list view + "title": "Post Title" # Rename 'title' column in list view } column_searchable_list = [ - 'title', - 'tags.name', - 'user.first_name', - 'user.last_name', + "title", + "tags.name", + "user.first_name", + "user.last_name", ] column_labels = { - 'title': 'Title', - 'tags.name': 'Tags', - 'user.first_name': 'User\'s first name', - 'user.last_name': 'Last name', + "title": "Title", + "tags.name": "Tags", + "user.first_name": "User's first name", + "user.last_name": "Last name", } column_filters = [ - 'id', - 'user.first_name', - 'user.id', - 'background_color', - 'created_at', - 'title', - 'date', - 'tags', - filters.FilterLike(Post.title, 'Fixed Title', options=(('test1', 'Test 1'), ('test2', 'Test 2'))), + "id", + "user.first_name", + "user.id", + "background_color", + "created_at", + "title", + "date", + "tags", + filters.FilterLike( + Post.title, + "Fixed Title", + options=(("test1", "Test 1"), ("test2", "Test 2")), + ), ] can_export = True export_max_rows = 1000 - export_types = ['csv', 'xls'] + export_types = ["csv", "xls"] # Pass arguments to WTForms. In this case, change label for text field to # be 'Big Text' and add DataRequired() validator. - form_args = { - 'text': dict(label='Big Text', validators=[validators.DataRequired()]) - } - form_widget_args = { - 'text': { - 'rows': 10 - } - } + form_args = {"text": dict(label="Big Text", validators=[validators.DataRequired()])} + form_widget_args = {"text": {"rows": 10}} form_ajax_refs = { - 'user': { - 'fields': (User.first_name, User.last_name) - }, - 'tags': { - 'fields': (Tag.name,), - 'minimum_input_length': 0, # show suggestions, even before any user input - 'placeholder': 'Please select', - 'page_size': 5, + "user": {"fields": (User.first_name, User.last_name)}, + "tags": { + "fields": (Tag.name,), + "minimum_input_length": 0, # show suggestions, even before any user input + "placeholder": "Please select", + "page_size": 5, }, } @@ -231,15 +243,21 @@ def __init__(self, session): class TreeView(sqla.ModelView): - list_template = 'tree_list.html' + list_template = "tree_list.html" column_auto_select_related = True column_list = [ - 'id', - 'name', - 'parent', + "id", + "name", + "parent", + ] + form_excluded_columns = [ + "children", + ] + column_filters = [ + "id", + "name", + "parent", ] - form_excluded_columns = ['children', ] - column_filters = ['id', 'name', 'parent', ] # override the 'render' method to pass your own parameters to the template def render(self, template, **kwargs): @@ -247,7 +265,9 @@ def render(self, template, **kwargs): # Create admin -admin = admin.Admin(app, name='Example: SQLAlchemy', theme=Bootstrap4Theme(swatch='default')) +admin = admin.Admin( + app, name="Example: SQLAlchemy", theme=Bootstrap4Theme(swatch="default") +) # Add views admin.add_view(UserAdmin(User, db.session)) @@ -255,5 +275,7 @@ def render(self, template, **kwargs): admin.add_view(PostAdmin(db.session)) admin.add_view(TreeView(Tree, db.session, category="Other")) admin.add_sub_category(name="Links", parent_name="Other") -admin.add_link(MenuLink(name='Back Home', url='/', category='Links')) -admin.add_link(MenuLink(name='External link', url='http://www.example.com/', category='Links')) +admin.add_link(MenuLink(name="Back Home", url="/", category="Links")) +admin.add_link( + MenuLink(name="External link", url="http://www.example.com/", category="Links") +) diff --git a/examples/sqla/admin/models.py b/examples/sqla/admin/models.py index 25d1f1a27..670d7cb6c 100644 --- a/examples/sqla/admin/models.py +++ b/examples/sqla/admin/models.py @@ -1,19 +1,27 @@ -from admin import db -from sqlalchemy.ext.hybrid import hybrid_property -from sqlalchemy import sql, cast +import enum import uuid -from sqlalchemy_utils import ChoiceType, EmailType, UUIDType, URLType, CurrencyType -from sqlalchemy_utils import ColorType, ArrowType, IPAddressType, TimezoneType import arrow -import enum +from sqlalchemy import cast +from sqlalchemy import sql +from sqlalchemy.ext.hybrid import hybrid_property +from sqlalchemy_utils import ArrowType +from sqlalchemy_utils import ChoiceType +from sqlalchemy_utils import ColorType +from sqlalchemy_utils import CurrencyType +from sqlalchemy_utils import EmailType +from sqlalchemy_utils import IPAddressType +from sqlalchemy_utils import TimezoneType +from sqlalchemy_utils import URLType +from sqlalchemy_utils import UUIDType +from admin import db AVAILABLE_USER_TYPES = [ - (u'admin', u'Admin'), - (u'content-writer', u'Content writer'), - (u'editor', u'Editor'), - (u'regular-user', u'Regular user'), + ("admin", "Admin"), + ("content-writer", "Content writer"), + ("editor", "Editor"), + ("regular-user", "Regular user"), ] @@ -32,7 +40,9 @@ class User(db.Model): # fixed choices can be handled in a number of different ways: enum_choice_field = db.Column(db.Enum(EnumChoices), nullable=True) sqla_utils_choice_field = db.Column(ChoiceType(AVAILABLE_USER_TYPES), nullable=True) - sqla_utils_enum_choice_field = db.Column(ChoiceType(EnumChoices, impl=db.Integer()), nullable=True) + sqla_utils_enum_choice_field = db.Column( + ChoiceType(EnumChoices, impl=db.Integer()), nullable=True + ) first_name = db.Column(db.String(100)) last_name = db.Column(db.String(100)) @@ -42,37 +52,41 @@ class User(db.Model): website = db.Column(URLType) ip_address = db.Column(IPAddressType) currency = db.Column(CurrencyType, nullable=True, default=None) - timezone = db.Column(TimezoneType(backend='pytz')) + timezone = db.Column(TimezoneType(backend="pytz")) dialling_code = db.Column(db.Integer()) local_phone_number = db.Column(db.String(10)) - featured_post_id = db.Column(db.Integer, db.ForeignKey('post.id')) - featured_post = db.relationship('Post', foreign_keys=[featured_post_id]) + featured_post_id = db.Column(db.Integer, db.ForeignKey("post.id")) + featured_post = db.relationship("Post", foreign_keys=[featured_post_id]) @hybrid_property def phone_number(self): if self.dialling_code and self.local_phone_number: number = str(self.local_phone_number) - return "+{} ({}) {} {} {}".format(self.dialling_code, number[0], number[1:3], number[3:6], number[6::]) + return f"+{self.dialling_code} ({number[0]}) {number[1:3]} {number[3:6]} {number[6::]}" return @phone_number.expression def phone_number(cls): - return sql.operators.ColumnOperators.concat(cast(cls.dialling_code, db.String), cls.local_phone_number) + return sql.operators.ColumnOperators.concat( + cast(cls.dialling_code, db.String), cls.local_phone_number + ) def __str__(self): - return "{}, {}".format(self.last_name, self.first_name) + return f"{self.last_name}, {self.first_name}" def __repr__(self): - return "{}: {}".format(self.id, self.__str__()) + return f"{self.id}: {self.__str__()}" # Create M2M table -post_tags_table = db.Table('post_tags', db.Model.metadata, - db.Column('post_id', db.Integer, db.ForeignKey('post.id')), - db.Column('tag_id', db.Integer, db.ForeignKey('tag.id')) - ) +post_tags_table = db.Table( + "post_tags", + db.Model.metadata, + db.Column("post_id", db.Integer, db.ForeignKey("post.id")), + db.Column("tag_id", db.Integer, db.ForeignKey("tag.id")), +) class Post(db.Model): @@ -86,11 +100,11 @@ class Post(db.Model): created_at = db.Column(ArrowType, default=arrow.utcnow()) user_id = db.Column(UUIDType(binary=False), db.ForeignKey(User.id)) - user = db.relationship(User, foreign_keys=[user_id], backref='posts') - tags = db.relationship('Tag', secondary=post_tags_table) + user = db.relationship(User, foreign_keys=[user_id], backref="posts") + tags = db.relationship("Tag", secondary=post_tags_table) def __str__(self): - return "{}".format(self.title) + return f"{self.title}" class Tag(db.Model): @@ -98,7 +112,7 @@ class Tag(db.Model): name = db.Column(db.Unicode(64), unique=True) def __str__(self): - return "{}".format(self.name) + return f"{self.name}" class Tree(db.Model): @@ -106,8 +120,8 @@ class Tree(db.Model): name = db.Column(db.String(64)) # recursive relationship - parent_id = db.Column(db.Integer, db.ForeignKey('tree.id')) - parent = db.relationship('Tree', remote_side=[id], backref='children') + parent_id = db.Column(db.Integer, db.ForeignKey("tree.id")) + parent = db.relationship("Tree", remote_side=[id], backref="children") def __str__(self): - return "{}".format(self.name) + return f"{self.name}" diff --git a/examples/sqla/app.py b/examples/sqla/app.py index 51c66d22f..54aa23430 100644 --- a/examples/sqla/app.py +++ b/examples/sqla/app.py @@ -1,15 +1,16 @@ -from admin import app -from admin.data import build_sample_db import os import os.path as op +from admin import app +from admin.data import build_sample_db + # Build a sample db on the fly, if one does not exist yet. -app_dir = op.join(op.realpath(os.path.dirname(__file__)), 'admin') -database_path = op.join(app_dir, app.config['DATABASE_FILE']) +app_dir = op.join(op.realpath(os.path.dirname(__file__)), "admin") +database_path = op.join(app_dir, app.config["DATABASE_FILE"]) if not os.path.exists(database_path): with app.app_context(): build_sample_db() -if __name__ == '__main__': +if __name__ == "__main__": # Start app app.run(debug=True) diff --git a/examples/tinymongo/app.py b/examples/tinymongo/app.py index 7512c14ce..93ff21a94 100644 --- a/examples/tinymongo/app.py +++ b/examples/tinymongo/app.py @@ -5,24 +5,27 @@ Author: Bruno Rocha <@rochacbruno> Based in PyMongo Example and TinyMongo """ + import flask_admin as admin from flask import Flask -from flask_admin.contrib.pymongo import ModelView, filters +from flask_admin.contrib.pymongo import filters +from flask_admin.contrib.pymongo import ModelView from flask_admin.form import Select2Widget -from flask_admin.model.fields import InlineFieldList, InlineFormField -from wtforms import fields, form - +from flask_admin.model.fields import InlineFieldList +from flask_admin.model.fields import InlineFormField from tinymongo import TinyMongoClient +from wtforms import fields +from wtforms import form # Create application app = Flask(__name__) # Create dummy secrey key so we can use sessions -app.config['SECRET_KEY'] = '123456790' +app.config["SECRET_KEY"] = "123456790" # Create models in a JSON file localted at -DATAFOLDER = '/tmp/flask_admin_test' +DATAFOLDER = "/tmp/flask_admin_test" conn = TinyMongoClient(DATAFOLDER) db = conn.test @@ -34,15 +37,15 @@ # User admin class InnerForm(form.Form): - name = fields.StringField('Name') - test = fields.StringField('Test') + name = fields.StringField("Name") + test = fields.StringField("Test") class UserForm(form.Form): - foo = fields.StringField('foo') - name = fields.StringField('Name') - email = fields.StringField('Email') - password = fields.StringField('Password') + foo = fields.StringField("foo") + name = fields.StringField("Name") + email = fields.StringField("Email") + password = fields.StringField("Password") # Inner form inner = InlineFormField(InnerForm) @@ -52,8 +55,8 @@ class UserForm(form.Form): class UserView(ModelView): - column_list = ('name', 'email', 'password', 'foo') - column_sortable_list = ('name', 'email', 'password') + column_list = ("name", "email", "password", "foo") + column_sortable_list = ("name", "email", "password") form = UserForm @@ -63,22 +66,24 @@ class UserView(ModelView): # Tweet view class TweetForm(form.Form): - name = fields.StringField('Name') - user_id = fields.SelectField('User', widget=Select2Widget()) - text = fields.StringField('Text') + name = fields.StringField("Name") + user_id = fields.SelectField("User", widget=Select2Widget()) + text = fields.StringField("Text") - testie = fields.BooleanField('Test') + testie = fields.BooleanField("Test") class TweetView(ModelView): - column_list = ('name', 'user_name', 'text') - column_sortable_list = ('name', 'text') + column_list = ("name", "user_name", "text") + column_sortable_list = ("name", "text") - column_filters = (filters.FilterEqual('name', 'Name'), - filters.FilterNotEqual('name', 'Name'), - filters.FilterLike('name', 'Name'), - filters.FilterNotLike('name', 'Name'), - filters.BooleanEqualFilter('testie', 'Testie')) + column_filters = ( + filters.FilterEqual("name", "Name"), + filters.FilterNotEqual("name", "Name"), + filters.FilterLike("name", "Name"), + filters.FilterNotLike("name", "Name"), + filters.BooleanEqualFilter("testie", "Testie"), + ) # column_searchable_list = ('name', 'text') @@ -89,16 +94,14 @@ def get_list(self, *args, **kwargs): # Contribute user_name to the models for item in data: - item['user_name'] = db.user.find_one( - {'_id': item['user_id']} - )['name'] + item["user_name"] = db.user.find_one({"_id": item["user_id"]})["name"] return count, data # Contribute list of user choices to the forms def _feed_user_choices(self, form): - users = db.user.find(fields=('name',)) - form.user_id.choices = [(str(x['_id']), x['name']) for x in users] + users = db.user.find(fields=("name",)) + form.user_id.choices = [(str(x["_id"]), x["name"]) for x in users] return form def create_form(self): @@ -111,25 +114,25 @@ def edit_form(self, obj): # Correct user_id reference before saving def on_model_change(self, form, model): - user_id = model.get('user_id') - model['user_id'] = user_id + user_id = model.get("user_id") + model["user_id"] = user_id return model # Flask views -@app.route('/') +@app.route("/") def index(): return '<a href="/admin/">Click me to get to Admin!</a>' -if __name__ == '__main__': +if __name__ == "__main__": # Create admin - admin = admin.Admin(app, name='Example: TinyMongo - TinyDB') + admin = admin.Admin(app, name="Example: TinyMongo - TinyDB") # Add views - admin.add_view(UserView(db.user, 'User')) - admin.add_view(TweetView(db.tweet, 'Tweets')) + admin.add_view(UserView(db.user, "User")) + admin.add_view(TweetView(db.tweet, "Tweets")) # Start app app.run(debug=True) diff --git a/flask_admin/__init__.py b/flask_admin/__init__.py index 720f51b74..ccecd2ffa 100644 --- a/flask_admin/__init__.py +++ b/flask_admin/__init__.py @@ -1,6 +1,10 @@ -__version__ = '2.0.0a0' -__author__ = 'Flask-Admin team' -__email__ = 'contact@palletsproject.com' +__version__ = "2.0.0a0" +__author__ = "Flask-Admin team" +__email__ = "contact@palletsproject.com" -from .base import expose, expose_plugview, Admin, BaseView, AdminIndexView # noqa: F401 +from .base import Admin # noqa: F401 +from .base import AdminIndexView # noqa: F401 +from .base import BaseView # noqa: F401 +from .base import expose # noqa: F401 +from .base import expose_plugview # noqa: F401 diff --git a/flask_admin/_backwards.py b/flask_admin/_backwards.py index ce9abe5e6..528278a17 100644 --- a/flask_admin/_backwards.py +++ b/flask_admin/_backwards.py @@ -1,41 +1,43 @@ -# -*- coding: utf-8 -*- """ - flask_admin._backwards - ~~~~~~~~~~~~~~~~~~~~~~~~~~ +flask_admin._backwards +~~~~~~~~~~~~~~~~~~~~~~~~~~ - Backward compatibility helpers. +Backward compatibility helpers. """ + import sys import warnings def get_property(obj, name, old_name, default=None): """ - Check if old property name exists and if it does - show warning message - and return value. + Check if old property name exists and if it does - show warning message + and return value. - Otherwise, return new property value + Otherwise, return new property value - :param name: - New property name - :param old_name: - Old property name - :param default: - Default value + :param name: + New property name + :param old_name: + Old property name + :param default: + Default value """ if hasattr(obj, old_name): - warnings.warn('Property %s is obsolete, please use %s instead' % - (old_name, name), stacklevel=2) + warnings.warn( + "Property %s is obsolete, please use %s instead" % (old_name, name), + stacklevel=2, + ) return getattr(obj, old_name) return getattr(obj, name, default) -class ObsoleteAttr(object): +class ObsoleteAttr: def __init__(self, new_name, old_name, default): self.new_name = new_name self.old_name = old_name - self.cache = '_cache_' + new_name + self.cache = "_cache_" + new_name self.default = default def __get__(self, obj, objtype=None): @@ -48,8 +50,11 @@ def __get__(self, obj, objtype=None): # Check if there's old attribute if hasattr(obj, self.old_name): - warnings.warn('Property %s is obsolete, please use %s instead' % - (self.old_name, self.new_name), stacklevel=2) + warnings.warn( + "Property %s is obsolete, please use %s instead" + % (self.old_name, self.new_name), + stacklevel=2, + ) return getattr(obj, self.old_name) # Return default otherwise @@ -59,7 +64,7 @@ def __set__(self, obj, value): setattr(obj, self.cache, value) -class ImportRedirect(object): +class ImportRedirect: def __init__(self, prefix, target): self.prefix = prefix self.target = target @@ -72,7 +77,7 @@ def load_module(self, fullname): if fullname in sys.modules: return sys.modules[fullname] - path = self.target + fullname[len(self.prefix):] + path = self.target + fullname[len(self.prefix) :] __import__(path) module = sys.modules[fullname] = sys.modules[path] diff --git a/flask_admin/_compat.py b/flask_admin/_compat.py index 71c95a9a0..4fb53c475 100644 --- a/flask_admin/_compat.py +++ b/flask_admin/_compat.py @@ -1,15 +1,16 @@ # flake8: noqa """ - flask_admin._compat - ~~~~~~~~~~~~~~~~~~~~~~~ +flask_admin._compat +~~~~~~~~~~~~~~~~~~~~~~~ - Some py2/py3 compatibility support based on a stripped down - version of six so we don't have to depend on a specific version - of it. +Some py2/py3 compatibility support based on a stripped down +version of six so we don't have to depend on a specific version +of it. - :copyright: (c) 2013 by Armin Ronacher. - :license: BSD, see LICENSE for more details. +:copyright: (c) 2013 by Armin Ronacher. +:license: BSD, see LICENSE for more details. """ + from typing import Callable text_type = str @@ -30,10 +31,11 @@ def filter_list(f: Callable, l: list): def as_unicode(s): if isinstance(s, bytes): - return s.decode('utf-8') + return s.decode("utf-8") return str(s) + def csv_encode(s): - ''' Returns unicode string expected by Python 3's csv module ''' + """Returns unicode string expected by Python 3's csv module""" return as_unicode(s) diff --git a/flask_admin/_types.py b/flask_admin/_types.py index 9fd90cbd1..b2c3a2bbe 100644 --- a/flask_admin/_types.py +++ b/flask_admin/_types.py @@ -1,4 +1,9 @@ -from typing import Union, Sequence, Dict, Callable, Any, TYPE_CHECKING +from typing import Any +from typing import Callable +from typing import Dict +from typing import Sequence +from typing import TYPE_CHECKING +from typing import Union if TYPE_CHECKING: import sqlalchemy # noqa diff --git a/flask_admin/actions.py b/flask_admin/actions.py index f217fa0c4..f4e93c507 100644 --- a/flask_admin/actions.py +++ b/flask_admin/actions.py @@ -1,24 +1,26 @@ -from flask import request, redirect - +from flask import redirect +from flask import request from flask_admin import tools from flask_admin._compat import text_type -from flask_admin.helpers import get_redirect_target, flash_errors +from flask_admin.helpers import flash_errors +from flask_admin.helpers import get_redirect_target def action(name, text, confirmation=None): """ - Use this decorator to expose actions that span more than one - entity (model, file, etc) - - :param name: - Action name - :param text: - Action text. - :param confirmation: - Confirmation text. If not provided, action will be executed - unconditionally. + Use this decorator to expose actions that span more than one + entity (model, file, etc) + + :param name: + Action name + :param text: + Action text. + :param confirmation: + Confirmation text. If not provided, action will be executed + unconditionally. """ + def wrap(f): f._action = (name, text, confirmation) return f @@ -26,30 +28,30 @@ def wrap(f): return wrap -class ActionsMixin(object): +class ActionsMixin: """ - Actions mixin. + Actions mixin. - In some cases, you might work with more than one "entity" (model, file, etc) in - your admin view and will want to perform actions on a group of entities simultaneously. + In some cases, you might work with more than one "entity" (model, file, etc) in + your admin view and will want to perform actions on a group of entities simultaneously. - In this case, you can add this functionality by doing this: - 1. Add this mixin to your administrative view class - 2. Call `init_actions` in your class constructor - 3. Expose actions view - 4. Import `actions.html` library and add call library macros in your template + In this case, you can add this functionality by doing this: + 1. Add this mixin to your administrative view class + 2. Call `init_actions` in your class constructor + 3. Expose actions view + 4. Import `actions.html` library and add call library macros in your template """ def __init__(self): """ - Default constructor. + Default constructor. """ self._actions = [] self._actions_data = {} def init_actions(self): """ - Initialize list of actions for the current administrative view. + Initialize list of actions for the current administrative view. """ self._actions = [] self._actions_data = {} @@ -57,7 +59,7 @@ def init_actions(self): for p in dir(self): attr = tools.get_dict_attr(self, p) - if hasattr(attr, '_action'): + if hasattr(attr, "_action"): name, text, desc = attr._action self._actions.append((name, text)) @@ -69,16 +71,16 @@ def init_actions(self): def is_action_allowed(self, name): """ - Verify if action with `name` is allowed. + Verify if action with `name` is allowed. - :param name: - Action name + :param name: + Action name """ return True def get_actions_list(self): """ - Return a list and a dictionary of allowed actions. + Return a list and a dictionary of allowed actions. """ actions = [] actions_confirmation = {} @@ -97,18 +99,18 @@ def get_actions_list(self): def handle_action(self, return_view=None): """ - Handle action request. + Handle action request. - :param return_view: - Name of the view to return to after the request. - If not provided, will return user to the return url in the form - or the list view. + :param return_view: + Name of the view to return to after the request. + If not provided, will return user to the return url in the form + or the list view. """ form = self.action_form() if self.validate_form(form): # using getlist instead of FieldList for backward compatibility - ids = request.form.getlist('rowid') + ids = request.form.getlist("rowid") action = form.action.data handler = self._actions_data.get(action) @@ -119,11 +121,11 @@ def handle_action(self, return_view=None): if response is not None: return response else: - flash_errors(form, message='Failed to perform action. %(error)s') + flash_errors(form, message="Failed to perform action. %(error)s") if return_view: - url = self.get_url('.' + return_view) + url = self.get_url("." + return_view) else: - url = get_redirect_target() or self.get_url('.index_view') + url = get_redirect_target() or self.get_url(".index_view") return redirect(url) diff --git a/flask_admin/babel.py b/flask_admin/babel.py index 38ee8e734..230f501e5 100644 --- a/flask_admin/babel.py +++ b/flask_admin/babel.py @@ -2,18 +2,20 @@ from flask_babel import Domain except ImportError: + def gettext(string, **variables): return string % variables def ngettext(singular, plural, num, **variables): - variables.setdefault('num', num) + variables.setdefault("num", num) return (singular if num == 1 else plural) % variables def lazy_gettext(string, **variables): return gettext(string, **variables) - class Translations(object): - ''' dummy Translations class for WTForms, no translation support ''' + class Translations: + """dummy Translations class for WTForms, no translation support""" + def gettext(self, string): return string @@ -24,7 +26,7 @@ def ngettext(self, singular, plural, n): class CustomDomain(Domain): def __init__(self): - super(CustomDomain, self).__init__(translations.__path__[0], domain='admin') + super(CustomDomain, self).__init__(translations.__path__[0], domain="admin") @property def translation_directories(self): @@ -45,10 +47,11 @@ def translation_directories(self): from wtforms.i18n import messages_path - wtforms_domain = Domain(messages_path(), domain='wtforms') + wtforms_domain = Domain(messages_path(), domain="wtforms") + + class Translations: # type: ignore[no-redef] + """Fixes WTForms translation support and uses wtforms translations""" - class Translations(object): # type: ignore[no-redef] - ''' Fixes WTForms translation support and uses wtforms translations ''' def gettext(self, string): t = wtforms_domain.get_translations() return t.ugettext(string) diff --git a/flask_admin/base.py b/flask_admin/base.py index 3ac8c31d1..8920f7f8c 100644 --- a/flask_admin/base.py +++ b/flask_admin/base.py @@ -1,55 +1,65 @@ import os.path as op import typing as t import warnings - from functools import wraps -from flask import current_app, render_template, abort, g, url_for, request -from flask import Blueprint, current_app, render_template, abort, g, url_for +from flask import abort +from flask import Blueprint +from flask import current_app +from flask import g +from flask import render_template +from flask import url_for from markupsafe import Markup from flask_admin import babel -from flask_admin._compat import as_unicode from flask_admin import helpers as h +from flask_admin._compat import as_unicode # For compatibility reasons import MenuLink from flask_admin.blueprints import _BlueprintWithHostSupport as Blueprint from flask_admin.consts import ADMIN_ROUTES_HOST_VARIABLE -from flask_admin.menu import MenuCategory, MenuView, MenuLink, SubMenuCategory # noqa: F401 -from flask_admin.theme import Theme, Bootstrap4Theme +from flask_admin.menu import MenuCategory # noqa: F401 +from flask_admin.menu import MenuLink # noqa: F401 +from flask_admin.menu import MenuView # noqa: F401 +from flask_admin.menu import SubMenuCategory # noqa: F401 +from flask_admin.theme import Bootstrap4Theme +from flask_admin.theme import Theme -def expose(url='/', methods=('GET',)): +def expose(url="/", methods=("GET",)): """ - Use this decorator to expose views in your view classes. + Use this decorator to expose views in your view classes. - :param url: - Relative URL for the view - :param methods: - Allowed HTTP methods. By default only GET is allowed. + :param url: + Relative URL for the view + :param methods: + Allowed HTTP methods. By default only GET is allowed. """ + def wrap(f): - if not hasattr(f, '_urls'): + if not hasattr(f, "_urls"): f._urls = [] f._urls.append((url, methods)) return f + return wrap -def expose_plugview(url='/'): +def expose_plugview(url="/"): """ - Decorator to expose Flask's pluggable view classes - (``flask.views.View`` or ``flask.views.MethodView``). + Decorator to expose Flask's pluggable view classes + (``flask.views.View`` or ``flask.views.MethodView``). - :param url: - Relative URL for the view + :param url: + Relative URL for the view - .. versionadded:: 1.0.4 + .. versionadded:: 1.0.4 """ + def wrap(v): handler = expose(url, v.methods) - if hasattr(v, 'as_view'): + if hasattr(v, "as_view"): return handler(v.as_view(v.__name__)) else: return handler(v) @@ -60,7 +70,7 @@ def wrap(v): # Base views def _wrap_view(f): # Avoid wrapping view method twice - if hasattr(f, '_wrapped'): + if hasattr(f, "_wrapped"): return f @wraps(f) @@ -82,11 +92,12 @@ def inner(self, *args, **kwargs): class AdminViewMeta(type): """ - View metaclass. + View metaclass. - Does some precalculations (like getting list of view methods from the class) to avoid - calculating them for each view class instance. + Does some precalculations (like getting list of view methods from the class) to avoid + calculating them for each view class instance. """ + def __init__(cls, classname, bases, fields): type.__init__(cls, classname, bases, fields) @@ -97,102 +108,112 @@ def __init__(cls, classname, bases, fields): for p in dir(cls): attr = getattr(cls, p) - if hasattr(attr, '_urls'): + if hasattr(attr, "_urls"): # Collect methods for url, methods in attr._urls: cls._urls.append((url, p, methods)) - if url == '/': + if url == "/": cls._default_view = p # Wrap views setattr(cls, p, _wrap_view(attr)) -class BaseViewClass(object): +class BaseViewClass: pass class BaseView(BaseViewClass, metaclass=AdminViewMeta): """ - Base administrative view. + Base administrative view. - Derive from this class to implement your administrative interface piece. For example:: + Derive from this class to implement your administrative interface piece. For example:: - from flask_admin import BaseView, expose - class MyView(BaseView): - @expose('/') - def index(self): - return 'Hello World!' + from flask_admin import BaseView, expose + class MyView(BaseView): + @expose('/') + def index(self): + return 'Hello World!' - Icons can be added to the menu by using `menu_icon_type` and `menu_icon_value`. For example:: + Icons can be added to the menu by using `menu_icon_type` and `menu_icon_value`. For example:: - admin.add_view(MyView(name='My View', menu_icon_type='glyph', menu_icon_value='glyphicon-home')) + admin.add_view(MyView(name='My View', menu_icon_type='glyph', menu_icon_value='glyphicon-home')) """ + @property def _template_args(self): """ - Extra template arguments. + Extra template arguments. - If you need to pass some extra parameters to the template, - you can override particular view function, contribute - arguments you want to pass to the template and call parent view. + If you need to pass some extra parameters to the template, + you can override particular view function, contribute + arguments you want to pass to the template and call parent view. - These arguments are local for this request and will be discarded - in the next request. + These arguments are local for this request and will be discarded + in the next request. - Any value passed through ``_template_args`` will override whatever - parent view function passed to the template. + Any value passed through ``_template_args`` will override whatever + parent view function passed to the template. - For example:: + For example:: - class MyAdmin(ModelView): - @expose('/') - def index(self): - self._template_args['name'] = 'foobar' - self._template_args['code'] = '12345' - super(MyAdmin, self).index() + class MyAdmin(ModelView): + @expose('/') + def index(self): + self._template_args['name'] = 'foobar' + self._template_args['code'] = '12345' + super(MyAdmin, self).index() """ - args = getattr(g, '_admin_template_args', None) + args = getattr(g, "_admin_template_args", None) if args is None: args = g._admin_template_args = dict() return args - def __init__(self, name=None, category=None, endpoint=None, url=None, - static_folder=None, static_url_path=None, - menu_class_name=None, menu_icon_type=None, menu_icon_value=None): - """ - Constructor. - - :param name: - Name of this view. If not provided, will default to the class name. - :param category: - View category. If not provided, this view will be shown as a top-level menu item. Otherwise, it will - be in a submenu. - :param endpoint: - Base endpoint name for the view. For example, if there's a view method called "index" and - endpoint is set to "myadmin", you can use `url_for('myadmin.index')` to get the URL to the - view method. Defaults to the class name in lower case. - :param url: - Base URL. If provided, affects how URLs are generated. For example, if the url parameter - is "test", the resulting URL will look like "/admin/test/". If not provided, will - use endpoint as a base url. However, if URL starts with '/', absolute path is assumed - and '/admin/' prefix won't be applied. - :param static_url_path: - Static URL Path. If provided, this specifies the path to the static url directory. - :param menu_class_name: - Optional class name for the menu item. - :param menu_icon_type: - Optional icon. Possible icon types: - - - `flask_admin.consts.ICON_TYPE_GLYPH` - Bootstrap glyph icon - - `flask_admin.consts.ICON_TYPE_FONT_AWESOME` - Font Awesome icon - - `flask_admin.consts.ICON_TYPE_IMAGE` - Image relative to Flask static directory - - `flask_admin.consts.ICON_TYPE_IMAGE_URL` - Image with full URL - :param menu_icon_value: - Icon glyph name or URL, depending on `menu_icon_type` setting + def __init__( + self, + name=None, + category=None, + endpoint=None, + url=None, + static_folder=None, + static_url_path=None, + menu_class_name=None, + menu_icon_type=None, + menu_icon_value=None, + ): + """ + Constructor. + + :param name: + Name of this view. If not provided, will default to the class name. + :param category: + View category. If not provided, this view will be shown as a top-level menu item. Otherwise, it will + be in a submenu. + :param endpoint: + Base endpoint name for the view. For example, if there's a view method called "index" and + endpoint is set to "myadmin", you can use `url_for('myadmin.index')` to get the URL to the + view method. Defaults to the class name in lower case. + :param url: + Base URL. If provided, affects how URLs are generated. For example, if the url parameter + is "test", the resulting URL will look like "/admin/test/". If not provided, will + use endpoint as a base url. However, if URL starts with '/', absolute path is assumed + and '/admin/' prefix won't be applied. + :param static_url_path: + Static URL Path. If provided, this specifies the path to the static url directory. + :param menu_class_name: + Optional class name for the menu item. + :param menu_icon_type: + Optional icon. Possible icon types: + + - `flask_admin.consts.ICON_TYPE_GLYPH` - Bootstrap glyph icon + - `flask_admin.consts.ICON_TYPE_FONT_AWESOME` - Font Awesome icon + - `flask_admin.consts.ICON_TYPE_IMAGE` - Image relative to Flask static directory + - `flask_admin.consts.ICON_TYPE_IMAGE_URL` - Image with full URL + :param menu_icon_value: + Icon glyph name or URL, depending on `menu_icon_type` setting """ self.name = name self.category = category @@ -212,12 +233,15 @@ def __init__(self, name=None, category=None, endpoint=None, url=None, # Default view if self._default_view is None: - raise Exception(u'Attempted to instantiate admin view %s without default view' % self.__class__.__name__) + raise Exception( + "Attempted to instantiate admin view %s without default view" + % self.__class__.__name__ + ) def _get_endpoint(self, endpoint): """ - Generate Flask endpoint name. By default converts class name to lower case if endpoint is - not explicitly provided. + Generate Flask endpoint name. By default converts class name to lower case if endpoint is + not explicitly provided. """ if endpoint: return endpoint @@ -226,25 +250,25 @@ def _get_endpoint(self, endpoint): def _get_view_url(self, admin, url): """ - Generate URL for the view. Override to change default behavior. + Generate URL for the view. Override to change default behavior. """ if url is None: - if admin.url != '/': - url = '%s/%s' % (admin.url, self.endpoint) + if admin.url != "/": + url = "%s/%s" % (admin.url, self.endpoint) else: if self == admin.index_view: - url = '/' + url = "/" else: - url = '/%s' % self.endpoint + url = "/%s" % self.endpoint else: - if not url.startswith('/'): - url = '%s/%s' % (admin.url, url) + if not url.startswith("/"): + url = "%s/%s" % (admin.url, url) return url def create_blueprint(self, admin): """ - Create Flask blueprint. + Create Flask blueprint. """ # Store admin instance self.admin = admin @@ -257,65 +281,66 @@ def create_blueprint(self, admin): self.url = self._get_view_url(admin, self.url) # If we're working from the root of the site, set prefix to None - if self.url == '/': + if self.url == "/": self.url = None # prevent admin static files from conflicting with flask static files if not self.static_url_path: - self.static_folder = 'static' - self.static_url_path = '/static/admin' + self.static_folder = "static" + self.static_url_path = "/static/admin" # If name is not provided, use capitalized endpoint name if self.name is None: self.name = self._prettify_class_name(self.__class__.__name__) # Create blueprint and register rules - self.blueprint = Blueprint(self.endpoint, __name__, - url_prefix=self.url, - subdomain=self.admin.subdomain, - template_folder=op.join('templates', self.admin.theme.folder), - static_folder=self.static_folder, - static_url_path=self.static_url_path) + self.blueprint = Blueprint( + self.endpoint, + __name__, + url_prefix=self.url, + subdomain=self.admin.subdomain, + template_folder=op.join("templates", self.admin.theme.folder), + static_folder=self.static_folder, + static_url_path=self.static_url_path, + ) self.blueprint.attach_url_defaults_and_value_preprocessor( - app=self.admin.app, - host=self.admin.host + app=self.admin.app, host=self.admin.host ) for url, name, methods in self._urls: - self.blueprint.add_url_rule(url, - name, - getattr(self, name), - methods=methods) + self.blueprint.add_url_rule(url, name, getattr(self, name), methods=methods) return self.blueprint def render(self, template, **kwargs): """ - Render template + Render template - :param template: - Template path to render - :param kwargs: - Template arguments + :param template: + Template path to render + :param kwargs: + Template arguments """ # Store self as admin_view - kwargs['admin_view'] = self - kwargs['admin_base_template'] = self.admin.theme.base_template - kwargs['admin_csp_nonce_attribute'] = ( - Markup(f'nonce="{self.admin.csp_nonce_generator()}"') if self.admin.csp_nonce_generator else '' + kwargs["admin_view"] = self + kwargs["admin_base_template"] = self.admin.theme.base_template + kwargs["admin_csp_nonce_attribute"] = ( + Markup(f'nonce="{self.admin.csp_nonce_generator()}"') + if self.admin.csp_nonce_generator + else "" ) # Provide i18n support even if flask-babel is not installed # or enabled. - kwargs['_gettext'] = babel.gettext - kwargs['_ngettext'] = babel.ngettext - kwargs['h'] = h + kwargs["_gettext"] = babel.gettext + kwargs["_ngettext"] = babel.ngettext + kwargs["h"] = h # Expose get_url helper - kwargs['get_url'] = self.get_url + kwargs["get_url"] = self.get_url # Expose config info - kwargs['config'] = current_app.config - kwargs['theme'] = self.admin.theme + kwargs["config"] = current_app.config + kwargs["theme"] = self.admin.theme # Contribute extra arguments kwargs.update(self._template_args) @@ -324,61 +349,61 @@ def render(self, template, **kwargs): def _prettify_class_name(self, name): """ - Split words in PascalCase string into separate words. + Split words in PascalCase string into separate words. - :param name: - String to prettify + :param name: + String to prettify """ return h.prettify_class_name(name) def is_visible(self): """ - Override this method if you want dynamically hide or show administrative views - from Flask-Admin menu structure + Override this method if you want dynamically hide or show administrative views + from Flask-Admin menu structure - By default, item is visible in menu. + By default, item is visible in menu. - Please note that item should be both visible and accessible to be displayed in menu. + Please note that item should be both visible and accessible to be displayed in menu. """ return True def is_accessible(self): """ - Override this method to add permission checks. + Override this method to add permission checks. - Flask-Admin does not make any assumptions about the authentication system used in your application, so it is - up to you to implement it. + Flask-Admin does not make any assumptions about the authentication system used in your application, so it is + up to you to implement it. - By default, it will allow access for everyone. + By default, it will allow access for everyone. """ return True def _handle_view(self, name, **kwargs): """ - This method will be executed before calling any view method. + This method will be executed before calling any view method. - It will execute the ``inaccessible_callback`` if the view is not - accessible. + It will execute the ``inaccessible_callback`` if the view is not + accessible. - :param name: - View function name - :param kwargs: - View function arguments + :param name: + View function name + :param kwargs: + View function arguments """ if not self.is_accessible(): return self.inaccessible_callback(name, **kwargs) def _run_view(self, fn, *args, **kwargs): """ - This method will run actual view function. + This method will run actual view function. - While it is similar to _handle_view, can be used to change - arguments that are passed to the view. + While it is similar to _handle_view, can be used to change + arguments that are passed to the view. - :param fn: - View function - :param kwargs: - Arguments + :param fn: + View function + :param kwargs: + Arguments """ try: return fn(self, *args, **kwargs) @@ -387,23 +412,23 @@ def _run_view(self, fn, *args, **kwargs): def inaccessible_callback(self, name, **kwargs): """ - Handle the response to inaccessible views. + Handle the response to inaccessible views. - By default, it throw HTTP 403 error. Override this method to - customize the behaviour. + By default, it throw HTTP 403 error. Override this method to + customize the behaviour. """ return abort(403) def get_url(self, endpoint, **kwargs): """ - Generate URL for the endpoint. If you want to customize URL generation - logic (persist some query string argument, for example), this is - right place to do it. + Generate URL for the endpoint. If you want to customize URL generation + logic (persist some query string argument, for example), this is + right place to do it. - :param endpoint: - Flask endpoint name - :param kwargs: - Arguments for `url_for` + :param endpoint: + Flask endpoint name + :param kwargs: + Arguments for `url_for` """ return url_for(endpoint, **kwargs) @@ -417,52 +442,60 @@ def _debug(self): class AdminIndexView(BaseView): """ - Default administrative interface index page when visiting the ``/admin/`` URL. + Default administrative interface index page when visiting the ``/admin/`` URL. - It can be overridden by passing your own view class to the ``Admin`` constructor:: + It can be overridden by passing your own view class to the ``Admin`` constructor:: - class MyHomeView(AdminIndexView): - @expose('/') - def index(self): - arg1 = 'Hello' - return self.render('admin/myhome.html', arg1=arg1) + class MyHomeView(AdminIndexView): + @expose('/') + def index(self): + arg1 = 'Hello' + return self.render('admin/myhome.html', arg1=arg1) - admin = Admin(index_view=MyHomeView()) + admin = Admin(index_view=MyHomeView()) - Also, you can change the root url from /admin to / with the following:: + Also, you can change the root url from /admin to / with the following:: - admin = Admin( - app, - index_view=AdminIndexView( - name='Home', - template='admin/myhome.html', - url='/' - ) + admin = Admin( + app, + index_view=AdminIndexView( + name='Home', + template='admin/myhome.html', + url='/' ) + ) - Default values for the index page are: + Default values for the index page are: - * If a name is not provided, 'Home' will be used. - * If an endpoint is not provided, will default to ``admin`` - * Default URL route is ``/admin``. - * Automatically associates with static folder. - * Default template is ``admin/index.html`` + * If a name is not provided, 'Home' will be used. + * If an endpoint is not provided, will default to ``admin`` + * Default URL route is ``/admin``. + * Automatically associates with static folder. + * Default template is ``admin/index.html`` """ - def __init__(self, name=None, category=None, - endpoint=None, url=None, - template='admin/index.html', - menu_class_name=None, - menu_icon_type=None, - menu_icon_value=None): - super(AdminIndexView, self).__init__(name or babel.lazy_gettext('Home'), - category, - endpoint or 'admin', - '/admin' if url is None else url, - 'static', - menu_class_name=menu_class_name, - menu_icon_type=menu_icon_type, - menu_icon_value=menu_icon_value) + + def __init__( + self, + name=None, + category=None, + endpoint=None, + url=None, + template="admin/index.html", + menu_class_name=None, + menu_icon_type=None, + menu_icon_value=None, + ): + super(AdminIndexView, self).__init__( + name or babel.lazy_gettext("Home"), + category, + endpoint or "admin", + "/admin" if url is None else url, + "static", + menu_class_name=menu_class_name, + menu_icon_type=menu_icon_type, + menu_icon_value=menu_icon_value, + ) self._template = template @expose() @@ -470,51 +503,57 @@ def index(self): return self.render(self._template) -class Admin(object): +class Admin: """ - Collection of the admin views. Also manages menu structure. + Collection of the admin views. Also manages menu structure. """ - def __init__(self, app=None, name=None, - url=None, subdomain=None, - index_view=None, - translations_path=None, - endpoint=None, - static_url_path=None, - theme: t.Optional[Theme] = None, - category_icon_classes=None, - host=None, - csp_nonce_generator: t.Optional[t.Callable] = None): - """ - Constructor. - - :param app: - Flask application object - :param name: - Application name. Will be displayed in the main menu and as a page title. Defaults to "Admin" - :param url: - Base URL - :param subdomain: - Subdomain to use - :param index_view: - Home page view to use. Defaults to `AdminIndexView`. - :param translations_path: - Location of the translation message catalogs. By default will use the translations - shipped with Flask-Admin. - :param endpoint: - Base endpoint name for index view. If you use multiple instances of the `Admin` class with - a single Flask application, you have to set a unique endpoint name for each instance. - :param static_url_path: - Static URL Path. If provided, this specifies the default path to the static url directory for - all its views. Can be overridden in view configuration. - :param theme: - Base theme. Defaults to `Bootstrap4Theme()`. - :param category_icon_classes: - A dict of category names as keys and html classes as values to be added to menu category icons. - Example: {'Favorites': 'glyphicon glyphicon-star'} - :param host: - The host to register all admin views on. Mutually exclusive with `subdomain` - :param csp_nonce_generator: - A callable that returns a nonce to inject into Flask-Admin JS, CSS, etc. + + def __init__( + self, + app=None, + name=None, + url=None, + subdomain=None, + index_view=None, + translations_path=None, + endpoint=None, + static_url_path=None, + theme: t.Optional[Theme] = None, + category_icon_classes=None, + host=None, + csp_nonce_generator: t.Optional[t.Callable] = None, + ): + """ + Constructor. + + :param app: + Flask application object + :param name: + Application name. Will be displayed in the main menu and as a page title. Defaults to "Admin" + :param url: + Base URL + :param subdomain: + Subdomain to use + :param index_view: + Home page view to use. Defaults to `AdminIndexView`. + :param translations_path: + Location of the translation message catalogs. By default will use the translations + shipped with Flask-Admin. + :param endpoint: + Base endpoint name for index view. If you use multiple instances of the `Admin` class with + a single Flask application, you have to set a unique endpoint name for each instance. + :param static_url_path: + Static URL Path. If provided, this specifies the default path to the static url directory for + all its views. Can be overridden in view configuration. + :param theme: + Base theme. Defaults to `Bootstrap4Theme()`. + :param category_icon_classes: + A dict of category names as keys and html classes as values to be added to menu category icons. + Example: {'Favorites': 'glyphicon glyphicon-star'} + :param host: + The host to register all admin views on. Mutually exclusive with `subdomain` + :param csp_nonce_generator: + A callable that returns a nonce to inject into Flask-Admin JS, CSS, etc. """ self.app = app @@ -526,7 +565,7 @@ def __init__(self, app=None, name=None, self._menu_links = [] # type: ignore[var-annotated] if name is None: - name = 'Admin' + name = "Admin" self.name = name self.index_view = index_view or AdminIndexView(endpoint=endpoint, url=url) @@ -573,10 +612,10 @@ def _validate_admin_host_and_subdomain(self): def add_view(self, view): """ - Add a view to the collection. + Add a view to the collection. - :param view: - View to add. + :param view: + View to add. """ # Add to views self._views.append(view) @@ -590,18 +629,17 @@ def add_view(self, view): self._add_view_to_menu(view) - def _set_admin_index_view(self, index_view=None, - endpoint=None, url=None): + def _set_admin_index_view(self, index_view=None, endpoint=None, url=None): """ - Add the admin index view. + Add the admin index view. - :param index_view: - Home page view to use. Defaults to `AdminIndexView`. - :param url: - Base URL - :param endpoint: - Base endpoint name for index view. If you use multiple instances of the `Admin` class with - a single Flask application, you have to set a unique endpoint name for each instance. + :param index_view: + Home page view to use. Defaults to `AdminIndexView`. + :param url: + Base URL + :param endpoint: + Base endpoint name for index view. If you use multiple instances of the `Admin` class with + a single Flask application, you have to set a unique endpoint name for each instance. """ self.index_view = index_view or AdminIndexView(endpoint=endpoint, url=url) self.endpoint = endpoint or self.index_view.endpoint @@ -617,32 +655,32 @@ def _set_admin_index_view(self, index_view=None, def add_views(self, *args): """ - Add one or more views to the collection. + Add one or more views to the collection. - Examples:: + Examples:: - admin.add_views(view1) - admin.add_views(view1, view2, view3, view4) - admin.add_views(*my_list) + admin.add_views(view1) + admin.add_views(view1, view2, view3, view4) + admin.add_views(*my_list) - :param args: - Argument list including the views to add. + :param args: + Argument list including the views to add. """ for view in args: self.add_view(view) def add_category(self, name, class_name=None, icon_type=None, icon_value=None): """ - Add a category of a given name + Add a category of a given name - :param name: - The name of the new menu category. - :param class_name: - The class name for the new menu category. - :param icon_type: - The icon name for the new menu category. - :param icon_value: - The icon value for the new menu category. + :param name: + The name of the new menu category. + :param class_name: + The class name for the new menu category. + :param icon_type: + The icon name for the new menu category. + :param icon_value: + The icon value for the new menu category. """ cat_text = as_unicode(name) @@ -650,20 +688,21 @@ def add_category(self, name, class_name=None, icon_type=None, icon_value=None): if category: return - category = MenuCategory(name, class_name=class_name, icon_type=icon_type, icon_value=icon_value) + category = MenuCategory( + name, class_name=class_name, icon_type=icon_type, icon_value=icon_value + ) self._menu_categories[cat_text] = category self._menu.append(category) def add_sub_category(self, name, parent_name): - """ - Add a category of a given name underneath - the category with parent_name. + Add a category of a given name underneath + the category with parent_name. - :param name: - The name of the new menu category. - :param parent_name: - The name of a parent_name category + :param name: + The name of the new menu category. + :param parent_name: + The name of a parent_name category """ name_text = as_unicode(name) @@ -677,10 +716,10 @@ def add_sub_category(self, name, parent_name): def add_link(self, link): """ - Add link to menu links collection. + Add link to menu links collection. - :param link: - Link to add. + :param link: + Link to add. """ if link.category: self.add_menu_item(link, link.category) @@ -689,28 +728,28 @@ def add_link(self, link): def add_links(self, *args): """ - Add one or more links to the menu links collection. + Add one or more links to the menu links collection. - Examples:: + Examples:: - admin.add_links(link1) - admin.add_links(link1, link2, link3, link4) - admin.add_links(*my_list) + admin.add_links(link1) + admin.add_links(link1, link2, link3, link4) + admin.add_links(*my_list) - :param args: - Argument list including the links to add. + :param args: + Argument list including the links to add. """ for link in args: self.add_link(link) def add_menu_item(self, menu_item, target_category=None): """ - Add menu item to menu tree hierarchy. + Add menu item to menu tree hierarchy. - :param menu_item: - MenuItem class instance - :param target_category: - Target category name + :param menu_item: + MenuItem class instance + :param target_category: + Target category name """ if target_category: cat_text = as_unicode(target_category) @@ -730,28 +769,29 @@ def add_menu_item(self, menu_item, target_category=None): self._menu.append(menu_item) def _add_menu_item(self, menu_item, target_category): - warnings.warn('Admin._add_menu_item is obsolete - use Admin.add_menu_item instead.') + warnings.warn( + "Admin._add_menu_item is obsolete - use Admin.add_menu_item instead." + ) return self.add_menu_item(menu_item, target_category) def _add_view_to_menu(self, view): """ - Add a view to the menu tree + Add a view to the menu tree - :param view: - View to add + :param view: + View to add """ self.add_menu_item(MenuView(view.name, view), view.category) def get_category_menu_item(self, name): return self._menu_categories.get(name) - def init_app(self, app, index_view=None, - endpoint=None, url=None): + def init_app(self, app, index_view=None, endpoint=None, url=None): """ - Register all views with the Flask application. + Register all views with the Flask application. - :param app: - Flask application instance + :param app: + Flask application instance """ self.app = app self._validate_admin_host_and_subdomain() @@ -761,44 +801,42 @@ def init_app(self, app, index_view=None, # Register Index view if index_view is not None: self._set_admin_index_view( - index_view=index_view, - endpoint=endpoint, - url=url + index_view=index_view, endpoint=endpoint, url=url ) # Register views for view in self._views: - app.register_blueprint( - view.create_blueprint(self), - host=self.host - ) + app.register_blueprint(view.create_blueprint(self), host=self.host) def _init_extension(self): - if not hasattr(self.app, 'extensions'): + if not hasattr(self.app, "extensions"): self.app.extensions = dict() - admins = self.app.extensions.get('admin', []) + admins = self.app.extensions.get("admin", []) for p in admins: if p.endpoint == self.endpoint: - raise Exception(u'Cannot have two Admin() instances with same' - u' endpoint name.') + raise Exception( + "Cannot have two Admin() instances with same" " endpoint name." + ) if p.url == self.url and p.subdomain == self.subdomain: - raise Exception(u'Cannot assign two Admin() instances with same' - u' URL and subdomain to the same application.') + raise Exception( + "Cannot assign two Admin() instances with same" + " URL and subdomain to the same application." + ) admins.append(self) - self.app.extensions['admin'] = admins + self.app.extensions["admin"] = admins def menu(self): """ - Return the menu hierarchy. + Return the menu hierarchy. """ return self._menu def menu_links(self): """ - Return menu links. + Return menu links. """ return self._menu_links diff --git a/flask_admin/blueprints.py b/flask_admin/blueprints.py index dc4d2c2c3..62b49818c 100644 --- a/flask_admin/blueprints.py +++ b/flask_admin/blueprints.py @@ -1,11 +1,12 @@ import typing as t -from flask import request, Flask +from flask import Flask +from flask import request from flask.blueprints import Blueprint as FlaskBlueprint from flask.blueprints import BlueprintSetupState as FlaskBlueprintSetupState -from flask_admin.consts import ADMIN_ROUTES_HOST_VARIABLE_NAME, \ - ADMIN_ROUTES_HOST_VARIABLE +from flask_admin.consts import ADMIN_ROUTES_HOST_VARIABLE +from flask_admin.consts import ADMIN_ROUTES_HOST_VARIABLE_NAME class _BlueprintSetupStateWithHostSupport(FlaskBlueprintSetupState): diff --git a/flask_admin/consts.py b/flask_admin/consts.py index 95e7df903..841986460 100644 --- a/flask_admin/consts.py +++ b/flask_admin/consts.py @@ -1,11 +1,11 @@ # bootstrap glyph icon -ICON_TYPE_GLYPH = 'glyph' +ICON_TYPE_GLYPH = "glyph" # font awesome glyph icon -ICON_TYPE_FONT_AWESOME = 'fa' +ICON_TYPE_FONT_AWESOME = "fa" # image relative to Flask static folder -ICON_TYPE_IMAGE = 'image' +ICON_TYPE_IMAGE = "image" # external image -ICON_TYPE_IMAGE_URL = 'image-url' +ICON_TYPE_IMAGE_URL = "image-url" ADMIN_ROUTES_HOST_VARIABLE = "<admin_routes_host>" diff --git a/flask_admin/contrib/__init__.py b/flask_admin/contrib/__init__.py index 24608e116..5f7329600 100644 --- a/flask_admin/contrib/__init__.py +++ b/flask_admin/contrib/__init__.py @@ -1,4 +1,4 @@ try: - __path__ = __import__('pkgutil').extend_path(__path__, __name__) + __path__ = __import__("pkgutil").extend_path(__path__, __name__) except ImportError: pass diff --git a/flask_admin/contrib/fileadmin/__init__.py b/flask_admin/contrib/fileadmin/__init__.py index 2bc9344a8..54964b29e 100644 --- a/flask_admin/contrib/fileadmin/__init__.py +++ b/flask_admin/contrib/fileadmin/__init__.py @@ -1,75 +1,88 @@ -import sys -import warnings -from datetime import datetime import os import os.path as op import platform import re import shutil +import sys +import warnings +from datetime import datetime from functools import partial from operator import itemgetter -from urllib.parse import urljoin, quote - -from flask import flash, redirect, abort, request, send_file +from urllib.parse import quote +from urllib.parse import urljoin + +from flask import abort +from flask import flash +from flask import redirect +from flask import request +from flask import send_file from werkzeug.utils import secure_filename -from wtforms import fields, validators +from wtforms import fields +from wtforms import validators -from flask_admin import form, helpers +from flask_admin import form +from flask_admin import helpers from flask_admin._compat import as_unicode -from flask_admin.base import BaseView, expose -from flask_admin.actions import action, ActionsMixin -from flask_admin.babel import gettext, lazy_gettext - +from flask_admin.actions import action +from flask_admin.actions import ActionsMixin +from flask_admin.babel import gettext +from flask_admin.babel import lazy_gettext +from flask_admin.base import BaseView +from flask_admin.base import expose if sys.version_info >= (3, 11): from datetime import UTC + utc_fromtimestamp = partial(datetime.fromtimestamp, tz=UTC) else: utc_fromtimestamp = datetime.utcfromtimestamp -class LocalFileStorage(object): +class LocalFileStorage: def __init__(self, base_path): """ - Constructor. + Constructor. - :param base_path: - Base file storage location + :param base_path: + Base file storage location """ self.base_path = as_unicode(base_path) self.separator = os.sep if not self.path_exists(self.base_path): - raise IOError('FileAdmin path "%s" does not exist or is not accessible' % self.base_path) + raise OSError( + 'FileAdmin path "%s" does not exist or is not accessible' + % self.base_path + ) def get_base_path(self): """ - Return base path. Override to customize behavior (per-user - directories, etc) + Return base path. Override to customize behavior (per-user + directories, etc) """ return op.normpath(self.base_path) def make_dir(self, path, directory): """ - Creates a directory `directory` under the `path` + Creates a directory `directory` under the `path` """ os.mkdir(op.join(path, directory)) def get_files(self, path, directory): """ - Gets a list of tuples representing the files in the `directory` - under the `path` + Gets a list of tuples representing the files in the `directory` + under the `path` - :param path: - The path up to the directory + :param path: + The path up to the directory - :param directory: - The directory that will have its files listed + :param directory: + The directory that will have its files listed - Each tuple represents a file and it should contain the file name, - the relative path, a flag signifying if it is a directory, the file - size in bytes and the time last modified in seconds since the epoch + Each tuple represents a file and it should contain the file name, + the relative path, a flag signifying if it is a directory, the file + size in bytes and the time last modified in seconds since the epoch """ items = [] for f in os.listdir(directory): @@ -83,68 +96,67 @@ def get_files(self, path, directory): def delete_tree(self, directory): """ - Deletes the directory `directory` and all its files and subdirectories + Deletes the directory `directory` and all its files and subdirectories """ shutil.rmtree(directory) def delete_file(self, file_path): """ - Deletes the file located at `file_path` + Deletes the file located at `file_path` """ os.remove(file_path) def path_exists(self, path): """ - Check if `path` exists + Check if `path` exists """ return op.exists(path) def rename_path(self, src, dst): """ - Renames `src` to `dst` + Renames `src` to `dst` """ os.rename(src, dst) def is_dir(self, path): """ - Check if `path` is a directory + Check if `path` is a directory """ return op.isdir(path) def send_file(self, file_path): """ - Sends the file located at `file_path` to the user + Sends the file located at `file_path` to the user """ return send_file(file_path) def read_file(self, path): """ - Reads the content of the file located at `file_path`. + Reads the content of the file located at `file_path`. """ - with open(path, 'rb') as f: + with open(path, "rb") as f: return f.read() def write_file(self, path, content): """ - Writes `content` to the file located at `file_path`. + Writes `content` to the file located at `file_path`. """ - with open(path, 'w') as f: + with open(path, "w") as f: return f.write(content) def save_file(self, path, file_data): """ - Save uploaded file to the disk + Save uploaded file to the disk - :param path: - Path to save to - :param file_data: - Werkzeug `FileStorage` object + :param path: + Path to save to + :param file_data: + Werkzeug `FileStorage` object """ file_data.save(path) class BaseFileAdmin(BaseView, ActionsMixin): - can_upload = True """ Is file upload allowed. @@ -195,47 +207,47 @@ class MyAdmin(FileAdmin): editable_extensions = ('md', 'html', 'txt') """ - list_template = 'admin/file/list.html' + list_template = "admin/file/list.html" """ File list template """ - upload_template = 'admin/file/form.html' + upload_template = "admin/file/form.html" """ File upload template """ - upload_modal_template = 'admin/file/modals/form.html' + upload_modal_template = "admin/file/modals/form.html" """ File upload template for modal dialog """ - mkdir_template = 'admin/file/form.html' + mkdir_template = "admin/file/form.html" """ Directory creation (mkdir) template """ - mkdir_modal_template = 'admin/file/modals/form.html' + mkdir_modal_template = "admin/file/modals/form.html" """ Directory creation (mkdir) template for modal dialog """ - rename_template = 'admin/file/form.html' + rename_template = "admin/file/form.html" """ Rename template """ - rename_modal_template = 'admin/file/modals/form.html' + rename_modal_template = "admin/file/modals/form.html" """ Rename template for modal dialog """ - edit_template = 'admin/file/form.html' + edit_template = "admin/file/form.html" """ Edit template """ - edit_modal_template = 'admin/file/modals/form.html' + edit_modal_template = "admin/file/modals/form.html" """ Edit template for modal dialog """ @@ -272,10 +284,10 @@ class MyAdmin(FileAdmin): """Setting this to true will display the edit view as a modal dialog.""" # List view - possible_columns = 'name', 'rel_path', 'is_dir', 'size', 'date' + possible_columns = "name", "rel_path", "is_dir", "size", "date" """A list of possible columns to display.""" - column_list = 'name', 'size', 'date' + column_list = "name", "size", "date" """A list of columns to display.""" column_sortable_list = column_list @@ -290,148 +302,171 @@ class MyAdmin(FileAdmin): column_labels = dict((column, column.capitalize()) for column in column_list) """A dict from column names to their labels.""" - date_format = '%Y-%m-%d %H:%M:%S' + date_format = "%Y-%m-%d %H:%M:%S" """Date column display format.""" - def __init__(self, base_url=None, name=None, category=None, endpoint=None, - url=None, verify_path=True, menu_class_name=None, - menu_icon_type=None, menu_icon_value=None, storage=None): - """ - Constructor. - - :param base_url: - Base URL for the files - :param name: - Name of this view. If not provided, will default to the class name. - :param category: - View category - :param endpoint: - Endpoint name for the view - :param url: - URL for view - :param verify_path: - Verify if path exists. If set to `True` and path does not exist - will raise an exception. - :param storage: - The storage backend that the `BaseFileAdmin` will use to operate on the files. + def __init__( + self, + base_url=None, + name=None, + category=None, + endpoint=None, + url=None, + verify_path=True, + menu_class_name=None, + menu_icon_type=None, + menu_icon_value=None, + storage=None, + ): + """ + Constructor. + + :param base_url: + Base URL for the files + :param name: + Name of this view. If not provided, will default to the class name. + :param category: + View category + :param endpoint: + Endpoint name for the view + :param url: + URL for view + :param verify_path: + Verify if path exists. If set to `True` and path does not exist + will raise an exception. + :param storage: + The storage backend that the `BaseFileAdmin` will use to operate on the files. """ self.base_url = base_url self.storage = storage self.init_actions() - self._on_windows = platform.system() == 'Windows' + self._on_windows = platform.system() == "Windows" # Convert allowed_extensions to set for quick validation - if (self.allowed_extensions and - not isinstance(self.allowed_extensions, set)): + if self.allowed_extensions and not isinstance(self.allowed_extensions, set): self.allowed_extensions = set(self.allowed_extensions) # Convert editable_extensions to set for quick validation - if (self.editable_extensions and - not isinstance(self.editable_extensions, set)): + if self.editable_extensions and not isinstance(self.editable_extensions, set): self.editable_extensions = set(self.editable_extensions) - super(BaseFileAdmin, self).__init__(name, category, endpoint, url, - menu_class_name=menu_class_name, - menu_icon_type=menu_icon_type, - menu_icon_value=menu_icon_value) + super(BaseFileAdmin, self).__init__( + name, + category, + endpoint, + url, + menu_class_name=menu_class_name, + menu_icon_type=menu_icon_type, + menu_icon_value=menu_icon_value, + ) def is_accessible_path(self, path): """ - Verify if the provided path is accessible for the current user. + Verify if the provided path is accessible for the current user. - Override to customize behavior. + Override to customize behavior. - :param path: - Relative path to the root + :param path: + Relative path to the root """ return True def get_base_path(self): """ - Return base path. Override to customize behavior (per-user - directories, etc) + Return base path. Override to customize behavior (per-user + directories, etc) """ return self.storage.get_base_path() def get_base_url(self): """ - Return base URL. Override to customize behavior (per-user - directories, etc) + Return base URL. Override to customize behavior (per-user + directories, etc) """ return self.base_url def get_upload_form(self): """ - Upload form class for file upload view. + Upload form class for file upload view. - Override to implement customized behavior. + Override to implement customized behavior. """ + class UploadForm(self.form_base_class): """ - File upload form. Works with FileAdmin instance to check if it - is allowed to upload file with given extension. + File upload form. Works with FileAdmin instance to check if it + is allowed to upload file with given extension. """ - upload = fields.FileField(lazy_gettext('File to upload')) + + upload = fields.FileField(lazy_gettext("File to upload")) def __init__(self, *args, **kwargs): super(UploadForm, self).__init__(*args, **kwargs) - self.admin = kwargs['admin'] + self.admin = kwargs["admin"] def validate_upload(self, field): if not self.upload.data: - raise validators.ValidationError(gettext('File required.')) + raise validators.ValidationError(gettext("File required.")) filename = self.upload.data.filename if not self.admin.is_file_allowed(filename): - raise validators.ValidationError(gettext('Invalid file type.')) + raise validators.ValidationError(gettext("Invalid file type.")) return UploadForm def get_edit_form(self): """ - Create form class for file editing view. + Create form class for file editing view. - Override to implement customized behavior. + Override to implement customized behavior. """ + class EditForm(self.form_base_class): - content = fields.TextAreaField(lazy_gettext('Content'), - (validators.InputRequired(),)) + content = fields.TextAreaField( + lazy_gettext("Content"), (validators.InputRequired(),) + ) return EditForm def get_name_form(self): """ - Create form class for renaming and mkdir views. + Create form class for renaming and mkdir views. - Override to implement customized behavior. + Override to implement customized behavior. """ + def validate_name(self, field): - regexp = re.compile(r'^(?!^(PRN|AUX|CLOCK\$|NUL|CON|COM\d|LPT\d|\..*)(\..+)?$)[^\x00-\x1f\\?*:\";|/]+$') + regexp = re.compile( + r"^(?!^(PRN|AUX|CLOCK\$|NUL|CON|COM\d|LPT\d|\..*)(\..+)?$)[^\x00-\x1f\\?*:\";|/]+$" + ) if not regexp.match(field.data): - raise validators.ValidationError(gettext('Invalid name')) + raise validators.ValidationError(gettext("Invalid name")) class NameForm(self.form_base_class): """ - Form with a filename input field. + Form with a filename input field. - Validates if provided name is valid for *nix and Windows systems. + Validates if provided name is valid for *nix and Windows systems. """ - name = fields.StringField(lazy_gettext('Name'), - validators=[validators.InputRequired(), - validate_name]) + + name = fields.StringField( + lazy_gettext("Name"), + validators=[validators.InputRequired(), validate_name], + ) path = fields.HiddenField() return NameForm def get_delete_form(self): """ - Create form class for model delete view. + Create form class for model delete view. - Override to implement customized behavior. + Override to implement customized behavior. """ + class DeleteForm(self.form_base_class): path = fields.HiddenField(validators=[validators.InputRequired()]) @@ -439,10 +474,11 @@ class DeleteForm(self.form_base_class): def get_action_form(self): """ - Create form class for model action. + Create form class for model action. - Override to implement customized behavior. + Override to implement customized behavior. """ + class ActionForm(self.form_base_class): action = fields.HiddenField() url = fields.HiddenField() @@ -452,9 +488,9 @@ class ActionForm(self.form_base_class): def upload_form(self): """ - Instantiate file upload form and return it. + Instantiate file upload form and return it. - Override to implement custom behavior. + Override to implement custom behavior. """ upload_form_class = self.get_upload_form() if request.form: @@ -472,9 +508,9 @@ def upload_form(self): def name_form(self): """ - Instantiate form used in rename and mkdir then return it. + Instantiate form used in rename and mkdir then return it. - Override to implement custom behavior. + Override to implement custom behavior. """ name_form_class = self.get_name_form() if request.form: @@ -486,9 +522,9 @@ def name_form(self): def edit_form(self): """ - Instantiate file editing form and return it. + Instantiate file editing form and return it. - Override to implement custom behavior. + Override to implement custom behavior. """ edit_form_class = self.get_edit_form() if request.form: @@ -498,9 +534,9 @@ def edit_form(self): def delete_form(self): """ - Instantiate file delete form and return it. + Instantiate file delete form and return it. - Override to implement custom behavior. + Override to implement custom behavior. """ delete_form_class = self.get_delete_form() if request.form: @@ -510,9 +546,9 @@ def delete_form(self): def action_form(self): """ - Instantiate action form and return it. + Instantiate action form and return it. - Override to implement custom behavior. + Override to implement custom behavior. """ action_form_class = self.get_action_form() if request.form: @@ -522,16 +558,16 @@ def action_form(self): def is_file_allowed(self, filename): """ - Verify if file can be uploaded. + Verify if file can be uploaded. - Override to customize behavior. + Override to customize behavior. - :param filename: - Source file name + :param filename: + Source file name """ ext = op.splitext(filename)[1].lower() - if ext.startswith('.'): + if ext.startswith("."): ext = ext[1:] if self.allowed_extensions and ext not in self.allowed_extensions: @@ -541,16 +577,16 @@ def is_file_allowed(self, filename): def is_file_editable(self, filename): """ - Determine if the file can be edited. + Determine if the file can be edited. - Override to customize behavior. + Override to customize behavior. - :param filename: - Source file name + :param filename: + Source file name """ ext = op.splitext(filename)[1].lower() - if ext.startswith('.'): + if ext.startswith("."): ext = ext[1:] if not self.editable_extensions or ext not in self.editable_extensions: @@ -560,85 +596,85 @@ def is_file_editable(self, filename): def is_in_folder(self, base_path, directory): """ - Verify that `directory` is in `base_path` folder + Verify that `directory` is in `base_path` folder - :param base_path: - Base directory path - :param directory: - Directory path to check + :param base_path: + Base directory path + :param directory: + Directory path to check """ return op.normpath(directory).startswith(base_path) def save_file(self, path, file_data): """ - Save uploaded file to the storage + Save uploaded file to the storage - :param path: - Path to save to - :param file_data: - Werkzeug `FileStorage` object + :param path: + Path to save to + :param file_data: + Werkzeug `FileStorage` object """ self.storage.save_file(path, file_data) def validate_form(self, form): """ - Validate the form on submit. + Validate the form on submit. - :param form: - Form to validate + :param form: + Form to validate """ return helpers.validate_form_on_submit(form) def _get_dir_url(self, endpoint, path=None, **kwargs): """ - Return prettified URL + Return prettified URL - :param endpoint: - Endpoint name - :param path: - Directory path - :param kwargs: - Additional arguments + :param endpoint: + Endpoint name + :param path: + Directory path + :param kwargs: + Additional arguments """ if not path: return self.get_url(endpoint, **kwargs) else: if self._on_windows: - path = path.replace('\\', '/') + path = path.replace("\\", "/") - kwargs['path'] = path + kwargs["path"] = path return self.get_url(endpoint, **kwargs) def _get_file_url(self, path, **kwargs): """ - Return static file url + Return static file url - :param path: - Static file path + :param path: + Static file path """ if self._on_windows: - path = path.replace('\\', '/') + path = path.replace("\\", "/") if self.is_file_editable(path): - route = '.edit' + route = ".edit" else: - route = '.download' + route = ".download" return self.get_url(route, path=path, **kwargs) def _normalize_path(self, path): """ - Verify and normalize path. + Verify and normalize path. - If the path is not relative to the base directory, will raise a 404 exception. + If the path is not relative to the base directory, will raise a 404 exception. - If the path does not exist, this will also raise a 404 exception. + If the path does not exist, this will also raise a 404 exception. """ base_path = self.get_base_path() if path is None: directory = base_path - path = '' + path = "" else: path = op.normpath(path) if base_path: @@ -657,90 +693,90 @@ def _normalize_path(self, path): return base_path, directory, path def is_action_allowed(self, name): - if name == 'delete' and not self.can_delete: + if name == "delete" and not self.can_delete: return False - elif name == 'edit' and len(self.editable_extensions) == 0: + elif name == "edit" and len(self.editable_extensions) == 0: return False return True def on_rename(self, full_path, dir_base, filename): """ - Perform some actions after a file or directory has been renamed. + Perform some actions after a file or directory has been renamed. - Called from rename method + Called from rename method - By default do nothing. + By default do nothing. """ pass def on_edit_file(self, full_path, path): """ - Perform some actions after a file has been successfully changed. + Perform some actions after a file has been successfully changed. - Called from edit method + Called from edit method - By default do nothing. + By default do nothing. """ pass def on_file_upload(self, directory, path, filename): """ - Perform some actions after a file has been successfully uploaded. + Perform some actions after a file has been successfully uploaded. - Called from upload method + Called from upload method - By default do nothing. + By default do nothing. """ pass def on_mkdir(self, parent_dir, dir_name): """ - Perform some actions after a directory has successfully been created. + Perform some actions after a directory has successfully been created. - Called from mkdir method + Called from mkdir method - By default do nothing. + By default do nothing. """ pass def before_directory_delete(self, full_path, dir_name): """ - Perform some actions before a directory has successfully been deleted. + Perform some actions before a directory has successfully been deleted. - Called from delete method + Called from delete method - By default do nothing. + By default do nothing. """ pass def before_file_delete(self, full_path, filename): """ - Perform some actions before a file has successfully been deleted. + Perform some actions before a file has successfully been deleted. - Called from delete method + Called from delete method - By default do nothing. + By default do nothing. """ pass def on_directory_delete(self, full_path, dir_name): """ - Perform some actions after a directory has successfully been deleted. + Perform some actions after a directory has successfully been deleted. - Called from delete method + Called from delete method - By default do nothing. + By default do nothing. """ pass def on_file_delete(self, full_path, filename): """ - Perform some actions after a file has successfully been deleted. + Perform some actions after a file has successfully been deleted. - Called from delete method + Called from delete method - By default do nothing. + By default do nothing. """ pass @@ -777,12 +813,17 @@ def timestamp_format(self, timestamp): return datetime.fromtimestamp(timestamp).strftime(self.date_format) def _save_form_files(self, directory, path, form): - filename = self._separator.join([directory, secure_filename(form.upload.data.filename)]) + filename = self._separator.join( + [directory, secure_filename(form.upload.data.filename)] + ) if self.storage.path_exists(filename): - secure_name = self._separator.join([path, secure_filename(form.upload.data.filename)]) - raise Exception(gettext('File "%(name)s" already exists.', - name=secure_name)) + secure_name = self._separator.join( + [path, secure_filename(form.upload.data.filename)] + ) + raise Exception( + gettext('File "%(name)s" already exists.', name=secure_name) + ) else: self.save_file(filename, form.upload.data) self.on_file_upload(directory, path, filename) @@ -793,8 +834,8 @@ def _separator(self): def _get_breadcrumbs(self, path): """ - Returns a list of tuples with each tuple containing the folder and - the tree up to that folder when traversing down the `path` + Returns a list of tuples with each tuple containing the folder and + the tree up to that folder when traversing down the `path` """ accumulator = [] breadcrumbs = [] @@ -803,20 +844,20 @@ def _get_breadcrumbs(self, path): breadcrumbs.append((n, self._separator.join(accumulator))) return breadcrumbs - @expose('/old_index') - @expose('/old_b/<path:path>') + @expose("/old_index") + @expose("/old_b/<path:path>") def index(self, path=None): - warnings.warn('deprecated: use index_view instead.', DeprecationWarning) - return redirect(self.get_url('.index_view', path=path)) + warnings.warn("deprecated: use index_view instead.", DeprecationWarning) + return redirect(self.get_url(".index_view", path=path)) - @expose('/') - @expose('/b/<path:path>') + @expose("/") + @expose("/b/<path:path>") def index_view(self, path=None): """ - Index view method + Index view method - :param path: - Optional directory path. If not provided, will use the base directory + :param path: + Optional directory path. If not provided, will use the base directory """ if self.can_delete: delete_form = self.delete_form() @@ -826,27 +867,29 @@ def index_view(self, path=None): # Get path and verify if it is valid base_path, directory, path = self._normalize_path(path) if not self.is_accessible_path(path): - flash(gettext('Permission denied.'), 'error') - return redirect(self._get_dir_url('.index_view')) + flash(gettext("Permission denied."), "error") + return redirect(self._get_dir_url(".index_view")) # Get directory listing items = [] # Parent directory if directory != base_path: - parent_path = op.normpath(self._separator.join([path, '..'])) - if parent_path == '.': + parent_path = op.normpath(self._separator.join([path, ".."])) + if parent_path == ".": parent_path = None - items.append(('..', parent_path, True, 0, 0)) + items.append(("..", parent_path, True, 0, 0)) for item in self.storage.get_files(path, directory): file_name, rel_path, is_dir, size, last_modified = item if self.is_accessible_path(rel_path): items.append(item) - sort_column = request.args.get('sort', None, type=str) or self.default_sort_column - sort_desc = request.args.get('desc', 0, type=int) or self.default_desc + sort_column = ( + request.args.get("sort", None, type=str) or self.default_sort_column + ) + sort_desc = request.args.get("desc", 0, type=int) or self.default_desc if sort_column is None: if self.default_sort_column: @@ -866,7 +909,10 @@ def index_view(self, path=None): items.sort(key=itemgetter(2), reverse=True) if not self._on_windows: # Sort by modified date - items.sort(key=lambda x: (x[0], x[1], x[2], x[3], utc_fromtimestamp(x[4])), reverse=True) + items.sort( + key=lambda x: (x[0], x[1], x[2], x[3], utc_fromtimestamp(x[4])), + reverse=True, + ) else: items.sort(key=itemgetter(column_index), reverse=sort_desc) @@ -889,69 +935,79 @@ def sort_url(column, path, invert=False): if invert and not sort_desc: desc = 1 - return self.get_url('.index_view', path=path, sort=column, desc=desc) - - return self.render(self.list_template, - dir_path=path, - breadcrumbs=breadcrumbs, - get_dir_url=self._get_dir_url, - get_file_url=self._get_file_url, - items=items, - actions=actions, - actions_confirmation=actions_confirmation, - action_form=action_form, - delete_form=delete_form, - sort_column=sort_column, - sort_desc=sort_desc, - sort_url=sort_url, - timestamp_format=self.timestamp_format) - - @expose('/upload/', methods=('GET', 'POST')) - @expose('/upload/<path:path>', methods=('GET', 'POST')) + return self.get_url(".index_view", path=path, sort=column, desc=desc) + + return self.render( + self.list_template, + dir_path=path, + breadcrumbs=breadcrumbs, + get_dir_url=self._get_dir_url, + get_file_url=self._get_file_url, + items=items, + actions=actions, + actions_confirmation=actions_confirmation, + action_form=action_form, + delete_form=delete_form, + sort_column=sort_column, + sort_desc=sort_desc, + sort_url=sort_url, + timestamp_format=self.timestamp_format, + ) + + @expose("/upload/", methods=("GET", "POST")) + @expose("/upload/<path:path>", methods=("GET", "POST")) def upload(self, path=None): """ - Upload view method + Upload view method - :param path: - Optional directory path. If not provided, will use the base directory + :param path: + Optional directory path. If not provided, will use the base directory """ # Get path and verify if it is valid base_path, directory, path = self._normalize_path(path) if not self.can_upload: - flash(gettext('File uploading is disabled.'), 'error') - return redirect(self._get_dir_url('.index_view', path)) + flash(gettext("File uploading is disabled."), "error") + return redirect(self._get_dir_url(".index_view", path)) if not self.is_accessible_path(path): - flash(gettext('Permission denied.'), 'error') - return redirect(self._get_dir_url('.index_view')) + flash(gettext("Permission denied."), "error") + return redirect(self._get_dir_url(".index_view")) form = self.upload_form() if self.validate_form(form): try: self._save_form_files(directory, path, form) - flash(gettext('Successfully saved file: %(name)s', - name=form.upload.data.filename), 'success') - return redirect(self._get_dir_url('.index_view', path)) + flash( + gettext( + "Successfully saved file: %(name)s", + name=form.upload.data.filename, + ), + "success", + ) + return redirect(self._get_dir_url(".index_view", path)) except Exception as ex: - flash(gettext('Failed to save file: %(error)s', error=ex), 'error') + flash(gettext("Failed to save file: %(error)s", error=ex), "error") - if self.upload_modal and request.args.get('modal'): + if self.upload_modal and request.args.get("modal"): template = self.upload_modal_template else: template = self.upload_template - return self.render(template, form=form, - header_text=gettext('Upload File'), - modal=request.args.get('modal')) + return self.render( + template, + form=form, + header_text=gettext("Upload File"), + modal=request.args.get("modal"), + ) - @expose('/download/<path:path>') + @expose("/download/<path:path>") def download(self, path=None): """ - Download view method. + Download view method. - :param path: - File path. + :param path: + File path. """ if not self.can_download: abort(404) @@ -961,32 +1017,32 @@ def download(self, path=None): # backward compatibility with base_url base_url = self.get_base_url() if base_url: - base_url = urljoin(self.get_url('.index_view'), base_url) + base_url = urljoin(self.get_url(".index_view"), base_url) return redirect(urljoin(quote(base_url), quote(path))) return self.storage.send_file(directory) - @expose('/mkdir/', methods=('GET', 'POST')) - @expose('/mkdir/<path:path>', methods=('GET', 'POST')) + @expose("/mkdir/", methods=("GET", "POST")) + @expose("/mkdir/<path:path>", methods=("GET", "POST")) def mkdir(self, path=None): """ - Directory creation view method + Directory creation view method - :param path: - Optional directory path. If not provided, will use the base directory + :param path: + Optional directory path. If not provided, will use the base directory """ # Get path and verify if it is valid base_path, directory, path = self._normalize_path(path) - dir_url = self._get_dir_url('.index_view', path) + dir_url = self._get_dir_url(".index_view", path) if not self.can_mkdir: - flash(gettext('Directory creation is disabled.'), 'error') + flash(gettext("Directory creation is disabled."), "error") return redirect(dir_url) if not self.is_accessible_path(path): - flash(gettext('Permission denied.'), 'error') - return redirect(self._get_dir_url('.index_view')) + flash(gettext("Permission denied."), "error") + return redirect(self._get_dir_url(".index_view")) form = self.name_form() @@ -994,81 +1050,103 @@ def mkdir(self, path=None): try: self.storage.make_dir(directory, form.name.data) self.on_mkdir(directory, form.name.data) - flash(gettext('Successfully created directory: %(directory)s', - directory=form.name.data), 'success') + flash( + gettext( + "Successfully created directory: %(directory)s", + directory=form.name.data, + ), + "success", + ) return redirect(dir_url) except Exception as ex: - flash(gettext('Failed to create directory: %(error)s', error=ex), 'error') + flash( + gettext("Failed to create directory: %(error)s", error=ex), "error" + ) else: - helpers.flash_errors(form, message='Failed to create directory: %(error)s') + helpers.flash_errors(form, message="Failed to create directory: %(error)s") - if self.mkdir_modal and request.args.get('modal'): + if self.mkdir_modal and request.args.get("modal"): template = self.mkdir_modal_template else: template = self.mkdir_template - return self.render(template, form=form, dir_url=dir_url, - header_text=gettext('Create Directory')) + return self.render( + template, + form=form, + dir_url=dir_url, + header_text=gettext("Create Directory"), + ) def delete_file(self, file_path): """ - Deletes the file located at `file_path` + Deletes the file located at `file_path` """ self.storage.delete_file(file_path) - @expose('/delete/', methods=('POST',)) + @expose("/delete/", methods=("POST",)) def delete(self): """ - Delete view method + Delete view method """ form = self.delete_form() path = form.path.data if path: - return_url = self._get_dir_url('.index_view', op.dirname(path)) + return_url = self._get_dir_url(".index_view", op.dirname(path)) else: - return_url = self.get_url('.index_view') + return_url = self.get_url(".index_view") if self.validate_form(form): # Get path and verify if it is valid base_path, full_path, path = self._normalize_path(path) if not self.can_delete: - flash(gettext('Deletion is disabled.'), 'error') + flash(gettext("Deletion is disabled."), "error") return redirect(return_url) if not self.is_accessible_path(path): - flash(gettext('Permission denied.'), 'error') - return redirect(self._get_dir_url('.index_view')) + flash(gettext("Permission denied."), "error") + return redirect(self._get_dir_url(".index_view")) if self.storage.is_dir(full_path): if not self.can_delete_dirs: - flash(gettext('Directory deletion is disabled.'), 'error') + flash(gettext("Directory deletion is disabled."), "error") return redirect(return_url) try: self.before_directory_delete(full_path, path) self.storage.delete_tree(full_path) self.on_directory_delete(full_path, path) - flash(gettext('Directory "%(path)s" was successfully deleted.', path=path), 'success') + flash( + gettext( + 'Directory "%(path)s" was successfully deleted.', path=path + ), + "success", + ) except Exception as ex: - flash(gettext('Failed to delete directory: %(error)s', error=ex), 'error') + flash( + gettext("Failed to delete directory: %(error)s", error=ex), + "error", + ) else: try: self.before_file_delete(full_path, path) self.delete_file(full_path) self.on_file_delete(full_path, path) - flash(gettext('File "%(name)s" was successfully deleted.', name=path), 'success') + flash( + gettext('File "%(name)s" was successfully deleted.', name=path), + "success", + ) except Exception as ex: - flash(gettext('Failed to delete file: %(name)s', name=ex), 'error') + flash(gettext("Failed to delete file: %(name)s", name=ex), "error") else: - helpers.flash_errors(form, message='Failed to delete file. %(error)s') + helpers.flash_errors(form, message="Failed to delete file. %(error)s") return redirect(return_url) - @expose('/rename/', methods=('GET', 'POST')) + @expose("/rename/", methods=("GET", "POST")) def rename(self): """ - Rename view method + Rename view method """ form = self.name_form() @@ -1076,107 +1154,131 @@ def rename(self): if path: base_path, full_path, path = self._normalize_path(path) - return_url = self._get_dir_url('.index_view', op.dirname(path)) + return_url = self._get_dir_url(".index_view", op.dirname(path)) else: - return redirect(self.get_url('.index_view')) + return redirect(self.get_url(".index_view")) if not self.can_rename: - flash(gettext('Renaming is disabled.'), 'error') + flash(gettext("Renaming is disabled."), "error") return redirect(return_url) if not self.is_accessible_path(path): - flash(gettext('Permission denied.'), 'error') - return redirect(self._get_dir_url('.index_view')) + flash(gettext("Permission denied."), "error") + return redirect(self._get_dir_url(".index_view")) if not self.storage.path_exists(full_path): - flash(gettext('Path does not exist.'), 'error') + flash(gettext("Path does not exist."), "error") return redirect(return_url) if self.validate_form(form): try: dir_base = op.dirname(full_path) filename = secure_filename(form.name.data) - self.storage.rename_path(full_path, self._separator.join([dir_base, filename])) + self.storage.rename_path( + full_path, self._separator.join([dir_base, filename]) + ) self.on_rename(full_path, dir_base, filename) - flash(gettext('Successfully renamed "%(src)s" to "%(dst)s"', - src=op.basename(path), - dst=filename), 'success') + flash( + gettext( + 'Successfully renamed "%(src)s" to "%(dst)s"', + src=op.basename(path), + dst=filename, + ), + "success", + ) except Exception as ex: - flash(gettext('Failed to rename: %(error)s', error=ex), 'error') + flash(gettext("Failed to rename: %(error)s", error=ex), "error") return redirect(return_url) else: - helpers.flash_errors(form, message='Failed to rename: %(error)s') + helpers.flash_errors(form, message="Failed to rename: %(error)s") - if self.rename_modal and request.args.get('modal'): + if self.rename_modal and request.args.get("modal"): template = self.rename_modal_template else: template = self.rename_template - return self.render(template, form=form, path=op.dirname(path), - name=op.basename(path), dir_url=return_url, - header_text=gettext('Rename %(name)s', - name=op.basename(path))) + return self.render( + template, + form=form, + path=op.dirname(path), + name=op.basename(path), + dir_url=return_url, + header_text=gettext("Rename %(name)s", name=op.basename(path)), + ) - @expose('/edit/', methods=('GET', 'POST')) + @expose("/edit/", methods=("GET", "POST")) def edit(self): """ - Edit view method + Edit view method """ next_url = None - path = request.args.getlist('path') + path = request.args.getlist("path") if not path: - return redirect(self.get_url('.index_view')) + return redirect(self.get_url(".index_view")) if len(path) > 1: - next_url = self.get_url('.edit', path=path[1:]) + next_url = self.get_url(".edit", path=path[1:]) path = path[0] base_path, full_path, path = self._normalize_path(path) if not self.is_accessible_path(path) or not self.is_file_editable(path): - flash(gettext('Permission denied.'), 'error') - return redirect(self._get_dir_url('.index_view')) + flash(gettext("Permission denied."), "error") + return redirect(self._get_dir_url(".index_view")) - dir_url = self._get_dir_url('.index_view', op.dirname(path)) + dir_url = self._get_dir_url(".index_view", op.dirname(path)) next_url = next_url or dir_url form = self.edit_form() error = False if self.validate_form(form): - form.process(request.form, content='') + form.process(request.form, content="") if form.validate(): try: - self.storage.write_file(full_path, request.form['content']) - except IOError: - flash(gettext("Error saving changes to %(name)s.", name=path), 'error') + self.storage.write_file(full_path, request.form["content"]) + except OSError: + flash( + gettext("Error saving changes to %(name)s.", name=path), "error" + ) error = True else: self.on_edit_file(full_path, path) - flash(gettext("Changes to %(name)s saved successfully.", name=path), 'success') + flash( + gettext("Changes to %(name)s saved successfully.", name=path), + "success", + ) return redirect(next_url) else: - helpers.flash_errors(form, message='Failed to edit file. %(error)s') + helpers.flash_errors(form, message="Failed to edit file. %(error)s") try: content = self.storage.read_file(full_path) - except IOError: - flash(gettext("Error reading %(name)s.", name=path), 'error') + except OSError: + flash(gettext("Error reading %(name)s.", name=path), "error") error = True except: - flash(gettext("Unexpected error while reading from %(name)s", name=path), 'error') + flash( + gettext("Unexpected error while reading from %(name)s", name=path), + "error", + ) error = True else: try: - content = content.decode('utf8') + content = content.decode("utf8") except UnicodeDecodeError: - flash(gettext("Cannot edit %(name)s.", name=path), 'error') + flash(gettext("Cannot edit %(name)s.", name=path), "error") error = True except: - flash(gettext("Unexpected error while reading from %(name)s", name=path), 'error') + flash( + gettext( + "Unexpected error while reading from %(name)s", name=path + ), + "error", + ) error = True else: form.content.data = content @@ -1184,26 +1286,33 @@ def edit(self): if error: return redirect(next_url) - if self.edit_modal and request.args.get('modal'): + if self.edit_modal and request.args.get("modal"): template = self.edit_modal_template else: template = self.edit_template - return self.render(template, dir_url=dir_url, path=path, - form=form, error=error, - header_text=gettext('Editing %(path)s', path=path)) + return self.render( + template, + dir_url=dir_url, + path=path, + form=form, + error=error, + header_text=gettext("Editing %(path)s", path=path), + ) - @expose('/action/', methods=('POST',)) + @expose("/action/", methods=("POST",)) def action_view(self): return self.handle_action() # Actions - @action('delete', - lazy_gettext('Delete'), - lazy_gettext('Are you sure you want to delete these files?')) + @action( + "delete", + lazy_gettext("Delete"), + lazy_gettext("Are you sure you want to delete these files?"), + ) def action_delete(self, items): if not self.can_delete: - flash(gettext('File deletion is disabled.'), 'error') + flash(gettext("File deletion is disabled."), "error") return for path in items: @@ -1212,37 +1321,40 @@ def action_delete(self, items): if self.is_accessible_path(path): try: self.delete_file(full_path) - flash(gettext('File "%(name)s" was successfully deleted.', name=path), 'success') + flash( + gettext('File "%(name)s" was successfully deleted.', name=path), + "success", + ) except Exception as ex: - flash(gettext('Failed to delete file: %(name)s', name=ex), 'error') + flash(gettext("Failed to delete file: %(name)s", name=ex), "error") - @action('edit', lazy_gettext('Edit')) + @action("edit", lazy_gettext("Edit")) def action_edit(self, items): - return redirect(self.get_url('.edit', path=items)) + return redirect(self.get_url(".edit", path=items)) class FileAdmin(BaseFileAdmin): """ - Simple file-management interface. + Simple file-management interface. - :param base_path: - Path to the directory which will be managed - :param base_url: - Optional base URL for the directory. Will be used to generate - static links to the files. If not defined, a route will be created - to serve uploaded files. + :param base_path: + Path to the directory which will be managed + :param base_url: + Optional base URL for the directory. Will be used to generate + static links to the files. If not defined, a route will be created + to serve uploaded files. - Sample usage:: + Sample usage:: - import os.path as op + import os.path as op - from flask_admin import Admin - from flask_admin.contrib.fileadmin import FileAdmin + from flask_admin import Admin + from flask_admin.contrib.fileadmin import FileAdmin - admin = Admin() + admin = Admin() - path = op.join(op.dirname(__file__), 'static') - admin.add_view(FileAdmin(path, '/static/', name='Static Files')) + path = op.join(op.dirname(__file__), 'static') + admin.add_view(FileAdmin(path, '/static/', name='Static Files')) """ def __init__(self, base_path, *args, **kwargs): diff --git a/flask_admin/contrib/fileadmin/azure.py b/flask_admin/contrib/fileadmin/azure.py index e0e0e291f..88a7cef16 100644 --- a/flask_admin/contrib/fileadmin/azure.py +++ b/flask_admin/contrib/fileadmin/azure.py @@ -1,8 +1,7 @@ -from __future__ import absolute_import +import os.path as op from datetime import datetime from datetime import timedelta from time import sleep -import os.path as op try: from azure.storage.blob import BlobPermissions @@ -15,44 +14,45 @@ from . import BaseFileAdmin -class AzureStorage(object): +class AzureStorage: """ - Storage object representing files on an Azure Storage container. + Storage object representing files on an Azure Storage container. - Usage:: + Usage:: - from flask_admin.contrib.fileadmin import BaseFileAdmin - from flask_admin.contrib.fileadmin.azure import AzureStorage + from flask_admin.contrib.fileadmin import BaseFileAdmin + from flask_admin.contrib.fileadmin.azure import AzureStorage - class MyAzureAdmin(BaseFileAdmin): - # Configure your class however you like - pass + class MyAzureAdmin(BaseFileAdmin): + # Configure your class however you like + pass - fileadmin_view = MyAzureAdmin(storage=AzureStorage(...)) + fileadmin_view = MyAzureAdmin(storage=AzureStorage(...)) """ - _fakedir = '.dir' + + _fakedir = ".dir" _copy_poll_interval_seconds = 1 _send_file_lookback = timedelta(minutes=15) _send_file_validity = timedelta(hours=1) - separator = '/' + separator = "/" def __init__(self, container_name, connection_string): """ - Constructor + Constructor - :param container_name: - Name of the container that the files are on. + :param container_name: + Name of the container that the files are on. - :param connection_string: - Azure Blob Storage Connection String + :param connection_string: + Azure Blob Storage Connection String """ if not BlockBlobService: raise ValueError( - 'Could not import `azure.storage.blob`. ' - 'Enable `azure-blob-storage` integration ' - 'by installing `flask-admin[azure-blob-storage]`' + "Could not import `azure.storage.blob`. " + "Enable `azure-blob-storage` integration " + "by installing `flask-admin[azure-blob-storage]`" ) self._container_name = container_name @@ -62,10 +62,8 @@ def __init__(self, container_name, connection_string): @property def _client(self): if not self.__client: - self.__client = BlockBlobService( - connection_string=self._connection_string) - self.__client.create_container( - self._container_name, fail_on_exist=False) + self.__client = BlockBlobService(connection_string=self._connection_string) + self.__client.create_container(self._container_name, fail_on_exist=False) return self.__client @classmethod @@ -109,7 +107,7 @@ def get_files(self, path, directory): last_modified = self._get_blob_last_modified(blob) files.append((name, rel_path, is_dir, size, last_modified)) else: - next_level_folder = blob_path_parts[:num_path_parts + 1] + next_level_folder = blob_path_parts[: num_path_parts + 1] folder_name = self.separator.join(next_level_folder) folders.add(folder_name) @@ -155,7 +153,7 @@ def path_exists(self, path): return True def get_base_path(self): - return '' + return "" def get_breadcrumbs(self, path): path = self._ensure_blob_path(path) @@ -176,11 +174,13 @@ def send_file(self, file_path): now = datetime.utcnow() url = self._client.make_blob_url(self._container_name, file_path) sas = self._client.generate_blob_shared_access_signature( - self._container_name, file_path, + self._container_name, + file_path, BlobPermissions.READ, expiry=now + self._send_file_validity, - start=now - self._send_file_lookback) - return redirect('%s?%s' % (url, sas)) + start=now - self._send_file_lookback, + ) + return redirect("%s?%s" % (url, sas)) def read_file(self, path): path = self._ensure_blob_path(path) @@ -196,8 +196,9 @@ def write_file(self, path, content): def save_file(self, path, file_data): path = self._ensure_blob_path(path) - self._client.create_blob_from_stream(self._container_name, path, - file_data.stream) + self._client.create_blob_from_stream( + self._container_name, path, file_data.stream + ) def delete_tree(self, directory): directory = self._ensure_blob_path(directory) @@ -216,15 +217,16 @@ def make_dir(self, path, directory): blob = self.separator.join([path, directory, self._fakedir]) blob = blob.lstrip(self.separator) - self._client.create_blob_from_text(self._container_name, blob, '') + self._client.create_blob_from_text(self._container_name, blob, "") def _copy_blob(self, src, dst): src_url = self._client.make_blob_url(self._container_name, src) copy = self._client.copy_blob(self._container_name, dst, src_url) - while copy.status != 'success': + while copy.status != "success": sleep(self._copy_poll_interval_seconds) copy = self._client.get_blob_properties( - self._container_name, dst).properties.copy + self._container_name, dst + ).properties.copy def _rename_file(self, src, dst): self._copy_blob(src, dst) @@ -246,22 +248,22 @@ def rename_path(self, src, dst): class AzureFileAdmin(BaseFileAdmin): """ - Simple Azure Blob Storage file-management interface. + Simple Azure Blob Storage file-management interface. - :param container_name: - Name of the container that the files are on. + :param container_name: + Name of the container that the files are on. - :param connection_string: - Azure Blob Storage Connection String + :param connection_string: + Azure Blob Storage Connection String - Sample usage:: + Sample usage:: - from flask_admin import Admin - from flask_admin.contrib.fileadmin.azure import AzureFileAdmin + from flask_admin import Admin + from flask_admin.contrib.fileadmin.azure import AzureFileAdmin - admin = Admin() + admin = Admin() - admin.add_view(AzureFileAdmin('files_container', 'my-connection-string') + admin.add_view(AzureFileAdmin('files_container', 'my-connection-string') """ def __init__(self, container_name, connection_string, *args, **kwargs): diff --git a/flask_admin/contrib/fileadmin/s3.py b/flask_admin/contrib/fileadmin/s3.py index 3843aa757..ebc3292fa 100644 --- a/flask_admin/contrib/fileadmin/s3.py +++ b/flask_admin/contrib/fileadmin/s3.py @@ -6,59 +6,59 @@ try: from boto import s3 - from boto.s3.prefix import Prefix from boto.s3.key import Key + from boto.s3.prefix import Prefix except ImportError: s3 = None from flask import redirect + from flask_admin.babel import gettext from . import BaseFileAdmin -class S3Storage(object): +class S3Storage: """ - Storage object representing files on an Amazon S3 bucket. + Storage object representing files on an Amazon S3 bucket. - Usage:: + Usage:: - from flask_admin.contrib.fileadmin import BaseFileAdmin - from flask_admin.contrib.fileadmin.s3 import S3Storage + from flask_admin.contrib.fileadmin import BaseFileAdmin + from flask_admin.contrib.fileadmin.s3 import S3Storage - class MyS3Admin(BaseFileAdmin): - # Configure your class however you like - pass + class MyS3Admin(BaseFileAdmin): + # Configure your class however you like + pass - fileadmin_view = MyS3Admin(storage=S3Storage(...)) + fileadmin_view = MyS3Admin(storage=S3Storage(...)) """ - def __init__(self, bucket_name, region, aws_access_key_id, - aws_secret_access_key): + def __init__(self, bucket_name, region, aws_access_key_id, aws_secret_access_key): """ - Constructor + Constructor - :param bucket_name: - Name of the bucket that the files are on. + :param bucket_name: + Name of the bucket that the files are on. - :param region: - Region that the bucket is located + :param region: + Region that the bucket is located - :param aws_access_key_id: - AWS Access Key ID + :param aws_access_key_id: + AWS Access Key ID - :param aws_secret_access_key: - AWS Secret Access Key + :param aws_secret_access_key: + AWS Secret Access Key - Make sure the credentials have the correct permissions set up on - Amazon or else S3 will return a 403 FORBIDDEN error. + Make sure the credentials have the correct permissions set up on + Amazon or else S3 will return a 403 FORBIDDEN error. """ if not s3: raise ValueError( - 'Could not import `boto`. ' - 'Enable `s3` integration by installing `flask-admin[s3]`' + "Could not import `boto`. " + "Enable `s3` integration by installing `flask-admin[s3]`" ) connection = s3.connect_to_region( @@ -67,12 +67,12 @@ def __init__(self, bucket_name, region, aws_access_key_id, aws_secret_access_key=aws_secret_access_key, ) self.bucket = connection.get_bucket(bucket_name) - self.separator = '/' + self.separator = "/" def get_files(self, path, directory): def _strip_path(name, path): if name.startswith(path): - return name.replace(path, '', 1) + return name.replace(path, "", 1) return name def _remove_trailing_slash(name): @@ -102,7 +102,7 @@ def _iso_to_epoch(timestamp): def _get_bucket_list_prefix(self, path): parts = path.split(self.separator) if len(parts) == 1: - search = '' + search = "" else: search = self.separator.join(parts[:-1]) + self.separator return search @@ -116,13 +116,13 @@ def is_dir(self, path): return path + self.separator in keys def path_exists(self, path): - if path == '': + if path == "": return True keys = self._get_path_keys(path) return path in keys or (path + self.separator) in keys def get_base_path(self): - return '' + return "" def get_breadcrumbs(self, path): accumulator = [] @@ -141,7 +141,7 @@ def send_file(self, file_path): def save_file(self, path, file_data): key = Key(self.bucket, path) headers = { - 'Content-Type': file_data.content_type, + "Content-Type": file_data.content_type, } key.set_contents_from_file(file_data.stream, headers=headers) @@ -155,12 +155,11 @@ def delete_file(self, file_path): def make_dir(self, path, directory): dir_path = self.separator.join([path, (directory + self.separator)]) key = Key(self.bucket, dir_path) - key.set_contents_from_string('') + key.set_contents_from_string("") def _check_empty_directory(self, path): if not self._is_directory_empty(path): - raise ValueError(gettext('Cannot operate on non empty ' - 'directories')) + raise ValueError(gettext("Cannot operate on non empty " "directories")) return True def rename_path(self, src, dst): @@ -186,32 +185,40 @@ def write_file(self, path, content): class S3FileAdmin(BaseFileAdmin): """ - Simple Amazon Simple Storage Service file-management interface. + Simple Amazon Simple Storage Service file-management interface. - :param bucket_name: - Name of the bucket that the files are on. + :param bucket_name: + Name of the bucket that the files are on. - :param region: - Region that the bucket is located + :param region: + Region that the bucket is located - :param aws_access_key_id: - AWS Access Key ID + :param aws_access_key_id: + AWS Access Key ID - :param aws_secret_access_key: - AWS Secret Access Key + :param aws_secret_access_key: + AWS Secret Access Key - Sample usage:: + Sample usage:: - from flask_admin import Admin - from flask_admin.contrib.fileadmin.s3 import S3FileAdmin + from flask_admin import Admin + from flask_admin.contrib.fileadmin.s3 import S3FileAdmin - admin = Admin() + admin = Admin() - admin.add_view(S3FileAdmin('files_bucket', 'us-east-1', 'key_id', 'secret_key') + admin.add_view(S3FileAdmin('files_bucket', 'us-east-1', 'key_id', 'secret_key') """ - def __init__(self, bucket_name, region, aws_access_key_id, - aws_secret_access_key, *args, **kwargs): - storage = S3Storage(bucket_name, region, aws_access_key_id, - aws_secret_access_key) + def __init__( + self, + bucket_name, + region, + aws_access_key_id, + aws_secret_access_key, + *args, + **kwargs, + ): + storage = S3Storage( + bucket_name, region, aws_access_key_id, aws_secret_access_key + ) super(S3FileAdmin, self).__init__(*args, storage=storage, **kwargs) diff --git a/flask_admin/contrib/geoa/__init__.py b/flask_admin/contrib/geoa/__init__.py index 0c74a64c3..39797f7ea 100644 --- a/flask_admin/contrib/geoa/__init__.py +++ b/flask_admin/contrib/geoa/__init__.py @@ -4,8 +4,8 @@ import shapely except ImportError: raise Exception( - 'Could not import `geoalchemy2` or `shapely`. ' - 'Enable `geoalchemy` integration by installing `flask-admin[geoalchemy]`' + "Could not import `geoalchemy2` or `shapely`. " + "Enable `geoalchemy` integration by installing `flask-admin[geoalchemy]`" ) from .view import ModelView diff --git a/flask_admin/contrib/geoa/fields.py b/flask_admin/contrib/geoa/fields.py index 0e9a30371..99b55d88d 100644 --- a/flask_admin/contrib/geoa/fields.py +++ b/flask_admin/contrib/geoa/fields.py @@ -8,13 +8,19 @@ class GeoJSONField(JSONField): - - def __init__(self, label=None, validators=None, geometry_type="GEOMETRY", - srid='-1', session=None, tile_layer_url=None, - tile_layer_attribution=None, **kwargs): + def __init__( + self, + label=None, + validators=None, + geometry_type="GEOMETRY", + srid="-1", + session=None, + tile_layer_url=None, + tile_layer_attribution=None, + **kwargs, + ): self.widget = LeafletWidget( - tile_layer_url=tile_layer_url, - tile_layer_attribution=tile_layer_attribution + tile_layer_url=tile_layer_url, tile_layer_attribution=tile_layer_attribution ) super(GeoJSONField, self).__init__(label, validators, **kwargs) self.web_srid = 4326 @@ -34,27 +40,22 @@ def _value(self): return self.session.scalar(func.ST_AsGeoJSON(self.data)) else: return self.session.scalar( - func.ST_AsGeoJSON( - func.ST_Transform(self.data, self.web_srid) - ) + func.ST_AsGeoJSON(func.ST_Transform(self.data, self.web_srid)) ) else: - return '' + return "" def process_formdata(self, valuelist): super(GeoJSONField, self).process_formdata(valuelist) - if str(self.data) == '': + if str(self.data) == "": self.data = None if self.data is not None: web_shape = self.session.scalar( func.ST_AsText( func.ST_Transform( - func.ST_GeomFromText( - shape(self.data).wkt, - self.web_srid - ), - self.transform_srid + func.ST_GeomFromText(shape(self.data).wkt, self.web_srid), + self.transform_srid, ) ) ) - self.data = 'SRID=' + str(self.srid) + ';' + str(web_shape) + self.data = "SRID=" + str(self.srid) + ";" + str(web_shape) diff --git a/flask_admin/contrib/geoa/form.py b/flask_admin/contrib/geoa/form.py index 4cec1f5dc..641f7216c 100644 --- a/flask_admin/contrib/geoa/form.py +++ b/flask_admin/contrib/geoa/form.py @@ -1,14 +1,15 @@ -from flask_admin.model.form import converts from flask_admin.contrib.sqla.form import AdminModelConverter as SQLAAdminConverter +from flask_admin.model.form import converts + from .fields import GeoJSONField class AdminModelConverter(SQLAAdminConverter): - @converts('Geography', 'Geometry') + @converts("Geography", "Geometry") def convert_geom(self, column, field_args, **extra): - field_args['geometry_type'] = column.type.geometry_type - field_args['srid'] = column.type.srid - field_args['session'] = self.session - field_args['tile_layer_url'] = self.view.tile_layer_url - field_args['tile_layer_attribution'] = self.view.tile_layer_attribution + field_args["geometry_type"] = column.type.geometry_type + field_args["srid"] = column.type.srid + field_args["session"] = self.session + field_args["tile_layer_url"] = self.view.tile_layer_url + field_args["tile_layer_attribution"] = self.view.tile_layer_attribution return GeoJSONField(**field_args) diff --git a/flask_admin/contrib/geoa/typefmt.py b/flask_admin/contrib/geoa/typefmt.py index e11314808..8346c33c0 100644 --- a/flask_admin/contrib/geoa/typefmt.py +++ b/flask_admin/contrib/geoa/typefmt.py @@ -1,9 +1,10 @@ -from flask_admin.contrib.sqla.typefmt import DEFAULT_FORMATTERS as BASE_FORMATTERS -from markupsafe import Markup -from wtforms.widgets import html_params -from geoalchemy2.shape import to_shape from geoalchemy2.elements import WKBElement +from geoalchemy2.shape import to_shape +from markupsafe import Markup from sqlalchemy import func +from wtforms.widgets import html_params + +from flask_admin.contrib.sqla.typefmt import DEFAULT_FORMATTERS as BASE_FORMATTERS def geom_formatter(view, value, name) -> str: @@ -28,8 +29,10 @@ def geom_formatter(view, value, name) -> str: if value.srid == -1: value.srid = 4326 - geojson = view.session.query(view.model).with_entities(func.ST_AsGeoJSON(value)).scalar() - return Markup('<textarea %s>%s</textarea>' % (params, geojson)) + geojson = ( + view.session.query(view.model).with_entities(func.ST_AsGeoJSON(value)).scalar() + ) + return Markup("<textarea %s>%s</textarea>" % (params, geojson)) DEFAULT_FORMATTERS = BASE_FORMATTERS.copy() diff --git a/flask_admin/contrib/geoa/view.py b/flask_admin/contrib/geoa/view.py index d10c7b401..fc6d9ccbb 100644 --- a/flask_admin/contrib/geoa/view.py +++ b/flask_admin/contrib/geoa/view.py @@ -1,5 +1,6 @@ +from flask_admin.contrib.geoa import form +from flask_admin.contrib.geoa import typefmt from flask_admin.contrib.sqla import ModelView as SQLAModelView -from flask_admin.contrib.geoa import form, typefmt class ModelView(SQLAModelView): diff --git a/flask_admin/contrib/geoa/widgets.py b/flask_admin/contrib/geoa/widgets.py index 896c2b607..04ec8f3b4 100644 --- a/flask_admin/contrib/geoa/widgets.py +++ b/flask_admin/contrib/geoa/widgets.py @@ -10,7 +10,7 @@ def lng(pt): class LeafletWidget(TextArea): - data_role = 'leaflet' + data_role = "leaflet" """ `Leaflet <https://leafletjs.com>`_ styled map widget. Inherits from @@ -21,10 +21,19 @@ class LeafletWidget(TextArea): work. You also need leaflet.draw.js (and its stylesheet) for it to be editable. """ + def __init__( - self, width='auto', height=350, center=None, - zoom=None, min_zoom=None, max_zoom=None, max_bounds=None, - tile_layer_url=None, tile_layer_attribution=None): + self, + width="auto", + height=350, + center=None, + zoom=None, + min_zoom=None, + max_zoom=None, + max_bounds=None, + tile_layer_url=None, + tile_layer_attribution=None, + ): self.width = width self.height = height self.center = center @@ -36,15 +45,15 @@ def __init__( self.tile_layer_attribution = tile_layer_attribution def __call__(self, field, **kwargs): - kwargs.setdefault('data-role', self.data_role) + kwargs.setdefault("data-role", self.data_role) gtype = getattr(field, "geometry_type", "GEOMETRY") - kwargs.setdefault('data-geometry-type', gtype) + kwargs.setdefault("data-geometry-type", gtype) # set optional values from constructor if self.tile_layer_url: - kwargs['data-tile-layer-url'] = self.tile_layer_url + kwargs["data-tile-layer-url"] = self.tile_layer_url if self.tile_layer_attribution: - kwargs['data-tile-layer-attribution'] = self.tile_layer_attribution + kwargs["data-tile-layer-attribution"] = self.tile_layer_attribution if "data-width" not in kwargs: kwargs["data-width"] = self.width if "data-height" not in kwargs: @@ -59,7 +68,7 @@ def __call__(self, field, **kwargs): if self.max_zoom: kwargs["data-max-zoom"] = self.max_zoom if self.max_bounds: - if getattr(self.max_bounds, "bounds"): + if self.max_bounds.bounds: # this is a Shapely geometric object minx, miny, maxx, maxy = self.max_bounds.bounds elif len(self.max_bounds) == 4: diff --git a/flask_admin/contrib/peewee/__init__.py b/flask_admin/contrib/peewee/__init__.py index d3f30fc39..d2996f32f 100644 --- a/flask_admin/contrib/peewee/__init__.py +++ b/flask_admin/contrib/peewee/__init__.py @@ -4,8 +4,8 @@ import wtfpeewee except ImportError: raise Exception( - 'Could not import `peewee` or `wtfpeewee`. ' - 'Enable `peewee` integration by installing `flask-admin[peewee]`' + "Could not import `peewee` or `wtfpeewee`. " + "Enable `peewee` integration by installing `flask-admin[peewee]`" ) from .view import ModelView diff --git a/flask_admin/contrib/peewee/ajax.py b/flask_admin/contrib/peewee/ajax.py index 99d8842db..61a5f4952 100644 --- a/flask_admin/contrib/peewee/ajax.py +++ b/flask_admin/contrib/peewee/ajax.py @@ -1,5 +1,7 @@ -from flask_admin._compat import as_unicode, string_types -from flask_admin.model.ajax import AjaxModelLoader, DEFAULT_PAGE_SIZE +from flask_admin._compat import as_unicode +from flask_admin._compat import string_types +from flask_admin.model.ajax import AjaxModelLoader +from flask_admin.model.ajax import DEFAULT_PAGE_SIZE from .tools import get_primary_key @@ -7,18 +9,21 @@ class QueryAjaxModelLoader(AjaxModelLoader): def __init__(self, name, model, **options): """ - Constructor. + Constructor. - :param fields: - Fields to run query against + :param fields: + Fields to run query against """ super(QueryAjaxModelLoader, self).__init__(name, options) self.model = model - self.fields = options.get('fields') + self.fields = options.get("fields") if not self.fields: - raise ValueError('AJAX loading requires `fields` to be specified for %s.%s' % (model, self.name)) + raise ValueError( + "AJAX loading requires `fields` to be specified for %s.%s" + % (model, self.name) + ) self._cached_fields = self._process_fields() @@ -32,7 +37,7 @@ def _process_fields(self): attr = getattr(self.model, field, None) if not attr: - raise ValueError('%s.%s does not exist.' % (self.model, field)) + raise ValueError("%s.%s does not exist." % (self.model, field)) remote_fields.append(attr) else: @@ -55,7 +60,7 @@ def get_list(self, term, offset=0, limit=DEFAULT_PAGE_SIZE): if len(term) > 0: stmt = None for field in self._cached_fields: - q = field ** (u'%%%s%%' % term) + q = field ** ("%%%s%%" % term) if stmt is None: stmt = q @@ -74,7 +79,7 @@ def create_ajax_loader(model, name, field_name, options): prop = getattr(model, field_name, None) if prop is None: - raise ValueError('Model %s does not have field %s.' % (model, field_name)) + raise ValueError("Model %s does not have field %s." % (model, field_name)) # TODO: Check for field remote_model = prop.rel_model diff --git a/flask_admin/contrib/peewee/filters.py b/flask_admin/contrib/peewee/filters.py index c4d679b0d..1db9cae32 100644 --- a/flask_admin/contrib/peewee/filters.py +++ b/flask_admin/contrib/peewee/filters.py @@ -1,25 +1,26 @@ from flask_admin.babel import lazy_gettext - from flask_admin.model import filters + from .tools import parse_like_term class BasePeeweeFilter(filters.BaseFilter): """ - Base Peewee filter. + Base Peewee filter. """ + def __init__(self, column, name, options=None, data_type=None): """ - Constructor. - - :param column: - Model field - :param name: - Display name - :param options: - Fixed set of options - :param data_type: - Client data type + Constructor. + + :param column: + Model field + :param name: + Display name + :param options: + Fixed set of options + :param data_type: + Client data type """ super(BasePeeweeFilter, self).__init__(name, options, data_type) @@ -32,7 +33,7 @@ def apply(self, query, value): return query.filter(self.column == value) def operation(self): - return lazy_gettext('equals') + return lazy_gettext("equals") class FilterNotEqual(BasePeeweeFilter): @@ -40,25 +41,25 @@ def apply(self, query, value): return query.filter(self.column != value) def operation(self): - return lazy_gettext('not equal') + return lazy_gettext("not equal") class FilterLike(BasePeeweeFilter): def apply(self, query, value): term = parse_like_term(value) - return query.filter(self.column ** term) + return query.filter(self.column**term) def operation(self): - return lazy_gettext('contains') + return lazy_gettext("contains") class FilterNotLike(BasePeeweeFilter): def apply(self, query, value): term = parse_like_term(value) - return query.filter(~(self.column ** term)) + return query.filter(~(self.column**term)) def operation(self): - return lazy_gettext('not contains') + return lazy_gettext("not contains") class FilterGreater(BasePeeweeFilter): @@ -66,7 +67,7 @@ def apply(self, query, value): return query.filter(self.column > value) def operation(self): - return lazy_gettext('greater than') + return lazy_gettext("greater than") class FilterSmaller(BasePeeweeFilter): @@ -74,32 +75,34 @@ def apply(self, query, value): return query.filter(self.column < value) def operation(self): - return lazy_gettext('smaller than') + return lazy_gettext("smaller than") class FilterEmpty(BasePeeweeFilter, filters.BaseBooleanFilter): def apply(self, query, value): - if value == '1': + if value == "1": return query.filter(self.column >> None) else: return query.filter(~(self.column >> None)) def operation(self): - return lazy_gettext('empty') + return lazy_gettext("empty") class FilterInList(BasePeeweeFilter): def __init__(self, column, name, options=None, data_type=None): - super(FilterInList, self).__init__(column, name, options, data_type='select2-tags') + super(FilterInList, self).__init__( + column, name, options, data_type="select2-tags" + ) def clean(self, value): - return [v.strip() for v in value.split(',') if v.strip()] + return [v.strip() for v in value.split(",") if v.strip()] def apply(self, query, value): return query.filter(self.column << (value or [None])) def operation(self): - return lazy_gettext('in list') + return lazy_gettext("in list") class FilterNotInList(FilterInList): @@ -108,7 +111,7 @@ def apply(self, query, value): return query.filter(~(self.column << (value or [None])) | (self.column >> None)) def operation(self): - return lazy_gettext('not in list') + return lazy_gettext("not in list") # Customized type filters @@ -188,10 +191,9 @@ class DateSmallerFilter(FilterSmaller, filters.BaseDateFilter): class DateBetweenFilter(BasePeeweeFilter, filters.BaseDateBetweenFilter): def __init__(self, column, name, options=None, data_type=None): - super(DateBetweenFilter, self).__init__(column, - name, - options, - data_type='daterangepicker') + super(DateBetweenFilter, self).__init__( + column, name, options, data_type="daterangepicker" + ) def apply(self, query, value): start, end = value @@ -204,7 +206,7 @@ def apply(self, query, value): return query.filter(~(self.column.between(start, end))) def operation(self): - return lazy_gettext('not between') + return lazy_gettext("not between") class DateTimeEqualFilter(FilterEqual, filters.BaseDateTimeFilter): @@ -225,10 +227,9 @@ class DateTimeSmallerFilter(FilterSmaller, filters.BaseDateTimeFilter): class DateTimeBetweenFilter(BasePeeweeFilter, filters.BaseDateTimeBetweenFilter): def __init__(self, column, name, options=None, data_type=None): - super(DateTimeBetweenFilter, self).__init__(column, - name, - options, - data_type='datetimerangepicker') + super(DateTimeBetweenFilter, self).__init__( + column, name, options, data_type="datetimerangepicker" + ) def apply(self, query, value): start, end = value @@ -241,7 +242,7 @@ def apply(self, query, value): return query.filter(~(self.column.between(start, end))) def operation(self): - return lazy_gettext('not between') + return lazy_gettext("not between") class TimeEqualFilter(FilterEqual, filters.BaseTimeFilter): @@ -262,10 +263,9 @@ class TimeSmallerFilter(FilterSmaller, filters.BaseTimeFilter): class TimeBetweenFilter(BasePeeweeFilter, filters.BaseTimeBetweenFilter): def __init__(self, column, name, options=None, data_type=None): - super(TimeBetweenFilter, self).__init__(column, - name, - options, - data_type='timerangepicker') + super(TimeBetweenFilter, self).__init__( + column, name, options, data_type="timerangepicker" + ) def apply(self, query, value): start, end = value @@ -278,30 +278,66 @@ def apply(self, query, value): return query.filter(~(self.column.between(start, end))) def operation(self): - return lazy_gettext('not between') + return lazy_gettext("not between") # Base peewee filter field converter class FilterConverter(filters.BaseFilterConverter): - strings = (FilterLike, FilterNotLike, FilterEqual, FilterNotEqual, - FilterEmpty, FilterInList, FilterNotInList) - int_filters = (IntEqualFilter, IntNotEqualFilter, IntGreaterFilter, - IntSmallerFilter, FilterEmpty, IntInListFilter, - IntNotInListFilter) - float_filters = (FloatEqualFilter, FloatNotEqualFilter, FloatGreaterFilter, - FloatSmallerFilter, FilterEmpty, FloatInListFilter, - FloatNotInListFilter) + strings = ( + FilterLike, + FilterNotLike, + FilterEqual, + FilterNotEqual, + FilterEmpty, + FilterInList, + FilterNotInList, + ) + int_filters = ( + IntEqualFilter, + IntNotEqualFilter, + IntGreaterFilter, + IntSmallerFilter, + FilterEmpty, + IntInListFilter, + IntNotInListFilter, + ) + float_filters = ( + FloatEqualFilter, + FloatNotEqualFilter, + FloatGreaterFilter, + FloatSmallerFilter, + FilterEmpty, + FloatInListFilter, + FloatNotInListFilter, + ) bool_filters = (BooleanEqualFilter, BooleanNotEqualFilter) - date_filters = (DateEqualFilter, DateNotEqualFilter, DateGreaterFilter, - DateSmallerFilter, DateBetweenFilter, DateNotBetweenFilter, - FilterEmpty) - datetime_filters = (DateTimeEqualFilter, DateTimeNotEqualFilter, - DateTimeGreaterFilter, DateTimeSmallerFilter, - DateTimeBetweenFilter, DateTimeNotBetweenFilter, - FilterEmpty) - time_filters = (TimeEqualFilter, TimeNotEqualFilter, TimeGreaterFilter, - TimeSmallerFilter, TimeBetweenFilter, TimeNotBetweenFilter, - FilterEmpty) + date_filters = ( + DateEqualFilter, + DateNotEqualFilter, + DateGreaterFilter, + DateSmallerFilter, + DateBetweenFilter, + DateNotBetweenFilter, + FilterEmpty, + ) + datetime_filters = ( + DateTimeEqualFilter, + DateTimeNotEqualFilter, + DateTimeGreaterFilter, + DateTimeSmallerFilter, + DateTimeBetweenFilter, + DateTimeNotBetweenFilter, + FilterEmpty, + ) + time_filters = ( + TimeEqualFilter, + TimeNotEqualFilter, + TimeGreaterFilter, + TimeSmallerFilter, + TimeBetweenFilter, + TimeNotBetweenFilter, + FilterEmpty, + ) def convert(self, type_name, column, name): filter_name = type_name.lower() @@ -311,30 +347,30 @@ def convert(self, type_name, column, name): return None - @filters.convert('CharField', 'TextField') + @filters.convert("CharField", "TextField") def conv_string(self, column, name): return [f(column, name) for f in self.strings] - @filters.convert('BooleanField') + @filters.convert("BooleanField") def conv_bool(self, column, name): return [f(column, name) for f in self.bool_filters] - @filters.convert('IntegerField', 'BigIntegerField', 'PrimaryKeyField') + @filters.convert("IntegerField", "BigIntegerField", "PrimaryKeyField") def conv_int(self, column, name): return [f(column, name) for f in self.int_filters] - @filters.convert('DecimalField', 'FloatField', 'DoubleField') + @filters.convert("DecimalField", "FloatField", "DoubleField") def conv_float(self, column, name): return [f(column, name) for f in self.float_filters] - @filters.convert('DateField') + @filters.convert("DateField") def conv_date(self, column, name): return [f(column, name) for f in self.date_filters] - @filters.convert('DateTimeField') + @filters.convert("DateTimeField") def conv_datetime(self, column, name): return [f(column, name) for f in self.datetime_filters] - @filters.convert('TimeField') + @filters.convert("TimeField") def conv_time(self, column, name): return [f(column, name) for f in self.time_filters] diff --git a/flask_admin/contrib/peewee/form.py b/flask_admin/contrib/peewee/form.py index 7c022778d..5ae87ad5c 100644 --- a/flask_admin/contrib/peewee/form.py +++ b/flask_admin/contrib/peewee/form.py @@ -1,24 +1,36 @@ +from peewee import CharField +from peewee import DateField +from peewee import DateTimeField +from peewee import ForeignKeyField +from peewee import PrimaryKeyField +from peewee import TimeField from wtforms import fields -from peewee import (CharField, DateTimeField, DateField, TimeField, - PrimaryKeyField, ForeignKeyField) - try: from peewee import BaseModel # type: ignore[attr-defined] except ImportError: from peewee import ModelBase as BaseModel -from wtfpeewee.orm import ModelConverter, model_form +from wtfpeewee.orm import model_form +from wtfpeewee.orm import ModelConverter from flask_admin import form -from flask_admin._compat import iteritems, itervalues -from flask_admin.model.form import InlineFormAdmin, InlineModelConverterBase -from flask_admin.model.fields import InlineModelFormField, InlineFieldList, AjaxSelectField +from flask_admin._compat import iteritems +from flask_admin._compat import itervalues +from flask_admin.model.fields import AjaxSelectField +from flask_admin.model.fields import InlineFieldList +from flask_admin.model.fields import InlineModelFormField +from flask_admin.model.form import InlineFormAdmin +from flask_admin.model.form import InlineModelConverterBase -from .tools import get_primary_key, get_meta_fields from .ajax import create_ajax_loader +from .tools import get_meta_fields +from .tools import get_primary_key + try: - from playhouse.postgres_ext import JSONField, BinaryJSONField + from playhouse.postgres_ext import BinaryJSONField + from playhouse.postgres_ext import JSONField + pg_ext = True except: pg_ext = False @@ -26,7 +38,7 @@ class InlineModelFormList(InlineFieldList): """ - Customized inline model form list field. + Customized inline model form list field. """ form_field_type = InlineModelFormField @@ -41,7 +53,9 @@ def __init__(self, form, model, prop, inline_view, **kwargs): self.inline_view = inline_view self._pk = get_primary_key(model) - super(InlineModelFormList, self).__init__(self.form_field_type(form, self._pk), **kwargs) + super(InlineModelFormList, self).__init__( + self.form_field_type(form, self._pk), **kwargs + ) def display_row_controls(self, field): return field.get_pk() is not None @@ -99,7 +113,7 @@ def save_related(self, obj): # Recurse, to save multi-level nested inlines for f in itervalues(field.form._fields): - if f.type == 'InlineModelFormList': + if f.type == "InlineModelFormList": f.save_related(model) @@ -120,29 +134,31 @@ def __init__(self, view, additional=None): self.converters[JSONField] = self.handle_json self.converters[BinaryJSONField] = self.handle_json - self.overrides = getattr(self.view, 'form_overrides', None) or {} + self.overrides = getattr(self.view, "form_overrides", None) or {} def handle_foreign_key(self, model, field, **kwargs): - loader = getattr(self.view, '_form_ajax_refs', {}).get(field.name) + loader = getattr(self.view, "_form_ajax_refs", {}).get(field.name) if loader: if field.null: - kwargs['allow_blank'] = True + kwargs["allow_blank"] = True return field.name, AjaxSelectField(loader, **kwargs) - return super(CustomModelConverter, self).handle_foreign_key(model, field, **kwargs) + return super(CustomModelConverter, self).handle_foreign_key( + model, field, **kwargs + ) def handle_pk(self, model, field, **kwargs): - kwargs['validators'] = [] + kwargs["validators"] = [] return field.name, fields.HiddenField(**kwargs) def handle_date(self, model, field, **kwargs): - kwargs['widget'] = form.DatePickerWidget() + kwargs["widget"] = form.DatePickerWidget() return field.name, fields.DateField(**kwargs) def handle_datetime(self, model, field, **kwargs): - kwargs['widget'] = form.DateTimePickerWidget() + kwargs["widget"] = form.DateTimePickerWidget() return field.name, fields.DateTimeField(**kwargs) def handle_time(self, model, field, **kwargs): @@ -152,23 +168,28 @@ def handle_json(self, model, field, **kwargs): return field.name, form.JSONField(**kwargs) -def get_form(model, converter, - base_class=form.BaseForm, - only=None, - exclude=None, - field_args=None, - allow_pk=False, - extra_fields=None): +def get_form( + model, + converter, + base_class=form.BaseForm, + only=None, + exclude=None, + field_args=None, + allow_pk=False, + extra_fields=None, +): """ - Create form from peewee model and contribute extra fields, if necessary + Create form from peewee model and contribute extra fields, if necessary """ - result = model_form(model, - base_class=base_class, - only=only, - exclude=exclude, - field_args=field_args, - allow_pk=allow_pk, - converter=converter) + result = model_form( + model, + base_class=base_class, + only=only, + exclude=exclude, + field_args=field_args, + allow_pk=allow_pk, + converter=converter, + ) if extra_fields: for name, field in iteritems(extra_fields): @@ -179,7 +200,7 @@ def get_form(model, converter, class InlineModelConverter(InlineModelConverterBase): """ - Inline model form helper. + Inline model form helper. """ inline_field_list_type = InlineModelFormList @@ -197,14 +218,14 @@ def get_info(self, p): if isinstance(p, BaseModel): info = InlineFormAdmin(p) else: - model = getattr(p, 'model', None) + model = getattr(p, "model", None) if model is None: - raise Exception('Unknown inline model admin: %s' % repr(p)) + raise Exception("Unknown inline model admin: %s" % repr(p)) attrs = dict() for attr in dir(p): - if not attr.startswith('_') and attr != 'model': + if not attr.startswith("_") and attr != "model": attrs[attr] = getattr(p, attr) info = InlineFormAdmin(model, **attrs) @@ -215,13 +236,13 @@ def get_info(self, p): return info def process_ajax_refs(self, info): - refs = getattr(info, 'form_ajax_refs', None) + refs = getattr(info, "form_ajax_refs", None) result = {} if refs: for name, opts in iteritems(refs): - new_name = '%s.%s' % (info.model.__name__.lower(), name) + new_name = "%s.%s" % (info.model.__name__.lower(), name) loader = None if isinstance(opts, (list, tuple)): @@ -248,7 +269,7 @@ def contribute(self, converter, model, form_class, inline_model): reverse_field = field break else: - raise Exception('Cannot find reverse relation for model %s' % info.model) + raise Exception("Cannot find reverse relation for model %s" % info.model) # Remove reverse property from the list ignore = [reverse_field.name] @@ -262,13 +283,15 @@ def contribute(self, converter, model, form_class, inline_model): child_form = info.get_form() if child_form is None: - child_form = model_form(info.model, - base_class=form.BaseForm, - only=info.form_columns, - exclude=exclude, - field_args=info.form_args, - allow_pk=True, - converter=converter) + child_form = model_form( + info.model, + base_class=form.BaseForm, + only=info.form_columns, + exclude=exclude, + field_args=info.form_args, + allow_pk=True, + converter=converter, + ) try: prop_name = reverse_field.related_name @@ -277,18 +300,22 @@ def contribute(self, converter, model, form_class, inline_model): label = self.get_label(info, prop_name) - setattr(form_class, - prop_name, - self.inline_field_list_type(child_form, - info.model, - reverse_field.name, - info, - label=label or info.model.__name__)) + setattr( + form_class, + prop_name, + self.inline_field_list_type( + child_form, + info.model, + reverse_field.name, + info, + label=label or info.model.__name__, + ), + ) return form_class def save_inline(form, model): for f in itervalues(form._fields): - if f.type == 'InlineModelFormList': + if f.type == "InlineModelFormList": f.save_related(model) diff --git a/flask_admin/contrib/peewee/tools.py b/flask_admin/contrib/peewee/tools.py index 98277d56b..2a1087d4f 100644 --- a/flask_admin/contrib/peewee/tools.py +++ b/flask_admin/contrib/peewee/tools.py @@ -3,18 +3,18 @@ def get_primary_key(model): def parse_like_term(term): - if term.startswith('^'): - stmt = '%s%%' % term[1:] - elif term.startswith('='): + if term.startswith("^"): + stmt = "%s%%" % term[1:] + elif term.startswith("="): stmt = term[1:] else: - stmt = '%%%s%%' % term + stmt = "%%%s%%" % term return stmt def get_meta_fields(model): - if hasattr(model._meta, 'sorted_fields'): + if hasattr(model._meta, "sorted_fields"): fields = model._meta.sorted_fields else: fields = model._meta.get_fields() diff --git a/flask_admin/contrib/peewee/view.py b/flask_admin/contrib/peewee/view.py index 45f4c64c5..06b415008 100644 --- a/flask_admin/contrib/peewee/view.py +++ b/flask_admin/contrib/peewee/view.py @@ -1,20 +1,30 @@ import logging from flask import flash +from peewee import CharField +from peewee import Field +from peewee import ForeignKeyField +from peewee import JOIN +from peewee import PrimaryKeyField +from peewee import TextField from flask_admin._compat import string_types -from flask_admin.babel import gettext, ngettext, lazy_gettext -from flask_admin.model import BaseModelView -from flask_admin.model.form import create_editable_list_form - -from peewee import JOIN, PrimaryKeyField, ForeignKeyField, Field, CharField, TextField - from flask_admin.actions import action +from flask_admin.babel import gettext +from flask_admin.babel import lazy_gettext +from flask_admin.babel import ngettext from flask_admin.contrib.peewee import filters +from flask_admin.model import BaseModelView +from flask_admin.model.form import create_editable_list_form -from .form import get_form, CustomModelConverter, InlineModelConverter, save_inline -from .tools import get_meta_fields, get_primary_key, parse_like_term from .ajax import create_ajax_loader +from .form import CustomModelConverter +from .form import get_form +from .form import InlineModelConverter +from .form import save_inline +from .tools import get_meta_fields +from .tools import get_primary_key +from .tools import parse_like_term # Set up logger log = logging.getLogger("flask-admin.peewee") @@ -160,15 +170,31 @@ class MyModel1View(Base): column_labels = {'model_ones': 'Hello'} """ - def __init__(self, model, name=None, - category=None, endpoint=None, url=None, static_folder=None, - menu_class_name=None, menu_icon_type=None, menu_icon_value=None): + def __init__( + self, + model, + name=None, + category=None, + endpoint=None, + url=None, + static_folder=None, + menu_class_name=None, + menu_icon_type=None, + menu_icon_value=None, + ): self._search_fields = [] - super(ModelView, self).__init__(model, name, category, endpoint, url, static_folder, - menu_class_name=menu_class_name, - menu_icon_type=menu_icon_type, - menu_icon_value=menu_icon_value) + super(ModelView, self).__init__( + model, + name, + category, + endpoint, + url, + static_folder, + menu_class_name=menu_class_name, + menu_icon_type=menu_icon_type, + menu_icon_value=menu_icon_value, + ) self._primary_key = self.scaffold_pk() @@ -176,18 +202,19 @@ def _get_model_fields(self, model=None): if model is None: model = self.model - return ( - (field.name, field) - for field in get_meta_fields(model)) + return ((field.name, field) for field in get_meta_fields(model)) def scaffold_pk(self): return get_primary_key(self.model) def get_pk_value(self, model): if self.model._meta.composite_key: - return tuple([ - getattr(model, field_name) - for field_name in self.model._meta.primary_key.field_names]) + return tuple( + [ + getattr(model, field_name) + for field_name in self.model._meta.primary_key.field_names + ] + ) return getattr(model, self._primary_key) def scaffold_list_columns(self): @@ -218,7 +245,9 @@ def init_search(self): # Check type if not isinstance(p, (CharField, TextField)): - raise Exception(f'Can only search on text columns. Failed to setup search for "{p}"') + raise Exception( + f'Can only search on text columns. Failed to setup search for "{p}"' + ) self._search_fields.append(p) @@ -231,7 +260,7 @@ def scaffold_filters(self, name): attr = name if attr is None: - raise Exception('Failed to find field for filter: %s' % name) + raise Exception("Failed to find field for filter: %s" % name) # Check if field is in different model model_class = None @@ -241,8 +270,10 @@ def scaffold_filters(self, name): model_class = attr.model if model_class != self.model: - visible_name = '%s / %s' % (self.get_column_name(model_class.__name__), - self.get_column_name(attr.name)) + visible_name = "%s / %s" % ( + self.get_column_name(model_class.__name__), + self.get_column_name(attr.name), + ) else: if not isinstance(name, string_types): visible_name = self.get_column_name(attr.name) @@ -250,9 +281,7 @@ def scaffold_filters(self, name): visible_name = self.get_column_name(name) type_name = type(attr).__name__ - flt = self.filter_converter.convert(type_name, - attr, - visible_name) + flt = self.filter_converter.convert(type_name, attr, visible_name) return flt @@ -260,17 +289,20 @@ def is_valid_filter(self, filter): return isinstance(filter, filters.BasePeeweeFilter) def scaffold_form(self): - form_class = get_form(self.model, self.model_form_converter(self), - base_class=self.form_base_class, - only=self.form_columns, - exclude=self.form_excluded_columns, - field_args=self.form_args, - # Allow child to specify pk, so inline_models - # can be ModelViews. But don't auto-generate - # pk field if form_columns is empty -- allow - # default behaviour in that case. - allow_pk=bool(self.form_columns), - extra_fields=self.form_extra_fields) + form_class = get_form( + self.model, + self.model_form_converter(self), + base_class=self.form_base_class, + only=self.form_columns, + exclude=self.form_excluded_columns, + field_args=self.form_args, + # Allow child to specify pk, so inline_models + # can be ModelViews. But don't auto-generate + # pk field if form_columns is empty -- allow + # default behaviour in that case. + allow_pk=bool(self.form_columns), + extra_fields=self.form_extra_fields, + ) if self.inline_models: form_class = self.scaffold_inline_form_models(form_class) @@ -279,32 +311,33 @@ def scaffold_form(self): def scaffold_list_form(self, widget=None, validators=None): """ - Create form for the `index_view` using only the columns from - `self.column_editable_list`. - - :param widget: - WTForms widget class. Defaults to `XEditableWidget`. - :param validators: - `form_args` dict with only validators - {'name': {'validators': [required()]}} + Create form for the `index_view` using only the columns from + `self.column_editable_list`. + + :param widget: + WTForms widget class. Defaults to `XEditableWidget`. + :param validators: + `form_args` dict with only validators + {'name': {'validators': [required()]}} """ - form_class = get_form(self.model, self.model_form_converter(self), - base_class=self.form_base_class, - only=self.column_editable_list, - field_args=validators) + form_class = get_form( + self.model, + self.model_form_converter(self), + base_class=self.form_base_class, + only=self.column_editable_list, + field_args=validators, + ) - return create_editable_list_form(self.form_base_class, form_class, - widget) + return create_editable_list_form(self.form_base_class, form_class, widget) def scaffold_inline_form_models(self, form_class): converter = self.model_form_converter(self) inline_converter = self.inline_model_form_converter(self) for m in self.inline_models: - form_class = inline_converter.contribute(converter, - self.model, - form_class, - m) + form_class = inline_converter.contribute( + converter, self.model, form_class, m + ) return form_class @@ -330,7 +363,8 @@ def _order_by(self, query, joins, order): clauses = [] for sort_field, sort_desc in order: query, joins, clause = self._sort_clause( - query, joins, sort_field, sort_desc) + query, joins, sort_field, sort_desc + ) clauses.append(clause) query = query.order_by(*clauses) return query, joins @@ -353,27 +387,35 @@ def _sort_clause(self, query, joins, sort_field, sort_desc): def get_query(self): return self.model.select() - def get_list(self, page, sort_column, sort_desc, search, filters, - execute=True, page_size=None): + def get_list( + self, + page, + sort_column, + sort_desc, + search, + filters, + execute=True, + page_size=None, + ): """ - Return records from the database. - - :param page: - Page number - :param sort_column: - Sort column name - :param sort_desc: - Descending or ascending sort - :param search: - Search query - :param filters: - List of filter tuples - :param execute: - Execute query immediately? Default is `True` - :param page_size: - Number of results. Defaults to ModelView's page_size. Can be - overriden to change the page_size limit. Removing the page_size - limit requires setting page_size to 0 or False. + Return records from the database. + + :param page: + Page number + :param sort_column: + Sort column name + :param sort_desc: + Descending or ascending sort + :param search: + Search query + :param filters: + List of filter tuples + :param execute: + Execute query immediately? Default is `True` + :param page_size: + Number of results. Defaults to ModelView's page_size. Can be + overriden to change the page_size limit. Removing the page_size + limit requires setting page_size to 0 or False. """ query = self.get_query() @@ -382,7 +424,7 @@ def get_list(self, page, sort_column, sort_desc, search, filters, # Search if self._search_supported and search: - values = search.split(' ') + values = search.split(" ") for value in values: if not value: @@ -394,7 +436,7 @@ def get_list(self, page, sort_column, sort_desc, search, filters, for field in self._search_fields: query = self._handle_join(query, field, joins) - q = field ** term + q = field**term if stmt is None: stmt = q @@ -441,7 +483,9 @@ def get_list(self, page, sort_column, sort_desc, search, filters, def get_one(self, id): if self.model._meta.composite_key: - return self.model.get(**dict(zip(self.model._meta.primary_key.field_names, id))) + return self.model.get( + **dict(zip(self.model._meta.primary_key.field_names, id)) + ) return self.model.get(**{self._primary_key: id}) def create_model(self, form): @@ -455,8 +499,11 @@ def create_model(self, form): save_inline(form, model) except Exception as ex: if not self.handle_view_exception(ex): - flash(gettext('Failed to create record. %(error)s', error=str(ex)), 'error') - log.exception('Failed to create record.') + flash( + gettext("Failed to create record. %(error)s", error=str(ex)), + "error", + ) + log.exception("Failed to create record.") return False else: @@ -474,8 +521,11 @@ def update_model(self, form, model): save_inline(form, model) except Exception as ex: if not self.handle_view_exception(ex): - flash(gettext('Failed to update record. %(error)s', error=str(ex)), 'error') - log.exception('Failed to update record.') + flash( + gettext("Failed to update record. %(error)s", error=str(ex)), + "error", + ) + log.exception("Failed to update record.") return False else: @@ -489,8 +539,11 @@ def delete_model(self, model): model.delete_instance(recursive=True) except Exception as ex: if not self.handle_view_exception(ex): - flash(gettext('Failed to delete record. %(error)s', error=str(ex)), 'error') - log.exception('Failed to delete record.') + flash( + gettext("Failed to delete record. %(error)s", error=str(ex)), + "error", + ) + log.exception("Failed to delete record.") return False else: @@ -501,14 +554,16 @@ def delete_model(self, model): # Default model actions def is_action_allowed(self, name): # Check delete action permission - if name == 'delete' and not self.can_delete: + if name == "delete" and not self.can_delete: return False return super(ModelView, self).is_action_allowed(name) - @action('delete', - lazy_gettext('Delete'), - lazy_gettext('Are you sure you want to delete selected records?')) + @action( + "delete", + lazy_gettext("Delete"), + lazy_gettext("Are you sure you want to delete selected records?"), + ) def action_delete(self, ids): try: model_pk = getattr(self.model, self._primary_key) @@ -525,10 +580,18 @@ def action_delete(self, ids): m.delete_instance(recursive=True) count += 1 - flash(ngettext('Record was successfully deleted.', - '%(count)s records were successfully deleted.', - count, - count=count), 'success') + flash( + ngettext( + "Record was successfully deleted.", + "%(count)s records were successfully deleted.", + count, + count=count, + ), + "success", + ) except Exception as ex: if not self.handle_view_exception(ex): - flash(gettext('Failed to delete records. %(error)s', error=str(ex)), 'error') + flash( + gettext("Failed to delete records. %(error)s", error=str(ex)), + "error", + ) diff --git a/flask_admin/contrib/peeweemodel/__init__.py b/flask_admin/contrib/peeweemodel/__init__.py index 554622265..72bc13dbd 100644 --- a/flask_admin/contrib/peeweemodel/__init__.py +++ b/flask_admin/contrib/peeweemodel/__init__.py @@ -1,10 +1,14 @@ def setup(): import warnings - warnings.warn('Flask-Admin peewee integration module was renamed as ' - 'flask_admin.contrib.peewee, please use it instead.') + + warnings.warn( + "Flask-Admin peewee integration module was renamed as " + "flask_admin.contrib.peewee, please use it instead." + ) from flask_admin._backwards import import_redirect - import_redirect(__name__, 'flask_admin.contrib.peewee') + + import_redirect(__name__, "flask_admin.contrib.peewee") setup() diff --git a/flask_admin/contrib/pymongo/__init__.py b/flask_admin/contrib/pymongo/__init__.py index 57bded8ac..2e0764473 100644 --- a/flask_admin/contrib/pymongo/__init__.py +++ b/flask_admin/contrib/pymongo/__init__.py @@ -3,8 +3,8 @@ import pymongo except ImportError: raise Exception( - 'Could not import `pymongo`. ' - 'Enable `pymongo` integration by installing `flask-admin[pymongo]`' + "Could not import `pymongo`. " + "Enable `pymongo` integration by installing `flask-admin[pymongo]`" ) from .view import ModelView diff --git a/flask_admin/contrib/pymongo/filters.py b/flask_admin/contrib/pymongo/filters.py index 40f1b0fd1..a02ad91e1 100644 --- a/flask_admin/contrib/pymongo/filters.py +++ b/flask_admin/contrib/pymongo/filters.py @@ -8,20 +8,21 @@ class BasePyMongoFilter(filters.BaseFilter): """ - Base pymongo filter. + Base pymongo filter. """ + def __init__(self, column, name, options=None, data_type=None): """ - Constructor. - - :param column: - Document field name - :param name: - Display name - :param options: - Fixed set of options - :param data_type: - Client data type + Constructor. + + :param column: + Document field name + :param name: + Display name + :param options: + Fixed set of options + :param data_type: + Client data type """ super(BasePyMongoFilter, self).__init__(name, options, data_type) @@ -35,36 +36,36 @@ def apply(self, query, value): return query def operation(self): - return lazy_gettext('equals') + return lazy_gettext("equals") class FilterNotEqual(BasePyMongoFilter): def apply(self, query, value): - query.append({self.column: {'$ne': value}}) + query.append({self.column: {"$ne": value}}) return query def operation(self): - return lazy_gettext('not equal') + return lazy_gettext("not equal") class FilterLike(BasePyMongoFilter): def apply(self, query, value): regex = parse_like_term(value) - query.append({self.column: {'$regex': regex}}) + query.append({self.column: {"$regex": regex}}) return query def operation(self): - return lazy_gettext('contains') + return lazy_gettext("contains") class FilterNotLike(BasePyMongoFilter): def apply(self, query, value): regex = parse_like_term(value) - query.append({self.column: {'$not': re.compile(regex)}}) + query.append({self.column: {"$not": re.compile(regex)}}) return query def operation(self): - return lazy_gettext('not contains') + return lazy_gettext("not contains") class FilterGreater(BasePyMongoFilter): @@ -73,11 +74,11 @@ def apply(self, query, value): value = float(value) except ValueError: value = 0 - query.append({self.column: {'$gt': value}}) + query.append({self.column: {"$gt": value}}) return query def operation(self): - return lazy_gettext('greater than') + return lazy_gettext("greater than") class FilterSmaller(BasePyMongoFilter): @@ -86,21 +87,21 @@ def apply(self, query, value): value = float(value) except ValueError: value = 0 - query.append({self.column: {'$lt': value}}) + query.append({self.column: {"$lt": value}}) return query def operation(self): - return lazy_gettext('smaller than') + return lazy_gettext("smaller than") # Customized type filters class BooleanEqualFilter(FilterEqual, filters.BaseBooleanFilter): def apply(self, query, value): - query.append({self.column: value == '1'}) + query.append({self.column: value == "1"}) return query class BooleanNotEqualFilter(FilterNotEqual, filters.BaseBooleanFilter): def apply(self, query, value): - query.append({self.column: value != '1'}) + query.append({self.column: value != "1"}) return query diff --git a/flask_admin/contrib/pymongo/tools.py b/flask_admin/contrib/pymongo/tools.py index e931527de..1b5e7c87a 100644 --- a/flask_admin/contrib/pymongo/tools.py +++ b/flask_admin/contrib/pymongo/tools.py @@ -3,14 +3,14 @@ def parse_like_term(term): """ - Parse search term into (operation, term) tuple + Parse search term into (operation, term) tuple - :param term: - Search term + :param term: + Search term """ - if term.startswith('^'): - return '^{}'.format(re.escape(term[1:])) - elif term.startswith('='): - return '^{}$'.format(re.escape(term[1:])) + if term.startswith("^"): + return f"^{re.escape(term[1:])}" + elif term.startswith("="): + return f"^{re.escape(term[1:])}$" return re.escape(term) diff --git a/flask_admin/contrib/pymongo/view.py b/flask_admin/contrib/pymongo/view.py index d354436b5..b51e25a3f 100644 --- a/flask_admin/contrib/pymongo/view.py +++ b/flask_admin/contrib/pymongo/view.py @@ -3,14 +3,15 @@ import pymongo from bson import ObjectId from bson.errors import InvalidId - from flask import flash from flask_admin._compat import string_types -from flask_admin.babel import gettext, ngettext, lazy_gettext -from flask_admin.model import BaseModelView from flask_admin.actions import action +from flask_admin.babel import gettext +from flask_admin.babel import lazy_gettext +from flask_admin.babel import ngettext from flask_admin.helpers import get_form_data +from flask_admin.model import BaseModelView from .filters import BasePyMongoFilter from .tools import parse_like_term @@ -21,7 +22,7 @@ class ModelView(BaseModelView): """ - MongoEngine model scaffolding. + MongoEngine model scaffolding. """ column_filters = None @@ -63,33 +64,41 @@ class MyModelView(BaseModelView): ] """ - def __init__(self, coll, - name=None, category=None, endpoint=None, url=None, - menu_class_name=None, menu_icon_type=None, menu_icon_value=None): + def __init__( + self, + coll, + name=None, + category=None, + endpoint=None, + url=None, + menu_class_name=None, + menu_icon_type=None, + menu_icon_value=None, + ): """ - Constructor - - :param coll: - MongoDB collection object - :param name: - Display name - :param category: - Display category - :param endpoint: - Endpoint - :param url: - Custom URL - :param menu_class_name: - Optional class name for the menu item. - :param menu_icon_type: - Optional icon. Possible icon types: - - - `flask_admin.consts.ICON_TYPE_GLYPH` - Bootstrap glyph icon - - `flask_admin.consts.ICON_TYPE_FONT_AWESOME` - Font Awesome icon - - `flask_admin.consts.ICON_TYPE_IMAGE` - Image relative to Flask static directory - - `flask_admin.consts.ICON_TYPE_IMAGE_URL` - Image with full URL - :param menu_icon_value: - Icon glyph name or URL, depending on `menu_icon_type` setting + Constructor + + :param coll: + MongoDB collection object + :param name: + Display name + :param category: + Display category + :param endpoint: + Endpoint + :param url: + Custom URL + :param menu_class_name: + Optional class name for the menu item. + :param menu_icon_type: + Optional icon. Possible icon types: + + - `flask_admin.consts.ICON_TYPE_GLYPH` - Bootstrap glyph icon + - `flask_admin.consts.ICON_TYPE_FONT_AWESOME` - Font Awesome icon + - `flask_admin.consts.ICON_TYPE_IMAGE` - Image relative to Flask static directory + - `flask_admin.consts.ICON_TYPE_IMAGE_URL` - Image with full URL + :param menu_icon_value: + Icon glyph name or URL, depending on `menu_icon_type` setting """ self._search_fields = [] @@ -97,47 +106,53 @@ def __init__(self, coll, name = self._prettify_name(coll.name) if endpoint is None: - endpoint = ('%sview' % coll.name).lower() - - super(ModelView, self).__init__(None, name, category, endpoint, url, - menu_class_name=menu_class_name, - menu_icon_type=menu_icon_type, - menu_icon_value=menu_icon_value) + endpoint = ("%sview" % coll.name).lower() + + super(ModelView, self).__init__( + None, + name, + category, + endpoint, + url, + menu_class_name=menu_class_name, + menu_icon_type=menu_icon_type, + menu_icon_value=menu_icon_value, + ) self.coll = coll def scaffold_pk(self): - return '_id' + return "_id" def get_pk_value(self, model): """ - Return primary key value from the model instance + Return primary key value from the model instance - :param model: - Model instance + :param model: + Model instance """ - return model.get('_id') + return model.get("_id") def scaffold_list_columns(self): """ - Scaffold list columns + Scaffold list columns """ raise NotImplementedError() def scaffold_sortable_columns(self): """ - Return sortable columns dictionary (name, field) + Return sortable columns dictionary (name, field) """ return [] def init_search(self): """ - Init search + Init search """ if self.column_searchable_list: for p in self.column_searchable_list: if not isinstance(p, string_types): - raise ValueError('Expected string') + raise ValueError("Expected string") # TODO: Validation? @@ -147,19 +162,19 @@ def init_search(self): def scaffold_filters(self, attr): """ - Return filter object(s) for the field + Return filter object(s) for the field - :param name: - Either field name or field instance + :param name: + Either field name or field instance """ raise NotImplementedError() def is_valid_filter(self, filter): """ - Validate if it is valid MongoEngine filter + Validate if it is valid MongoEngine filter - :param filter: - Filter object + :param filter: + Filter object """ return isinstance(filter, BasePyMongoFilter) @@ -168,12 +183,12 @@ def scaffold_form(self): def _get_field_value(self, model, name): """ - Get unformatted field value from the model + Get unformatted field value from the model """ return model.get(name) def _search(self, query, search_term): - values = search_term.split(' ') + values = search_term.split(" ") queries = [] @@ -186,49 +201,57 @@ def _search(self, query, search_term): stmt = [] for field in self._search_fields: - stmt.append({field: {'$regex': regex}}) + stmt.append({field: {"$regex": regex}}) if stmt: if len(stmt) == 1: queries.append(stmt[0]) else: - queries.append({'$or': stmt}) + queries.append({"$or": stmt}) # Construct final query if queries: if len(queries) == 1: final = queries[0] else: - final = {'$and': queries} + final = {"$and": queries} if query: - query = {'$and': [query, final]} + query = {"$and": [query, final]} else: query = final return query - def get_list(self, page, sort_column, sort_desc, search, filters, - execute=True, page_size=None): + def get_list( + self, + page, + sort_column, + sort_desc, + search, + filters, + execute=True, + page_size=None, + ): """ - Get list of objects from MongoEngine - - :param page: - Page number - :param sort_column: - Sort column - :param sort_desc: - Sort descending - :param search: - Search criteria - :param filters: - List of applied fiters - :param execute: - Run query immediately or not - :param page_size: - Number of results. Defaults to ModelView's page_size. Can be - overriden to change the page_size limit. Removing the page_size - limit requires setting page_size to 0 or False. + Get list of objects from MongoEngine + + :param page: + Page number + :param sort_column: + Sort column + :param sort_desc: + Sort descending + :param search: + Search criteria + :param filters: + List of applied fiters + :param execute: + Run query immediately or not + :param page_size: + Number of results. Defaults to ModelView's page_size. Can be + overriden to change the page_size limit. Removing the page_size + limit requires setting page_size to 0 or False. """ query = {} @@ -244,7 +267,7 @@ def get_list(self, page, sort_column, sort_desc, search, filters, if len(data) == 1: query = data[0] else: - query['$and'] = data + query["$and"] = data # Search if self._search_supported and search: @@ -257,13 +280,17 @@ def get_list(self, page, sort_column, sort_desc, search, filters, sort_by = None if sort_column: - sort_by = [(sort_column, pymongo.DESCENDING if sort_desc else pymongo.ASCENDING)] + sort_by = [ + (sort_column, pymongo.DESCENDING if sort_desc else pymongo.ASCENDING) + ] else: order = self._get_default_order() if order: - sort_by = [(col, pymongo.DESCENDING if desc else pymongo.ASCENDING) - for (col, desc) in order] + sort_by = [ + (col, pymongo.DESCENDING if desc else pymongo.ASCENDING) + for (col, desc) in order + ] # Pagination if page_size is None: @@ -289,34 +316,33 @@ def _get_valid_id(self, id): def get_one(self, id): """ - Return single model instance by ID + Return single model instance by ID - :param id: - Model ID + :param id: + Model ID """ - return self.coll.find_one({'_id': self._get_valid_id(id)}) + return self.coll.find_one({"_id": self._get_valid_id(id)}) def edit_form(self, obj): """ - Create edit form from the MongoDB document + Create edit form from the MongoDB document """ return self._edit_form_class(get_form_data(), **obj) def create_model(self, form): """ - Create model helper + Create model helper - :param form: - Form instance + :param form: + Form instance """ try: model = form.data self._on_model_change(form, model, True) self.coll.insert_one(model) except Exception as ex: - flash(gettext('Failed to create record. %(error)s', error=str(ex)), - 'error') - log.exception('Failed to create record.') + flash(gettext("Failed to create record. %(error)s", error=str(ex)), "error") + log.exception("Failed to create record.") return False else: self.after_model_change(form, model, True) @@ -325,23 +351,22 @@ def create_model(self, form): def update_model(self, form, model): """ - Update model helper + Update model helper - :param form: - Form instance - :param model: - Model instance to update + :param form: + Form instance + :param model: + Model instance to update """ try: model.update(form.data) self._on_model_change(form, model, False) pk = self.get_pk_value(model) - self.coll.replace_one({'_id': pk}, model) + self.coll.replace_one({"_id": pk}, model) except Exception as ex: - flash(gettext('Failed to update record. %(error)s', error=str(ex)), - 'error') - log.exception('Failed to update record.') + flash(gettext("Failed to update record. %(error)s", error=str(ex)), "error") + log.exception("Failed to update record.") return False else: self.after_model_change(form, model, False) @@ -350,23 +375,22 @@ def update_model(self, form, model): def delete_model(self, model): """ - Delete model helper + Delete model helper - :param model: - Model instance + :param model: + Model instance """ try: pk = self.get_pk_value(model) if not pk: - raise ValueError('Document does not have _id') + raise ValueError("Document does not have _id") self.on_model_delete(model) - self.coll.delete_one({'_id': pk}) + self.coll.delete_one({"_id": pk}) except Exception as ex: - flash(gettext('Failed to delete record. %(error)s', error=str(ex)), - 'error') - log.exception('Failed to delete record.') + flash(gettext("Failed to delete record. %(error)s", error=str(ex)), "error") + log.exception("Failed to delete record.") return False else: self.after_model_delete(model) @@ -376,14 +400,16 @@ def delete_model(self, model): # Default model actions def is_action_allowed(self, name): # Check delete action permission - if name == 'delete' and not self.can_delete: + if name == "delete" and not self.can_delete: return False return super(ModelView, self).is_action_allowed(name) - @action('delete', - lazy_gettext('Delete'), - lazy_gettext('Are you sure you want to delete selected records?')) + @action( + "delete", + lazy_gettext("Delete"), + lazy_gettext("Are you sure you want to delete selected records?"), + ) def action_delete(self, ids): try: count = 0 @@ -393,9 +419,16 @@ def action_delete(self, ids): if self.delete_model(self.get_one(pk)): count += 1 - flash(ngettext('Record was successfully deleted.', - '%(count)s records were successfully deleted.', - count, - count=count), 'success') + flash( + ngettext( + "Record was successfully deleted.", + "%(count)s records were successfully deleted.", + count, + count=count, + ), + "success", + ) except Exception as ex: - flash(gettext('Failed to delete records. %(error)s', error=str(ex)), 'error') + flash( + gettext("Failed to delete records. %(error)s", error=str(ex)), "error" + ) diff --git a/flask_admin/contrib/rediscli.py b/flask_admin/contrib/rediscli.py index 659dc5e0d..9ec1268a5 100644 --- a/flask_admin/contrib/rediscli.py +++ b/flask_admin/contrib/rediscli.py @@ -2,12 +2,11 @@ import shlex from flask import request - from markupsafe import Markup -from flask_admin.base import BaseView, expose from flask_admin.babel import gettext - +from flask_admin.base import BaseView +from flask_admin.base import expose # Set up logger log = logging.getLogger("flask-admin.redis") @@ -15,55 +14,54 @@ class CommandError(Exception): """ - RedisCli error exception. + RedisCli error exception. """ + pass class TextWrapper(str): """ - Small text wrapper for result formatter to distinguish between - different string types. + Small text wrapper for result formatter to distinguish between + different string types. """ + pass class RedisCli(BaseView): """ - Simple redis console. + Simple redis console. - To use it, simply pass `Redis` connection object to the constructor. + To use it, simply pass `Redis` connection object to the constructor. """ - remapped_commands = { - 'del': 'delete' - } + remapped_commands = {"del": "delete"} """ List of redis remapped commands. """ - excluded_commands = set(('pubsub', 'set_response_callback', 'from_url')) + excluded_commands = set(("pubsub", "set_response_callback", "from_url")) """ List of excluded commands. """ - def __init__(self, redis, - name=None, category=None, endpoint=None, url=None): + def __init__(self, redis, name=None, category=None, endpoint=None, url=None): """ - Constructor. + Constructor. - :param redis: - Redis connection - :param name: - View name. If not provided, will use the model class name - :param category: - View category - :param endpoint: - Base endpoint. If not provided, will use the model name + 'view'. - For example if model name was 'User', endpoint will be - 'userview' - :param url: - Base URL. If not provided, will use endpoint as a URL. + :param redis: + Redis connection + :param name: + View name. If not provided, will use the model class name + :param category: + View category + :param endpoint: + Base endpoint. If not provided, will use the model name + 'view'. + For example if model name was 'User', endpoint will be + 'userview' + :param url: + Base URL. If not provided, will use endpoint as a URL. """ super(RedisCli, self).__init__(name, category, endpoint, url) @@ -76,13 +74,13 @@ def __init__(self, redis, def _inspect_commands(self): """ - Inspect connection object and extract command names. + Inspect connection object and extract command names. """ for name in dir(self.redis): - if not name.startswith('_'): + if not name.startswith("_"): attr = getattr(self.redis, name) if callable(attr) and name not in self.excluded_commands: - doc = (getattr(attr, '__doc__', '') or '').strip() + doc = (getattr(attr, "__doc__", "") or "").strip() self.commands[name] = (attr, doc) for new, old in self.remapped_commands.items(): @@ -90,18 +88,18 @@ def _inspect_commands(self): def _contribute_commands(self): """ - Contribute custom commands. + Contribute custom commands. """ - self.commands['help'] = (self._cmd_help, 'Help!') + self.commands["help"] = (self._cmd_help, "Help!") def _execute_command(self, name, args): """ - Execute single command. + Execute single command. - :param name: - Command name - :param args: - Command arguments + :param name: + Command name + :param args: + Command arguments """ # Do some remapping new_cmd = self.remapped_commands.get(name) @@ -110,85 +108,87 @@ def _execute_command(self, name, args): # Execute command if name not in self.commands: - return self._error(gettext('Cli: Invalid command.')) + return self._error(gettext("Cli: Invalid command.")) handler, _ = self.commands[name] return self._result(handler(*args)) def _parse_cmd(self, cmd): """ - Parse command by using shlex module. + Parse command by using shlex module. - :param cmd: - Command to parse + :param cmd: + Command to parse """ return tuple(shlex.split(cmd)) def _error(self, msg): """ - Format error message as HTTP response. + Format error message as HTTP response. - :param msg: - Message to format + :param msg: + Message to format """ return Markup('<div class="error">%s</div>' % msg) def _result(self, result): """ - Format result message as HTTP response. + Format result message as HTTP response. - :param msg: - Result to format. + :param msg: + Result to format. """ - return self.render('admin/rediscli/response.html', - type_name=lambda d: type(d).__name__, - result=result) + return self.render( + "admin/rediscli/response.html", + type_name=lambda d: type(d).__name__, + result=result, + ) # Commands def _cmd_help(self, *args): """ - Help command implementation. + Help command implementation. """ if not args: - help = 'Usage: help <command>.\nList of supported commands: ' - help += ', '.join(n for n in sorted(self.commands)) + help = "Usage: help <command>.\nList of supported commands: " + help += ", ".join(n for n in sorted(self.commands)) return TextWrapper(help) cmd = args[0] if cmd not in self.commands: - raise CommandError('Invalid command.') + raise CommandError("Invalid command.") help = self.commands[cmd][1] if not help: - return TextWrapper('Command does not have any help.') + return TextWrapper("Command does not have any help.") return TextWrapper(help) # Views - @expose('/') + @expose("/") def console_view(self): """ - Console view. + Console view. """ - return self.render('admin/rediscli/console.html') + return self.render("admin/rediscli/console.html") - @expose('/run/', methods=('POST',)) + @expose("/run/", methods=("POST",)) def execute_view(self): """ - AJAX API. + AJAX API. """ try: - cmd = request.form.get('cmd') + cmd = request.form.get("cmd") if not cmd: - return self._error('Cli: Empty command.') + return self._error("Cli: Empty command.") parts = self._parse_cmd(cmd) if not parts: - return self._error('Cli: Failed to parse command.') + return self._error("Cli: Failed to parse command.") return self._execute_command(parts[0], parts[1:]) except CommandError as err: - return self._error('Cli: %s' % err) + return self._error("Cli: %s" % err) except Exception as ex: log.exception(ex) - return self._error('Cli: %s' % ex) + return self._error("Cli: %s" % ex) diff --git a/flask_admin/contrib/sqla/ajax.py b/flask_admin/contrib/sqla/ajax.py index c2db01259..3a75a5a96 100644 --- a/flask_admin/contrib/sqla/ajax.py +++ b/flask_admin/contrib/sqla/ajax.py @@ -1,37 +1,50 @@ -from sqlalchemy import or_, and_, cast, text +from sqlalchemy import and_ +from sqlalchemy import cast +from sqlalchemy import or_ +from sqlalchemy import text from sqlalchemy.types import String -from flask_admin._compat import as_unicode, string_types -from flask_admin.model.ajax import AjaxModelLoader, DEFAULT_PAGE_SIZE +from flask_admin._compat import as_unicode +from flask_admin._compat import string_types +from flask_admin.model.ajax import AjaxModelLoader +from flask_admin.model.ajax import DEFAULT_PAGE_SIZE -from .tools import get_primary_key, has_multiple_pks, is_relationship, is_association_proxy +from .tools import get_primary_key +from .tools import has_multiple_pks +from .tools import is_association_proxy +from .tools import is_relationship class QueryAjaxModelLoader(AjaxModelLoader): def __init__(self, name, session, model, **options): """ - Constructor. + Constructor. - :param fields: - Fields to run query against - :param filters: - Additional filters to apply to the loader + :param fields: + Fields to run query against + :param filters: + Additional filters to apply to the loader """ super(QueryAjaxModelLoader, self).__init__(name, options) self.session = session self.model = model - self.fields = options.get('fields') - self.order_by = options.get('order_by') - self.filters = options.get('filters') + self.fields = options.get("fields") + self.order_by = options.get("order_by") + self.filters = options.get("filters") if not self.fields: - raise ValueError('AJAX loading requires `fields` to be specified for %s.%s' % (model, self.name)) + raise ValueError( + "AJAX loading requires `fields` to be specified for %s.%s" + % (model, self.name) + ) self._cached_fields = self._process_fields() if has_multiple_pks(model): - raise NotImplementedError('Flask-Admin does not support multi-pk AJAX model loading.') + raise NotImplementedError( + "Flask-Admin does not support multi-pk AJAX model loading." + ) self.pk = get_primary_key(model) @@ -43,7 +56,7 @@ def _process_fields(self): attr = getattr(self.model, field, None) if not attr: - raise ValueError('%s.%s does not exist.' % (self.model, field)) + raise ValueError("%s.%s does not exist." % (self.model, field)) remote_fields.append(attr) else: @@ -70,12 +83,19 @@ def get_list(self, term, offset=0, limit=DEFAULT_PAGE_SIZE): query = self.get_query() # no type casting to string if a ColumnAssociationProxyInstance is given - filters = (field.ilike(u'%%%s%%' % term) if is_association_proxy(field) - else cast(field, String).ilike(u'%%%s%%' % term) for field in self._cached_fields) + filters = ( + field.ilike("%%%s%%" % term) + if is_association_proxy(field) + else cast(field, String).ilike("%%%s%%" % term) + for field in self._cached_fields + ) query = query.filter(or_(*filters)) if self.filters: - filters = [text("%s.%s" % (self.model.__tablename__.lower(), value)) for value in self.filters] + filters = [ + text("%s.%s" % (self.model.__tablename__.lower(), value)) + for value in self.filters + ] query = query.filter(and_(*filters)) if self.order_by: @@ -88,10 +108,10 @@ def create_ajax_loader(model, session, name, field_name, options): attr = getattr(model, field_name, None) if attr is None: - raise ValueError('Model %s does not have field %s.' % (model, field_name)) + raise ValueError("Model %s does not have field %s." % (model, field_name)) if not is_relationship(attr) and not is_association_proxy(attr): - raise ValueError('%s.%s is not a relation.' % (model, field_name)) + raise ValueError("%s.%s is not a relation." % (model, field_name)) if is_association_proxy(attr): attr = attr.remote_attr diff --git a/flask_admin/contrib/sqla/fields.py b/flask_admin/contrib/sqla/fields.py index 441af0312..c074c077e 100644 --- a/flask_admin/contrib/sqla/fields.py +++ b/flask_admin/contrib/sqla/fields.py @@ -1,20 +1,27 @@ """ - Useful form fields for use with SQLAlchemy ORM. +Useful form fields for use with SQLAlchemy ORM. """ + import operator from sqlalchemy.orm.util import identity_key - -from wtforms.fields import SelectFieldBase, StringField +from wtforms.fields import SelectFieldBase +from wtforms.fields import StringField from wtforms.utils import unset_value from wtforms.validators import ValidationError -from .tools import get_primary_key -from flask_admin._compat import text_type, string_types, iteritems -from flask_admin.contrib.sqla.widgets import CheckboxListInput -from flask_admin.form import FormOpts, BaseForm, Select2Widget -from flask_admin.model.fields import InlineFieldList, InlineModelFormField +from flask_admin._compat import iteritems +from flask_admin._compat import string_types +from flask_admin._compat import text_type from flask_admin.babel import lazy_gettext +from flask_admin.contrib.sqla.widgets import CheckboxListInput +from flask_admin.form import BaseForm +from flask_admin.form import FormOpts +from flask_admin.form import Select2Widget +from flask_admin.model.fields import InlineFieldList +from flask_admin.model.fields import InlineModelFormField + +from .tools import get_primary_key class QuerySelectField(SelectFieldBase): @@ -47,11 +54,20 @@ class QuerySelectField(SelectFieldBase): being `None`. The label for this blank choice can be set by specifying the `blank_text` parameter. """ + widget = Select2Widget() - def __init__(self, label=None, validators=None, query_factory=None, - get_pk=None, get_label=None, allow_blank=False, - blank_text=u'', **kwargs): + def __init__( + self, + label=None, + validators=None, + query_factory=None, + get_pk=None, + get_label=None, + allow_blank=False, + blank_text="", + **kwargs, + ): super(QuerySelectField, self).__init__(label, validators, **kwargs) self.query_factory = query_factory @@ -95,14 +111,14 @@ def _get_object_list(self): def iter_choices(self): if self.allow_blank: - yield (u'__None', self.blank_text, self.data is None) + yield ("__None", self.blank_text, self.data is None) for pk, obj in self._get_object_list(): yield (pk, self.get_label(obj), obj == self.data) def process_formdata(self, valuelist): if valuelist: - if self.allow_blank and valuelist[0] == u'__None': + if self.allow_blank and valuelist[0] == "__None": self.data = None else: self._data = None @@ -114,7 +130,7 @@ def pre_validate(self, form): if self.data == obj: break else: - raise ValidationError(self.gettext(u'Not a valid choice')) + raise ValidationError(self.gettext("Not a valid choice")) class QuerySelectMultipleField(QuerySelectField): @@ -126,12 +142,15 @@ class QuerySelectMultipleField(QuerySelectField): If any of the items in the data list or submitted form data cannot be found in the query, this will result in a validation error. """ + widget = Select2Widget(multiple=True) def __init__(self, label=None, validators=None, default=None, **kwargs): if default is None: default = [] - super(QuerySelectMultipleField, self).__init__(label, validators, default=default, **kwargs) + super(QuerySelectMultipleField, self).__init__( + label, validators, default=default, **kwargs + ) self._invalid_formdata = False def _get_data(self): @@ -164,12 +183,12 @@ def process_formdata(self, valuelist): def pre_validate(self, form): if self._invalid_formdata: - raise ValidationError(self.gettext(u'Not a valid choice')) + raise ValidationError(self.gettext("Not a valid choice")) elif self.data: obj_list = list(x[1] for x in self._get_object_list()) for v in self.data: if v not in obj_list: - raise ValidationError(self.gettext(u'Not a valid choice')) + raise ValidationError(self.gettext("Not a valid choice")) class CheckboxListField(QuerySelectMultipleField): @@ -193,44 +212,47 @@ class MyView(ModelView): 'languages': CheckboxListField, } """ + widget = CheckboxListInput() # type: ignore[assignment] class HstoreForm(BaseForm): - """ Form used in InlineFormField/InlineHstoreList for HSTORE columns """ - key = StringField(lazy_gettext('Key')) - value = StringField(lazy_gettext('Value')) + """Form used in InlineFormField/InlineHstoreList for HSTORE columns""" + + key = StringField(lazy_gettext("Key")) + value = StringField(lazy_gettext("Value")) -class KeyValue(object): - """ Used by InlineHstoreList to simulate a key and a value field instead of - the single HSTORE column. """ +class KeyValue: + """Used by InlineHstoreList to simulate a key and a value field instead of + the single HSTORE column.""" + def __init__(self, key=None, value=None): self.key = key self.value = value class InlineHstoreList(InlineFieldList): - """ Version of InlineFieldList for use with Postgres HSTORE columns """ + """Version of InlineFieldList for use with Postgres HSTORE columns""" def process(self, formdata, data=unset_value, extra_filters=None): - """ SQLAlchemy returns a dict for HSTORE columns, but WTForms cannot - process a dict. This overrides `process` to convert the dict - returned by SQLAlchemy to a list of classes before processing. """ + """SQLAlchemy returns a dict for HSTORE columns, but WTForms cannot + process a dict. This overrides `process` to convert the dict + returned by SQLAlchemy to a list of classes before processing.""" if isinstance(data, dict): data = [KeyValue(k, v) for k, v in iteritems(data)] super(InlineHstoreList, self).process(formdata, data, extra_filters) def populate_obj(self, obj, name): - """ Combines each FormField key/value into a dictionary for storage """ - _fake = type(str('_fake'), (object, ), {}) + """Combines each FormField key/value into a dictionary for storage""" + _fake = type("_fake", (object,), {}) output = {} for form_field in self.entries: if not self.should_delete(form_field): fake_obj = _fake() fake_obj.data = KeyValue() - form_field.populate_obj(fake_obj, 'data') + form_field.populate_obj(fake_obj, "data") output[fake_obj.data.key] = fake_obj.data.value setattr(obj, name, output) @@ -238,7 +260,7 @@ def populate_obj(self, obj, name): class InlineModelFormList(InlineFieldList): """ - Customized inline model form list field. + Customized inline model form list field. """ form_field_type = InlineModelFormField @@ -248,18 +270,18 @@ class InlineModelFormList(InlineFieldList): def __init__(self, form, session, model, prop, inline_view, **kwargs): """ - Default constructor. - - :param form: - Form for the related model - :param session: - SQLAlchemy session - :param model: - Related model - :param prop: - Related property name - :param inline_view: - Inline view + Default constructor. + + :param form: + Form for the related model + :param session: + SQLAlchemy session + :param model: + Related model + :param prop: + Related property name + :param inline_view: + Inline view """ self.form = form self.session = session @@ -270,8 +292,10 @@ def __init__(self, form, session, model, prop, inline_view, **kwargs): self._pk = get_primary_key(model) # Generate inline form field - form_opts = FormOpts(widget_args=getattr(inline_view, 'form_widget_args', None), - form_rules=inline_view._form_rules) + form_opts = FormOpts( + widget_args=getattr(inline_view, "form_widget_args", None), + form_rules=inline_view._form_rules, + ) form_field = self.form_field_type(form, self._pk, form_opts=form_opts) @@ -321,8 +345,8 @@ def __init__(self, form, session, model, prop, inline_view, **kwargs): # Generate inline form field form_opts = FormOpts( - widget_args=getattr(inline_view, 'form_widget_args', None), - form_rules=inline_view._form_rules + widget_args=getattr(inline_view, "form_widget_args", None), + form_rules=inline_view._form_rules, ) super().__init__(form, self._pk, form_opts=form_opts, **kwargs) @@ -370,7 +394,7 @@ def populate_obj(self, model, field_name): def get_pk_from_identity(obj): # TODO: Remove me key = identity_key(instance=obj)[1] - return u':'.join(text_type(x) for x in key) + return ":".join(text_type(x) for x in key) def get_obj_pk(obj, pk): diff --git a/flask_admin/contrib/sqla/filters.py b/flask_admin/contrib/sqla/filters.py index 60367f940..e92b976bc 100644 --- a/flask_admin/contrib/sqla/filters.py +++ b/flask_admin/contrib/sqla/filters.py @@ -1,26 +1,30 @@ +import enum + +from sqlalchemy.sql import not_ +from sqlalchemy.sql import or_ + from flask_admin.babel import lazy_gettext -from flask_admin.model import filters from flask_admin.contrib.sqla import tools -from sqlalchemy.sql import not_, or_ -import enum +from flask_admin.model import filters class BaseSQLAFilter(filters.BaseFilter): """ - Base SQLAlchemy filter. + Base SQLAlchemy filter. """ + def __init__(self, column, name, options=None, data_type=None): """ - Constructor. - - :param column: - Model field - :param name: - Display name - :param options: - Fixed set of options - :param data_type: - Client data type + Constructor. + + :param column: + Model field + :param name: + Display name + :param options: + Fixed set of options + :param data_type: + Client data type """ super(BaseSQLAFilter, self).__init__(name, options, data_type) @@ -39,7 +43,7 @@ def apply(self, query, value, alias=None): return query.filter(self.get_column(alias) == value) def operation(self): - return lazy_gettext('equals') + return lazy_gettext("equals") class FilterNotEqual(BaseSQLAFilter): @@ -47,7 +51,7 @@ def apply(self, query, value, alias=None): return query.filter(self.get_column(alias) != value) def operation(self): - return lazy_gettext('not equal') + return lazy_gettext("not equal") class FilterLike(BaseSQLAFilter): @@ -56,7 +60,7 @@ def apply(self, query, value, alias=None): return query.filter(self.get_column(alias).ilike(stmt)) def operation(self): - return lazy_gettext('contains') + return lazy_gettext("contains") class FilterNotLike(BaseSQLAFilter): @@ -65,7 +69,7 @@ def apply(self, query, value, alias=None): return query.filter(~self.get_column(alias).ilike(stmt)) def operation(self): - return lazy_gettext('not contains') + return lazy_gettext("not contains") class FilterGreater(BaseSQLAFilter): @@ -73,7 +77,7 @@ def apply(self, query, value, alias=None): return query.filter(self.get_column(alias) > value) def operation(self): - return lazy_gettext('greater than') + return lazy_gettext("greater than") class FilterSmaller(BaseSQLAFilter): @@ -81,32 +85,34 @@ def apply(self, query, value, alias=None): return query.filter(self.get_column(alias) < value) def operation(self): - return lazy_gettext('smaller than') + return lazy_gettext("smaller than") class FilterEmpty(BaseSQLAFilter, filters.BaseBooleanFilter): def apply(self, query, value, alias=None): - if value == '1': + if value == "1": return query.filter(self.get_column(alias) == None) # noqa: E711 else: return query.filter(self.get_column(alias) != None) # noqa: E711 def operation(self): - return lazy_gettext('empty') + return lazy_gettext("empty") class FilterInList(BaseSQLAFilter): def __init__(self, column, name, options=None, data_type=None): - super(FilterInList, self).__init__(column, name, options, data_type='select2-tags') + super(FilterInList, self).__init__( + column, name, options, data_type="select2-tags" + ) def clean(self, value): - return [v.strip() for v in value.split(',') if v.strip()] + return [v.strip() for v in value.split(",") if v.strip()] def apply(self, query, value, alias=None): return query.filter(self.get_column(alias).in_(value)) def operation(self): - return lazy_gettext('in list') + return lazy_gettext("in list") class FilterNotInList(FilterInList): @@ -116,7 +122,7 @@ def apply(self, query, value, alias=None): return query.filter(or_(~column.in_(value), column == None)) # noqa: E711 def operation(self): - return lazy_gettext('not in list') + return lazy_gettext("not in list") # Customized type filters @@ -194,10 +200,9 @@ class DateSmallerFilter(FilterSmaller, filters.BaseDateFilter): class DateBetweenFilter(BaseSQLAFilter, filters.BaseDateBetweenFilter): def __init__(self, column, name, options=None, data_type=None): - super(DateBetweenFilter, self).__init__(column, - name, - options, - data_type='daterangepicker') + super(DateBetweenFilter, self).__init__( + column, name, options, data_type="daterangepicker" + ) def apply(self, query, value, alias=None): start, end = value @@ -210,7 +215,7 @@ def apply(self, query, value, alias=None): return query.filter(not_(self.get_column(alias).between(start, end))) def operation(self): - return lazy_gettext('not between') + return lazy_gettext("not between") class DateTimeEqualFilter(FilterEqual, filters.BaseDateTimeFilter): @@ -231,10 +236,9 @@ class DateTimeSmallerFilter(FilterSmaller, filters.BaseDateTimeFilter): class DateTimeBetweenFilter(BaseSQLAFilter, filters.BaseDateTimeBetweenFilter): def __init__(self, column, name, options=None, data_type=None): - super(DateTimeBetweenFilter, self).__init__(column, - name, - options, - data_type='datetimerangepicker') + super(DateTimeBetweenFilter, self).__init__( + column, name, options, data_type="datetimerangepicker" + ) def apply(self, query, value, alias=None): start, end = value @@ -247,7 +251,7 @@ def apply(self, query, value, alias=None): return query.filter(not_(self.get_column(alias).between(start, end))) def operation(self): - return lazy_gettext('not between') + return lazy_gettext("not between") class TimeEqualFilter(FilterEqual, filters.BaseTimeFilter): @@ -268,10 +272,9 @@ class TimeSmallerFilter(FilterSmaller, filters.BaseTimeFilter): class TimeBetweenFilter(BaseSQLAFilter, filters.BaseTimeBetweenFilter): def __init__(self, column, name, options=None, data_type=None): - super(TimeBetweenFilter, self).__init__(column, - name, - options, - data_type='timerangepicker') + super(TimeBetweenFilter, self).__init__( + column, name, options, data_type="timerangepicker" + ) def apply(self, query, value, alias=None): start, end = value @@ -284,7 +287,7 @@ def apply(self, query, value, alias=None): return query.filter(not_(self.get_column(alias).between(start, end))) def operation(self): - return lazy_gettext('not between') + return lazy_gettext("not between") class EnumEqualFilter(FilterEqual): @@ -453,32 +456,89 @@ class UuidFilterNotInList(filters.BaseUuidListFilter, FilterNotInList): # Base SQLA filter field converter class FilterConverter(filters.BaseFilterConverter): - strings = (FilterLike, FilterNotLike, FilterEqual, FilterNotEqual, - FilterEmpty, FilterInList, FilterNotInList) - string_key_filters = (FilterEqual, FilterNotEqual, FilterEmpty, FilterInList, FilterNotInList) - int_filters = (IntEqualFilter, IntNotEqualFilter, IntGreaterFilter, - IntSmallerFilter, FilterEmpty, IntInListFilter, - IntNotInListFilter) - float_filters = (FloatEqualFilter, FloatNotEqualFilter, FloatGreaterFilter, - FloatSmallerFilter, FilterEmpty, FloatInListFilter, - FloatNotInListFilter) + strings = ( + FilterLike, + FilterNotLike, + FilterEqual, + FilterNotEqual, + FilterEmpty, + FilterInList, + FilterNotInList, + ) + string_key_filters = ( + FilterEqual, + FilterNotEqual, + FilterEmpty, + FilterInList, + FilterNotInList, + ) + int_filters = ( + IntEqualFilter, + IntNotEqualFilter, + IntGreaterFilter, + IntSmallerFilter, + FilterEmpty, + IntInListFilter, + IntNotInListFilter, + ) + float_filters = ( + FloatEqualFilter, + FloatNotEqualFilter, + FloatGreaterFilter, + FloatSmallerFilter, + FilterEmpty, + FloatInListFilter, + FloatNotInListFilter, + ) bool_filters = (BooleanEqualFilter, BooleanNotEqualFilter) - enum = (EnumEqualFilter, EnumFilterNotEqual, EnumFilterEmpty, EnumFilterInList, - EnumFilterNotInList) - date_filters = (DateEqualFilter, DateNotEqualFilter, DateGreaterFilter, - DateSmallerFilter, DateBetweenFilter, DateNotBetweenFilter, - FilterEmpty) - datetime_filters = (DateTimeEqualFilter, DateTimeNotEqualFilter, - DateTimeGreaterFilter, DateTimeSmallerFilter, - DateTimeBetweenFilter, DateTimeNotBetweenFilter, - FilterEmpty) - time_filters = (TimeEqualFilter, TimeNotEqualFilter, TimeGreaterFilter, - TimeSmallerFilter, TimeBetweenFilter, TimeNotBetweenFilter, - FilterEmpty) - choice_type_filters = (ChoiceTypeEqualFilter, ChoiceTypeNotEqualFilter, - ChoiceTypeLikeFilter, ChoiceTypeNotLikeFilter, FilterEmpty) - uuid_filters = (UuidFilterEqual, UuidFilterNotEqual, FilterEmpty, - UuidFilterInList, UuidFilterNotInList) + enum = ( + EnumEqualFilter, + EnumFilterNotEqual, + EnumFilterEmpty, + EnumFilterInList, + EnumFilterNotInList, + ) + date_filters = ( + DateEqualFilter, + DateNotEqualFilter, + DateGreaterFilter, + DateSmallerFilter, + DateBetweenFilter, + DateNotBetweenFilter, + FilterEmpty, + ) + datetime_filters = ( + DateTimeEqualFilter, + DateTimeNotEqualFilter, + DateTimeGreaterFilter, + DateTimeSmallerFilter, + DateTimeBetweenFilter, + DateTimeNotBetweenFilter, + FilterEmpty, + ) + time_filters = ( + TimeEqualFilter, + TimeNotEqualFilter, + TimeGreaterFilter, + TimeSmallerFilter, + TimeBetweenFilter, + TimeNotBetweenFilter, + FilterEmpty, + ) + choice_type_filters = ( + ChoiceTypeEqualFilter, + ChoiceTypeNotEqualFilter, + ChoiceTypeLikeFilter, + ChoiceTypeNotLikeFilter, + FilterEmpty, + ) + uuid_filters = ( + UuidFilterEqual, + UuidFilterNotEqual, + FilterEmpty, + UuidFilterInList, + UuidFilterNotInList, + ) arrow_type_filters = (DateTimeGreaterFilter, DateTimeSmallerFilter, FilterEmpty) def convert(self, type_name, column, name, **kwargs): @@ -489,60 +549,80 @@ def convert(self, type_name, column, name, **kwargs): return None - @filters.convert('string', 'char', 'unicode', 'varchar', 'tinytext', - 'text', 'mediumtext', 'longtext', 'unicodetext', - 'nchar', 'nvarchar', 'ntext', 'citext', 'emailtype', - 'URLType', 'IPAddressType') + @filters.convert( + "string", + "char", + "unicode", + "varchar", + "tinytext", + "text", + "mediumtext", + "longtext", + "unicodetext", + "nchar", + "nvarchar", + "ntext", + "citext", + "emailtype", + "URLType", + "IPAddressType", + ) def conv_string(self, column, name, **kwargs): return [f(column, name, **kwargs) for f in self.strings] - @filters.convert('UUIDType', 'ColorType', 'TimezoneType', 'CurrencyType') + @filters.convert("UUIDType", "ColorType", "TimezoneType", "CurrencyType") def conv_string_keys(self, column, name, **kwargs): return [f(column, name, **kwargs) for f in self.string_key_filters] - @filters.convert('boolean', 'tinyint') + @filters.convert("boolean", "tinyint") def conv_bool(self, column, name, **kwargs): return [f(column, name, **kwargs) for f in self.bool_filters] - @filters.convert('int', 'integer', 'smallinteger', 'smallint', - 'biginteger', 'bigint', 'mediumint') + @filters.convert( + "int", + "integer", + "smallinteger", + "smallint", + "biginteger", + "bigint", + "mediumint", + ) def conv_int(self, column, name, **kwargs): return [f(column, name, **kwargs) for f in self.int_filters] - @filters.convert('float', 'real', 'decimal', 'numeric', 'double_precision', 'double') + @filters.convert( + "float", "real", "decimal", "numeric", "double_precision", "double" + ) def conv_float(self, column, name, **kwargs): return [f(column, name, **kwargs) for f in self.float_filters] - @filters.convert('date') + @filters.convert("date") def conv_date(self, column, name, **kwargs): return [f(column, name, **kwargs) for f in self.date_filters] - @filters.convert('datetime', 'datetime2', 'timestamp', 'smalldatetime') + @filters.convert("datetime", "datetime2", "timestamp", "smalldatetime") def conv_datetime(self, column, name, **kwargs): return [f(column, name, **kwargs) for f in self.datetime_filters] - @filters.convert('time') + @filters.convert("time") def conv_time(self, column, name, **kwargs): return [f(column, name, **kwargs) for f in self.time_filters] - @filters.convert('ChoiceType') + @filters.convert("ChoiceType") def conv_sqla_utils_choice(self, column, name, **kwargs): return [f(column, name, **kwargs) for f in self.choice_type_filters] - @filters.convert('ArrowType') + @filters.convert("ArrowType") def conv_sqla_utils_arrow(self, column, name, **kwargs): return [f(column, name, **kwargs) for f in self.arrow_type_filters] - @filters.convert('enum') + @filters.convert("enum") def conv_enum(self, column, name, options=None, **kwargs): if not options: - options = [ - (v, v) - for v in column.type.enums - ] + options = [(v, v) for v in column.type.enums] return [f(column, name, options, **kwargs) for f in self.enum] - @filters.convert('uuid') + @filters.convert("uuid") def conv_uuid(self, column, name, **kwargs): return [f(column, name, **kwargs) for f in self.uuid_filters] diff --git a/flask_admin/contrib/sqla/form.py b/flask_admin/contrib/sqla/form.py index ea0dbc847..ddc3eb829 100644 --- a/flask_admin/contrib/sqla/form.py +++ b/flask_admin/contrib/sqla/form.py @@ -1,32 +1,49 @@ import warnings -from enum import Enum, EnumMeta +from enum import Enum +from enum import EnumMeta -from wtforms import fields, validators -from sqlalchemy import Boolean, Column +from sqlalchemy import Boolean +from sqlalchemy import Column from sqlalchemy.orm import ColumnProperty +from wtforms import fields +from wtforms import validators from flask_admin import form -from flask_admin.model.form import (converts, ModelConverterBase, - InlineModelConverterBase, FieldPlaceholder) -from flask_admin.model.fields import AjaxSelectField, AjaxSelectMultipleField -from flask_admin.model.helpers import prettify_name from flask_admin._backwards import get_property -from flask_admin._compat import iteritems, text_type - -from .validators import Unique, valid_currency, valid_color, TimeZoneValidator -from .fields import (QuerySelectField, QuerySelectMultipleField, - InlineModelFormList, InlineHstoreList, HstoreForm, - InlineModelOneToOneField) +from flask_admin._compat import iteritems +from flask_admin._compat import text_type +from flask_admin.model.fields import AjaxSelectField +from flask_admin.model.fields import AjaxSelectMultipleField from flask_admin.model.fields import InlineFormField -from .tools import (has_multiple_pks, filter_foreign_columns, - get_field_with_path, is_association_proxy, is_relationship) +from flask_admin.model.form import converts +from flask_admin.model.form import FieldPlaceholder +from flask_admin.model.form import InlineModelConverterBase +from flask_admin.model.form import ModelConverterBase +from flask_admin.model.helpers import prettify_name + from .ajax import create_ajax_loader +from .fields import HstoreForm +from .fields import InlineHstoreList +from .fields import InlineModelFormList +from .fields import InlineModelOneToOneField +from .fields import QuerySelectField +from .fields import QuerySelectMultipleField +from .tools import filter_foreign_columns +from .tools import get_field_with_path +from .tools import has_multiple_pks +from .tools import is_association_proxy +from .tools import is_relationship +from .validators import TimeZoneValidator +from .validators import Unique +from .validators import valid_color +from .validators import valid_currency class AdminModelConverter(ModelConverterBase): """ - SQLAlchemy model to form converter + SQLAlchemy model to form converter """ + def __init__(self, session, view): super(AdminModelConverter, self).__init__() @@ -35,37 +52,37 @@ def __init__(self, session, view): def _get_label(self, name, field_args): """ - Label for field name. If it is not specified explicitly, - then the views prettify_name method is used to find it. + Label for field name. If it is not specified explicitly, + then the views prettify_name method is used to find it. - :param field_args: - Dictionary with additional field arguments + :param field_args: + Dictionary with additional field arguments """ - if 'label' in field_args: - return field_args['label'] + if "label" in field_args: + return field_args["label"] - column_labels = get_property(self.view, 'column_labels', 'rename_columns') + column_labels = get_property(self.view, "column_labels", "rename_columns") if column_labels: return column_labels.get(name) - prettify_override = getattr(self.view, 'prettify_name', None) + prettify_override = getattr(self.view, "prettify_name", None) if prettify_override: return prettify_override(name) return prettify_name(name) def _get_description(self, name, field_args): - if 'description' in field_args: - return field_args['description'] + if "description" in field_args: + return field_args["description"] - column_descriptions = getattr(self.view, 'column_descriptions', None) + column_descriptions = getattr(self.view, "column_descriptions", None) if column_descriptions: return column_descriptions.get(name) def _get_field_override(self, name): - form_overrides = getattr(self.view, 'form_overrides', None) + form_overrides = getattr(self.view, "form_overrides", None) if form_overrides: return form_overrides.get(name) @@ -73,7 +90,7 @@ def _get_field_override(self, name): return None def _model_select_field(self, prop, multiple, remote_model, **kwargs): - loader = getattr(self.view, '_form_ajax_refs', {}).get(prop.key) + loader = getattr(self.view, "_form_ajax_refs", {}).get(prop.key) if loader: if multiple: @@ -81,8 +98,8 @@ def _model_select_field(self, prop, multiple, remote_model, **kwargs): else: return AjaxSelectField(loader, **kwargs) - if 'query_factory' not in kwargs: - kwargs['query_factory'] = lambda: self.session.query(remote_model) + if "query_factory" not in kwargs: + kwargs["query_factory"] = lambda: self.session.query(remote_model) if multiple: return QuerySelectMultipleField(**kwargs) @@ -91,7 +108,7 @@ def _model_select_field(self, prop, multiple, remote_model, **kwargs): def _convert_relation(self, name, prop, property_is_association_proxy, kwargs): # Check if relation is specified - form_columns = getattr(self.view, 'form_columns', None) + form_columns = getattr(self.view, "form_columns", None) if form_columns and name not in form_columns: return None @@ -103,28 +120,35 @@ def _convert_relation(self, name, prop, property_is_association_proxy, kwargs): if not column.foreign_keys: column = prop.local_remote_pairs[0][1] - kwargs['label'] = self._get_label(name, kwargs) - kwargs['description'] = self._get_description(name, kwargs) + kwargs["label"] = self._get_label(name, kwargs) + kwargs["description"] = self._get_description(name, kwargs) # determine optional/required, or respect existing requirement_options = (validators.Optional, validators.InputRequired) - requirement_validator_specified = any(isinstance(v, requirement_options) for v in kwargs['validators']) - if property_is_association_proxy or column.nullable or prop.direction.name != 'MANYTOONE': - kwargs['allow_blank'] = True + requirement_validator_specified = any( + isinstance(v, requirement_options) for v in kwargs["validators"] + ) + if ( + property_is_association_proxy + or column.nullable + or prop.direction.name != "MANYTOONE" + ): + kwargs["allow_blank"] = True if not requirement_validator_specified: - kwargs['validators'].append(validators.Optional()) + kwargs["validators"].append(validators.Optional()) else: - kwargs['allow_blank'] = False + kwargs["allow_blank"] = False if not requirement_validator_specified: - kwargs['validators'].append(validators.InputRequired()) + kwargs["validators"].append(validators.InputRequired()) # Override field type if necessary override = self._get_field_override(prop.key) if override: return override(**kwargs) - multiple = (property_is_association_proxy or - (prop.direction.name in ('ONETOMANY', 'MANYTOMANY') and prop.uselist)) + multiple = property_is_association_proxy or ( + prop.direction.name in ("ONETOMANY", "MANYTOMANY") and prop.uselist + ) return self._model_select_field(prop, multiple, remote_model, **kwargs) def convert(self, model, mapper, name, prop, field_args, hidden_pk): @@ -132,27 +156,28 @@ def convert(self, model, mapper, name, prop, field_args, hidden_pk): if isinstance(prop, FieldPlaceholder): return form.recreate_field(prop.field) - kwargs = { - 'validators': [], - 'filters': [] - } + kwargs = {"validators": [], "filters": []} if field_args: kwargs.update(field_args) - if kwargs['validators']: + if kwargs["validators"]: # Create a copy of the list since we will be modifying it. - kwargs['validators'] = list(kwargs['validators']) + kwargs["validators"] = list(kwargs["validators"]) # Check if it is relation or property - if hasattr(prop, 'direction') or is_association_proxy(prop): + if hasattr(prop, "direction") or is_association_proxy(prop): property_is_association_proxy = is_association_proxy(prop) if property_is_association_proxy: - if not hasattr(prop.remote_attr, 'prop'): - raise Exception('Association proxy referencing another association proxy is not supported.') + if not hasattr(prop.remote_attr, "prop"): + raise Exception( + "Association proxy referencing another association proxy is not supported." + ) prop = prop.remote_attr.prop - return self._convert_relation(name, prop, property_is_association_proxy, kwargs) - elif hasattr(prop, 'columns'): # Ignore pk/fk + return self._convert_relation( + name, prop, property_is_association_proxy, kwargs + ) + elif hasattr(prop, "columns"): # Ignore pk/fk # Check if more than one column mapped to the property if len(prop.columns) > 1 and not isinstance(prop, ColumnProperty): columns = filter_foreign_columns(model.__table__, prop.columns) @@ -160,7 +185,10 @@ def convert(self, model, mapper, name, prop, field_args, hidden_pk): if len(columns) == 0: return None elif len(columns) > 1: - warnings.warn('Can not convert multiple-column properties (%s.%s)' % (model, prop.key)) + warnings.warn( + "Can not convert multiple-column properties (%s.%s)" + % (model, prop.key) + ) return None column = columns[0] @@ -168,7 +196,7 @@ def convert(self, model, mapper, name, prop, field_args, hidden_pk): # Grab column column = prop.columns[0] - form_columns = getattr(self.view, 'form_columns', None) or () + form_columns = getattr(self.view, "form_columns", None) or () # Do not display foreign keys - use relations, except when explicitly instructed if column.foreign_keys and prop.key not in form_columns: @@ -192,52 +220,48 @@ def convert(self, model, mapper, name, prop, field_args, hidden_pk): # Current Unique Validator does not work with multicolumns-pks if not has_multiple_pks(model): - kwargs['validators'].append(Unique(self.session, - model, - column)) + kwargs["validators"].append(Unique(self.session, model, column)) unique = True # If field is unique, validate it if column.unique and not unique: - kwargs['validators'].append(Unique(self.session, - model, - column)) + kwargs["validators"].append(Unique(self.session, model, column)) - optional_types = getattr(self.view, 'form_optional_types', (Boolean,)) + optional_types = getattr(self.view, "form_optional_types", (Boolean,)) if ( - not column.nullable and - not isinstance(column.type, optional_types) and - not column.default and - not column.server_default + not column.nullable + and not isinstance(column.type, optional_types) + and not column.default + and not column.server_default ): - kwargs['validators'].append(validators.InputRequired()) + kwargs["validators"].append(validators.InputRequired()) # Apply label and description if it isn't inline form field if self.view.model == mapper.class_: - kwargs['label'] = self._get_label(prop.key, kwargs) - kwargs['description'] = self._get_description(prop.key, kwargs) + kwargs["label"] = self._get_label(prop.key, kwargs) + kwargs["description"] = self._get_description(prop.key, kwargs) # Figure out default value - default = getattr(column, 'default', None) + default = getattr(column, "default", None) value = None if default is not None: - value = getattr(default, 'arg', None) + value = getattr(default, "arg", None) if value is not None: - if getattr(default, 'is_callable', False): + if getattr(default, "is_callable", False): value = lambda: default.arg(None) # noqa: E731 else: - if not getattr(default, 'is_scalar', True): + if not getattr(default, "is_scalar", True): value = None if value is not None: - kwargs['default'] = value + kwargs["default"] = value # Check nullable if column.nullable: - kwargs['validators'].append(validators.Optional()) + kwargs["validators"].append(validators.Optional()) # Override field type if necessary override = self._get_field_override(prop.key) @@ -245,14 +269,12 @@ def convert(self, model, mapper, name, prop, field_args, hidden_pk): return override(**kwargs) # Check if a list of 'form_choices' are specified - form_choices = getattr(self.view, 'form_choices', None) + form_choices = getattr(self.view, "form_choices", None) if mapper.class_ == self.view.model and form_choices: choices = form_choices.get(prop.key) if choices: return form.Select2Field( - choices=choices, - allow_blank=column.nullable, - **kwargs + choices=choices, allow_blank=column.nullable, **kwargs ) # Run converter @@ -261,45 +283,50 @@ def convert(self, model, mapper, name, prop, field_args, hidden_pk): if converter is None: return None - return converter(model=model, mapper=mapper, prop=prop, - column=column, field_args=kwargs) + return converter( + model=model, mapper=mapper, prop=prop, column=column, field_args=kwargs + ) return None @classmethod def _nullable_common(cls, column, field_args): if column.nullable: - filters = field_args.get('filters', []) + filters = field_args.get("filters", []) filters.append(lambda x: x or None) - field_args['filters'] = filters + field_args["filters"] = filters @classmethod def _string_common(cls, column, field_args, **extra): - if hasattr(column.type, 'length') and isinstance(column.type.length, int) and column.type.length: - field_args['validators'].append(validators.Length(max=column.type.length)) + if ( + hasattr(column.type, "length") + and isinstance(column.type.length, int) + and column.type.length + ): + field_args["validators"].append(validators.Length(max=column.type.length)) cls._nullable_common(column, field_args) - @converts('String') # includes VARCHAR, CHAR, and Unicode + @converts("String") # includes VARCHAR, CHAR, and Unicode def conv_String(self, column, field_args, **extra): self._string_common(column=column, field_args=field_args, **extra) return fields.StringField(**field_args) - @converts('sqlalchemy.sql.sqltypes.Enum') + @converts("sqlalchemy.sql.sqltypes.Enum") def convert_enum(self, column, field_args, **extra): available_choices = [(f, f) for f in column.type.enums] accepted_values = [choice[0] for choice in available_choices] if column.nullable: - field_args['allow_blank'] = column.nullable + field_args["allow_blank"] = column.nullable accepted_values.append(None) self._nullable_common(column, field_args) - field_args['choices'] = available_choices - field_args['validators'].append(validators.AnyOf(accepted_values)) - field_args['coerce'] = lambda v: v.name if isinstance(v, Enum) else text_type(v) + field_args["choices"] = available_choices + field_args["validators"].append(validators.AnyOf(accepted_values)) + field_args["coerce"] = lambda v: v.name if isinstance(v, Enum) else text_type(v) return form.Select2Field(**field_args) - @converts('sqlalchemy_utils.types.choice.ChoiceType') + @converts("sqlalchemy_utils.types.choice.ChoiceType") def convert_choice_type(self, column, field_args, **extra): available_choices = [] # choices can either be specified as an enum, or as a list of tuples @@ -307,124 +334,139 @@ def convert_choice_type(self, column, field_args, **extra): available_choices = [(f.value, f.name) for f in column.type.choices] else: available_choices = column.type.choices - accepted_values = [choice[0] if isinstance(choice, tuple) else choice.value for choice in available_choices] + accepted_values = [ + choice[0] if isinstance(choice, tuple) else choice.value + for choice in available_choices + ] if column.nullable: - field_args['allow_blank'] = column.nullable + field_args["allow_blank"] = column.nullable accepted_values.append(None) self._nullable_common(column, field_args) - field_args['choices'] = available_choices - field_args['validators'].append(validators.AnyOf(accepted_values)) - field_args['coerce'] = choice_type_coerce_factory(column.type) + field_args["choices"] = available_choices + field_args["validators"].append(validators.AnyOf(accepted_values)) + field_args["coerce"] = choice_type_coerce_factory(column.type) return form.Select2Field(**field_args) - @converts('Text', 'LargeBinary', 'Binary', 'CIText') # includes UnicodeText + @converts("Text", "LargeBinary", "Binary", "CIText") # includes UnicodeText def conv_Text(self, field_args, **extra): self._string_common(field_args=field_args, **extra) return fields.TextAreaField(**field_args) - @converts('Boolean', 'sqlalchemy.dialects.mssql.base.BIT') + @converts("Boolean", "sqlalchemy.dialects.mssql.base.BIT") def conv_Boolean(self, field_args, **extra): return fields.BooleanField(**field_args) - @converts('Date') + @converts("Date") def convert_date(self, field_args, **extra): - field_args['widget'] = form.DatePickerWidget() + field_args["widget"] = form.DatePickerWidget() return fields.DateField(**field_args) - @converts('DateTime') # includes TIMESTAMP + @converts("DateTime") # includes TIMESTAMP def convert_datetime(self, field_args, **extra): return form.DateTimeField(**field_args) - @converts('Time') + @converts("Time") def convert_time(self, field_args, **extra): return form.TimeField(**field_args) - @converts('sqlalchemy_utils.types.arrow.ArrowType') + @converts("sqlalchemy_utils.types.arrow.ArrowType") def convert_arrow_time(self, field_args, **extra): return form.DateTimeField(**field_args) - @converts('sqlalchemy_utils.types.email.EmailType') + @converts("sqlalchemy_utils.types.email.EmailType") def convert_email(self, field_args, column=None, **extra): self._nullable_common(column, field_args) - field_args['validators'].append(validators.Email()) + field_args["validators"].append(validators.Email()) return fields.StringField(**field_args) - @converts('sqlalchemy_utils.types.url.URLType') + @converts("sqlalchemy_utils.types.url.URLType") def convert_url(self, field_args, **extra): - field_args['validators'].append(validators.URL()) - field_args['filters'] = [avoid_empty_strings] # don't accept empty strings, or whitespace + field_args["validators"].append(validators.URL()) + field_args["filters"] = [ + avoid_empty_strings + ] # don't accept empty strings, or whitespace return fields.StringField(**field_args) - @converts('sqlalchemy_utils.types.ip_address.IPAddressType') + @converts("sqlalchemy_utils.types.ip_address.IPAddressType") def convert_ip_address(self, field_args, **extra): - field_args['validators'].append(validators.IPAddress()) + field_args["validators"].append(validators.IPAddress()) return fields.StringField(**field_args) - @converts('sqlalchemy_utils.types.color.ColorType') + @converts("sqlalchemy_utils.types.color.ColorType") def convert_color(self, field_args, **extra): - field_args['validators'].append(valid_color) - field_args['filters'] = [avoid_empty_strings] # don't accept empty strings, or whitespace + field_args["validators"].append(valid_color) + field_args["filters"] = [ + avoid_empty_strings + ] # don't accept empty strings, or whitespace return fields.StringField(**field_args) - @converts('sqlalchemy_utils.types.currency.CurrencyType') + @converts("sqlalchemy_utils.types.currency.CurrencyType") def convert_currency(self, field_args, **extra): - field_args['validators'].append(valid_currency) - field_args['filters'] = [avoid_empty_strings] # don't accept empty strings, or whitespace + field_args["validators"].append(valid_currency) + field_args["filters"] = [ + avoid_empty_strings + ] # don't accept empty strings, or whitespace return fields.StringField(**field_args) - @converts('sqlalchemy_utils.types.timezone.TimezoneType') + @converts("sqlalchemy_utils.types.timezone.TimezoneType") def convert_timezone(self, column, field_args, **extra): - - field_args['validators'].append(TimeZoneValidator(coerce_function=column.type._coerce)) + field_args["validators"].append( + TimeZoneValidator(coerce_function=column.type._coerce) + ) return fields.StringField(**field_args) - @converts('Integer') # includes BigInteger and SmallInteger + @converts("Integer") # includes BigInteger and SmallInteger def handle_integer_types(self, column, field_args, **extra): - unsigned = getattr(column.type, 'unsigned', False) + unsigned = getattr(column.type, "unsigned", False) if unsigned: - field_args['validators'].append(validators.NumberRange(min=0)) + field_args["validators"].append(validators.NumberRange(min=0)) return fields.IntegerField(**field_args) - @converts('Numeric') # includes DECIMAL, Float/FLOAT, REAL, and DOUBLE + @converts("Numeric") # includes DECIMAL, Float/FLOAT, REAL, and DOUBLE def handle_decimal_types(self, column, field_args, **extra): # override default decimal places limit, use database defaults instead - field_args.setdefault('places', None) + field_args.setdefault("places", None) return fields.DecimalField(**field_args) - @converts('sqlalchemy.dialects.postgresql.base.INET') + @converts("sqlalchemy.dialects.postgresql.base.INET") def conv_PGInet(self, field_args, **extra): - field_args.setdefault('label', u'IP Address') - field_args['validators'].append(validators.IPAddress()) + field_args.setdefault("label", "IP Address") + field_args["validators"].append(validators.IPAddress()) return fields.StringField(**field_args) - @converts('sqlalchemy.dialects.postgresql.base.MACADDR') + @converts("sqlalchemy.dialects.postgresql.base.MACADDR") def conv_PGMacaddr(self, field_args, **extra): - field_args.setdefault('label', u'MAC Address') - field_args['validators'].append(validators.MacAddress()) + field_args.setdefault("label", "MAC Address") + field_args["validators"].append(validators.MacAddress()) return fields.StringField(**field_args) - @converts('sqlalchemy.dialects.postgresql.base.UUID', - 'sqlalchemy_utils.types.uuid.UUIDType') + @converts( + "sqlalchemy.dialects.postgresql.base.UUID", + "sqlalchemy_utils.types.uuid.UUIDType", + ) def conv_PGUuid(self, field_args, **extra): - field_args.setdefault('label', u'UUID') - field_args['validators'].append(validators.UUID()) - field_args['filters'] = [avoid_empty_strings] # don't accept empty strings, or whitespace + field_args.setdefault("label", "UUID") + field_args["validators"].append(validators.UUID()) + field_args["filters"] = [ + avoid_empty_strings + ] # don't accept empty strings, or whitespace return fields.StringField(**field_args) - @converts('sqlalchemy.dialects.postgresql.base.ARRAY', - 'sqlalchemy.sql.sqltypes.ARRAY') + @converts( + "sqlalchemy.dialects.postgresql.base.ARRAY", "sqlalchemy.sql.sqltypes.ARRAY" + ) def conv_ARRAY(self, field_args, **extra): return form.Select2TagsField(save_as_list=True, **field_args) - @converts('HSTORE') + @converts("HSTORE") def conv_HSTORE(self, field_args, **extra): - inner_form = field_args.pop('form', HstoreForm) + inner_form = field_args.pop("form", HstoreForm) return InlineHstoreList(InlineFormField(inner_form), **field_args) - @converts('JSON') + @converts("JSON") def convert_JSON(self, field_args, **extra): return form.JSONField(**field_args) @@ -451,9 +493,9 @@ def choice_type_coerce_factory(type_): choices = type_.choices if isinstance(choices, type) and issubclass(choices, Enum): - key, choice_cls = 'value', choices + key, choice_cls = "value", choices else: - key, choice_cls = 'code', Choice + key, choice_cls = "code", Choice def choice_coerce(value): if value is None: @@ -461,56 +503,60 @@ def choice_coerce(value): if isinstance(value, choice_cls): return getattr(value, key) return type_.python_type(value) + return choice_coerce def _resolve_prop(prop): """ - Resolve proxied property + Resolve proxied property - :param prop: - Property to resolve + :param prop: + Property to resolve """ # Try to see if it is proxied property - if hasattr(prop, '_proxied_property'): + if hasattr(prop, "_proxied_property"): return prop._proxied_property return prop # Get list of fields and generate form -def get_form(model, converter, - base_class=form.BaseForm, - only=None, - exclude=None, - field_args=None, - hidden_pk=False, - ignore_hidden=True, - extra_fields=None): +def get_form( + model, + converter, + base_class=form.BaseForm, + only=None, + exclude=None, + field_args=None, + hidden_pk=False, + ignore_hidden=True, + extra_fields=None, +): """ - Generate form from the model. - - :param model: - Model to generate form from - :param converter: - Converter class to use - :param base_class: - Base form class - :param only: - Include fields - :param exclude: - Exclude fields - :param field_args: - Dictionary with additional field arguments - :param hidden_pk: - Generate hidden field with model primary key or not - :param ignore_hidden: - If set to True (default), will ignore properties that start with underscore + Generate form from the model. + + :param model: + Model to generate form from + :param converter: + Converter class to use + :param base_class: + Base form class + :param only: + Include fields + :param exclude: + Exclude fields + :param field_args: + Dictionary with additional field arguments + :param hidden_pk: + Generate hidden field with model primary key or not + :param ignore_hidden: + If set to True (default), will ignore properties that start with underscore """ # TODO: Support new 0.8 API - if not hasattr(model, '_sa_class_manager'): - raise TypeError('model must be a sqlalchemy mapped model') + if not hasattr(model, "_sa_class_manager"): + raise TypeError("model must be a sqlalchemy mapped model") mapper = model._sa_class_manager.mapper field_args = field_args or {} @@ -518,26 +564,31 @@ def get_form(model, converter, properties = ((p.key, p) for p in mapper.attrs) if only: + def find(name): # If field is in extra_fields, it has higher priority if extra_fields and name in extra_fields: return name, FieldPlaceholder(extra_fields[name]) - column, path = get_field_with_path(model, name, return_remote_proxy_attr=False) + column, path = get_field_with_path( + model, name, return_remote_proxy_attr=False + ) if path and not (is_relationship(column) or is_association_proxy(column)): - raise Exception("form column is located in another table and " - "requires inline_models: {0}".format(name)) + raise Exception( + "form column is located in another table and " + f"requires inline_models: {name}" + ) if is_association_proxy(column): return name, column relation_name = column.key - if column is not None and hasattr(column, 'property'): + if column is not None and hasattr(column, "property"): return relation_name, column.property - raise ValueError('Invalid model property name %s.%s' % (model, name)) + raise ValueError("Invalid model property name %s.%s" % (model, name)) # Filter properties while maintaining property order in 'only' list properties = (find(x) for x in only) @@ -547,12 +598,14 @@ def find(name): field_dict = {} for name, p in properties: # Ignore protected properties - if ignore_hidden and name.startswith('_'): + if ignore_hidden and name.startswith("_"): continue prop = _resolve_prop(p) - field = converter.convert(model, mapper, name, prop, field_args.get(name), hidden_pk) + field = converter.convert( + model, mapper, name, prop, field_args.get(name), hidden_pk + ) if field is not None: field_dict[name] = field @@ -561,12 +614,12 @@ def find(name): for name, field in iteritems(extra_fields): field_dict[name] = form.recreate_field(field) - return type(model.__name__ + 'Form', (base_class, ), field_dict) + return type(model.__name__ + "Form", (base_class,), field_dict) class InlineModelConverter(InlineModelConverterBase): """ - Inline model form helper. + Inline model form helper. """ inline_field_list_type = InlineModelFormList @@ -579,15 +632,15 @@ class InlineModelConverter(InlineModelConverterBase): def __init__(self, session, view, model_converter): """ - Constructor. - - :param session: - SQLAlchemy session - :param view: - Flask-Admin view object - :param model_converter: - Model converter class. Will be automatically instantiated with - appropriate `InlineFormAdmin` instance. + Constructor. + + :param session: + SQLAlchemy session + :param view: + Flask-Admin view object + :param model_converter: + Model converter class. Will be automatically instantiated with + appropriate `InlineFormAdmin` instance. """ super(InlineModelConverter, self).__init__(view) self.session = session @@ -598,17 +651,17 @@ def get_info(self, p): # Special case for model instances if info is None: - if hasattr(p, '_sa_class_manager'): + if hasattr(p, "_sa_class_manager"): return self.form_admin_class(p) else: - model = getattr(p, 'model', None) + model = getattr(p, "model", None) if model is None: - raise Exception('Unknown inline model admin: %s' % repr(p)) + raise Exception("Unknown inline model admin: %s" % repr(p)) attrs = dict() for attr in dir(p): - if not attr.startswith('_') and attr != 'model': + if not attr.startswith("_") and attr != "model": attrs[attr] = getattr(p, attr) return self.form_admin_class(model, **attrs) @@ -621,17 +674,19 @@ def get_info(self, p): return info def process_ajax_refs(self, info): - refs = getattr(info, 'form_ajax_refs', None) + refs = getattr(info, "form_ajax_refs", None) result = {} if refs: for name, opts in iteritems(refs): - new_name = '%s-%s' % (info.model.__name__.lower(), name) + new_name = "%s-%s" % (info.model.__name__.lower(), name) loader = None if isinstance(opts, dict): - loader = create_ajax_loader(info.model, self.session, new_name, name, opts) + loader = create_ajax_loader( + info.model, self.session, new_name, name, opts + ) else: loader = opts # If we're changing the name in self.view._form_ajax_refs, @@ -639,7 +694,7 @@ def process_ajax_refs(self, info): # when the widget tries to set the 'data-url' property in the <input> tag, # it won't be able to find the loader since it'll be using the "field.loader.name" # of the previously-configured loader. - setattr(loader, "name", new_name) + loader.name = new_name result[name] = loader self.view._form_ajax_refs[new_name] = loader @@ -648,16 +703,16 @@ def process_ajax_refs(self, info): def _calculate_mapping_key_pair(self, model, info): """ - Calculate mapping property key pair between `model` and inline model, - including the forward one for `model` and the reverse one for inline model. - Override the method to map your own inline models. - - :param model: - Model class - :param info: - The InlineFormAdmin instance - :return: - A dict of forward property key and reverse property key + Calculate mapping property key pair between `model` and inline model, + including the forward one for `model` and the reverse one for inline model. + Override the method to map your own inline models. + + :param model: + Model class + :param info: + The InlineFormAdmin instance + :return: + A dict of forward property key and reverse property key """ mapper = model._sa_class_manager.mapper @@ -668,58 +723,64 @@ def _calculate_mapping_key_pair(self, model, info): reverse_props = [] forward_reverse_props_keys = dict() for prop in target_mapper.iterate_properties: - if hasattr(prop, 'direction') and prop.direction.name in ('MANYTOONE', 'MANYTOMANY'): + if hasattr(prop, "direction") and prop.direction.name in ( + "MANYTOONE", + "MANYTOMANY", + ): if issubclass(model, prop.mapper.class_): # store props in reverse_props list reverse_props.append(prop) if not reverse_props: - raise Exception('Cannot find reverse relation for model %s' % info.model) + raise Exception("Cannot find reverse relation for model %s" % info.model) for reverse_prop in reverse_props: # Find forward property - if reverse_prop.direction.name == 'MANYTOONE': - candidate = 'ONETOMANY' + if reverse_prop.direction.name == "MANYTOONE": + candidate = "ONETOMANY" else: - candidate = 'MANYTOMANY' + candidate = "MANYTOMANY" for prop in mapper.iterate_properties: - if hasattr(prop, 'direction') and prop.direction.name == candidate: + if hasattr(prop, "direction") and prop.direction.name == candidate: # check if prop is not handled yet # issubclass is more useful than equal comparator in the case of inheritance - if prop.key not in forward_reverse_props_keys.keys() and issubclass(target_mapper.class_, - prop.mapper.class_): + if prop.key not in forward_reverse_props_keys.keys() and issubclass( + target_mapper.class_, prop.mapper.class_ + ): forward_reverse_props_keys[prop.key] = reverse_prop.key break else: - raise Exception('Cannot find forward relation for model %s' % info.model) + raise Exception( + "Cannot find forward relation for model %s" % info.model + ) return forward_reverse_props_keys def contribute(self, model, form_class, inline_model): """ - Generate form fields for inline forms and contribute them to - the `form_class` - - :param converter: - ModelConverterBase instance - :param session: - SQLAlchemy session - :param model: - Model class - :param form_class: - Form to add properties to - :param inline_model: - Inline model. Can be one of: - - - ``tuple``, first value is related model instance, - second is dictionary with options - - ``InlineFormAdmin`` instance - - Model class - - :return: - Form class + Generate form fields for inline forms and contribute them to + the `form_class` + + :param converter: + ModelConverterBase instance + :param session: + SQLAlchemy session + :param model: + Model class + :param form_class: + Form to add properties to + :param inline_model: + Inline model. Can be one of: + + - ``tuple``, first value is related model instance, + second is dictionary with options + - ``InlineFormAdmin`` instance + - Model class + + :return: + Form class """ info = self.get_info(inline_model) @@ -742,14 +803,16 @@ def contribute(self, model, form_class, inline_model): child_form = info.get_form() if child_form is None: - child_form = get_form(info.model, - converter, - base_class=info.form_base_class or form.BaseForm, - only=info.form_columns, - exclude=exclude, - field_args=info.form_args, - hidden_pk=True, - extra_fields=info.form_extra_fields) + child_form = get_form( + info.model, + converter, + base_class=info.form_base_class or form.BaseForm, + only=info.form_columns, + exclude=exclude, + field_args=info.form_args, + hidden_pk=True, + extra_fields=info.form_extra_fields, + ) # Post-process form child_form = info.postprocess_form(child_form) @@ -758,21 +821,25 @@ def contribute(self, model, form_class, inline_model): label = self.get_label(info, forward_prop_key) if label: - kwargs['label'] = label + kwargs["label"] = label if self.view.form_args: field_args = self.view.form_args.get(forward_prop_key, {}) kwargs.update(**field_args) # Contribute field - setattr(form_class, - forward_prop_key, - self.inline_field_list_type(child_form, - self.session, - info.model, - reverse_prop_key, - info, - **kwargs)) + setattr( + form_class, + forward_prop_key, + self.inline_field_list_type( + child_form, + self.session, + info.model, + reverse_prop_key, + info, + **kwargs, + ), + ) return form_class @@ -781,17 +848,16 @@ class InlineOneToOneModelConverter(InlineModelConverter): inline_field_list_type = InlineModelOneToOneField # type: ignore[assignment] def _calculate_mapping_key_pair(self, model, info): - mapper = info.model._sa_class_manager.mapper.base_mapper target_mapper = model._sa_class_manager.mapper inline_relationship = dict() for forward_prop in mapper.iterate_properties: - if not hasattr(forward_prop, 'direction'): + if not hasattr(forward_prop, "direction"): continue - if forward_prop.direction.name != 'MANYTOONE': + if forward_prop.direction.name != "MANYTOONE": continue if forward_prop.mapper.class_ != target_mapper.class_: @@ -800,10 +866,10 @@ def _calculate_mapping_key_pair(self, model, info): # in case when model has few relationships to target model or # has just installed references manually. This is more quick # solution rather than rotate yet another one loop - ref = getattr(forward_prop, 'backref') + ref = forward_prop.backref if not ref: - ref = getattr(forward_prop, 'back_populates') + ref = forward_prop.back_populates if ref: inline_relationship[ref] = forward_prop.key @@ -812,10 +878,10 @@ def _calculate_mapping_key_pair(self, model, info): # here we suppose that model has only one relationship # to target model and prop has not any reference for backward_prop in target_mapper.iterate_properties: - if not hasattr(backward_prop, 'direction'): + if not hasattr(backward_prop, "direction"): continue - if backward_prop.direction.name != 'ONETOMANY': + if backward_prop.direction.name != "ONETOMANY": continue if issubclass(model, backward_prop.mapper.class_): @@ -823,12 +889,12 @@ def _calculate_mapping_key_pair(self, model, info): break else: raise Exception( - 'Cannot find reverse relation for model %s' % info.model) + "Cannot find reverse relation for model %s" % info.model + ) break if not inline_relationship: - raise Exception( - 'Cannot find forward relation for model %s' % info.model) + raise Exception("Cannot find forward relation for model %s" % info.model) return inline_relationship @@ -852,14 +918,16 @@ def contribute(self, model, form_class, inline_model): child_form = info.get_form() if child_form is None: - child_form = get_form(info.model, - converter, - base_class=info.form_base_class or form.BaseForm, - only=info.form_columns, - exclude=exclude, - field_args=info.form_args, - hidden_pk=True, - extra_fields=info.form_extra_fields) + child_form = get_form( + info.model, + converter, + base_class=info.form_base_class or form.BaseForm, + only=info.form_columns, + exclude=exclude, + field_args=info.form_args, + hidden_pk=True, + extra_fields=info.form_extra_fields, + ) # Post-process form child_form = info.postprocess_form(child_form) @@ -868,13 +936,17 @@ def contribute(self, model, form_class, inline_model): # Contribute field for key in inline_relationships.keys(): - setattr(form_class, key, self.inline_field_list_type( - child_form, - self.session, - info.model, - inline_relationships[key], - info, - **kwargs - )) + setattr( + form_class, + key, + self.inline_field_list_type( + child_form, + self.session, + info.model, + inline_relationships[key], + info, + **kwargs, + ), + ) return form_class diff --git a/flask_admin/contrib/sqla/tools.py b/flask_admin/contrib/sqla/tools.py index 0e02ecec7..ac2cd261b 100644 --- a/flask_admin/contrib/sqla/tools.py +++ b/flask_admin/contrib/sqla/tools.py @@ -1,51 +1,61 @@ import types -from sqlalchemy import tuple_, or_, and_, inspect -from sqlalchemy.orm.clsregistry import _class_resolver +from sqlalchemy import and_ +from sqlalchemy import inspect +from sqlalchemy import or_ +from sqlalchemy import tuple_ from sqlalchemy.ext.hybrid import hybrid_property +from sqlalchemy.orm.clsregistry import _class_resolver + try: # SQLAlchemy 2.0 - from sqlalchemy.ext.associationproxy import AssociationProxyExtensionType # type: ignore[attr-defined] + from sqlalchemy.ext.associationproxy import ( + AssociationProxyExtensionType, # type: ignore[attr-defined] + ) + ASSOCIATION_PROXY = AssociationProxyExtensionType.ASSOCIATION_PROXY except ImportError: from sqlalchemy.ext.associationproxy import ASSOCIATION_PROXY -from sqlalchemy.sql.operators import eq # type: ignore[attr-defined] from sqlalchemy.exc import DBAPIError from sqlalchemy.orm.attributes import InstrumentedAttribute +from sqlalchemy.sql.operators import eq # type: ignore[attr-defined] -from flask_admin._compat import filter_list, string_types -from flask_admin.tools import iterencode, iterdecode, escape # noqa: F401 +from flask_admin._compat import filter_list +from flask_admin._compat import string_types +from flask_admin.tools import escape # noqa: F401 +from flask_admin.tools import iterdecode # noqa: F401 +from flask_admin.tools import iterencode # noqa: F401 def parse_like_term(term): - if term.startswith('^'): - stmt = '%s%%' % term[1:] - elif term.startswith('='): + if term.startswith("^"): + stmt = "%s%%" % term[1:] + elif term.startswith("="): stmt = term[1:] else: - stmt = '%%%s%%' % term + stmt = "%%%s%%" % term return stmt def filter_foreign_columns(base_table, columns): """ - Return list of columns that belong to passed table. + Return list of columns that belong to passed table. - :param base_table: Table to check against - :param columns: List of columns to filter + :param base_table: Table to check against + :param columns: List of columns to filter """ return filter_list(lambda c: c.table == base_table, columns) def get_primary_key(model): """ - Return primary key name from a model. If the primary key consists of multiple columns, - return the corresponding tuple + Return primary key name from a model. If the primary key consists of multiple columns, + return the corresponding tuple - :param model: - Model class + :param model: + Model class """ mapper = model._sa_class_manager.mapper pks = [mapper.get_property_by_column(c).key for c in mapper.primary_key] @@ -59,10 +69,10 @@ def get_primary_key(model): def has_multiple_pks(model): """ - Return True, if the model has more than one primary key + Return True, if the model has more than one primary key """ - if not hasattr(model, '_sa_class_manager'): - raise TypeError('model must be a sqlalchemy mapped model') + if not hasattr(model, "_sa_class_manager"): + raise TypeError("model must be a sqlalchemy mapped model") return len(model._sa_class_manager.mapper.primary_key) > 1 @@ -95,10 +105,10 @@ def tuple_operator_in(model_pk, ids): def get_query_for_ids(modelquery, model, ids): """ - Return a query object filtered by primary key values passed in `ids` argument. + Return a query object filtered by primary key values passed in `ids` argument. - Unfortunately, it is not possible to use `in_` filter if model has more than one - primary key. + Unfortunately, it is not possible to use `in_` filter if model has more than one + primary key. """ if has_multiple_pks(model): # Decode keys to tuples @@ -122,27 +132,29 @@ def get_query_for_ids(modelquery, model, ids): def get_columns_for_field(field): - if (not field or - not hasattr(field, 'property') or - not hasattr(field.property, 'columns') or - not field.property.columns): - raise Exception('Invalid field %s: does not contains any columns.' % field) + if ( + not field + or not hasattr(field, "property") + or not hasattr(field.property, "columns") + or not field.property.columns + ): + raise Exception("Invalid field %s: does not contains any columns." % field) return field.property.columns def need_join(model, table): """ - Check if join to a table is necessary. + Check if join to a table is necessary. """ return table not in model._sa_class_manager.mapper.tables def get_field_with_path(model, name, return_remote_proxy_attr=True): """ - Resolve property by name and figure out its join path. + Resolve property by name and figure out its join path. - Join path might contain both properties and tables. + Join path might contain both properties and tables. """ path = [] @@ -152,7 +164,7 @@ def get_field_with_path(model, name, return_remote_proxy_attr=True): current_model = model value = None - for attribute in name.split('.'): + for attribute in name.split("."): value = getattr(current_model, attribute) if is_association_proxy(value): @@ -178,7 +190,7 @@ def get_field_with_path(model, name, return_remote_proxy_attr=True): columns = get_columns_for_field(attr) if len(columns) > 1: - raise Exception('Can only handle one column for %s' % name) + raise Exception("Can only handle one column for %s" % name) column = columns[0] @@ -200,7 +212,7 @@ def get_hybrid_properties(model): def is_hybrid_property(model, attr_name): if isinstance(attr_name, string_types): - names = attr_name.split('.') + names = attr_name.split(".") last_model = model for i in range(len(names) - 1): attr = getattr(last_model, names[i]) @@ -220,10 +232,10 @@ def is_hybrid_property(model, attr_name): def is_relationship(attr): - return hasattr(attr, 'property') and hasattr(attr.property, 'direction') + return hasattr(attr, "property") and hasattr(attr.property, "direction") def is_association_proxy(attr): - if hasattr(attr, 'parent'): + if hasattr(attr, "parent"): attr = attr.parent - return hasattr(attr, 'extension_type') and attr.extension_type == ASSOCIATION_PROXY + return hasattr(attr, "extension_type") and attr.extension_type == ASSOCIATION_PROXY diff --git a/flask_admin/contrib/sqla/typefmt.py b/flask_admin/contrib/sqla/typefmt.py index 6d0480c2e..e9a5e8716 100644 --- a/flask_admin/contrib/sqla/typefmt.py +++ b/flask_admin/contrib/sqla/typefmt.py @@ -1,39 +1,40 @@ from sqlalchemy.ext.associationproxy import _AssociationList - -from flask_admin.model.typefmt import BASE_FORMATTERS, EXPORT_FORMATTERS, \ - list_formatter from sqlalchemy.orm.collections import InstrumentedList +from flask_admin.model.typefmt import BASE_FORMATTERS +from flask_admin.model.typefmt import EXPORT_FORMATTERS +from flask_admin.model.typefmt import list_formatter + def choice_formatter(view, choice, name) -> str: """ - Return label of selected choice - see https://sqlalchemy-utils.readthedocs.io/ + Return label of selected choice + see https://sqlalchemy-utils.readthedocs.io/ - :param choice: - sqlalchemy_utils Choice, which has a `code` and a `value` + :param choice: + sqlalchemy_utils Choice, which has a `code` and a `value` """ return choice.value def arrow_formatter(view, arrow_time, name) -> str: """ - Return human-friendly string of the time relative to now. - see https://arrow.readthedocs.io/ + Return human-friendly string of the time relative to now. + see https://arrow.readthedocs.io/ - :param arrow_time: - Arrow object for handling datetimes + :param arrow_time: + Arrow object for handling datetimes """ return arrow_time.humanize() def arrow_export_formatter(view, arrow_time, name) -> str: """ - Return string representation of Arrow object - see https://arrow.readthedocs.io/ + Return string representation of Arrow object + see https://arrow.readthedocs.io/ - :param arrow_time: - Arrow object for handling datetimes + :param arrow_time: + Arrow object for handling datetimes """ return arrow_time.format() @@ -41,18 +42,22 @@ def arrow_export_formatter(view, arrow_time, name) -> str: DEFAULT_FORMATTERS = BASE_FORMATTERS.copy() EXPORT_FORMATTERS = EXPORT_FORMATTERS.copy() -DEFAULT_FORMATTERS.update({ - InstrumentedList: list_formatter, - _AssociationList: list_formatter, -}) +DEFAULT_FORMATTERS.update( + { + InstrumentedList: list_formatter, + _AssociationList: list_formatter, + } +) try: from sqlalchemy_utils import Choice + DEFAULT_FORMATTERS[Choice] = choice_formatter except ImportError: pass try: from arrow import Arrow + DEFAULT_FORMATTERS[Arrow] = arrow_formatter EXPORT_FORMATTERS[Arrow] = arrow_export_formatter except ImportError: diff --git a/flask_admin/contrib/sqla/validators.py b/flask_admin/contrib/sqla/validators.py index b141138e7..f0ce862db 100644 --- a/flask_admin/contrib/sqla/validators.py +++ b/flask_admin/contrib/sqla/validators.py @@ -1,5 +1,4 @@ from sqlalchemy.orm.exc import NoResultFound - from wtforms import ValidationError from wtforms.validators import InputRequired @@ -7,7 +6,7 @@ from flask_admin.babel import lazy_gettext -class Unique(object): +class Unique: """Checks field value unicity against specified table field. :param get_session: @@ -19,13 +18,14 @@ class Unique(object): :param message: The error message. """ - field_flags = {'unique': True} + + field_flags = {"unique": True} def __init__(self, db_session, model, column, message=None): self.db_session = db_session self.model = model self.column = column - self.message = message or lazy_gettext('Already exists.') + self.message = message or lazy_gettext("Already exists.") def __call__(self, form, field): # databases allow multiple NULL values for unique columns @@ -33,11 +33,13 @@ def __call__(self, form, field): return try: - obj = (self.db_session.query(self.model) - .filter(self.column == field.data) - .one()) + obj = ( + self.db_session.query(self.model) + .filter(self.column == field.data) + .one() + ) - if not hasattr(form, '_obj') or not form._obj == obj: + if not hasattr(form, "_obj") or not form._obj == obj: raise ValidationError(str(self.message)) except NoResultFound: pass @@ -48,6 +50,7 @@ class ItemsRequired(InputRequired): A version of the ``InputRequired`` validator that works with relations, to require a minimum number of related items. """ + def __init__(self, min=1, message=None): super(ItemsRequired, self).__init__(message=message) self.min = min @@ -57,9 +60,9 @@ def __call__(self, form, field): if len(items) < self.min: if self.message is None: message = field.ngettext( - u"At least %(num)d item is required", - u"At least %(num)d items are required", - self.min + "At least %(num)d item is required", + "At least %(num)d items are required", + self.min, ) else: message = self.message @@ -69,24 +72,31 @@ def __call__(self, form, field): def valid_currency(form, field): from sqlalchemy_utils import Currency + try: Currency(field.data) except (TypeError, ValueError): - raise ValidationError(field.gettext(u'Not a valid ISO currency code (e.g. USD, EUR, CNY).')) + raise ValidationError( + field.gettext("Not a valid ISO currency code (e.g. USD, EUR, CNY).") + ) def valid_color(form, field): from colour import Color + try: Color(field.data) - except (ValueError): - raise ValidationError(field.gettext(u'Not a valid color (e.g. "red", "#f00", "#ff0000").')) + except ValueError: + raise ValidationError( + field.gettext('Not a valid color (e.g. "red", "#f00", "#ff0000").') + ) -class TimeZoneValidator(object): +class TimeZoneValidator: """ Tries to coerce a TimZone object from input data """ + def __init__(self, coerce_function): self.coerce_function = coerce_function @@ -94,5 +104,5 @@ def __call__(self, form, field): try: self.coerce_function(str(field.data)) except Exception: - msg = u'Not a valid timezone (e.g. "America/New_York", "Africa/Johannesburg", "Asia/Singapore").' + msg = 'Not a valid timezone (e.g. "America/New_York", "Africa/Johannesburg", "Asia/Singapore").' raise ValidationError(field.gettext(msg)) diff --git a/flask_admin/contrib/sqla/view.py b/flask_admin/contrib/sqla/view.py index 6dafa165a..ce0ca1364 100644 --- a/flask_admin/contrib/sqla/view.py +++ b/flask_admin/contrib/sqla/view.py @@ -1,30 +1,44 @@ +import inspect import logging import warnings -import inspect -from typing import Optional, Dict, List, Tuple, cast as t_cast - -from sqlalchemy.orm.attributes import InstrumentedAttribute -from sqlalchemy.orm.base import manager_of_class, instance_state -from sqlalchemy.orm import joinedload, aliased -from sqlalchemy.sql.expression import desc -from sqlalchemy import Boolean, Table, func, or_ +from typing import cast as t_cast +from typing import Dict +from typing import List +from typing import Optional +from typing import Tuple + +from flask import current_app +from flask import flash +from sqlalchemy import Boolean +from sqlalchemy import func +from sqlalchemy import or_ +from sqlalchemy import Table +from sqlalchemy import Unicode from sqlalchemy.exc import IntegrityError +from sqlalchemy.orm import aliased +from sqlalchemy.orm import joinedload +from sqlalchemy.orm.attributes import InstrumentedAttribute +from sqlalchemy.orm.base import instance_state +from sqlalchemy.orm.base import manager_of_class from sqlalchemy.sql.expression import cast -from sqlalchemy import Unicode - -from flask import current_app, flash +from sqlalchemy.sql.expression import desc -from flask_admin._compat import string_types, text_type -from flask_admin.babel import gettext, ngettext, lazy_gettext +from flask_admin._backwards import ObsoleteAttr +from flask_admin._compat import string_types +from flask_admin._compat import text_type +from flask_admin.actions import action +from flask_admin.babel import gettext +from flask_admin.babel import lazy_gettext +from flask_admin.babel import ngettext +from flask_admin.contrib.sqla import filters as sqla_filters +from flask_admin.contrib.sqla import form +from flask_admin.contrib.sqla import tools from flask_admin.contrib.sqla.tools import is_relationship from flask_admin.model import BaseModelView from flask_admin.model.form import create_editable_list_form -from flask_admin.actions import action -from flask_admin._backwards import ObsoleteAttr -from flask_admin.contrib.sqla import form, filters as sqla_filters, tools -from .typefmt import DEFAULT_FORMATTERS from .ajax import create_ajax_loader +from .typefmt import DEFAULT_FORMATTERS # Set up logger log = logging.getLogger("flask-admin.sqla") @@ -32,17 +46,17 @@ class ModelView(BaseModelView): """ - SQLAlchemy model view + SQLAlchemy model view - Usage sample:: + Usage sample:: - admin = Admin() - admin.add_view(ModelView(User, db.session)) + admin = Admin() + admin.add_view(ModelView(User, db.session)) """ - column_auto_select_related = ObsoleteAttr('column_auto_select_related', - 'auto_select_related', - True) + column_auto_select_related = ObsoleteAttr( + "column_auto_select_related", "auto_select_related", True + ) """ Enable automatic detection of displayed foreign keys in this view and perform automatic joined loading for related models to improve @@ -53,9 +67,9 @@ class ModelView(BaseModelView): will still make separate database call. """ - column_select_related_list = ObsoleteAttr('column_select_related', - 'list_select_related', - None) + column_select_related_list = ObsoleteAttr( + "column_select_related", "list_select_related", None + ) """ List of parameters for SQLAlchemy `subqueryload`. Overrides `column_auto_select_related` property. @@ -74,9 +88,7 @@ class PostAdmin(ModelView): """ column_display_all_relations = ObsoleteAttr( - 'column_display_all_relations', - 'list_display_all_relations', - False + "column_display_all_relations", "list_display_all_relations", False ) """ Controls if list view should display all relations, not only many-to-one. @@ -84,7 +96,7 @@ class PostAdmin(ModelView): column_searchable_list = t_cast( None, - ObsoleteAttr('column_searchable_list', 'searchable_columns', None), + ObsoleteAttr("column_searchable_list", "searchable_columns", None), ) """ Collection of the searchable columns. @@ -302,35 +314,45 @@ class MyModelView(BaseModelView): ignore_hidden = False """ - def __init__(self, model, session, - name=None, category=None, endpoint=None, url=None, static_folder=None, - menu_class_name=None, menu_icon_type=None, menu_icon_value=None): + def __init__( + self, + model, + session, + name=None, + category=None, + endpoint=None, + url=None, + static_folder=None, + menu_class_name=None, + menu_icon_type=None, + menu_icon_value=None, + ): """ - Constructor. - - :param model: - Model class - :param session: - SQLAlchemy session - :param name: - View name. If not set, defaults to the model name - :param category: - Category name - :param endpoint: - Endpoint name. If not set, defaults to the model name - :param url: - Base URL. If not set, defaults to '/admin/' + endpoint - :param menu_class_name: - Optional class name for the menu item. - :param menu_icon_type: - Optional icon. Possible icon types: - - - `flask_admin.consts.ICON_TYPE_GLYPH` - Bootstrap glyph icon - - `flask_admin.consts.ICON_TYPE_FONT_AWESOME` - Font Awesome icon - - `flask_admin.consts.ICON_TYPE_IMAGE` - Image relative to Flask static directory - - `flask_admin.consts.ICON_TYPE_IMAGE_URL` - Image with full URL - :param menu_icon_value: - Icon glyph name or URL, depending on `menu_icon_type` setting + Constructor. + + :param model: + Model class + :param session: + SQLAlchemy session + :param name: + View name. If not set, defaults to the model name + :param category: + Category name + :param endpoint: + Endpoint name. If not set, defaults to the model name + :param url: + Base URL. If not set, defaults to '/admin/' + endpoint + :param menu_class_name: + Optional class name for the menu item. + :param menu_icon_type: + Optional icon. Possible icon types: + + - `flask_admin.consts.ICON_TYPE_GLYPH` - Bootstrap glyph icon + - `flask_admin.consts.ICON_TYPE_FONT_AWESOME` - Font Awesome icon + - `flask_admin.consts.ICON_TYPE_IMAGE` - Image relative to Flask static directory + - `flask_admin.consts.ICON_TYPE_IMAGE_URL` - Image with full URL + :param menu_icon_value: + Icon glyph name or URL, depending on `menu_icon_type` setting """ self.session = session @@ -343,10 +365,17 @@ def __init__(self, model, session, if self.form_choices is None: self.form_choices = {} - super(ModelView, self).__init__(model, name, category, endpoint, url, static_folder, - menu_class_name=menu_class_name, - menu_icon_type=menu_icon_type, - menu_icon_value=menu_icon_value) + super(ModelView, self).__init__( + model, + name, + category, + endpoint, + url, + static_folder, + menu_class_name=menu_class_name, + menu_icon_type=menu_icon_type, + menu_icon_value=menu_icon_value, + ) self._manager = manager_of_class(self.model) @@ -354,7 +383,7 @@ def __init__(self, model, session, self._primary_key = self.scaffold_pk() if self._primary_key is None: - raise Exception('Model %s does not have primary key.' % self.model.__name__) + raise Exception("Model %s does not have primary key." % self.model.__name__) # Configuration if not self.column_select_related_list: @@ -365,7 +394,7 @@ def __init__(self, model, session, # Internal API def _get_model_iterator(self, model=None): """ - Return property iterator for the model + Return property iterator for the model """ if model is None: model = self.model @@ -374,16 +403,16 @@ def _get_model_iterator(self, model=None): def _apply_path_joins(self, query, joins, path, inner_join=True): """ - Apply join path to the query. - - :param query: - Query to add joins to - :param joins: - List of current joins. Used to avoid joining on same relationship more than once - :param path: - Path to be joined - :param fn: - Join function + Apply join path to the query. + + :param query: + Query to add joins to + :param joins: + List of current joins. Used to avoid joining on same relationship more than once + :param path: + Path to be joined + :param fn: + Join function """ last = None @@ -413,15 +442,15 @@ def _apply_path_joins(self, query, joins, path, inner_join=True): # Scaffolding def scaffold_pk(self): """ - Return the primary key name(s) from a model - If model has single primary key, will return a string and tuple otherwise + Return the primary key name(s) from a model + If model has single primary key, will return a string and tuple otherwise """ return tools.get_primary_key(self.model) def get_pk_value(self, model): """ - Return the primary key value from a model object. - If there are multiple primary keys, they're encoded into string representation. + Return the primary key value from a model object. + If there are multiple primary keys, they're encoded into string representation. """ if isinstance(self._primary_key, tuple): return tools.iterencode(getattr(model, attr) for attr in self._primary_key) @@ -430,22 +459,27 @@ def get_pk_value(self, model): def scaffold_list_columns(self): """ - Return a list of columns from the model. + Return a list of columns from the model. """ columns = [] for p in self._get_model_iterator(): - if hasattr(p, 'direction'): - if self.column_display_all_relations or p.direction.name == 'MANYTOONE': + if hasattr(p, "direction"): + if self.column_display_all_relations or p.direction.name == "MANYTOONE": columns.append(p.key) - elif hasattr(p, 'columns'): + elif hasattr(p, "columns"): if len(p.columns) > 1: - filtered = tools.filter_foreign_columns(self.model.__table__, p.columns) + filtered = tools.filter_foreign_columns( + self.model.__table__, p.columns + ) if len(filtered) == 0: continue elif len(filtered) > 1: - warnings.warn('Can not convert multiple-column properties (%s.%s)' % (self.model, p.key)) + warnings.warn( + "Can not convert multiple-column properties (%s.%s)" + % (self.model, p.key) + ) continue column = filtered[0] @@ -464,13 +498,13 @@ def scaffold_list_columns(self): def scaffold_sortable_columns(self): """ - Return a dictionary of sortable columns. - Key is column name, value is sort column/field. + Return a dictionary of sortable columns. + Key is column name, value is sort column/field. """ columns = dict() for p in self._get_model_iterator(): - if hasattr(p, 'columns'): + if hasattr(p, "columns"): # Sanity check if len(p.columns) > 1: # Multi-column properties are not supported @@ -491,11 +525,11 @@ def scaffold_sortable_columns(self): def get_sortable_columns(self): """ - Returns a dictionary of the sortable columns. Key is a model - field name and value is sort column (for example - attribute). + Returns a dictionary of the sortable columns. Key is a model + field name and value is sort column (for example - attribute). - If `column_sortable_list` is set, will use it. Otherwise, will call - `scaffold_sortable_columns` to get them from the model. + If `column_sortable_list` is set, will use it. Otherwise, will call + `scaffold_sortable_columns` to get them from the model. """ self._sortable_joins = dict() @@ -509,7 +543,9 @@ def get_sortable_columns(self): if isinstance(c[1], tuple): column, path = [], [] for item in c[1]: - column_item, path_item = tools.get_field_with_path(self.model, item) + column_item, path_item = tools.get_field_with_path( + self.model, item + ) column.append(column_item) path.append(path_item) column_name = c[0] @@ -520,16 +556,18 @@ def get_sortable_columns(self): column, path = tools.get_field_with_path(self.model, c) column_name = text_type(c) - if path and (hasattr(path[0], 'property') or isinstance(path[0], list)): + if path and (hasattr(path[0], "property") or isinstance(path[0], list)): self._sortable_joins[column_name] = path elif path: - raise Exception("For sorting columns in a related table, " - "column_sortable_list requires a string " - "like '<relation name>.<column name>'. " - "Failed on: {0}".format(c)) + raise Exception( + "For sorting columns in a related table, " + "column_sortable_list requires a string " + "like '<relation name>.<column name>'. " + f"Failed on: {c}" + ) else: # column is in same table, use only model attribute name - if getattr(column, 'key', None) is not None: + if getattr(column, "key", None) is not None: column_name = column.key # column_name must match column_name used in `get_list_columns` @@ -539,16 +577,16 @@ def get_sortable_columns(self): def get_column_names(self, only_columns, excluded_columns): """ - Returns a list of tuples with the model field name and formatted - field name. + Returns a list of tuples with the model field name and formatted + field name. - Overridden to handle special columns like InstrumentedAttribute. + Overridden to handle special columns like InstrumentedAttribute. - :param only_columns: - List of columns to include in the results. If not set, - `scaffold_list_columns` will generate the list from the model. - :param excluded_columns: - List of columns to exclude from the results. + :param only_columns: + List of columns to include in the results. If not set, + `scaffold_list_columns` will generate the list from the model. + :param excluded_columns: + List of columns to exclude from the results. """ if excluded_columns: only_columns = [c for c in only_columns if c not in excluded_columns] @@ -563,7 +601,7 @@ def get_column_names(self, only_columns, excluded_columns): column_name = text_type(c) else: # column is in same table, use only model attribute name - if getattr(column, 'key', None) is not None: + if getattr(column, "key", None) is not None: column_name = column.key else: column_name = text_type(c) @@ -582,11 +620,11 @@ def get_column_names(self, only_columns, excluded_columns): def init_search(self): """ - Initialize search. Returns `True` if search is supported for this - view. + Initialize search. Returns `True` if search is supported for this + view. - For SQLAlchemy, this will initialize internal fields: list of - column objects used for filtering, etc. + For SQLAlchemy, this will initialize internal fields: list of + column objects used for filtering, etc. """ if self.column_searchable_list: self._search_fields = [] @@ -595,12 +633,12 @@ def init_search(self): attr, joins = tools.get_field_with_path(self.model, name) if not attr: - raise Exception('Failed to find field for search field: %s' % name) + raise Exception("Failed to find field for search field: %s" % name) if tools.is_hybrid_property(self.model, name): column = attr if isinstance(name, string_types): - column.key = name.split('.')[-1] + column.key = name.split(".")[-1] self._search_fields.append((column, joins)) else: for column in tools.get_columns_for_field(attr): @@ -610,15 +648,15 @@ def init_search(self): def search_placeholder(self): """ - Return search placeholder. + Return search placeholder. - For example, if set column_labels and column_searchable_list: + For example, if set column_labels and column_searchable_list: - class MyModelView(BaseModelView): - column_labels = dict(name='Name', last_name='Last Name') - column_searchable_list = ('name', 'last_name') + class MyModelView(BaseModelView): + column_labels = dict(name='Name', last_name='Last Name') + column_searchable_list = ('name', 'last_name') - placeholder is: "Name, Last Name" + placeholder is: "Name, Last Name" """ if not self.column_searchable_list: return None @@ -628,42 +666,42 @@ class MyModelView(BaseModelView): for searchable in self.column_searchable_list: if isinstance(searchable, InstrumentedAttribute): placeholders.append( - str(self.column_labels.get(searchable.key, searchable.key))) + str(self.column_labels.get(searchable.key, searchable.key)) + ) else: - placeholders.append( - str(self.column_labels.get(searchable, searchable))) + placeholders.append(str(self.column_labels.get(searchable, searchable))) - return u', '.join(placeholders) + return ", ".join(placeholders) def scaffold_filters(self, name): """ - Return list of enabled filters + Return list of enabled filters """ attr, joins = tools.get_field_with_path(self.model, name) if attr is None: - raise Exception('Failed to find field for filter: %s' % name) + raise Exception("Failed to find field for filter: %s" % name) # Figure out filters for related column if is_relationship(attr): filters = [] for p in self._get_model_iterator(attr.property.mapper.class_): - if hasattr(p, 'columns'): + if hasattr(p, "columns"): # TODO: Check for multiple columns column = p.columns[0] if column.foreign_keys or column.primary_key: continue - visible_name = '%s / %s' % (self.get_column_name(attr.prop.target.name), - self.get_column_name(p.key)) + visible_name = "%s / %s" % ( + self.get_column_name(attr.prop.target.name), + self.get_column_name(p.key), + ) type_name = type(column.type).__name__ - flt = self.filter_converter.convert(type_name, - column, - visible_name) + flt = self.filter_converter.convert(type_name, column, visible_name) if flt: table = column.table @@ -681,34 +719,39 @@ def scaffold_filters(self, name): if is_hybrid_property: column = attr if isinstance(name, string_types): - column.key = name.split('.')[-1] + column.key = name.split(".")[-1] else: columns = tools.get_columns_for_field(attr) if len(columns) > 1: - raise Exception('Can not filter more than on one column for %s' % name) + raise Exception( + "Can not filter more than on one column for %s" % name + ) column = columns[0] # If filter related to relation column (represented by # relation_name.target_column) we collect here relation name joined_column_name = None - if isinstance(name, string_types) and '.' in name: - joined_column_name = name.split('.')[0] + if isinstance(name, string_types) and "." in name: + joined_column_name = name.split(".")[0] # Join not needed for hybrid properties - if (not is_hybrid_property and tools.need_join(self.model, column.table) and - name not in self.column_labels): + if ( + not is_hybrid_property + and tools.need_join(self.model, column.table) + and name not in self.column_labels + ): if joined_column_name: - visible_name = '%s / %s / %s' % ( + visible_name = "%s / %s / %s" % ( joined_column_name, self.get_column_name(column.table.name), - self.get_column_name(column.name) + self.get_column_name(column.name), ) else: - visible_name = '%s / %s' % ( + visible_name = "%s / %s" % ( self.get_column_name(column.table.name), - self.get_column_name(column.name) + self.get_column_name(column.name), ) else: if not isinstance(name, string_types): @@ -718,7 +761,7 @@ def scaffold_filters(self, name): visible_name = self.column_labels[name] else: visible_name = self.get_column_name(name) - visible_name = visible_name.replace('.', ' / ') + visible_name = visible_name.replace(".", " / ") type_name = type(column.type).__name__ @@ -734,7 +777,7 @@ def scaffold_filters(self, name): # must be named with relation name (to prevent following same # target column to replace previous) if joined_column_name: - key_name = "{0}.{1}".format(joined_column_name, column) + key_name = f"{joined_column_name}.{column}" for f in flt: f.key_name = key_name @@ -750,24 +793,28 @@ def handle_filter(self, filter): column = filter.column # hybrid_property joins are not supported yet - if (isinstance(column, InstrumentedAttribute) and - tools.need_join(self.model, column.table)): + if isinstance(column, InstrumentedAttribute) and tools.need_join( + self.model, column.table + ): self._filter_joins[column] = [column.table] return filter def scaffold_form(self): """ - Create form from the model. + Create form from the model. """ converter = self.model_form_converter(self.session, self) - form_class = form.get_form(self.model, converter, - base_class=self.form_base_class, - only=self.form_columns, - exclude=self.form_excluded_columns, - field_args=self.form_args, - ignore_hidden=self.ignore_hidden, - extra_fields=self.form_extra_fields) + form_class = form.get_form( + self.model, + converter, + base_class=self.form_base_class, + only=self.form_columns, + exclude=self.form_excluded_columns, + field_args=self.form_args, + ignore_hidden=self.ignore_hidden, + extra_fields=self.form_extra_fields, + ) if self.inline_models: form_class = self.scaffold_inline_form_models(form_class) @@ -776,50 +823,52 @@ def scaffold_form(self): def scaffold_list_form(self, widget=None, validators=None): """ - Create form for the `index_view` using only the columns from - `self.column_editable_list`. - - :param widget: - WTForms widget class. Defaults to `XEditableWidget`. - :param validators: - `form_args` dict with only validators - {'name': {'validators': [required()]}} + Create form for the `index_view` using only the columns from + `self.column_editable_list`. + + :param widget: + WTForms widget class. Defaults to `XEditableWidget`. + :param validators: + `form_args` dict with only validators + {'name': {'validators': [required()]}} """ converter = self.model_form_converter(self.session, self) - form_class = form.get_form(self.model, converter, - base_class=self.form_base_class, - only=self.column_editable_list, - field_args=validators) + form_class = form.get_form( + self.model, + converter, + base_class=self.form_base_class, + only=self.column_editable_list, + field_args=validators, + ) - return create_editable_list_form(self.form_base_class, form_class, - widget) + return create_editable_list_form(self.form_base_class, form_class, widget) def scaffold_inline_form_models(self, form_class): """ - Contribute inline models to the form + Contribute inline models to the form - :param form_class: - Form class + :param form_class: + Form class """ default_converter = self.inline_model_form_converter( - self.session, self, self.model_form_converter) + self.session, self, self.model_form_converter + ) for m in self.inline_models: - if not hasattr(m, 'inline_converter'): - form_class = default_converter.contribute( - self.model, form_class, m) + if not hasattr(m, "inline_converter"): + form_class = default_converter.contribute(self.model, form_class, m) continue custom_converter = m.inline_converter( - self.session, self, self.model_form_converter) - form_class = custom_converter.contribute( - self.model, form_class, m) + self.session, self, self.model_form_converter + ) + form_class = custom_converter.contribute(self.model, form_class, m) return form_class def scaffold_auto_joins(self): """ - Return a list of joined tables by going through the - displayed columns. + Return a list of joined tables by going through the + displayed columns. """ if not self.column_auto_select_related: return [] @@ -827,18 +876,18 @@ def scaffold_auto_joins(self): relations = set() for p in self._get_model_iterator(): - if hasattr(p, 'direction'): + if hasattr(p, "direction"): # Check if it is pointing to same model if p.mapper.class_ == self.model: continue # Check if it is pointing to a differnet bind - source_bind = getattr(self.model, '__bind_key__', None) - target_bind = getattr(p.mapper.class_, '__bind_key__', None) + source_bind = getattr(self.model, "__bind_key__", None) + target_bind = getattr(p.mapper.class_, "__bind_key__", None) if source_bind != target_bind: continue - if p.direction.name in ['MANYTOONE', 'MANYTOMANY']: + if p.direction.name in ["MANYTOONE", "MANYTOMANY"]: relations.add(p.key) joined = [] @@ -856,51 +905,53 @@ def _create_ajax_loader(self, name, options): # Database-related API def get_query(self): """ - Return a query for the model type. + Return a query for the model type. - This method can be used to set a "persistent filter" on an index_view. + This method can be used to set a "persistent filter" on an index_view. - Example:: + Example:: - class MyView(ModelView): - def get_query(self): - return super(MyView, self).get_query().filter(User.username == current_user.username) + class MyView(ModelView): + def get_query(self): + return super(MyView, self).get_query().filter(User.username == current_user.username) - If you override this method, don't forget to also override `get_count_query`, for displaying the correct - item count in the list view, and `get_one`, which is used when retrieving records for the edit view. + If you override this method, don't forget to also override `get_count_query`, for displaying the correct + item count in the list view, and `get_one`, which is used when retrieving records for the edit view. """ return self.session.query(self.model) def get_count_query(self): """ - Return a the count query for the model type + Return a the count query for the model type - A ``query(self.model).count()`` approach produces an excessive - subquery, so ``query(func.count('*'))`` should be used instead. + A ``query(self.model).count()`` approach produces an excessive + subquery, so ``query(func.count('*'))`` should be used instead. - See commit ``#45a2723`` for details. + See commit ``#45a2723`` for details. """ - return self.session.query(func.count('*')).select_from(self.model) + return self.session.query(func.count("*")).select_from(self.model) def _order_by(self, query, joins, sort_joins, sort_field, sort_desc): """ - Apply order_by to the query - - :param query: - Query - :pram joins: - Current joins - :param sort_joins: - Sort joins (properties or tables) - :param sort_field: - Sort field - :param sort_desc: - Ascending or descending + Apply order_by to the query + + :param query: + Query + :pram joins: + Current joins + :param sort_joins: + Sort joins (properties or tables) + :param sort_field: + Sort field + :param sort_desc: + Ascending or descending """ if sort_field is not None: # Handle joins - query, joins, alias = self._apply_path_joins(query, joins, sort_joins, inner_join=False) + query, joins, alias = self._apply_path_joins( + query, joins, sort_joins, inner_join=False + ) column = sort_field if alias is None else getattr(alias, sort_field.key) @@ -913,7 +964,7 @@ def _order_by(self, query, joins, sort_joins, sort_field, sort_desc): def _get_default_order(self): order = super(ModelView, self)._get_default_order() - for field, direction in (order or []): + for field, direction in order or []: attr, joins = tools.get_field_with_path(self.model, field) yield attr, joins, direction @@ -925,21 +976,27 @@ def _apply_sorting(self, query, joins, sort_column, sort_desc): if isinstance(sort_field, list): for field_item, join_item in zip(sort_field, sort_joins): - query, joins = self._order_by(query, joins, join_item, field_item, sort_desc) + query, joins = self._order_by( + query, joins, join_item, field_item, sort_desc + ) else: - query, joins = self._order_by(query, joins, sort_joins, sort_field, sort_desc) + query, joins = self._order_by( + query, joins, sort_joins, sort_field, sort_desc + ) else: order = self._get_default_order() for sort_field, sort_joins, sort_desc in order: - query, joins = self._order_by(query, joins, sort_joins, sort_field, sort_desc) + query, joins = self._order_by( + query, joins, sort_joins, sort_field, sort_desc + ) return query, joins def _apply_search(self, query, count_query, joins, count_joins, search): """ - Apply search to a query. + Apply search to a query. """ - terms = search.split(' ') + terms = search.split(" ") for term in terms: if not term: @@ -951,21 +1008,26 @@ def _apply_search(self, query, count_query, joins, count_joins, search): count_filter_stmt = [] for field, path in self._search_fields: - query, joins, alias = self._apply_path_joins(query, joins, path, inner_join=False) + query, joins, alias = self._apply_path_joins( + query, joins, path, inner_join=False + ) count_alias = None if count_query is not None: - count_query, count_joins, count_alias = self._apply_path_joins(count_query, - count_joins, - path, - inner_join=False) + count_query, count_joins, count_alias = self._apply_path_joins( + count_query, count_joins, path, inner_join=False + ) column = field if alias is None else getattr(alias, field.key) filter_stmt.append(cast(column, Unicode).ilike(stmt)) if count_filter_stmt is not None: - column = field if count_alias is None else getattr(count_alias, field.key) + column = ( + field + if count_alias is None + else getattr(count_alias, field.key) + ) count_filter_stmt.append(cast(column, Unicode).ilike(stmt)) query = query.filter(or_(*filter_stmt)) @@ -988,14 +1050,14 @@ def _apply_filters(self, query, count_query, joins, count_joins, filters): filter_key = flt.key_name or flt.column path = self._filter_joins.get(filter_key, []) - query, joins, alias = self._apply_path_joins(query, joins, path, inner_join=False) + query, joins, alias = self._apply_path_joins( + query, joins, path, inner_join=False + ) if count_query is not None: count_query, count_joins, count_alias = self._apply_path_joins( - count_query, - count_joins, - path, - inner_join=False) + count_query, count_joins, path, inner_join=False + ) # Clean value .clean() and apply the filter clean_value = flt.clean(value) @@ -1006,8 +1068,10 @@ def _apply_filters(self, query, count_query, joins, count_joins, filters): spec = inspect.getfullargspec(flt.apply) if len(spec.args) == 3: - warnings.warn('Please update your custom filter %s to ' - 'include additional `alias` parameter.' % repr(flt)) + warnings.warn( + "Please update your custom filter %s to " + "include additional `alias` parameter." % repr(flt) + ) else: raise @@ -1033,27 +1097,35 @@ def _apply_pagination(self, query, page, page_size): return query - def get_list(self, page, sort_column, sort_desc, search, filters, - execute=True, page_size=None): + def get_list( + self, + page, + sort_column, + sort_desc, + search, + filters, + execute=True, + page_size=None, + ): """ - Return records from the database. - - :param page: - Page number - :param sort_column: - Sort column name - :param sort_desc: - Descending or ascending sort - :param search: - Search query - :param execute: - Execute query immediately? Default is `True` - :param filters: - List of filter tuples - :param page_size: - Number of results. Defaults to ModelView's page_size. Can be - overriden to change the page_size limit. Removing the page_size - limit requires setting page_size to 0 or False. + Return records from the database. + + :param page: + Page number + :param sort_column: + Sort column name + :param sort_desc: + Descending or ascending sort + :param search: + Search query + :param execute: + Execute query immediately? Default is `True` + :param filters: + List of filter tuples + :param page_size: + Number of results. Defaults to ModelView's page_size. Can be + overriden to change the page_size limit. Removing the page_size + limit requires setting page_size to 0 or False. """ # Will contain join paths with optional aliased object @@ -1065,26 +1137,22 @@ def get_list(self, page, sort_column, sort_desc, search, filters, # Ignore eager-loaded relations (prevent unnecessary joins) # TODO: Separate join detection for query and count query? - if hasattr(query, '_join_entities'): + if hasattr(query, "_join_entities"): for entity in query._join_entities: for table in entity.tables: joins[table] = None # Apply search criteria if self._search_supported and search: - query, count_query, joins, count_joins = self._apply_search(query, - count_query, - joins, - count_joins, - search) + query, count_query, joins, count_joins = self._apply_search( + query, count_query, joins, count_joins, search + ) # Apply filters if filters and self._filters: - query, count_query, joins, count_joins = self._apply_filters(query, - count_query, - joins, - count_joins, - filters) + query, count_query, joins, count_joins = self._apply_filters( + query, count_query, joins, count_joins, filters + ) # Calculate number of rows if necessary count = count_query.scalar() if count_query else None @@ -1107,18 +1175,18 @@ def get_list(self, page, sort_column, sort_desc, search, filters, def get_one(self, id): """ - Return a single model by its id. + Return a single model by its id. - Example:: + Example:: - def get_one(self, id): - query = self.get_query() - return query.filter(self.model.id == id).one() + def get_one(self, id): + query = self.get_query() + return query.filter(self.model.id == id).one() - Also see `get_query` for how to filter the list view. + Also see `get_query` for how to filter the list view. - :param id: - Model id + :param id: + Model id """ return self.session.get(self.model, tools.iterdecode(id)) @@ -1126,20 +1194,23 @@ def get_one(self, id): def handle_view_exception(self, exc): if isinstance(exc, IntegrityError): if current_app.config.get( - 'FLASK_ADMIN_RAISE_ON_INTEGRITY_ERROR', - current_app.config.get('FLASK_ADMIN_RAISE_ON_VIEW_EXCEPTION') + "FLASK_ADMIN_RAISE_ON_INTEGRITY_ERROR", + current_app.config.get("FLASK_ADMIN_RAISE_ON_VIEW_EXCEPTION"), ): raise else: - flash(gettext('Integrity error. %(message)s', message=text_type(exc)), 'error') + flash( + gettext("Integrity error. %(message)s", message=text_type(exc)), + "error", + ) return True return super(ModelView, self).handle_view_exception(exc) def build_new_instance(self): """ - Build new instance of a model. Useful to override the Flask-Admin behavior - when the model has a custom __init__ method. + Build new instance of a model. Useful to override the Flask-Admin behavior + when the model has a custom __init__ method. """ model = self._manager.new_instance() @@ -1153,10 +1224,10 @@ def build_new_instance(self): # Model handlers def create_model(self, form): """ - Create model from form. + Create model from form. - :param form: - Form instance + :param form: + Form instance """ try: model = self.build_new_instance() @@ -1167,8 +1238,11 @@ def create_model(self, form): self.session.commit() except Exception as ex: if not self.handle_view_exception(ex): - flash(gettext('Failed to create record. %(error)s', error=str(ex)), 'error') - log.exception('Failed to create record.') + flash( + gettext("Failed to create record. %(error)s", error=str(ex)), + "error", + ) + log.exception("Failed to create record.") self.session.rollback() @@ -1180,12 +1254,12 @@ def create_model(self, form): def update_model(self, form, model): """ - Update model from form. + Update model from form. - :param form: - Form instance - :param model: - Model instance + :param form: + Form instance + :param model: + Model instance """ try: form.populate_obj(model) @@ -1193,8 +1267,11 @@ def update_model(self, form, model): self.session.commit() except Exception as ex: if not self.handle_view_exception(ex): - flash(gettext('Failed to update record. %(error)s', error=str(ex)), 'error') - log.exception('Failed to update record.') + flash( + gettext("Failed to update record. %(error)s", error=str(ex)), + "error", + ) + log.exception("Failed to update record.") self.session.rollback() @@ -1206,10 +1283,10 @@ def update_model(self, form, model): def delete_model(self, model): """ - Delete model. + Delete model. - :param model: - Model to delete + :param model: + Model to delete """ try: self.on_model_delete(model) @@ -1218,8 +1295,11 @@ def delete_model(self, model): self.session.commit() except Exception as ex: if not self.handle_view_exception(ex): - flash(gettext('Failed to delete record. %(error)s', error=str(ex)), 'error') - log.exception('Failed to delete record.') + flash( + gettext("Failed to delete record. %(error)s", error=str(ex)), + "error", + ) + log.exception("Failed to delete record.") self.session.rollback() @@ -1232,14 +1312,16 @@ def delete_model(self, model): # Default model actions def is_action_allowed(self, name): # Check delete action permission - if name == 'delete' and not self.can_delete: + if name == "delete" and not self.can_delete: return False return super(ModelView, self).is_action_allowed(name) - @action('delete', - lazy_gettext('Delete'), - lazy_gettext('Are you sure you want to delete selected records?')) + @action( + "delete", + lazy_gettext("Delete"), + lazy_gettext("Are you sure you want to delete selected records?"), + ) def action_delete(self, ids): try: query = tools.get_query_for_ids(self.get_query(), self.model, ids) @@ -1255,12 +1337,19 @@ def action_delete(self, ids): self.session.commit() - flash(ngettext('Record was successfully deleted.', - '%(count)s records were successfully deleted.', - count, - count=count), 'success') + flash( + ngettext( + "Record was successfully deleted.", + "%(count)s records were successfully deleted.", + count, + count=count, + ), + "success", + ) except Exception as ex: if not self.handle_view_exception(ex): raise - flash(gettext('Failed to delete records. %(error)s', error=str(ex)), 'error') + flash( + gettext("Failed to delete records. %(error)s", error=str(ex)), "error" + ) diff --git a/flask_admin/contrib/sqla/widgets.py b/flask_admin/contrib/sqla/widgets.py index 55d6a3a1d..b987393f4 100644 --- a/flask_admin/contrib/sqla/widgets.py +++ b/flask_admin/contrib/sqla/widgets.py @@ -8,13 +8,14 @@ class CheckboxListInput: Appears as the list of checkboxes. """ + template = ( '<div class="checkbox">' - ' <label>' + " <label>" ' <input id="%(id)s" name="%(name)s" value="%(id)s" ' 'type="checkbox"%(selected)s>%(label)s' - ' </label>' - '</div>' + " </label>" + "</div>" ) def __call__(self, field, **kwargs): @@ -25,10 +26,10 @@ def __call__(self, field, **kwargs): else: value, label, selected, _ = field_choices args = { - 'id': value, - 'name': field.name, - 'label': escape(label), - 'selected': ' checked' if selected else '', + "id": value, + "name": field.name, + "label": escape(label), + "selected": " checked" if selected else "", } items.append(self.template % args) - return Markup(''.join(items)) + return Markup("".join(items)) diff --git a/flask_admin/contrib/sqlamodel/__init__.py b/flask_admin/contrib/sqlamodel/__init__.py index 3c06f45f7..cdc7d7a54 100644 --- a/flask_admin/contrib/sqlamodel/__init__.py +++ b/flask_admin/contrib/sqlamodel/__init__.py @@ -1,10 +1,14 @@ def setup(): import warnings - warnings.warn('Flask-Admin sqlalchemy integration module was renamed as ' - 'flask_admin.contrib.sqla, please use it instead.') + + warnings.warn( + "Flask-Admin sqlalchemy integration module was renamed as " + "flask_admin.contrib.sqla, please use it instead." + ) from flask_admin._backwards import import_redirect - import_redirect(__name__, 'flask_admin.contrib.sqla') + + import_redirect(__name__, "flask_admin.contrib.sqla") setup() diff --git a/flask_admin/form/__init__.py b/flask_admin/form/__init__.py index b1e7a38b4..84f5c2d30 100644 --- a/flask_admin/form/__init__.py +++ b/flask_admin/form/__init__.py @@ -1,6 +1,7 @@ from os import urandom -from flask import session, current_app +from flask import current_app +from flask import session from wtforms import form from wtforms.csrf.session import SessionCSRF from wtforms.fields.core import UnboundField @@ -9,8 +10,8 @@ from flask_admin.babel import Translations from .fields import * # noqa: F403,F401 -from .widgets import * # noqa: F403,F401 from .upload import * # noqa: F403,F401 +from .widgets import * # noqa: F403,F401 class BaseForm(form.Form): @@ -20,14 +21,16 @@ class Meta: def get_translations(self, form): return self._translations - def __init__(self, formdata=None, obj=None, prefix=u'', **kwargs): + def __init__(self, formdata=None, obj=None, prefix="", **kwargs): self._obj = obj - super(BaseForm, self).__init__(formdata=formdata, obj=obj, prefix=prefix, **kwargs) + super(BaseForm, self).__init__( + formdata=formdata, obj=obj, prefix=prefix, **kwargs + ) -class FormOpts(object): - __slots__ = ['widget_args', 'form_rules'] +class FormOpts: + __slots__ = ["widget_args", "form_rules"] def __init__(self, widget_args=None, form_rules=None): self.widget_args = widget_args or {} @@ -36,23 +39,27 @@ def __init__(self, widget_args=None, form_rules=None): def recreate_field(unbound): """ - Create new instance of the unbound field, resetting wtforms creation counter. + Create new instance of the unbound field, resetting wtforms creation counter. - :param unbound: - UnboundField instance + :param unbound: + UnboundField instance """ if not isinstance(unbound, UnboundField): - raise ValueError('recreate_field expects UnboundField instance, %s was passed.' % type(unbound)) + raise ValueError( + "recreate_field expects UnboundField instance, %s was passed." + % type(unbound) + ) return unbound.field_class(*unbound.args, **unbound.kwargs) class SecureForm(BaseForm): """ - BaseForm with CSRF token generation and validation support. + BaseForm with CSRF token generation and validation support. - Requires WTForms 2+ + Requires WTForms 2+ """ + class Meta: csrf = True csrf_class = SessionCSRF @@ -62,7 +69,7 @@ class Meta: def csrf_secret(self): secret = current_app.secret_key or self._csrf_secret if isinstance(secret, text_type): - secret = secret.encode('utf-8') + secret = secret.encode("utf-8") return secret @property diff --git a/flask_admin/form/fields.py b/flask_admin/form/fields.py index 5795cb93c..3e7328a77 100644 --- a/flask_admin/form/fields.py +++ b/flask_admin/form/fields.py @@ -1,11 +1,13 @@ -import time import datetime import json import re +import time from wtforms import fields + +from flask_admin._compat import as_unicode +from flask_admin._compat import text_type from flask_admin.babel import gettext -from flask_admin._compat import text_type, as_unicode from . import widgets as admin_widgets @@ -14,118 +16,149 @@ https://wtforms.readthedocs.io/widgets/#custom-widgets """ -__all__ = ['DateTimeField', 'TimeField', 'Select2Field', 'Select2TagsField', - 'JSONField'] +__all__ = [ + "DateTimeField", + "TimeField", + "Select2Field", + "Select2TagsField", + "JSONField", +] class DateTimeField(fields.DateTimeField): """ - Allows modifying the datetime format of a DateTimeField using form_args. + Allows modifying the datetime format of a DateTimeField using form_args. """ + widget = admin_widgets.DateTimePickerWidget() def __init__(self, label=None, validators=None, format=None, **kwargs): """ - Constructor - - :param label: - Label - :param validators: - Field validators - :param format: - Format for text to date conversion. Defaults to '%Y-%m-%d %H:%M:%S' - :param kwargs: - Any additional parameters + Constructor + + :param label: + Label + :param validators: + Field validators + :param format: + Format for text to date conversion. Defaults to '%Y-%m-%d %H:%M:%S' + :param kwargs: + Any additional parameters """ super(DateTimeField, self).__init__( - label, validators, format or '%Y-%m-%d %H:%M:%S', **kwargs) + label, validators, format or "%Y-%m-%d %H:%M:%S", **kwargs + ) class TimeField(fields.Field): """ - A text field which stores a `datetime.time` object. - Accepts time string in multiple formats: 20:10, 20:10:00, 10:00 am, 9:30pm, etc. + A text field which stores a `datetime.time` object. + Accepts time string in multiple formats: 20:10, 20:10:00, 10:00 am, 9:30pm, etc. """ + widget = admin_widgets.TimePickerWidget() - def __init__(self, label=None, validators=None, formats=None, - default_format=None, widget_format=None, **kwargs): + def __init__( + self, + label=None, + validators=None, + formats=None, + default_format=None, + widget_format=None, + **kwargs, + ): """ - Constructor - - :param label: - Label - :param validators: - Field validators - :param formats: - Supported time formats, as a enumerable. - :param default_format: - Default time format. Defaults to '%H:%M:%S' - :param kwargs: - Any additional parameters + Constructor + + :param label: + Label + :param validators: + Field validators + :param formats: + Supported time formats, as a enumerable. + :param default_format: + Default time format. Defaults to '%H:%M:%S' + :param kwargs: + Any additional parameters """ super(TimeField, self).__init__(label, validators, **kwargs) - self.formats = formats or ('%H:%M:%S', '%H:%M', - '%I:%M:%S%p', '%I:%M%p', - '%I:%M:%S %p', '%I:%M %p') + self.formats = formats or ( + "%H:%M:%S", + "%H:%M", + "%I:%M:%S%p", + "%I:%M%p", + "%I:%M:%S %p", + "%I:%M %p", + ) - self.default_format = default_format or '%H:%M:%S' + self.default_format = default_format or "%H:%M:%S" def _value(self): if self.raw_data: - return u' '.join(self.raw_data) + return " ".join(self.raw_data) elif self.data is not None: return self.data.strftime(self.default_format) else: - return u'' + return "" def process_formdata(self, valuelist): if valuelist: - date_str = u' '.join(valuelist) + date_str = " ".join(valuelist) if date_str.strip(): for format in self.formats: try: timetuple = time.strptime(date_str, format) - self.data = datetime.time(timetuple.tm_hour, - timetuple.tm_min, - timetuple.tm_sec) + self.data = datetime.time( + timetuple.tm_hour, timetuple.tm_min, timetuple.tm_sec + ) return except ValueError: pass - raise ValueError(gettext('Invalid time format')) + raise ValueError(gettext("Invalid time format")) else: self.data = None class Select2Field(fields.SelectField): """ - `Select2 <https://github.com/ivaynberg/select2>`_ styled select widget. + `Select2 <https://github.com/ivaynberg/select2>`_ styled select widget. - You must include select2.js, form-x.x.x.js and select2 stylesheet for it to - work. + You must include select2.js, form-x.x.x.js and select2 stylesheet for it to + work. """ + widget = admin_widgets.Select2Widget() - def __init__(self, label=None, validators=None, coerce=text_type, - choices=None, allow_blank=False, blank_text=None, **kwargs): - super(Select2Field, self).__init__( - label, validators, coerce, choices, **kwargs - ) + def __init__( + self, + label=None, + validators=None, + coerce=text_type, + choices=None, + allow_blank=False, + blank_text=None, + **kwargs, + ): + super(Select2Field, self).__init__(label, validators, coerce, choices, **kwargs) self.allow_blank = allow_blank - self.blank_text = blank_text or ' ' + self.blank_text = blank_text or " " def iter_choices(self): if self.allow_blank: - yield (u'__None', self.blank_text, self.data is None) + yield ("__None", self.blank_text, self.data is None) for choice in self.choices: if isinstance(choice, tuple): yield (choice[0], choice[1], self.coerce(choice[0]) == self.data) else: - yield (choice.value, choice.name, self.coerce(choice.value) == self.data) + yield ( + choice.value, + choice.name, + self.coerce(choice.value) == self.data, + ) def process_data(self, value): if value is None: @@ -138,13 +171,13 @@ def process_data(self, value): def process_formdata(self, valuelist): if valuelist: - if valuelist[0] == '__None': + if valuelist[0] == "__None": self.data = None else: try: self.data = self.coerce(valuelist[0]) except ValueError: - raise ValueError(self.gettext(u'Invalid Choice: could not coerce')) + raise ValueError(self.gettext("Invalid Choice: could not coerce")) def pre_validate(self, form): if self.allow_blank and self.data is None: @@ -157,11 +190,21 @@ class Select2TagsField(fields.StringField): """`Select2Tags <http://ivaynberg.github.com/select2/#tags>`_ styled text field. You must include select2.js, form-x.x.x.js and select2 stylesheet for it to work. """ - widget = admin_widgets.Select2TagsWidget() - _strip_regex = re.compile(r'#\d+(?:(,)|\s$)') # e.g., 'tag#123, anothertag#425 ' => 'tag, anothertag' - def __init__(self, label=None, validators=None, save_as_list=False, coerce=text_type, allow_duplicates=False, - **kwargs): + widget = admin_widgets.Select2TagsWidget() + _strip_regex = re.compile( + r"#\d+(?:(,)|\s$)" + ) # e.g., 'tag#123, anothertag#425 ' => 'tag, anothertag' + + def __init__( + self, + label=None, + validators=None, + save_as_list=False, + coerce=text_type, + allow_duplicates=False, + **kwargs, + ): """Initialization :param save_as_list: @@ -178,22 +221,24 @@ def __init__(self, label=None, validators=None, save_as_list=False, coerce=text_ def process_formdata(self, valuelist): if valuelist: entrylist = valuelist[0] - if self.allow_duplicates and entrylist.endswith(' '): + if self.allow_duplicates and entrylist.endswith(" "): # This means this is an allowed duplicate (see form.js, `createSearchChoice`), so its ID was modified. # Hence, we need to restore the original IDs. - entrylist = re.sub(self._strip_regex, '\\1', entrylist) + entrylist = re.sub(self._strip_regex, "\\1", entrylist) if self.save_as_list: - self.data = [self.coerce(v.strip()) for v in entrylist.split(',') if v.strip()] + self.data = [ + self.coerce(v.strip()) for v in entrylist.split(",") if v.strip() + ] else: self.data = self.coerce(entrylist) def _value(self): if isinstance(self.data, (list, tuple)): - return u','.join(as_unicode(v) for v in self.data) + return ",".join(as_unicode(v) for v in self.data) elif self.data: return as_unicode(self.data) else: - return u'' + return "" class JSONField(fields.TextAreaField): @@ -204,7 +249,7 @@ def _value(self): # prevent utf8 characters from being converted to ascii return as_unicode(json.dumps(self.data, ensure_ascii=False)) else: - return '{}' + return "{}" def process_formdata(self, valuelist): if valuelist: @@ -218,4 +263,4 @@ def process_formdata(self, valuelist): try: self.data = json.loads(valuelist[0]) except ValueError: - raise ValueError(self.gettext('Invalid JSON')) + raise ValueError(self.gettext("Invalid JSON")) diff --git a/flask_admin/form/rules.py b/flask_admin/form/rules.py index 305f596fe..e93089662 100644 --- a/flask_admin/form/rules.py +++ b/flask_admin/form/rules.py @@ -1,25 +1,26 @@ from markupsafe import Markup -from flask_admin._compat import string_types from flask_admin import helpers +from flask_admin._compat import string_types -class BaseRule(object): +class BaseRule: """ - Base form rule. All form formatting rules should derive from `BaseRule`. + Base form rule. All form formatting rules should derive from `BaseRule`. """ + def __init__(self): self.parent = None self.rule_set = None def configure(self, rule_set, parent): """ - Configure rule and assign to rule set. + Configure rule and assign to rule set. - :param rule_set: - Rule set - :param parent: - Parent rule (if any) + :param rule_set: + Rule set + :param parent: + Parent rule (if any) """ self.parent = parent self.rule_set = rule_set @@ -28,36 +29,37 @@ def configure(self, rule_set, parent): @property def visible_fields(self): """ - A list of visible fields for the given rule. + A list of visible fields for the given rule. """ return [] def __call__(self, form, form_opts=None, field_args={}): """ - Render rule. + Render rule. - :param form: - Form object - :param form_opts: - Form options - :param field_args: - Optional arguments that should be passed to template or the field + :param form: + Form object + :param form_opts: + Form options + :param field_args: + Optional arguments that should be passed to template or the field """ raise NotImplementedError() class NestedRule(BaseRule): """ - Nested rule. Can contain child rules and render them. + Nested rule. Can contain child rules and render them. """ - def __init__(self, rules=[], separator=''): + + def __init__(self, rules=[], separator=""): """ - Constructor. + Constructor. - :param rules: - Child rule list - :param separator: - Default separator between rules when rendering them. + :param rules: + Child rule list + :param separator: + Default separator between rules when rendering them. """ super(NestedRule, self).__init__() self.rules = list(rules) @@ -65,12 +67,12 @@ def __init__(self, rules=[], separator=''): def configure(self, rule_set, parent): """ - Configure rule. + Configure rule. - :param rule_set: - Rule set - :param parent: - Parent rule (if any) + :param rule_set: + Rule set + :param parent: + Parent rule (if any) """ self.rules = rule_set.configure_rules(self.rules, self) return super(NestedRule, self).configure(rule_set, parent) @@ -78,7 +80,7 @@ def configure(self, rule_set, parent): @property def visible_fields(self): """ - Return visible fields for all child rules. + Return visible fields for all child rules. """ visible_fields = [] for rule in self.rules: @@ -88,20 +90,20 @@ def visible_fields(self): def __iter__(self): """ - Return rules. + Return rules. """ return self.rules def __call__(self, form, form_opts=None, field_args={}): """ - Render all children. + Render all children. - :param form: - Form object - :param form_opts: - Form options - :param field_args: - Optional arguments that should be passed to template or the field + :param form: + Form object + :param form_opts: + Form options + :param field_args: + Optional arguments that should be passed to template or the field """ result = [] @@ -113,16 +115,17 @@ def __call__(self, form, form_opts=None, field_args={}): class Text(BaseRule): """ - Render text (or HTML snippet) from string. + Render text (or HTML snippet) from string. """ + def __init__(self, text, escape=True): """ - Constructor. + Constructor. - :param text: - Text to render - :param escape: - Should text be escaped or not. Default is `True`. + :param text: + Text to render + :param escape: + Should text be escaped or not. Default is `True`. """ super(Text, self).__init__() @@ -138,24 +141,26 @@ def __call__(self, form, form_opts=None, field_args={}): class HTML(Text): """ - Shortcut for `Text` rule with `escape` set to `False`. + Shortcut for `Text` rule with `escape` set to `False`. """ + def __init__(self, html): super(HTML, self).__init__(html, escape=False) class Macro(BaseRule): """ - Render macro by its name from current Jinja2 context. + Render macro by its name from current Jinja2 context. """ + def __init__(self, macro_name, **kwargs): """ - Constructor. + Constructor. - :param macro_name: - Macro name - :param kwargs: - Default macro parameters + :param macro_name: + Macro name + :param kwargs: + Default macro parameters """ super(Macro, self).__init__() @@ -164,20 +169,21 @@ def __init__(self, macro_name, **kwargs): def _resolve(self, context, name): """ - Resolve macro in a Jinja2 context + Resolve macro in a Jinja2 context - :param context: - Jinja2 context - :param name: - Macro name. May be full path (with dots) + :param context: + Jinja2 context + :param name: + Macro name. May be full path (with dots) """ - parts = name.split('.') + parts = name.split(".") try: field = context.resolve(parts[0]) except AttributeError: - raise Exception('Your template is missing ' - '"{% set render_ctx = h.resolve_ctx() %}"') + raise Exception( + "Your template is missing " '"{% set render_ctx = h.resolve_ctx() %}"' + ) if not field: return None @@ -192,20 +198,22 @@ def _resolve(self, context, name): def __call__(self, form, form_opts=None, field_args={}): """ - Render macro rule. + Render macro rule. - :param form: - Form object - :param form_opts: - Form options - :param field_args: - Optional arguments that should be passed to the macro + :param form: + Form object + :param form_opts: + Form options + :param field_args: + Optional arguments that should be passed to the macro """ context = helpers.get_render_ctx() macro = self._resolve(context, self.macro_name) if not macro: - raise ValueError('Cannot find macro %s in current context.' % self.macro_name) + raise ValueError( + "Cannot find macro %s in current context." % self.macro_name + ) opts = dict(self.default_args) opts.update(field_args) @@ -214,30 +222,31 @@ def __call__(self, form, form_opts=None, field_args={}): class Container(Macro): """ - Render container around child rule. + Render container around child rule. """ + def __init__(self, macro_name, child_rule, **kwargs): """ - Constructor. + Constructor. - :param macro_name: - Macro name that will be used as a container - :param child_rule: - Child rule to be rendered inside of container - :param kwargs: - Container macro arguments + :param macro_name: + Macro name that will be used as a container + :param child_rule: + Child rule to be rendered inside of container + :param kwargs: + Container macro arguments """ super(Container, self).__init__(macro_name, **kwargs) self.child_rule = child_rule def configure(self, rule_set, parent): """ - Configure rule. + Configure rule. - :param rule_set: - Rule set - :param parent: - Parent rule (if any) + :param rule_set: + Rule set + :param parent: + Parent rule (if any) """ self.child_rule.configure(rule_set, self) return super(Container, self).configure(rule_set, parent) @@ -248,14 +257,14 @@ def visible_fields(self): def __call__(self, form, form_opts=None, field_args={}): """ - Render container. + Render container. - :param form: - Form object - :param form_opts: - Form options - :param field_args: - Optional arguments that should be passed to template or the field + :param form: + Form object + :param form_opts: + Form options + :param field_args: + Optional arguments that should be passed to template or the field """ context = helpers.get_render_ctx() @@ -263,23 +272,24 @@ def caller(**kwargs): return context.call(self.child_rule, form, form_opts, kwargs) args = dict(field_args) - args['caller'] = caller + args["caller"] = caller return super(Container, self).__call__(form, form_opts, args) class Field(Macro): """ - Form field rule. + Form field rule. """ - def __init__(self, field_name, render_field='lib.render_field'): + + def __init__(self, field_name, render_field="lib.render_field"): """ - Constructor. + Constructor. - :param field_name: - Field name to render - :param render_field: - Macro that will be used to render the field. + :param field_name: + Field name to render + :param render_field: + Macro that will be used to render the field. """ super(Field, self).__init__(render_field) self.field_name = field_name @@ -290,19 +300,19 @@ def visible_fields(self): def __call__(self, form, form_opts=None, field_args={}): """ - Render field. + Render field. - :param form: - Form object - :param form_opts: - Form options - :param field_args: - Optional arguments that should be passed to template or the field + :param form: + Form object + :param form_opts: + Form options + :param field_args: + Optional arguments that should be passed to template or the field """ field = getattr(form, self.field_name, None) if field is None: - raise ValueError('Form %s does not have field %s' % (form, self.field_name)) + raise ValueError("Form %s does not have field %s" % (form, self.field_name)) opts = {} @@ -311,45 +321,43 @@ def __call__(self, form, form_opts=None, field_args={}): opts.update(field_args) - params = { - 'form': form, - 'field': field, - 'kwargs': opts - } + params = {"form": form, "field": field, "kwargs": opts} return super(Field, self).__call__(form, form_opts, params) class Header(Macro): """ - Render header text. + Render header text. """ - def __init__(self, text, header_macro='lib.render_header'): + + def __init__(self, text, header_macro="lib.render_header"): """ - Constructor. + Constructor. - :param text: - Text to render - :param header_macro: - Header rendering macro + :param text: + Text to render + :param header_macro: + Header rendering macro """ super(Header, self).__init__(header_macro, text=text) class FieldSet(NestedRule): """ - Field set with header. + Field set with header. """ - def __init__(self, rules, header=None, separator=''): + + def __init__(self, rules, header=None, separator=""): """ - Constructor. + Constructor. - :param rules: - Child rules - :param header: - Header text - :param separator: - Child rule separator + :param rules: + Child rules + :param header: + Header text + :param separator: + Child rule separator """ if header: rule_set = [Header(header)] + list(rules) @@ -369,19 +377,18 @@ def __call__(self, form, form_opts=None, field_args={}): for col in self.rules: if col.visible_fields: w_args = form_opts.widget_args.setdefault(col.visible_fields[0], {}) - w_args.setdefault('column_class', 'col') + w_args.setdefault("column_class", "col") cols.append(col(form, form_opts, field_args)) - return Markup('<div class="form-row">%s</div>' % ''.join(cols)) + return Markup('<div class="form-row">%s</div>' % "".join(cols)) class Group(Macro): - def __init__(self, field_name, prepend=None, append=None, **kwargs): - ''' - Bootstrap Input group. - ''' - render_field = kwargs.get('render_field', 'lib.render_field') + """ + Bootstrap Input group. + """ + render_field = kwargs.get("render_field", "lib.render_field") super(Group, self).__init__(render_field) self.field_name = field_name self._addons = [] @@ -392,15 +399,11 @@ def __init__(self, field_name, prepend=None, append=None, **kwargs): for cnf in prepend: if isinstance(cnf, str): - self._addons.append({ - 'pos': 'prepend', - 'type': 'text', - 'text': cnf - }) + self._addons.append({"pos": "prepend", "type": "text", "text": cnf}) continue - if cnf['type'] in ('field', 'html', 'text'): - cnf['pos'] = 'prepend' + if cnf["type"] in ("field", "html", "text"): + cnf["pos"] = "prepend" self._addons.append(cnf) if append: @@ -409,15 +412,11 @@ def __init__(self, field_name, prepend=None, append=None, **kwargs): for cnf in append: if isinstance(cnf, str): - self._addons.append({ - 'pos': 'append', - 'type': 'text', - 'text': cnf - }) + self._addons.append({"pos": "append", "type": "text", "text": cnf}) continue - if cnf['type'] in ('field', 'html', 'text'): - cnf['pos'] = 'append' + if cnf["type"] in ("field", "html", "text"): + cnf["pos"] = "append" self._addons.append(cnf) print(self._addons) @@ -426,25 +425,25 @@ def __init__(self, field_name, prepend=None, append=None, **kwargs): def visible_fields(self): fields = [self.field_name] for cnf in self._addons: - if cnf['type'] == 'field': - fields.append(cnf['name']) + if cnf["type"] == "field": + fields.append(cnf["name"]) return fields def __call__(self, form, form_opts=None, field_args={}): """ - Render field. + Render field. - :param form: - Form object - :param form_opts: - Form options - :param field_args: - Optional arguments that should be passed to template or the field + :param form: + Form object + :param form_opts: + Form options + :param field_args: + Optional arguments that should be passed to template or the field """ field = getattr(form, self.field_name, None) if field is None: - raise ValueError('Form %s does not have field %s' % (form, self.field_name)) + raise ValueError("Form %s does not have field %s" % (form, self.field_name)) if form_opts: widget_args = form_opts.widget_args @@ -456,58 +455,55 @@ def __call__(self, form, form_opts=None, field_args={}): append = [] for cnf in self._addons: ctn = None - typ = cnf['type'] - if typ == 'field': - name = cnf['name'] + typ = cnf["type"] + if typ == "field": + name = cnf["name"] fld = form._fields.get(name, None) if fld: w_args = widget_args.setdefault(name, {}) - if fld.type in ('BooleanField', 'RadioField'): - w_args.setdefault('class', 'form-check-input') + if fld.type in ("BooleanField", "RadioField"): + w_args.setdefault("class", "form-check-input") else: - w_args.setdefault('class', 'form-control') + w_args.setdefault("class", "form-control") ctn = fld(**w_args) - elif typ == 'text': - ctn = '<span class="input-group-text">%s</span>' % cnf['text'] - elif typ == 'html': - ctn = cnf['html'] + elif typ == "text": + ctn = '<span class="input-group-text">%s</span>' % cnf["text"] + elif typ == "html": + ctn = cnf["html"] if ctn: - if cnf['pos'] == 'prepend': + if cnf["pos"] == "prepend": prepend.append(ctn) else: append.append(ctn) if prepend: - opts['prepend'] = Markup(''.join(prepend)) + opts["prepend"] = Markup("".join(prepend)) if append: - opts['append'] = Markup(''.join(append)) + opts["append"] = Markup("".join(append)) opts.update(widget_args.get(self.field_name, {})) opts.update(field_args) - params = { - 'form': form, - 'field': field, - 'kwargs': opts - } + params = {"form": form, "field": field, "kwargs": opts} return super(Group, self).__call__(form, form_opts, params) -class RuleSet(object): +class RuleSet: """ - Rule set. + Rule set. """ + def __init__(self, view, rules): """ - Constructor. + Constructor. - :param view: - Administrative view - :param rules: - Rule list + :param view: + Administrative view + :param rules: + Rule list """ self.view = view self.rules = self.configure_rules(rules) @@ -522,21 +518,21 @@ def visible_fields(self): def convert_string(self, value): """ - Convert string to rule. + Convert string to rule. - Override this method to change default behavior. + Override this method to change default behavior. """ return Field(value) def configure_rules(self, rules, parent=None): """ - Configure all rules recursively - bind them to current RuleSet and - convert string references to `Field` rules. + Configure all rules recursively - bind them to current RuleSet and + convert string references to `Field` rules. - :param rules: - Rule list - :param parent: - Parent rule (if any) + :param rules: + Rule list + :param parent: + Parent rule (if any) """ result = [] @@ -556,7 +552,7 @@ def configure_rules(self, rules, parent=None): def __iter__(self): """ - Iterate through registered rules. + Iterate through registered rules. """ for r in self.rules: yield r diff --git a/flask_admin/form/upload.py b/flask_admin/form/upload.py index 72307a182..dbf86edff 100644 --- a/flask_admin/form/upload.py +++ b/flask_admin/form/upload.py @@ -5,54 +5,62 @@ from urllib.parse import urljoin from markupsafe import Markup - -from werkzeug.utils import secure_filename from werkzeug.datastructures import FileStorage - -from wtforms import ValidationError, fields, __version__ as wtforms_version # type: ignore[attr-defined] +from werkzeug.utils import secure_filename +from wtforms import __version__ as wtforms_version # type: ignore[attr-defined] +from wtforms import fields # type: ignore[attr-defined] +from wtforms import ValidationError # type: ignore[attr-defined] from wtforms.utils import unset_value from wtforms.widgets import html_params +from flask_admin._compat import string_types from flask_admin.babel import gettext from flask_admin.helpers import get_url -from flask_admin._compat import string_types - Image: Optional[ModuleType] ImageOps: Optional[ModuleType] try: - from PIL import Image, ImageOps + from PIL import Image + from PIL import ImageOps except ImportError: Image = None ImageOps = None -__all__ = ['FileUploadInput', 'FileUploadField', - 'ImageUploadInput', 'ImageUploadField', - 'namegen_filename', 'thumbgen_filename'] +__all__ = [ + "FileUploadInput", + "FileUploadField", + "ImageUploadInput", + "ImageUploadField", + "namegen_filename", + "thumbgen_filename", +] # Widgets -class FileUploadInput(object): +class FileUploadInput: """ - Renders a file input chooser field. + Renders a file input chooser field. - You can customize `empty_template` and `data_template` members to customize - look and feel. + You can customize `empty_template` and `data_template` members to customize + look and feel. """ - empty_template = ('<input %(file)s>') - input_type = 'file' - data_template = ('<div>' - ' <input %(text)s>' - ' <input type="checkbox" name="%(marker)s">Delete</input>' - '</div>' - '<input %(file)s>') + empty_template = "<input %(file)s>" + input_type = "file" + + data_template = ( + "<div>" + " <input %(text)s>" + ' <input type="checkbox" name="%(marker)s">Delete</input>' + "</div>" + "<input %(file)s>" + ) def __call__(self, field, **kwargs): - kwargs.setdefault('id', field.id) - kwargs.setdefault('name', field.name) + kwargs.setdefault("id", field.id) + kwargs.setdefault("name", field.name) template = self.data_template if field.data else self.empty_template @@ -62,53 +70,53 @@ def __call__(self, field, **kwargs): if field.data and isinstance(field.data, FileStorage): value = field.data.filename else: - value = field.data or '' + value = field.data or "" - return Markup(template % { - 'text': html_params(type='text', - readonly='readonly', - value=value, - name=field.name), - 'file': html_params(type='file', - value=value, - **kwargs), - 'marker': '_%s-delete' % field.name - }) + return Markup( + template + % { + "text": html_params( + type="text", readonly="readonly", value=value, name=field.name + ), + "file": html_params(type="file", value=value, **kwargs), + "marker": "_%s-delete" % field.name, + } + ) -class ImageUploadInput(object): +class ImageUploadInput: """ - Renders a image input chooser field. + Renders a image input chooser field. - You can customize `empty_template` and `data_template` members to customize - look and feel. + You can customize `empty_template` and `data_template` members to customize + look and feel. """ - empty_template = ('<input %(file)s>') - input_type = 'file' - data_template = ('<div class="image-thumbnail">' - ' <img %(image)s>' - ' <input type="checkbox" name="%(marker)s">Delete</input>' - ' <input %(text)s>' - '</div>' - '<input %(file)s>') + empty_template = "<input %(file)s>" + input_type = "file" + + data_template = ( + '<div class="image-thumbnail">' + " <img %(image)s>" + ' <input type="checkbox" name="%(marker)s">Delete</input>' + " <input %(text)s>" + "</div>" + "<input %(file)s>" + ) def __call__(self, field, **kwargs): - kwargs.setdefault('id', field.id) - kwargs.setdefault('name', field.name) + kwargs.setdefault("id", field.id) + kwargs.setdefault("name", field.name) args = { - 'text': html_params(type='hidden', - value=field.data, - name=field.name), - 'file': html_params(type='file', - **kwargs), - 'marker': '_%s-delete' % field.name + "text": html_params(type="hidden", value=field.data, name=field.name), + "file": html_params(type="file", **kwargs), + "marker": "_%s-delete" % field.name, } if field.data and isinstance(field.data, string_types): url = self.get_url(field) - args['image'] = html_params(src=url) + args["image"] = html_params(src=url) template = self.data_template else: @@ -131,53 +139,61 @@ def get_url(self, field): # Fields class FileUploadField(fields.StringField): """ - Customizable file-upload field. + Customizable file-upload field. - Saves file to configured path, handles updates and deletions. Inherits from `StringField`, - resulting filename will be stored as string. + Saves file to configured path, handles updates and deletions. Inherits from `StringField`, + resulting filename will be stored as string. """ + widget = FileUploadInput() - def __init__(self, label=None, validators=None, - base_path=None, relative_path=None, - namegen=None, allowed_extensions=None, - permission=0o666, allow_overwrite=True, - **kwargs): + def __init__( + self, + label=None, + validators=None, + base_path=None, + relative_path=None, + namegen=None, + allowed_extensions=None, + permission=0o666, + allow_overwrite=True, + **kwargs, + ): """ - Constructor. - - :param label: - Display label - :param validators: - Validators - :param base_path: - Absolute path to the directory which will store files - :param relative_path: - Relative path from the directory. Will be prepended to the file name for uploaded files. - Flask-Admin uses `urlparse.urljoin` to generate resulting filename, so make sure you have - trailing slash. - :param namegen: - Function that will generate filename from the model and uploaded file object. - Please note, that model is "dirty" model object, before it was committed to database. - - For example:: - - import os.path as op - - def prefix_name(obj, file_data): - parts = op.splitext(file_data.filename) - return secure_filename('file-%s%s' % parts) - - class MyForm(BaseForm): - upload = FileUploadField('File', namegen=prefix_name) - - :param allowed_extensions: - List of allowed extensions. If not provided, will allow any file. - :param allow_overwrite: - Whether to overwrite existing files in upload directory. Defaults to `True`. - - .. versionadded:: 1.1.1 - The `allow_overwrite` parameter was added. + Constructor. + + :param label: + Display label + :param validators: + Validators + :param base_path: + Absolute path to the directory which will store files + :param relative_path: + Relative path from the directory. Will be prepended to the file name for uploaded files. + Flask-Admin uses `urlparse.urljoin` to generate resulting filename, so make sure you have + trailing slash. + :param namegen: + Function that will generate filename from the model and uploaded file object. + Please note, that model is "dirty" model object, before it was committed to database. + + For example:: + + import os.path as op + + def prefix_name(obj, file_data): + parts = op.splitext(file_data.filename) + return secure_filename('file-%s%s' % parts) + + class MyForm(BaseForm): + upload = FileUploadField('File', namegen=prefix_name) + + :param allowed_extensions: + List of allowed extensions. If not provided, will allow any file. + :param allow_overwrite: + Whether to overwrite existing files in upload directory. Defaults to `True`. + + .. versionadded:: 1.1.1 + The `allow_overwrite` parameter was added. """ self.base_path = base_path self.relative_path = relative_path @@ -190,41 +206,47 @@ class MyForm(BaseForm): self._should_delete = False if int(wtforms_version[0]) < 3: - kwargs.pop('extra_filters', None) + kwargs.pop("extra_filters", None) super(FileUploadField, self).__init__(label, validators, **kwargs) def is_file_allowed(self, filename): """ - Check if file extension is allowed. + Check if file extension is allowed. - :param filename: - File name to check + :param filename: + File name to check """ if not self.allowed_extensions: return True - return ('.' in filename and - filename.rsplit('.', 1)[1].lower() in - map(lambda x: x.lower(), self.allowed_extensions)) + return "." in filename and filename.rsplit(".", 1)[1].lower() in map( + lambda x: x.lower(), self.allowed_extensions + ) def _is_uploaded_file(self, data): - return (data and isinstance(data, FileStorage) and data.filename) + return data and isinstance(data, FileStorage) and data.filename def pre_validate(self, form): - if self._is_uploaded_file(self.data) and not self.is_file_allowed(self.data.filename): - raise ValidationError(gettext('Invalid file extension')) + if self._is_uploaded_file(self.data) and not self.is_file_allowed( + self.data.filename + ): + raise ValidationError(gettext("Invalid file extension")) # Handle overwriting existing content if not self._is_uploaded_file(self.data): return - if not self._allow_overwrite and os.path.exists(self._get_path(self.data.filename)): - raise ValidationError(gettext('File "%s" already exists.' % self.data.filename)) + if not self._allow_overwrite and os.path.exists( + self._get_path(self.data.filename) + ): + raise ValidationError( + gettext('File "%s" already exists.' % self.data.filename) + ) def process(self, formdata, data=unset_value, extra_filters=None): if formdata: - marker = '_%s-delete' % self.name + marker = "_%s-delete" % self.name if marker in formdata: self._should_delete = True @@ -272,7 +294,7 @@ def generate_name(self, obj, file_data): def _get_path(self, filename): if not self.base_path: - raise ValueError('FileUploadField field requires base_path to be set.') + raise ValueError("FileUploadField field requires base_path to be set.") if callable(self.base_path): return op.join(self.base_path(), filename) @@ -299,98 +321,107 @@ def _save_file(self, data, filename): class ImageUploadField(FileUploadField): """ - Image upload field. + Image upload field. - Does image validation, thumbnail generation, updating and deleting images. + Does image validation, thumbnail generation, updating and deleting images. - Requires PIL (or Pillow) to be installed. + Requires PIL (or Pillow) to be installed. """ + widget = ImageUploadInput() # type: ignore[assignment] - keep_image_formats = ('PNG',) + keep_image_formats = ("PNG",) """ If field detects that uploaded image is not in this list, it will save image as PNG. """ - def __init__(self, label=None, validators=None, - base_path=None, relative_path=None, - namegen=None, allowed_extensions=None, - max_size=None, - thumbgen=None, thumbnail_size=None, - permission=0o666, - url_relative_path=None, endpoint='static', - **kwargs): + def __init__( + self, + label=None, + validators=None, + base_path=None, + relative_path=None, + namegen=None, + allowed_extensions=None, + max_size=None, + thumbgen=None, + thumbnail_size=None, + permission=0o666, + url_relative_path=None, + endpoint="static", + **kwargs, + ): """ - Constructor. - - :param label: - Display label - :param validators: - Validators - :param base_path: - Absolute path to the directory which will store files - :param relative_path: - Relative path from the directory. Will be prepended to the file name for uploaded files. - Flask-Admin uses `urlparse.urljoin` to generate resulting filename, so make sure you have - trailing slash. - :param namegen: - Function that will generate filename from the model and uploaded file object. - Please note, that model is "dirty" model object, before it was committed to database. - - For example:: - - import os.path as op - - def prefix_name(obj, file_data): - parts = op.splitext(file_data.filename) - return secure_filename('file-%s%s' % parts) - - class MyForm(BaseForm): - upload = FileUploadField('File', namegen=prefix_name) - - :param allowed_extensions: - List of allowed extensions. If not provided, then gif, jpg, jpeg, png and tiff will be allowed. - :param max_size: - Tuple of (width, height, force) or None. If provided, Flask-Admin will - resize image to the desired size. - - Width and height is in pixels. If `force` is set to `True`, will try to fit image into dimensions and - keep aspect ratio, otherwise will just resize to target size. - :param thumbgen: - Thumbnail filename generation function. All thumbnails will be saved as JPEG files, - so there's no need to keep original file extension. - - For example:: - - import os.path as op - - def thumb_name(filename): - name, _ = op.splitext(filename) - return secure_filename('%s-thumb.jpg' % name) - - class MyForm(BaseForm): - upload = ImageUploadField('File', thumbgen=thumb_name) - - :param thumbnail_size: - Tuple or (width, height, force) values. If not provided, thumbnail won't be created. - - Width and height is in pixels. If `force` is set to `True`, will try to fit image into dimensions and - keep aspect ratio, otherwise will just resize to target size. - :param url_relative_path: - Relative path from the root of the static directory URL. Only gets used when generating - preview image URLs. - - For example, your model might store just file names (`relative_path` set to `None`), but - `base_path` is pointing to subdirectory. - :param endpoint: - Static endpoint for images. Used by widget to display previews. Defaults to 'static'. + Constructor. + + :param label: + Display label + :param validators: + Validators + :param base_path: + Absolute path to the directory which will store files + :param relative_path: + Relative path from the directory. Will be prepended to the file name for uploaded files. + Flask-Admin uses `urlparse.urljoin` to generate resulting filename, so make sure you have + trailing slash. + :param namegen: + Function that will generate filename from the model and uploaded file object. + Please note, that model is "dirty" model object, before it was committed to database. + + For example:: + + import os.path as op + + def prefix_name(obj, file_data): + parts = op.splitext(file_data.filename) + return secure_filename('file-%s%s' % parts) + + class MyForm(BaseForm): + upload = FileUploadField('File', namegen=prefix_name) + + :param allowed_extensions: + List of allowed extensions. If not provided, then gif, jpg, jpeg, png and tiff will be allowed. + :param max_size: + Tuple of (width, height, force) or None. If provided, Flask-Admin will + resize image to the desired size. + + Width and height is in pixels. If `force` is set to `True`, will try to fit image into dimensions and + keep aspect ratio, otherwise will just resize to target size. + :param thumbgen: + Thumbnail filename generation function. All thumbnails will be saved as JPEG files, + so there's no need to keep original file extension. + + For example:: + + import os.path as op + + def thumb_name(filename): + name, _ = op.splitext(filename) + return secure_filename('%s-thumb.jpg' % name) + + class MyForm(BaseForm): + upload = ImageUploadField('File', thumbgen=thumb_name) + + :param thumbnail_size: + Tuple or (width, height, force) values. If not provided, thumbnail won't be created. + + Width and height is in pixels. If `force` is set to `True`, will try to fit image into dimensions and + keep aspect ratio, otherwise will just resize to target size. + :param url_relative_path: + Relative path from the root of the static directory URL. Only gets used when generating + preview image URLs. + + For example, your model might store just file names (`relative_path` set to `None`), but + `base_path` is pointing to subdirectory. + :param endpoint: + Static endpoint for images. Used by widget to display previews. Defaults to 'static'. """ # Check if PIL is installed if Image is None: raise Exception( - 'Could not import `PIL`. ' - 'Enable `images` integration by installing `flask-admin[images]`' + "Could not import `PIL`. " + "Enable `images` integration by installing `flask-admin[images]`" ) self.max_size = max_size @@ -401,15 +432,18 @@ class MyForm(BaseForm): self.url_relative_path = url_relative_path if not allowed_extensions: - allowed_extensions = ('gif', 'jpg', 'jpeg', 'png', 'tiff') - - super(ImageUploadField, self).__init__(label, validators, - base_path=base_path, - relative_path=relative_path, - namegen=namegen, - allowed_extensions=allowed_extensions, - permission=permission, - **kwargs) + allowed_extensions = ("gif", "jpg", "jpeg", "png", "tiff") + + super(ImageUploadField, self).__init__( + label, + validators, + base_path=base_path, + relative_path=relative_path, + namegen=namegen, + allowed_extensions=allowed_extensions, + permission=permission, + **kwargs, + ) def pre_validate(self, form): super(ImageUploadField, self).pre_validate(form) @@ -418,7 +452,7 @@ def pre_validate(self, form): try: self.image = Image.open(self.data) except Exception as e: - raise ValidationError('Invalid image: %s' % e) + raise ValidationError("Invalid image: %s" % e) # Deletion def _delete_file(self, filename): @@ -461,16 +495,18 @@ def _save_thumbnail(self, data, filename, format): if self.image and self.thumbnail_size: path = self._get_path(self.thumbnail_fn(filename)) - self._save_image(self._resize(self.image, self.thumbnail_size), - path, - format) + self._save_image( + self._resize(self.image, self.thumbnail_size), path, format + ) def _resize(self, image, size): (width, height, force) = size if image.size[0] > width or image.size[1] > height: if force: - return ImageOps.fit(self.image, (width, height), Image.Resampling.LANCZOS) + return ImageOps.fit( + self.image, (width, height), Image.Resampling.LANCZOS + ) else: thumb = self.image.copy() thumb.thumbnail((width, height), Image.Resampling.LANCZOS) @@ -478,21 +514,21 @@ def _resize(self, image, size): return image - def _save_image(self, image, path, format='JPEG'): + def _save_image(self, image, path, format="JPEG"): # New Pillow versions require RGB format for JPEGs - if format == 'JPEG' and image.mode != 'RGB': - image = image.convert('RGB') - elif image.mode not in ('RGB', 'RGBA'): - image = image.convert('RGBA') + if format == "JPEG" and image.mode != "RGB": + image = image.convert("RGB") + elif image.mode not in ("RGB", "RGBA"): + image = image.convert("RGBA") - with open(path, 'wb') as fp: + with open(path, "wb") as fp: image.save(fp, format) def _get_save_format(self, filename, image): if image.format not in self.keep_image_formats: name, ext = op.splitext(filename) - filename = '%s.jpg' % name - return filename, 'JPEG' + filename = "%s.jpg" % name + return filename, "JPEG" return filename, image.format @@ -500,14 +536,14 @@ def _get_save_format(self, filename, image): # Helpers def namegen_filename(obj, file_data): """ - Generate secure filename for uploaded file. + Generate secure filename for uploaded file. """ return secure_filename(file_data.filename) def thumbgen_filename(filename): """ - Generate thumbnail name from filename. + Generate thumbnail name from filename. """ name, ext = op.splitext(filename) - return '%s_thumb%s' % (name, ext) + return "%s_thumb%s" % (name, ext) diff --git a/flask_admin/form/validators.py b/flask_admin/form/validators.py index 3d7693f8b..4de6d5462 100644 --- a/flask_admin/form/validators.py +++ b/flask_admin/form/validators.py @@ -1,16 +1,16 @@ -from flask_admin.babel import gettext - from wtforms.validators import StopValidation +from flask_admin.babel import gettext + -class FieldListInputRequired(object): +class FieldListInputRequired: """ - Validates that at least one item was provided for a FieldList + Validates that at least one item was provided for a FieldList """ - field_flags = {'required': True} + field_flags = {"required": True} def __call__(self, form, field): if len(field.entries) == 0: field.errors[:] = [] - raise StopValidation(gettext('This field requires at least one item.')) + raise StopValidation(gettext("This field requires at least one item.")) diff --git a/flask_admin/form/widgets.py b/flask_admin/form/widgets.py index e1ef745a5..09008c8be 100644 --- a/flask_admin/form/widgets.py +++ b/flask_admin/form/widgets.py @@ -1,24 +1,33 @@ -from wtforms import widgets from flask import current_app -from flask_admin.babel import gettext, ngettext +from wtforms import widgets + from flask_admin import helpers as h +from flask_admin.babel import gettext +from flask_admin.babel import ngettext -__all__ = ['Select2Widget', 'DatePickerWidget', 'DateTimePickerWidget', 'RenderTemplateWidget', 'Select2TagsWidget', ] +__all__ = [ + "Select2Widget", + "DatePickerWidget", + "DateTimePickerWidget", + "RenderTemplateWidget", + "Select2TagsWidget", +] class Select2Widget(widgets.Select): """ - `Select2 <https://github.com/ivaynberg/select2>`_ styled select widget. + `Select2 <https://github.com/ivaynberg/select2>`_ styled select widget. - You must include select2.js, form-x.x.x.js and select2 stylesheet for it to - work. + You must include select2.js, form-x.x.x.js and select2 stylesheet for it to + work. """ + def __call__(self, field, **kwargs): - kwargs.setdefault('data-role', u'select2') + kwargs.setdefault("data-role", "select2") - allow_blank = getattr(field, 'allow_blank', False) + allow_blank = getattr(field, "allow_blank", False) if allow_blank and not self.multiple: - kwargs['data-allow-blank'] = u'1' + kwargs["data-allow-blank"] = "1" return super(Select2Widget, self).__call__(field, **kwargs) @@ -27,70 +36,80 @@ class Select2TagsWidget(widgets.TextInput): """`Select2Tags <http://ivaynberg.github.com/select2/#tags>`_ styled text widget. You must include select2.js, form-x.x.x.js and select2 stylesheet for it to work. """ + def __call__(self, field, **kwargs): - kwargs.setdefault('data-role', u'select2-tags') - kwargs.setdefault('data-allow-duplicate-tags', "true" if getattr(field, 'allow_duplicates', False) else "false") + kwargs.setdefault("data-role", "select2-tags") + kwargs.setdefault( + "data-allow-duplicate-tags", + "true" if getattr(field, "allow_duplicates", False) else "false", + ) return super(Select2TagsWidget, self).__call__(field, **kwargs) class DatePickerWidget(widgets.TextInput): """ - Date picker widget. + Date picker widget. - You must include bootstrap-datepicker.js and form-x.x.x.js for styling to work. + You must include bootstrap-datepicker.js and form-x.x.x.js for styling to work. """ + def __call__(self, field, **kwargs): - kwargs.setdefault('data-role', u'datepicker') - kwargs.setdefault('data-date-format', u'YYYY-MM-DD') + kwargs.setdefault("data-role", "datepicker") + kwargs.setdefault("data-date-format", "YYYY-MM-DD") - self.date_format = kwargs['data-date-format'] + self.date_format = kwargs["data-date-format"] return super(DatePickerWidget, self).__call__(field, **kwargs) class DateTimePickerWidget(widgets.TextInput): """ - Datetime picker widget. + Datetime picker widget. - You must include bootstrap-datepicker.js and form-x.x.x.js for styling to work. + You must include bootstrap-datepicker.js and form-x.x.x.js for styling to work. """ + def __call__(self, field, **kwargs): - kwargs.setdefault('data-role', u'datetimepicker') - kwargs.setdefault('data-date-format', u'YYYY-MM-DD HH:mm:ss') + kwargs.setdefault("data-role", "datetimepicker") + kwargs.setdefault("data-date-format", "YYYY-MM-DD HH:mm:ss") return super(DateTimePickerWidget, self).__call__(field, **kwargs) class TimePickerWidget(widgets.TextInput): """ - Date picker widget. + Date picker widget. - You must include bootstrap-datepicker.js and form-x.x.x.js for styling to work. + You must include bootstrap-datepicker.js and form-x.x.x.js for styling to work. """ + def __call__(self, field, **kwargs): - kwargs.setdefault('data-role', u'timepicker') - kwargs.setdefault('data-date-format', u'HH:mm:ss') + kwargs.setdefault("data-role", "timepicker") + kwargs.setdefault("data-date-format", "HH:mm:ss") return super(TimePickerWidget, self).__call__(field, **kwargs) -class RenderTemplateWidget(object): +class RenderTemplateWidget: """ - WTForms widget that renders Jinja2 template + WTForms widget that renders Jinja2 template """ + def __init__(self, template): """ - Constructor + Constructor - :param template: - Template path + :param template: + Template path """ self.template = template def __call__(self, field, **kwargs): - kwargs.update({ - 'field': field, - '_gettext': gettext, - '_ngettext': ngettext, - 'h': h, - }) + kwargs.update( + { + "field": field, + "_gettext": gettext, + "_ngettext": ngettext, + "h": h, + } + ) template = current_app.jinja_env.get_template(self.template) return template.render(kwargs) diff --git a/flask_admin/helpers.py b/flask_admin/helpers.py index 7c4efd6da..81965460a 100644 --- a/flask_admin/helpers.py +++ b/flask_admin/helpers.py @@ -1,20 +1,23 @@ -from re import sub, compile -from typing import Callable, Optional -from urllib.parse import urljoin, urlparse - -from flask import g, request, url_for, flash +from re import compile +from re import sub +from urllib.parse import urljoin +from urllib.parse import urlparse + +from flask import flash +from flask import g +from flask import request +from flask import url_for from jinja2 import pass_context # type: ignore[attr-defined] -from markupsafe import Markup -from wtforms.validators import DataRequired, InputRequired +from wtforms.validators import DataRequired +from wtforms.validators import InputRequired from flask_admin._compat import iteritems from ._compat import string_types - -VALID_SCHEMES = ['http', 'https'] -_substitute_whitespace = compile(r'[\s\x00-\x08\x0B\x0C\x0E-\x19]+').sub -_fix_multiple_slashes = compile(r'(^([^/]+:)?//)/*').sub +VALID_SCHEMES = ["http", "https"] +_substitute_whitespace = compile(r"[\s\x00-\x08\x0B\x0C\x0E-\x19]+").sub +_fix_multiple_slashes = compile(r"(^([^/]+:)?//)/*").sub def set_current_view(view): @@ -23,21 +26,21 @@ def set_current_view(view): def get_current_view(): """ - Get current administrative view. + Get current administrative view. """ - return getattr(g, '_admin_view', None) + return getattr(g, "_admin_view", None) def get_url(endpoint, **kwargs): """ - Alternative to Flask `url_for`. - If there's current administrative view, will call its `get_url`. If there's none - will - use generic `url_for`. + Alternative to Flask `url_for`. + If there's current administrative view, will call its `get_url`. If there's none - will + use generic `url_for`. - :param endpoint: - Endpoint name - :param kwargs: - View arguments + :param endpoint: + Endpoint name + :param kwargs: + View arguments """ view = get_current_view() @@ -49,13 +52,14 @@ def get_url(endpoint, **kwargs): def is_required_form_field(field): """ - Check if form field has `DataRequired`, `InputRequired`, or - `FieldListInputRequired` validators. + Check if form field has `DataRequired`, `InputRequired`, or + `FieldListInputRequired` validators. - :param field: - WTForms field to check + :param field: + WTForms field to check """ from flask_admin.form.validators import FieldListInputRequired + for validator in field.validators: if isinstance(validator, (DataRequired, InputRequired, FieldListInputRequired)): return True @@ -64,22 +68,22 @@ def is_required_form_field(field): def is_form_submitted(): """ - Check if current method is PUT or POST + Check if current method is PUT or POST """ - return request and request.method in ('PUT', 'POST') + return request and request.method in ("PUT", "POST") def validate_form_on_submit(form): """ - If current method is PUT or POST, validate form and return validation status. + If current method is PUT or POST, validate form and return validation status. """ return is_form_submitted() and form.validate() def get_form_data(): """ - If current method is PUT or POST, return concatenated `request.form` with - `request.files` or `None` otherwise. + If current method is PUT or POST, return concatenated `request.form` with + `request.files` or `None` otherwise. """ if is_form_submitted(): formdata = request.form @@ -93,10 +97,10 @@ def get_form_data(): def is_field_error(errors): """ - Check if wtforms field has error without checking its children. + Check if wtforms field has error without checking its children. - :param errors: - Errors list. + :param errors: + Errors list. """ if isinstance(errors, (list, tuple)): for e in errors: @@ -108,44 +112,45 @@ def is_field_error(errors): def flash_errors(form, message): from flask_admin.babel import gettext + for field_name, errors in iteritems(form.errors): - errors = form[field_name].label.text + u": " + u", ".join(errors) - flash(gettext(message, error=str(errors)), 'error') + errors = form[field_name].label.text + ": " + ", ".join(errors) + flash(gettext(message, error=str(errors)), "error") @pass_context def resolve_ctx(context): """ - Resolve current Jinja2 context and store it for general consumption. + Resolve current Jinja2 context and store it for general consumption. """ g._admin_render_ctx = context def get_render_ctx(): """ - Get view template context. + Get view template context. """ - return getattr(g, '_admin_render_ctx', None) + return getattr(g, "_admin_render_ctx", None) def prettify_class_name(name): """ - Split words in PascalCase string into separate words. + Split words in PascalCase string into separate words. - :param name: - String to split + :param name: + String to split """ - return sub(r'(?<=.)([A-Z])', r' \1', name) + return sub(r"(?<=.)([A-Z])", r" \1", name) def is_safe_url(target): # prevent urls like "\\www.google.com" # some browser will change \\ to // (eg: Chrome) # refs https://stackoverflow.com/questions/10438008 - target = target.replace('\\', '/') + target = target.replace("\\", "/") # handle cases like "j a v a s c r i p t:" - target = _substitute_whitespace('', target) + target = _substitute_whitespace("", target) # Chrome and FireFox "fix" more than two slashes into two after protocol target = _fix_multiple_slashes(lambda m: m.group(1), target, 1) @@ -161,7 +166,7 @@ def is_safe_url(target): return ref_url.netloc == test_url.netloc -def get_redirect_target(param_name='url'): +def get_redirect_target(param_name="url"): target = request.values.get(param_name) if target and is_safe_url(target): diff --git a/flask_admin/menu.py b/flask_admin/menu.py index 2257d3384..f72a3039d 100644 --- a/flask_admin/menu.py +++ b/flask_admin/menu.py @@ -1,13 +1,16 @@ from flask import url_for -class BaseMenu(object): +class BaseMenu: """ - Base menu item + Base menu item """ - def __init__(self, name, class_name=None, icon_type=None, icon_value=None, target=None): + + def __init__( + self, name, class_name=None, icon_type=None, icon_value=None, target=None + ): self.name = name - self.class_name = class_name if class_name is not None else '' + self.class_name = class_name if class_name is not None else "" self.icon_type = icon_type self.icon_value = icon_value self.target = target @@ -54,8 +57,9 @@ def get_children(self): class MenuCategory(BaseMenu): """ - Menu category item. + Menu category item. """ + def get_url(self): return None @@ -79,13 +83,16 @@ def is_accessible(self): class MenuView(BaseMenu): """ - Admin view menu item + Admin view menu item """ + def __init__(self, name, view=None, cache=True): - super(MenuView, self).__init__(name, - class_name=view.menu_class_name, - icon_type=view.menu_icon_type, - icon_value=view.menu_icon_value) + super(MenuView, self).__init__( + name, + class_name=view.menu_class_name, + icon_type=view.menu_icon_type, + icon_value=view.menu_icon_value, + ) self._view = view self._cache = cache @@ -100,7 +107,9 @@ def get_url(self): if self._cached_url: return self._cached_url - url = self._view.get_url('%s.%s' % (self._view.endpoint, self._view._default_view)) + url = self._view.get_url( + "%s.%s" % (self._view.endpoint, self._view._default_view) + ) if self._cache: self._cached_url = url @@ -128,10 +137,20 @@ def is_accessible(self): class MenuLink(BaseMenu): """ - Link item + Link item """ - def __init__(self, name, url=None, endpoint=None, category=None, class_name=None, - icon_type=None, icon_value=None, target=None): + + def __init__( + self, + name, + url=None, + endpoint=None, + category=None, + class_name=None, + icon_type=None, + icon_value=None, + target=None, + ): super(MenuLink, self).__init__(name, class_name, icon_type, icon_value, target) self.category = category @@ -146,4 +165,4 @@ def get_url(self): class SubMenuCategory(MenuCategory): def __init__(self, *args, **kwargs): super(SubMenuCategory, self).__init__(*args, **kwargs) - self.class_name += ' dropdown-submenu dropright' + self.class_name += " dropdown-submenu dropright" diff --git a/flask_admin/model/ajax.py b/flask_admin/model/ajax.py index 480789947..0b7e0e689 100644 --- a/flask_admin/model/ajax.py +++ b/flask_admin/model/ajax.py @@ -1,46 +1,47 @@ DEFAULT_PAGE_SIZE = 10 -class AjaxModelLoader(object): +class AjaxModelLoader: """ - Ajax related model loader. Override this to implement custom loading behavior. + Ajax related model loader. Override this to implement custom loading behavior. """ + def __init__(self, name, options): """ - Constructor. + Constructor. - :param name: - Field name + :param name: + Field name """ self.name = name self.options = options def format(self, model): """ - Return (id, name) tuple from the model. + Return (id, name) tuple from the model. """ raise NotImplementedError() def get_one(self, pk): """ - Find model by its primary key. + Find model by its primary key. - :param pk: - Primary key value + :param pk: + Primary key value """ raise NotImplementedError() def get_list(self, query, offset=0, limit=DEFAULT_PAGE_SIZE): """ - Return models that match `query`. + Return models that match `query`. - :param view: - Administrative view. - :param query: - Query string - :param offset: - Offset - :param limit: - Limit + :param view: + Administrative view. + :param query: + Query string + :param offset: + Offset + :param limit: + Limit """ raise NotImplementedError() diff --git a/flask_admin/model/base.py b/flask_admin/model/base.py index b4ea7630b..27578c7b8 100644 --- a/flask_admin/model/base.py +++ b/flask_admin/model/base.py @@ -1,57 +1,87 @@ -import warnings -import re import csv +import inspect import mimetypes +import re import time -from typing import Optional, cast, Type - -from math import ceil -import inspect +import warnings from collections import OrderedDict - +from math import ceil +from typing import cast +from typing import Optional +from typing import Type + +from flask import abort +from flask import current_app +from flask import flash +from flask import get_flashed_messages +from flask import json +from flask import redirect +from flask import request +from flask import Response +from flask import stream_with_context from jinja2 import pass_context # type: ignore[attr-defined] from werkzeug.utils import secure_filename -from flask import (current_app, request, redirect, flash, abort, json, - Response, get_flashed_messages, stream_with_context) - -from .._types import T_COLUMN_LIST, T_FORMATTERS +from .._types import T_COLUMN_LIST +from .._types import T_FORMATTERS try: import tablib except ImportError: tablib = None -from wtforms.form import Form from wtforms.fields import HiddenField from wtforms.fields.core import UnboundField -from wtforms.validators import ValidationError, InputRequired - -from flask_admin.babel import gettext, ngettext +from wtforms.form import Form +from wtforms.validators import InputRequired +from wtforms.validators import ValidationError -from flask_admin.base import BaseView, expose -from flask_admin.form import BaseForm, FormOpts, rules -from flask_admin.model import filters, typefmt, template +from flask_admin._backwards import ObsoleteAttr +from flask_admin._compat import as_unicode +from flask_admin._compat import csv_encode +from flask_admin._compat import iteritems +from flask_admin._compat import itervalues +from flask_admin._compat import text_type from flask_admin.actions import ActionsMixin -from flask_admin.helpers import (get_form_data, validate_form_on_submit, - get_redirect_target, flash_errors) +from flask_admin.babel import gettext +from flask_admin.babel import ngettext +from flask_admin.base import BaseView +from flask_admin.base import expose +from flask_admin.form import BaseForm +from flask_admin.form import FormOpts +from flask_admin.form import rules +from flask_admin.helpers import flash_errors +from flask_admin.helpers import get_form_data +from flask_admin.helpers import get_redirect_target +from flask_admin.helpers import validate_form_on_submit +from flask_admin.model import filters +from flask_admin.model import template +from flask_admin.model import typefmt from flask_admin.tools import rec_getattr -from flask_admin._backwards import ObsoleteAttr -from flask_admin._compat import (iteritems, itervalues, - as_unicode, csv_encode, text_type) -from .helpers import prettify_name, get_mdict_item_or_list + from .ajax import AjaxModelLoader +from .helpers import get_mdict_item_or_list +from .helpers import prettify_name # Used to generate filter query string name -filter_char_re = re.compile('[^a-z0-9 ]') -filter_compact_re = re.compile(' +') +filter_char_re = re.compile("[^a-z0-9 ]") +filter_compact_re = re.compile(" +") -class ViewArgs(object): +class ViewArgs: """ - List view arguments. + List view arguments. """ - def __init__(self, page=None, page_size=None, sort=None, sort_desc=None, - search=None, filters=None, extra_args=None): + + def __init__( + self, + page=None, + page_size=None, + sort=None, + sort_desc=None, + search=None, + filters=None, + extra_args=None, + ): self.page = page self.page_size = page_size self.sort = sort @@ -70,18 +100,18 @@ def clone(self, **kwargs): else: flt = None - kwargs.setdefault('page', self.page) - kwargs.setdefault('page_size', self.page_size) - kwargs.setdefault('sort', self.sort) - kwargs.setdefault('sort_desc', self.sort_desc) - kwargs.setdefault('search', self.search) - kwargs.setdefault('filters', flt) - kwargs.setdefault('extra_args', dict(self.extra_args)) + kwargs.setdefault("page", self.page) + kwargs.setdefault("page_size", self.page_size) + kwargs.setdefault("sort", self.sort) + kwargs.setdefault("sort_desc", self.sort_desc) + kwargs.setdefault("search", self.search) + kwargs.setdefault("filters", flt) + kwargs.setdefault("extra_args", dict(self.extra_args)) return ViewArgs(**kwargs) -class FilterGroup(object): +class FilterGroup: def __init__(self, label): self.label = label self.filters = [] @@ -93,10 +123,10 @@ def non_lazy(self): filters = [] for item in self.filters: copy = dict(item) - copy['operation'] = as_unicode(copy['operation']) - options = copy['options'] + copy["operation"] = as_unicode(copy["operation"]) + options = copy["options"] if options: - copy['options'] = [(k, text_type(v)) for k, v in options] + copy["options"] = [(k, text_type(v)) for k, v in options] filters.append(copy) return as_unicode(self.label), filters @@ -107,22 +137,23 @@ def __iter__(self): class BaseModelView(BaseView, ActionsMixin): """ - Base model view. + Base model view. - This view does not make any assumptions on how models are stored or managed, but expects the following: + This view does not make any assumptions on how models are stored or managed, but expects the following: - 1. The provided model is an object - 2. The model contains properties - 3. Each model contains an attribute which uniquely identifies it (i.e. a primary key for a database model) - 4. It is possible to retrieve a list of sorted models with pagination applied from a data source - 5. You can get one model by its identifier from the data source + 1. The provided model is an object + 2. The model contains properties + 3. Each model contains an attribute which uniquely identifies it (i.e. a primary key for a database model) + 4. It is possible to retrieve a list of sorted models with pagination applied from a data source + 5. You can get one model by its identifier from the data source - Essentially, if you want to support a new data store, all you have to do is: + Essentially, if you want to support a new data store, all you have to do is: - 1. Derive from the `BaseModelView` class - 2. Implement various data-related methods (`get_list`, `get_one`, `create_model`, etc) - 3. Implement automatic form generation from the model representation (`scaffold_form`) + 1. Derive from the `BaseModelView` class + 2. Implement various data-related methods (`get_list`, `get_one`, `create_model`, etc) + 3. Implement automatic form generation from the model representation (`scaffold_form`) """ + # Permissions can_create = True """Is model creation allowed""" @@ -143,26 +174,26 @@ class BaseModelView(BaseView, ActionsMixin): """Is model list export allowed""" # Templates - list_template = 'admin/model/list.html' + list_template = "admin/model/list.html" """Default list view template""" - edit_template = 'admin/model/edit.html' + edit_template = "admin/model/edit.html" """Default edit template""" - create_template = 'admin/model/create.html' + create_template = "admin/model/create.html" """Default create template""" - details_template = 'admin/model/details.html' + details_template = "admin/model/details.html" """Default details view template""" # Modal Templates - edit_modal_template = 'admin/model/modals/edit.html' + edit_modal_template = "admin/model/modals/edit.html" """Default edit modal template""" - create_modal_template = 'admin/model/modals/create.html' + create_modal_template = "admin/model/modals/create.html" """Default create modal template""" - details_modal_template = 'admin/model/modals/details.html' + details_modal_template = "admin/model/modals/details.html" """Default details modal view template""" # Modals @@ -177,8 +208,7 @@ class BaseModelView(BaseView, ActionsMixin): # Customizations column_list: Optional[T_COLUMN_LIST] = cast( - None, - ObsoleteAttr('column_list', 'list_columns', None) + None, ObsoleteAttr("column_list", "list_columns", None) ) """ Collection of the model field names for the list view. @@ -200,8 +230,8 @@ class MyModelView(BaseModelView): """ column_exclude_list: Optional[T_COLUMN_LIST] = cast( - None, - ObsoleteAttr('column_exclude_list', 'excluded_list_columns', None)) + None, ObsoleteAttr("column_exclude_list", "excluded_list_columns", None) + ) """ Collection of excluded list column names. @@ -233,7 +263,7 @@ class MyModelView(BaseModelView): Collection of fields excluded from the export. """ - column_formatters = ObsoleteAttr('column_formatters', 'list_formatters', dict()) + column_formatters = ObsoleteAttr("column_formatters", "list_formatters", dict()) """ Dictionary of list view column formatters. @@ -286,8 +316,7 @@ def formatter(view, context, model, name): """ column_type_formatters: Optional[T_FORMATTERS] = cast( - None, - ObsoleteAttr('column_type_formatters', 'list_type_formatters', None) + None, ObsoleteAttr("column_type_formatters", "list_type_formatters", None) ) """ Dictionary of value type formatters to be used in the list view. @@ -356,7 +385,7 @@ def type_formatter(view, value): Functions the same way as column_type_formatters. """ - column_labels = ObsoleteAttr('column_labels', 'rename_columns', None) + column_labels = ObsoleteAttr("column_labels", "rename_columns", None) """ Dictionary where key is column name and value is string to display. @@ -381,7 +410,7 @@ class MyModelView(BaseModelView): column_sortable_list: Optional[T_COLUMN_LIST] = cast( None, - ObsoleteAttr('column_sortable_list', 'sortable_columns', None), + ObsoleteAttr("column_sortable_list", "sortable_columns", None), ) """ Collection of the sortable columns for the list view. @@ -435,7 +464,7 @@ class MyModelView(BaseModelView): column_searchable_list: Optional[T_COLUMN_LIST] = cast( None, - ObsoleteAttr('column_searchable_list', 'searchable_columns', None), + ObsoleteAttr("column_searchable_list", "searchable_columns", None), ) """ A collection of the searchable columns. It is assumed that only @@ -493,9 +522,7 @@ class MyModelView(BaseModelView): Changing this parameter will break any existing URLs that have filters. """ - column_display_pk = ObsoleteAttr('column_display_pk', - 'list_display_pk', - False) + column_display_pk = ObsoleteAttr("column_display_pk", "list_display_pk", False) """ Controls if the primary key should be displayed in the list view. """ @@ -603,9 +630,9 @@ class MyModelView(BaseModelView): or you will need to use `inline_models`. """ - form_excluded_columns = ObsoleteAttr('form_excluded_columns', - 'excluded_form_columns', - None) + form_excluded_columns = ObsoleteAttr( + "form_excluded_columns", "excluded_form_columns", None + ) """ Collection of excluded form field names. @@ -750,9 +777,9 @@ class MyModelView(ModelView): """ # Actions - action_disallowed_list = ObsoleteAttr('action_disallowed_list', - 'disallowed_actions', - []) + action_disallowed_list = ObsoleteAttr( + "action_disallowed_list", "disallowed_actions", [] + ) """ Set of disallowed action names. For example, if you want to disable mass model deletion, do something like this: @@ -769,7 +796,7 @@ class MyModelView(BaseModelView): Unlimited by default. Uses `page_size` if set to `None`. """ - export_types = ['csv'] + export_types = ["csv"] """ A list of available export filetypes. `csv` only is default, but any filetypes supported by tablib can be used. @@ -794,44 +821,59 @@ class MyModelView(BaseModelView): Sets the page size options available, if `can_set_page_size` is True """ - def __init__(self, model, - name=None, category=None, endpoint=None, url=None, static_folder=None, - menu_class_name=None, menu_icon_type=None, menu_icon_value=None): - """ - Constructor. - - :param model: - Model class - :param name: - View name. If not provided, will use the model class name - :param category: - Optional category name, for grouping views in the menu - :param endpoint: - Base endpoint. If not provided, will use the model name. - :param url: - Base URL. If not provided, will use endpoint as a URL. - :param menu_class_name: - Optional class name for the menu item. - :param menu_icon_type: - Optional icon. Possible icon types: - - - `flask_admin.consts.ICON_TYPE_GLYPH` - Bootstrap glyph icon - - `flask_admin.consts.ICON_TYPE_FONT_AWESOME` - Font Awesome icon - - `flask_admin.consts.ICON_TYPE_IMAGE` - Image relative to Flask static directory - - `flask_admin.consts.ICON_TYPE_IMAGE_URL` - Image with full URL - :param menu_icon_value: - Icon glyph name or URL, depending on `menu_icon_type` setting + def __init__( + self, + model, + name=None, + category=None, + endpoint=None, + url=None, + static_folder=None, + menu_class_name=None, + menu_icon_type=None, + menu_icon_value=None, + ): + """ + Constructor. + + :param model: + Model class + :param name: + View name. If not provided, will use the model class name + :param category: + Optional category name, for grouping views in the menu + :param endpoint: + Base endpoint. If not provided, will use the model name. + :param url: + Base URL. If not provided, will use endpoint as a URL. + :param menu_class_name: + Optional class name for the menu item. + :param menu_icon_type: + Optional icon. Possible icon types: + + - `flask_admin.consts.ICON_TYPE_GLYPH` - Bootstrap glyph icon + - `flask_admin.consts.ICON_TYPE_FONT_AWESOME` - Font Awesome icon + - `flask_admin.consts.ICON_TYPE_IMAGE` - Image relative to Flask static directory + - `flask_admin.consts.ICON_TYPE_IMAGE_URL` - Image with full URL + :param menu_icon_value: + Icon glyph name or URL, depending on `menu_icon_type` setting """ self.model = model # If name not provided, it is model name if name is None: - name = '%s' % self._prettify_class_name(model.__name__) + name = "%s" % self._prettify_class_name(model.__name__) - super(BaseModelView, self).__init__(name, category, endpoint, url, static_folder, - menu_class_name=menu_class_name, - menu_icon_type=menu_icon_type, - menu_icon_value=menu_icon_value) + super(BaseModelView, self).__init__( + name, + category, + endpoint, + url, + static_folder, + menu_class_name=menu_class_name, + menu_icon_type=menu_icon_type, + menu_icon_value=menu_icon_value, + ) # Actions self.init_actions() @@ -841,8 +883,7 @@ def __init__(self, model, if self.can_set_page_size and self.page_size not in self.page_size_options: warnings.warn( - f"{self.page_size=} is not in {self.page_size_options=}", - UserWarning + f"{self.page_size=} is not in {self.page_size_options=}", UserWarning ) # Endpoint @@ -882,13 +923,15 @@ def _refresh_filters_cache(self): key = as_unicode(flt.name) if key not in self._filter_groups: self._filter_groups[key] = FilterGroup(flt.name) - self._filter_groups[key].append({ - 'index': i, - 'arg': self.get_filter_arg(i, flt), - 'operation': flt.operation(), - 'options': flt.get_options(self) or None, - 'type': flt.data_type - }) + self._filter_groups[key].append( + { + "index": i, + "arg": self.get_filter_arg(i, flt), + "operation": flt.operation(), + "options": flt.get_options(self) or None, + "type": flt.data_type, + } + ) self._filter_args[self.get_filter_arg(i, flt)] = (i, flt) else: @@ -917,7 +960,7 @@ def _refresh_form_rules_cache(self): def _refresh_cache(self): """ - Refresh various cached variables. + Refresh various cached variables. """ # List view self._list_columns = self.get_list_columns() @@ -942,10 +985,12 @@ def _refresh_cache(self): # Choices if self.column_choices: - self._column_choices_map = dict([ - (column, dict(choices)) - for column, choices in self.column_choices.items() - ]) + self._column_choices_map = dict( + [ + (column, dict(choices)) + for column, choices in self.column_choices.items() + ] + ) else: self.column_choices = self._column_choices_map = dict() @@ -982,28 +1027,28 @@ def _refresh_cache(self): # Primary key def get_pk_value(self, model): """ - Return PK value from a model object. + Return PK value from a model object. """ raise NotImplementedError() # List view def scaffold_list_columns(self): """ - Return list of the model field names. Must be implemented in - the child class. + Return list of the model field names. Must be implemented in + the child class. - Expected return format is list of strings of the field names. For example:: + Expected return format is list of strings of the field names. For example:: - ['name', 'first_name', 'last_name'] + ['name', 'first_name', 'last_name'] """ - raise NotImplementedError('Please implement scaffold_list_columns method') + raise NotImplementedError("Please implement scaffold_list_columns method") def get_column_name(self, field): """ - Return a human-readable column name. + Return a human-readable column name. - :param field: - Model field name. + :param field: + Model field name. """ if self.column_labels and field in self.column_labels: return self.column_labels[field] @@ -1012,8 +1057,8 @@ def get_column_name(self, field): def get_list_row_actions(self): """ - Return list of row action objects, each is instance of - :class:`~flask_admin.model.template.BaseListRowAction` + Return list of row action objects, each is instance of + :class:`~flask_admin.model.template.BaseListRowAction` """ actions = [] @@ -1036,15 +1081,15 @@ def get_list_row_actions(self): def get_column_names(self, only_columns, excluded_columns): """ - Returns a list of tuples with the model field name and formatted - field name. + Returns a list of tuples with the model field name and formatted + field name. - :param only_columns: - List of columns to include in the results. If not set, - `scaffold_list_columns` will generate the list from the model. - :param excluded_columns: - List of columns to exclude from the results if `only_columns` - is not set. + :param only_columns: + List of columns to include in the results. If not set, + `scaffold_list_columns` will generate the list from the model. + :param excluded_columns: + List of columns to exclude from the results if `only_columns` + is not set. """ if excluded_columns: only_columns = [c for c in only_columns if c not in excluded_columns] @@ -1053,10 +1098,10 @@ def get_column_names(self, only_columns, excluded_columns): def get_list_columns(self): """ - Uses `get_column_names` to get a list of tuples with the model - field name and formatted name for the columns in `column_list` - and not in `column_exclude_list`. If `column_list` is not set, - the columns from `scaffold_list_columns` will be used. + Uses `get_column_names` to get a list of tuples with the model + field name and formatted name for the columns in `column_list` + and not in `column_exclude_list`. If `column_list` is not set, + the columns from `scaffold_list_columns` will be used. """ return self.get_column_names( only_columns=self.column_list or self.scaffold_list_columns(), @@ -1065,15 +1110,15 @@ def get_list_columns(self): def get_details_columns(self): """ - Uses `get_column_names` to get a list of tuples with the model - field name and formatted name for the columns in `column_details_list` - and not in `column_details_exclude_list`. If `column_details_list` - is not set, the columns from `scaffold_list_columns` will be used. + Uses `get_column_names` to get a list of tuples with the model + field name and formatted name for the columns in `column_details_list` + and not in `column_details_exclude_list`. If `column_details_list` + is not set, the columns from `scaffold_list_columns` will be used. """ try: only_columns = self.column_details_list or self.scaffold_list_columns() except NotImplementedError: - raise Exception('Please define column_details_list') + raise Exception("Please define column_details_list") return self.get_column_names( only_columns=only_columns, @@ -1082,14 +1127,15 @@ def get_details_columns(self): def get_export_columns(self): """ - Uses `get_column_names` to get a list of tuples with the model - field name and formatted name for the columns in `column_export_list` - and not in `column_export_exclude_list`. If `column_export_list` is - not set, it will attempt to use the columns from `column_list` - or finally the columns from `scaffold_list_columns` will be used. + Uses `get_column_names` to get a list of tuples with the model + field name and formatted name for the columns in `column_export_list` + and not in `column_export_exclude_list`. If `column_export_list` is + not set, it will attempt to use the columns from `column_list` + or finally the columns from `scaffold_list_columns` will be used. """ - only_columns = (self.column_export_list or self.column_list or - self.scaffold_list_columns()) + only_columns = ( + self.column_export_list or self.column_list or self.scaffold_list_columns() + ) return self.get_column_names( only_columns=only_columns, @@ -1098,21 +1144,21 @@ def get_export_columns(self): def scaffold_sortable_columns(self): """ - Returns dictionary of sortable columns. Must be implemented in - the child class. + Returns dictionary of sortable columns. Must be implemented in + the child class. - Expected return format is a dictionary, where keys are field names and - values are property names. + Expected return format is a dictionary, where keys are field names and + values are property names. """ - raise NotImplementedError('Please implement scaffold_sortable_columns method') + raise NotImplementedError("Please implement scaffold_sortable_columns method") def get_sortable_columns(self): """ - Returns a dictionary of the sortable columns. Key is a model - field name and value is sort column (for example - attribute). + Returns a dictionary of the sortable columns. Key is a model + field name and value is sort column (for example - attribute). - If `column_sortable_list` is set, will use it. Otherwise, will call - `scaffold_sortable_columns` to get them from the model. + If `column_sortable_list` is set, will use it. Otherwise, will call + `scaffold_sortable_columns` to get them from the model. """ if self.column_sortable_list is None: return self.scaffold_sortable_columns() or dict() @@ -1129,54 +1175,54 @@ def get_sortable_columns(self): def init_search(self): """ - Initialize search. If data provider does not support search, - `init_search` will return `False`. + Initialize search. If data provider does not support search, + `init_search` will return `False`. """ return False def search_placeholder(self): """ - Return search placeholder text. + Return search placeholder text. """ return None # Filter helpers def scaffold_filters(self, name): """ - Generate filter object for the given name + Generate filter object for the given name - :param name: - Name of the field + :param name: + Name of the field """ return None def is_valid_filter(self, filter): """ - Verify that the provided filter object is valid. + Verify that the provided filter object is valid. - Override in model backend implementation to verify if - the provided filter type is allowed. + Override in model backend implementation to verify if + the provided filter type is allowed. - :param filter: - Filter object to verify. + :param filter: + Filter object to verify. """ return isinstance(filter, filters.BaseFilter) def handle_filter(self, filter): """ - Postprocess (add joins, etc) for a filter. + Postprocess (add joins, etc) for a filter. - :param filter: - Filter object to postprocess + :param filter: + Filter object to postprocess """ return filter def get_filters(self): """ - Return a list of filter objects. + Return a list of filter objects. - If your model backend implementation does not support filters, - override this method and return `None`. + If your model backend implementation does not support filters, + override this method and return `None`. """ if self.column_filters: collection = [] @@ -1189,22 +1235,22 @@ def get_filters(self): if flt: collection.extend(flt) else: - raise Exception('Unsupported filter type %s' % n) + raise Exception("Unsupported filter type %s" % n) return collection else: return None def get_filter_arg(self, index, flt): """ - Given a filter `flt`, return a unique name for that filter in - this view. + Given a filter `flt`, return a unique name for that filter in + this view. - Does not include the `flt[n]_` portion of the filter name. + Does not include the `flt[n]_` portion of the filter name. - :param index: - Filter index in _filters array - :param flt: - Filter instance + :param index: + Filter index in _filters array + :param flt: + Filter instance """ if self.named_filter_urls: operation = flt.operation() @@ -1215,16 +1261,16 @@ def get_filter_arg(self, index, flt): except AttributeError: pass - name = ('%s %s' % (flt.name, as_unicode(operation))).lower() - name = filter_char_re.sub('', name) - name = filter_compact_re.sub('_', name) + name = ("%s %s" % (flt.name, as_unicode(operation))).lower() + name = filter_char_re.sub("", name) + name = filter_compact_re.sub("_", name) return name else: return str(index) def _get_filter_groups(self): """ - Returns non-lazy version of filter strings + Returns non-lazy version of filter strings """ if self._filter_groups: results = OrderedDict() @@ -1240,34 +1286,34 @@ def _get_filter_groups(self): # Form helpers def scaffold_form(self): """ - Create `form.BaseForm` inherited class from the model. Must be - implemented in the child class. + Create `form.BaseForm` inherited class from the model. Must be + implemented in the child class. """ - raise NotImplementedError('Please implement scaffold_form method') + raise NotImplementedError("Please implement scaffold_form method") def scaffold_list_form(self, widget=None, validators=None): """ - Create form for the `index_view` using only the columns from - `self.column_editable_list`. + Create form for the `index_view` using only the columns from + `self.column_editable_list`. - :param widget: - WTForms widget class. Defaults to `XEditableWidget`. - :param validators: - `form_args` dict with only validators - {'name': {'validators': [DataRequired()]}} + :param widget: + WTForms widget class. Defaults to `XEditableWidget`. + :param validators: + `form_args` dict with only validators + {'name': {'validators': [DataRequired()]}} - Must be implemented in the child class. + Must be implemented in the child class. """ - raise NotImplementedError('Please implement scaffold_list_form method') + raise NotImplementedError("Please implement scaffold_list_form method") def get_form(self): """ - Get form class. + Get form class. - If ``self.form`` is set, will return it and will call - ``self.scaffold_form`` otherwise. + If ``self.form`` is set, will return it and will call + ``self.scaffold_form`` otherwise. - Override to implement customized behavior. + Override to implement customized behavior. """ if self.form is not None: return self.form @@ -1276,31 +1322,31 @@ def get_form(self): def get_list_form(self): """ - Get form class for the editable list view. + Get form class for the editable list view. - Uses only validators from `form_args` to build the form class. + Uses only validators from `form_args` to build the form class. - Allows overriding the editable list view field/widget. For example:: + Allows overriding the editable list view field/widget. For example:: - from flask_admin.model.widgets import XEditableWidget + from flask_admin.model.widgets import XEditableWidget - class CustomWidget(XEditableWidget): - def get_kwargs(self, subfield, kwargs): - if subfield.type == 'TextAreaField': - kwargs['data-type'] = 'textarea' - kwargs['data-rows'] = '20' - # elif: kwargs for other fields + class CustomWidget(XEditableWidget): + def get_kwargs(self, subfield, kwargs): + if subfield.type == 'TextAreaField': + kwargs['data-type'] = 'textarea' + kwargs['data-rows'] = '20' + # elif: kwargs for other fields - return kwargs + return kwargs - class MyModelView(BaseModelView): - def get_list_form(self): - return self.scaffold_list_form(widget=CustomWidget) + class MyModelView(BaseModelView): + def get_list_form(self): + return self.scaffold_list_form(widget=CustomWidget) """ if self.form_args: # get only validators, other form_args can break FieldList wrapper validators = dict( - (key, {'validators': value["validators"]}) + (key, {"validators": value["validators"]}) for key, value in iteritems(self.form_args) if value.get("validators") ) @@ -1311,26 +1357,27 @@ def get_list_form(self): def get_create_form(self): """ - Create form class for model creation view. + Create form class for model creation view. - Override to implement customized behavior. + Override to implement customized behavior. """ return self.get_form() def get_edit_form(self): """ - Create form class for model editing view. + Create form class for model editing view. - Override to implement customized behavior. + Override to implement customized behavior. """ return self.get_form() def get_delete_form(self): """ - Create form class for model delete view. + Create form class for model delete view. - Override to implement customized behavior. + Override to implement customized behavior. """ + class DeleteForm(self.form_base_class): id = HiddenField(validators=[InputRequired()]) url = HiddenField() @@ -1339,10 +1386,11 @@ class DeleteForm(self.form_base_class): def get_action_form(self): """ - Create form class for a model action. + Create form class for a model action. - Override to implement customized behavior. + Override to implement customized behavior. """ + class ActionForm(self.form_base_class): action = HiddenField() url = HiddenField() @@ -1352,28 +1400,28 @@ class ActionForm(self.form_base_class): def create_form(self, obj=None): """ - Instantiate model creation form and return it. + Instantiate model creation form and return it. - Override to implement custom behavior. + Override to implement custom behavior. """ return self._create_form_class(get_form_data(), obj=obj) def edit_form(self, obj=None): """ - Instantiate model editing form and return it. + Instantiate model editing form and return it. - Override to implement custom behavior. + Override to implement custom behavior. """ return self._edit_form_class(get_form_data(), obj=obj) def delete_form(self): """ - Instantiate model delete form and return it. + Instantiate model delete form and return it. - Override to implement custom behavior. + Override to implement custom behavior. - The delete form originally used a GET request, so delete_form - accepts both GET and POST request for backwards compatibility. + The delete form originally used a GET request, so delete_form + accepts both GET and POST request for backwards compatibility. """ if request.form: return self._delete_form_class(request.form) @@ -1385,48 +1433,48 @@ def delete_form(self): def list_form(self, obj=None): """ - Instantiate model editing form for list view and return it. + Instantiate model editing form for list view and return it. - Override to implement custom behavior. + Override to implement custom behavior. """ return self._list_form_class(get_form_data(), obj=obj) def action_form(self, obj=None): """ - Instantiate model action form and return it. + Instantiate model action form and return it. - Override to implement custom behavior. + Override to implement custom behavior. """ return self._action_form_class(get_form_data(), obj=obj) def validate_form(self, form): """ - Validate the form on submit. + Validate the form on submit. - :param form: - Form to validate + :param form: + Form to validate """ return validate_form_on_submit(form) def get_save_return_url(self, model, is_created=False): """ - Return url where user is redirected after successful form save. + Return url where user is redirected after successful form save. - :param model: - Saved object - :param is_created: - Whether new object was created or existing one was updated + :param model: + Saved object + :param is_created: + Whether new object was created or existing one was updated - For example, redirect use to object details view after form save:: + For example, redirect use to object details view after form save:: - class MyModelView(ModelView): - can_view_details = True + class MyModelView(ModelView): + can_view_details = True - def get_save_return_url(self, model, is_created): - return self.get_url('.details_view', id=model.id) + def get_save_return_url(self, model, is_created): + return self.get_url('.details_view', id=model.id) """ - return get_redirect_target() or self.get_url('.index_view') + return get_redirect_target() or self.get_url(".index_view") def _get_ruleset_missing_fields(self, ruleset, form): missing_fields = [] @@ -1456,14 +1504,18 @@ def _validate_form_class(self, ruleset, form_class, remove_missing=True): missing_fields.append(field_name) if missing_fields: - self._show_missing_fields_warning('Fields missing from ruleset: %s' % (','.join(missing_fields))) + self._show_missing_fields_warning( + "Fields missing from ruleset: %s" % (",".join(missing_fields)) + ) if remove_missing: self._remove_fields_from_form_class(missing_fields, form_class) def _validate_form_instance(self, ruleset, form, remove_missing=True): missing_fields = self._get_ruleset_missing_fields(ruleset=ruleset, form=form) if missing_fields: - self._show_missing_fields_warning('Fields missing from ruleset: %s' % (','.join(missing_fields))) + self._show_missing_fields_warning( + "Fields missing from ruleset: %s" % (",".join(missing_fields)) + ) if remove_missing: self._remove_fields_from_form_instance(missing_fields, form) @@ -1478,27 +1530,27 @@ def _remove_fields_from_form_class(self, field_names, form_class): # Helpers def is_sortable(self, name): """ - Verify if column is sortable. + Verify if column is sortable. - Not case-sensitive. + Not case-sensitive. - :param name: - Column name. + :param name: + Column name. """ return name.lower() in (x.lower() for x in self._sortable_columns) def is_editable(self, name): """ - Verify if column is editable. + Verify if column is editable. - :param name: - Column name. + :param name: + Column name. """ return name in self.column_editable_list and self.can_edit def _get_column_by_idx(self, idx): """ - Return column index by + Return column index by """ if idx is None or idx < 0 or idx >= len(self._list_columns): return None @@ -1507,7 +1559,7 @@ def _get_column_by_idx(self, idx): def _get_default_order(self): """ - Return default sort order + Return default sort order """ if self.column_default_sort: if isinstance(self.column_default_sort, list): @@ -1528,49 +1580,48 @@ def get_safe_page_size(self, page_size): return safe_page_size # Database-related API - def get_list(self, page, sort_field, sort_desc, search, filters, - page_size=None): - """ - Return a tuple of a count of results and a paginated and sorted list of models from the data source. - - Must be implemented in the child class. - - :param page: - Page number, 0 based. Can be set to None if it is first page. - :param sort_field: - Sort column name or None. - :param sort_desc: - If set to True, sorting is in descending order. - :param search: - Search query - :param filters: - List of filter tuples. First value in a tuple is a search - index, second value is a search value. - :param page_size: - Number of results. Defaults to ModelView's page_size. Can be - overriden to change the page_size limit. Removing the page_size - limit requires setting page_size to 0 or False. - """ - raise NotImplementedError('Please implement get_list method') + def get_list(self, page, sort_field, sort_desc, search, filters, page_size=None): + """ + Return a tuple of a count of results and a paginated and sorted list of models from the data source. + + Must be implemented in the child class. + + :param page: + Page number, 0 based. Can be set to None if it is first page. + :param sort_field: + Sort column name or None. + :param sort_desc: + If set to True, sorting is in descending order. + :param search: + Search query + :param filters: + List of filter tuples. First value in a tuple is a search + index, second value is a search value. + :param page_size: + Number of results. Defaults to ModelView's page_size. Can be + overriden to change the page_size limit. Removing the page_size + limit requires setting page_size to 0 or False. + """ + raise NotImplementedError("Please implement get_list method") def get_one(self, id): """ - Return one model by its id. + Return one model by its id. - Must be implemented in the child class. + Must be implemented in the child class. - :param id: - Model id + :param id: + Model id """ - raise NotImplementedError('Please implement get_one method') + raise NotImplementedError("Please implement get_one method") # Exception handler def handle_view_exception(self, exc): if isinstance(exc, ValidationError): - flash(as_unicode(exc), 'error') + flash(as_unicode(exc), "error") return True - if current_app.config.get('FLASK_ADMIN_RAISE_ON_VIEW_EXCEPTION'): + if current_app.config.get("FLASK_ADMIN_RAISE_ON_VIEW_EXCEPTION"): raise if self._debug: @@ -1581,32 +1632,36 @@ def handle_view_exception(self, exc): # Model event handlers def on_model_change(self, form, model, is_created): """ - Perform some actions before a model is created or updated. + Perform some actions before a model is created or updated. - Called from create_model and update_model in the same transaction - (if it has any meaning for a store backend). + Called from create_model and update_model in the same transaction + (if it has any meaning for a store backend). - By default does nothing. + By default does nothing. - :param form: - Form used to create/update model - :param model: - Model that will be created/updated - :param is_created: - Will be set to True if model was created and to False if edited + :param form: + Form used to create/update model + :param model: + Model that will be created/updated + :param is_created: + Will be set to True if model was created and to False if edited """ pass def _on_model_change(self, form, model, is_created): """ - Compatibility helper. + Compatibility helper. """ try: self.on_model_change(form, model, is_created) except TypeError as e: - if re.match(r'on_model_change\(\) takes .* 3 .* arguments .* 4 .* given .*', str(e)): - msg = ('%s.on_model_change() now accepts third ' + - 'parameter is_created. Please update your code') % self.model + if re.match( + r"on_model_change\(\) takes .* 3 .* arguments .* 4 .* given .*", str(e) + ): + msg = ( + "%s.on_model_change() now accepts third " + + "parameter is_created. Please update your code" + ) % self.model warnings.warn(msg) self.on_model_change(form, model) @@ -1615,126 +1670,126 @@ def _on_model_change(self, form, model, is_created): def after_model_change(self, form, model, is_created): """ - Perform some actions after a model was created or updated and - committed to the database. + Perform some actions after a model was created or updated and + committed to the database. - Called from create_model after successful database commit. + Called from create_model after successful database commit. - By default does nothing. + By default does nothing. - :param form: - Form used to create/update model - :param model: - Model that was created/updated - :param is_created: - True if model was created, False if model was updated + :param form: + Form used to create/update model + :param model: + Model that was created/updated + :param is_created: + True if model was created, False if model was updated """ pass def on_model_delete(self, model): """ - Perform some actions before a model is deleted. + Perform some actions before a model is deleted. - Called from delete_model in the same transaction - (if it has any meaning for a store backend). + Called from delete_model in the same transaction + (if it has any meaning for a store backend). - By default do nothing. + By default do nothing. """ pass def after_model_delete(self, model): """ - Perform some actions after a model was deleted and - committed to the database. + Perform some actions after a model was deleted and + committed to the database. - Called from delete_model after successful database commit - (if it has any meaning for a store backend). + Called from delete_model after successful database commit + (if it has any meaning for a store backend). - By default does nothing. + By default does nothing. - :param model: - Model that was deleted + :param model: + Model that was deleted """ pass def on_form_prefill(self, form, id): """ - Perform additional actions to pre-fill the edit form. + Perform additional actions to pre-fill the edit form. - Called from edit_view, if the current action is rendering - the form rather than receiving client side input, after - default pre-filling has been performed. + Called from edit_view, if the current action is rendering + the form rather than receiving client side input, after + default pre-filling has been performed. - By default does nothing. + By default does nothing. - You only need to override this if you have added custom - fields that depend on the database contents in a way that - Flask-admin can't figure out by itself. Fields that were - added by name of a normal column or relationship should - work out of the box. + You only need to override this if you have added custom + fields that depend on the database contents in a way that + Flask-admin can't figure out by itself. Fields that were + added by name of a normal column or relationship should + work out of the box. - :param form: - Form instance - :param id: - id of the object that is going to be edited + :param form: + Form instance + :param id: + id of the object that is going to be edited """ pass def create_model(self, form): """ - Create model from the form. + Create model from the form. - Returns the model instance if operation succeeded. + Returns the model instance if operation succeeded. - Must be implemented in the child class. + Must be implemented in the child class. - :param form: - Form instance + :param form: + Form instance """ raise NotImplementedError() def update_model(self, form, model): """ - Update model from the form. + Update model from the form. - Returns `True` if operation succeeded. + Returns `True` if operation succeeded. - Must be implemented in the child class. + Must be implemented in the child class. - :param form: - Form instance - :param model: - Model instance + :param form: + Form instance + :param model: + Model instance """ raise NotImplementedError() def delete_model(self, model): """ - Delete model. + Delete model. - Returns `True` if operation succeeded. + Returns `True` if operation succeeded. - Must be implemented in the child class. + Must be implemented in the child class. - :param model: - Model instance + :param model: + Model instance """ raise NotImplementedError() # Various helpers def _prettify_name(self, name): """ - Prettify pythonic variable name. + Prettify pythonic variable name. - For example, 'hello_world' will be converted to 'Hello World' + For example, 'hello_world' will be converted to 'Hello World' - :param name: - Name to prettify + :param name: + Name to prettify """ return prettify_name(name) def get_empty_list_message(self): - return gettext('There are no items in the table.') + return gettext("There are no items in the table.") def get_invalid_value_msg(self, value, filter): """ @@ -1743,7 +1798,7 @@ def get_invalid_value_msg(self, value, filter): :param filter: Filter :return: string """ - return gettext('Invalid Filter Value: %(value)s', value=value) + return gettext("Invalid Filter Value: %(value)s", value=value) # URL generation helpers def _get_list_filter_args(self): @@ -1751,13 +1806,13 @@ def _get_list_filter_args(self): filters = [] for arg in request.args: - if not arg.startswith('flt'): + if not arg.startswith("flt"): continue - if '_' not in arg: + if "_" not in arg: continue - pos, key = arg[3:].split('_', 1) + pos, key = arg[3:].split("_", 1) if key in self._filter_args: idx, flt = self._filter_args[key] @@ -1768,7 +1823,7 @@ def _get_list_filter_args(self): data = (pos, (idx, as_unicode(flt.name), value)) filters.append(data) else: - flash(self.get_invalid_value_msg(value, flt), 'error') + flash(self.get_invalid_value_msg(value, flt), "error") # Sort filters return [v[1] for v in sorted(filters, key=lambda n: n[0])] @@ -1777,26 +1832,38 @@ def _get_list_filter_args(self): def _get_list_extra_args(self): """ - Return arguments from query string. - """ - return ViewArgs(page=request.args.get('page', 0, type=int), - page_size=request.args.get('page_size', 0, type=int), - sort=request.args.get('sort', None, type=int), - sort_desc=request.args.get('desc', None, type=int), - search=request.args.get('search', None), - filters=self._get_list_filter_args(), - extra_args=dict([ - (k, v) for k, v in request.args.items() - if k not in ('page', 'page_size', 'sort', 'desc', 'search', ) and - not k.startswith('flt') - ])) + Return arguments from query string. + """ + return ViewArgs( + page=request.args.get("page", 0, type=int), + page_size=request.args.get("page_size", 0, type=int), + sort=request.args.get("sort", None, type=int), + sort_desc=request.args.get("desc", None, type=int), + search=request.args.get("search", None), + filters=self._get_list_filter_args(), + extra_args=dict( + [ + (k, v) + for k, v in request.args.items() + if k + not in ( + "page", + "page_size", + "sort", + "desc", + "search", + ) + and not k.startswith("flt") + ] + ), + ) def _get_filters(self, filters): """ - Get active filters as dictionary of URL arguments and values + Get active filters as dictionary of URL arguments and values - :param filters: - List of filters from ViewArgs object + :param filters: + List of filters from ViewArgs object """ kwargs = {} @@ -1804,7 +1871,7 @@ def _get_filters(self, filters): for i, pair in enumerate(filters): idx, flt_name, value = pair - key = 'flt%d_%s' % (i, self.get_filter_arg(idx, self._filters[idx])) + key = "flt%d_%s" % (i, self.get_filter_arg(idx, self._filters[idx])) kwargs[key] = value return kwargs @@ -1812,58 +1879,61 @@ def _get_filters(self, filters): # URL generation helpers def _get_list_url(self, view_args): """ - Generate page URL with current page, sort column and - other parameters. + Generate page URL with current page, sort column and + other parameters. - :param view: - View name - :param view_args: - ViewArgs object with page number, filters, etc. + :param view: + View name + :param view_args: + ViewArgs object with page number, filters, etc. """ page = view_args.page or None desc = 1 if view_args.sort_desc else None - kwargs = dict(page=page, sort=view_args.sort, desc=desc, search=view_args.search) + kwargs = dict( + page=page, sort=view_args.sort, desc=desc, search=view_args.search + ) kwargs.update(view_args.extra_args) - kwargs['page_size'] = self.get_safe_page_size(view_args.page_size) + kwargs["page_size"] = self.get_safe_page_size(view_args.page_size) kwargs.update(self._get_filters(view_args.filters)) - return self.get_url('.index_view', **kwargs) + return self.get_url(".index_view", **kwargs) # Actions def is_action_allowed(self, name): """ - Override this method to allow or disallow actions based - on some condition. + Override this method to allow or disallow actions based + on some condition. - The default implementation only checks if the particular action - is not in `action_disallowed_list`. + The default implementation only checks if the particular action + is not in `action_disallowed_list`. """ return name not in self.action_disallowed_list def _get_field_value(self, model, name): """ - Get unformatted field value from the model + Get unformatted field value from the model """ return rec_getattr(model, name) - def _get_list_value(self, context, model, name, column_formatters, - column_type_formatters): + def _get_list_value( + self, context, model, name, column_formatters, column_type_formatters + ): """ - Returns the value to be displayed. + Returns the value to be displayed. - :param context: - :py:class:`jinja2.runtime.Context` if available - :param model: - Model instance - :param name: - Field name - :param column_formatters: - column_formatters to be used. - :param column_type_formatters: - column_type_formatters to be used. + :param context: + :py:class:`jinja2.runtime.Context` if available + :param model: + Model instance + :param name: + Field name + :param column_formatters: + column_formatters to be used. + :param column_type_formatters: + column_type_formatters to be used. """ column_fmt = column_formatters.get(name) if column_fmt is not None: @@ -1887,8 +1957,10 @@ def _get_list_value(self, context, model, name, column_formatters, spec = inspect.getfullargspec(type_fmt) if len(spec.args) == 2: - warnings.warn(f'Please update your type formatter {type_fmt} to ' - 'include additional `name` parameter.') + warnings.warn( + f"Please update your type formatter {type_fmt} to " + "include additional `name` parameter." + ) else: raise @@ -1899,14 +1971,14 @@ def _get_list_value(self, context, model, name, column_formatters, @pass_context def get_list_value(self, context, model, name): """ - Returns the value to be displayed in the list view + Returns the value to be displayed in the list view - :param context: - :py:class:`jinja2.runtime.Context` - :param model: - Model instance - :param name: - Field name + :param context: + :py:class:`jinja2.runtime.Context` + :param model: + Model instance + :param name: + Field name """ return self._get_list_value( context, @@ -1919,14 +1991,14 @@ def get_list_value(self, context, model, name): @pass_context def get_detail_value(self, context, model, name): """ - Returns the value to be displayed in the detail view + Returns the value to be displayed in the detail view - :param context: - :py:class:`jinja2.runtime.Context` - :param model: - Model instance - :param name: - Field name + :param context: + :py:class:`jinja2.runtime.Context` + :param model: + Model instance + :param name: + Field name """ return self._get_list_value( context, @@ -1938,13 +2010,13 @@ def get_detail_value(self, context, model, name): def get_export_value(self, model, name): """ - Returns the value to be displayed in export. - Allows export to use different (non HTML) formatters. + Returns the value to be displayed in export. + Allows export to use different (non HTML) formatters. - :param model: - Model instance - :param name: - Field name + :param model: + Model instance + :param name: + Field name """ return self._get_list_value( None, @@ -1954,20 +2026,22 @@ def get_export_value(self, model, name): self.column_type_formatters_export, ) - def get_export_name(self, export_type='csv'): + def get_export_name(self, export_type="csv"): """ :return: The exported csv file name. """ - filename = '%s_%s.%s' % (self.name, - time.strftime("%Y-%m-%d_%H-%M-%S"), - export_type) + filename = "%s_%s.%s" % ( + self.name, + time.strftime("%Y-%m-%d_%H-%M-%S"), + export_type, + ) return filename # AJAX references def _process_ajax_references(self): """ - Process `form_ajax_refs` and generate model loaders that - will be used by the `ajax_lookup` view. + Process `form_ajax_refs` and generate model loaders that + will be used by the `ajax_lookup` view. """ result = {} @@ -1978,21 +2052,24 @@ def _process_ajax_references(self): elif isinstance(options, AjaxModelLoader): result[name] = options else: - raise ValueError('%s.form_ajax_refs can not handle %s types' % (self, type(options))) + raise ValueError( + "%s.form_ajax_refs can not handle %s types" + % (self, type(options)) + ) return result def _create_ajax_loader(self, name, options): """ - Model backend will override this to implement AJAX model loading. + Model backend will override this to implement AJAX model loading. """ raise NotImplementedError() # Views - @expose('/') + @expose("/") def index_view(self): """ - List view + List view """ if self.can_delete: delete_form = self.delete_form() @@ -2011,8 +2088,14 @@ def index_view(self): page_size = self.get_safe_page_size(view_args.page_size) # Get count and data - count, data = self.get_list(view_args.page, sort_column, view_args.sort_desc, - view_args.search, view_args.filters, page_size=page_size) + count, data = self.get_list( + view_args.page, + sort_column, + view_args.sort_desc, + view_args.search, + view_args.filters, + page_size=page_size, + ) list_forms = {} if self.column_editable_list: @@ -2054,11 +2137,15 @@ def page_size_url(s): else: action_form = None - clear_search_url = self._get_list_url(view_args.clone(page=0, - sort=view_args.sort, - sort_desc=view_args.sort_desc, - search=None, - filters=None)) + clear_search_url = self._get_list_url( + view_args.clone( + page=0, + sort=view_args.sort, + sort_desc=view_args.sort_desc, + search=None, + filters=None, + ) + ) return self.render( self.list_template, @@ -2066,13 +2153,11 @@ def page_size_url(s): list_forms=list_forms, delete_form=delete_form, action_form=action_form, - # List list_columns=self._list_columns, sortable_columns=self._sortable_columns, editable_columns=self.column_editable_list, list_row_actions=self.get_list_row_actions(), - # Pagination count=count, pager_url=pager_url, @@ -2082,50 +2167,44 @@ def page_size_url(s): page=view_args.page, page_size=page_size, default_page_size=self.page_size, - # Sorting sort_column=view_args.sort, sort_desc=view_args.sort_desc, sort_url=sort_url, - # Search search_supported=self._search_supported, clear_search_url=clear_search_url, search=view_args.search, search_placeholder=self.search_placeholder(), - # Filters filters=self._filters, filter_groups=self._get_filter_groups(), active_filters=view_args.filters, filter_args=self._get_filters(view_args.filters), - # Actions actions=actions, actions_confirmation=actions_confirmation, - # Misc enumerate=enumerate, get_pk_value=self.get_pk_value, get_value=self.get_list_value, return_url=self._get_list_url(view_args), - # Extras extra_args=view_args.extra_args, ) - @expose('/new/', methods=('GET', 'POST')) + @expose("/new/", methods=("GET", "POST")) def create_view(self): """ - Create model view + Create model view """ - return_url = get_redirect_target() or self.get_url('.index_view') + return_url = get_redirect_target() or self.get_url(".index_view") if not self.can_create: return redirect(return_url) form = self.create_form() - if not hasattr(form, '_validated_ruleset') or not form._validated_ruleset: + if not hasattr(form, "_validated_ruleset") or not form._validated_ruleset: self._validate_form_instance(ruleset=self._form_create_rules, form=form) if self.validate_form(form): @@ -2133,13 +2212,15 @@ def create_view(self): # in later versions, this is the model itself model = self.create_model(form) if model: - flash(gettext('Record was successfully created.'), 'success') - if '_add_another' in request.form: + flash(gettext("Record was successfully created."), "success") + if "_add_another" in request.form: return redirect(request.url) - elif '_continue_editing' in request.form: + elif "_continue_editing" in request.form: # if we have a valid model, try to go to the edit view if model is not True: - url = self.get_url('.edit_view', id=self.get_pk_value(model), url=return_url) + url = self.get_url( + ".edit_view", id=self.get_pk_value(model), url=return_url + ) else: url = return_url return redirect(url) @@ -2147,108 +2228,111 @@ def create_view(self): # save button return redirect(self.get_save_return_url(model, is_created=True)) - form_opts = FormOpts(widget_args=self.form_widget_args, - form_rules=self._form_create_rules) + form_opts = FormOpts( + widget_args=self.form_widget_args, form_rules=self._form_create_rules + ) - if self.create_modal and request.args.get('modal'): + if self.create_modal and request.args.get("modal"): template = self.create_modal_template else: template = self.create_template - return self.render(template, - form=form, - form_opts=form_opts, - return_url=return_url) + return self.render( + template, form=form, form_opts=form_opts, return_url=return_url + ) - @expose('/edit/', methods=('GET', 'POST')) + @expose("/edit/", methods=("GET", "POST")) def edit_view(self): """ - Edit model view + Edit model view """ - return_url = get_redirect_target() or self.get_url('.index_view') + return_url = get_redirect_target() or self.get_url(".index_view") if not self.can_edit: return redirect(return_url) - id = get_mdict_item_or_list(request.args, 'id') + id = get_mdict_item_or_list(request.args, "id") if id is None: return redirect(return_url) model = self.get_one(id) if model is None: - flash(gettext('Record does not exist.'), 'error') + flash(gettext("Record does not exist."), "error") return redirect(return_url) form = self.edit_form(obj=model) - if not hasattr(form, '_validated_ruleset') or not form._validated_ruleset: + if not hasattr(form, "_validated_ruleset") or not form._validated_ruleset: self._validate_form_instance(ruleset=self._form_edit_rules, form=form) if self.validate_form(form): if self.update_model(form, model): - flash(gettext('Record was successfully saved.'), 'success') - if '_add_another' in request.form: - return redirect(self.get_url('.create_view', url=return_url)) - elif '_continue_editing' in request.form: - return redirect(self.get_url('.edit_view', id=self.get_pk_value(model))) + flash(gettext("Record was successfully saved."), "success") + if "_add_another" in request.form: + return redirect(self.get_url(".create_view", url=return_url)) + elif "_continue_editing" in request.form: + return redirect( + self.get_url(".edit_view", id=self.get_pk_value(model)) + ) else: # save button return redirect(self.get_save_return_url(model, is_created=False)) - if request.method == 'GET' or form.errors: + if request.method == "GET" or form.errors: self.on_form_prefill(form, id) - form_opts = FormOpts(widget_args=self.form_widget_args, - form_rules=self._form_edit_rules) + form_opts = FormOpts( + widget_args=self.form_widget_args, form_rules=self._form_edit_rules + ) - if self.edit_modal and request.args.get('modal'): + if self.edit_modal and request.args.get("modal"): template = self.edit_modal_template else: template = self.edit_template - return self.render(template, - model=model, - form=form, - form_opts=form_opts, - return_url=return_url) + return self.render( + template, model=model, form=form, form_opts=form_opts, return_url=return_url + ) - @expose('/details/') + @expose("/details/") def details_view(self): """ - Details model view + Details model view """ - return_url = get_redirect_target() or self.get_url('.index_view') + return_url = get_redirect_target() or self.get_url(".index_view") if not self.can_view_details: return redirect(return_url) - id = get_mdict_item_or_list(request.args, 'id') + id = get_mdict_item_or_list(request.args, "id") if id is None: return redirect(return_url) model = self.get_one(id) if model is None: - flash(gettext('Record does not exist.'), 'error') + flash(gettext("Record does not exist."), "error") return redirect(return_url) - if self.details_modal and request.args.get('modal'): + if self.details_modal and request.args.get("modal"): template = self.details_modal_template else: template = self.details_template - return self.render(template, - model=model, - details_columns=self._details_columns, - get_value=self.get_detail_value, - return_url=return_url) + return self.render( + template, + model=model, + details_columns=self._details_columns, + get_value=self.get_detail_value, + return_url=return_url, + ) - @expose('/delete/', methods=('POST',)) + @expose("/delete/", methods=("POST",)) def delete_view(self): """ - Delete model view. Only POST method is allowed. + Delete model view. Only POST method is allowed. """ - return_url = get_redirect_target() or self.get_url('.index_view') + return_url = get_redirect_target() or self.get_url(".index_view") if not self.can_delete: return redirect(return_url) @@ -2262,26 +2346,31 @@ def delete_view(self): model = self.get_one(id) if model is None: - flash(gettext('Record does not exist.'), 'error') + flash(gettext("Record does not exist."), "error") return redirect(return_url) # message is flashed from within delete_model if it fails if self.delete_model(model): count = 1 flash( - ngettext('Record was successfully deleted.', - '%(count)s records were successfully deleted.', - count, count=count), 'success') + ngettext( + "Record was successfully deleted.", + "%(count)s records were successfully deleted.", + count, + count=count, + ), + "success", + ) return redirect(return_url) else: - flash_errors(form, message='Failed to delete record. %(error)s') + flash_errors(form, message="Failed to delete record. %(error)s") return redirect(return_url) - @expose('/action/', methods=('POST',)) + @expose("/action/", methods=("POST",)) def action_view(self): """ - Mass-model action view. + Mass-model action view. """ return self.handle_action() @@ -2294,11 +2383,11 @@ def _export_data(self): if col not in [col for col, _ in self._export_columns]: continue - if func.__name__ == 'inner': + if func.__name__ == "inner": raise NotImplementedError( - 'Macros are not implemented in export. Exclude column in' - ' column_formatters_export, column_export_list, or ' - ' column_export_exclude_list. Column: %s' % (col,) + "Macros are not implemented in export. Exclude column in" + " column_formatters_export, column_export_list, or " + " column_export_exclude_list. Column: %s" % (col,) ) # Grab parameters from URL @@ -2310,37 +2399,43 @@ def _export_data(self): sort_column = sort_column[0] # Get count and data - count, data = self.get_list(0, sort_column, view_args.sort_desc, - view_args.search, view_args.filters, - page_size=self.export_max_rows) + count, data = self.get_list( + 0, + sort_column, + view_args.sort_desc, + view_args.search, + view_args.filters, + page_size=self.export_max_rows, + ) return count, data - @expose('/export/<export_type>/') + @expose("/export/<export_type>/") def export(self, export_type): - return_url = get_redirect_target() or self.get_url('.index_view') + return_url = get_redirect_target() or self.get_url(".index_view") if not self.can_export or (export_type not in self.export_types): - flash(gettext('Permission denied.'), 'error') + flash(gettext("Permission denied."), "error") return redirect(return_url) - if export_type == 'csv': + if export_type == "csv": return self._export_csv(return_url) else: return self._export_tablib(export_type, return_url) def _export_csv(self, return_url): """ - Export a CSV of records as a stream. + Export a CSV of records as a stream. """ count, data = self._export_data() # https://docs.djangoproject.com/en/1.8/howto/outputting-csv/ - class Echo(object): + class Echo: """ An object that implements just the write method of the file-like interface. """ + def write(self, value): """ Write the value by returning it, instead of storing @@ -2356,46 +2451,51 @@ def generate(): yield writer.writerow(titles) for row in data: - vals = [csv_encode(self.get_export_value(row, c[0])) - for c in self._export_columns] + vals = [ + csv_encode(self.get_export_value(row, c[0])) + for c in self._export_columns + ] yield writer.writerow(vals) - filename = self.get_export_name(export_type='csv') + filename = self.get_export_name(export_type="csv") - disposition = 'attachment;filename=%s' % (secure_filename(filename),) + disposition = "attachment;filename=%s" % (secure_filename(filename),) return Response( stream_with_context(generate()), - headers={'Content-Disposition': disposition}, - mimetype='text/csv' + headers={"Content-Disposition": disposition}, + mimetype="text/csv", ) def _export_tablib(self, export_type, return_url): """ - Exports a variety of formats using the tablib library. + Exports a variety of formats using the tablib library. """ if tablib is None: raise Exception( - 'Could not import `tablib`. ' - 'Enable `export` integration by installing `flask-admin[export]`' + "Could not import `tablib`. " + "Enable `export` integration by installing `flask-admin[export]`" ) filename = self.get_export_name(export_type) - disposition = 'attachment;filename=%s' % (secure_filename(filename),) + disposition = "attachment;filename=%s" % (secure_filename(filename),) mimetype, encoding = mimetypes.guess_type(filename) if not mimetype: - mimetype = 'application/octet-stream' + mimetype = "application/octet-stream" if encoding: - mimetype = '%s; charset=%s' % (mimetype, encoding) + mimetype = "%s; charset=%s" % (mimetype, encoding) ds = tablib.Dataset(headers=[csv_encode(c[1]) for c in self._export_columns]) count, data = self._export_data() for row in data: - vals = [csv_encode(self.get_export_value(row, c[0])) for c in self._export_columns] + vals = [ + csv_encode(self.get_export_value(row, c[0])) + for c in self._export_columns + ] ds.append(vals) try: @@ -2404,22 +2504,24 @@ def _export_tablib(self, export_type, return_url): except AttributeError: response_data = getattr(ds, export_type) except (AttributeError, tablib.UnsupportedFormat): - flash(gettext('Export type "%(type)s not supported.', - type=export_type), 'error') + flash( + gettext('Export type "%(type)s not supported.', type=export_type), + "error", + ) return redirect(return_url) return Response( response_data, - headers={'Content-Disposition': disposition}, + headers={"Content-Disposition": disposition}, mimetype=mimetype, ) - @expose('/ajax/lookup/') + @expose("/ajax/lookup/") def ajax_lookup(self): - name = request.args.get('name') - query = request.args.get('query') - offset = request.args.get('offset', type=int) - limit = request.args.get('limit', 10, type=int) + name = request.args.get("name") + query = request.args.get("query") + offset = request.args.get("offset", type=int) + limit = request.args.get("limit", 10, type=int) loader = self._form_ajax_refs.get(name) @@ -2427,12 +2529,12 @@ def ajax_lookup(self): abort(404) data = [loader.format(m) for m in loader.get_list(query, offset, limit)] - return Response(json.dumps(data), mimetype='application/json') + return Response(json.dumps(data), mimetype="application/json") - @expose('/ajax/update/', methods=('POST',)) + @expose("/ajax/update/", methods=("POST",)) def ajax_update(self): """ - Edits a single column of a record in list view. + Edits a single column of a record in list view. """ if not self.column_editable_list: abort(404) @@ -2442,7 +2544,7 @@ def ajax_update(self): # prevent validation issues due to submitting a single field # delete all fields except the submitted fields and csrf token for field in list(form): - if (field.name in request.form) or (field.name == 'csrf_token'): + if (field.name in request.form) or (field.name == "csrf_token"): pass else: form.__delitem__(field.name) @@ -2452,23 +2554,24 @@ def ajax_update(self): record = self.get_one(pk) if record is None: - return gettext('Record does not exist.'), 500 + return gettext("Record does not exist."), 500 if self.update_model(form, record): # Success - return gettext('Record was successfully saved.') + return gettext("Record was successfully saved.") else: # Error: No records changed, or problem saving to database. msgs = ", ".join([msg for msg in get_flashed_messages()]) - return gettext('Failed to update record. %(error)s', - error=msgs), 500 + return gettext("Failed to update record. %(error)s", error=msgs), 500 else: for field in form: for error in field.errors: # return validation error to x-editable if isinstance(error, list): - return gettext('Failed to update record. %(error)s', - error=", ".join(error)), 500 + return gettext( + "Failed to update record. %(error)s", error=", ".join(error) + ), 500 else: - return gettext('Failed to update record. %(error)s', - error=error), 500 + return gettext( + "Failed to update record. %(error)s", error=error + ), 500 diff --git a/flask_admin/model/fields.py b/flask_admin/model/fields.py index 392a1b9fd..c703f1a39 100644 --- a/flask_admin/model/fields.py +++ b/flask_admin/model/fields.py @@ -1,12 +1,16 @@ import itertools -from wtforms.validators import ValidationError -from wtforms.fields import FieldList, FormField, SelectFieldBase +from wtforms.fields import FieldList +from wtforms.fields import FormField +from wtforms.fields import SelectFieldBase from wtforms.utils import unset_value +from wtforms.validators import ValidationError from flask_admin._compat import iteritems -from .widgets import (InlineFieldListWidget, InlineFormWidget, - AjaxSelect2Widget) + +from .widgets import AjaxSelect2Widget +from .widgets import InlineFieldListWidget +from .widgets import InlineFormWidget class InlineFieldList(FieldList): @@ -17,44 +21,42 @@ def __init__(self, *args, **kwargs): def __call__(self, **kwargs): # Create template - meta = getattr(self, 'meta', None) + meta = getattr(self, "meta", None) if meta: - template = self.unbound_field.bind(form=None, name='', _meta=meta) + template = self.unbound_field.bind(form=None, name="", _meta=meta) else: - template = self.unbound_field.bind(form=None, name='') + template = self.unbound_field.bind(form=None, name="") # Small hack to remove separator from FormField if isinstance(template, FormField): - template.separator = '' + template.separator = "" template.process(None) - return self.widget(self, - template=template, - check=self.display_row_controls, - **kwargs) + return self.widget( + self, template=template, check=self.display_row_controls, **kwargs + ) def display_row_controls(self, field): return True def process(self, formdata, data=unset_value, extra_filters=None): - res = super(InlineFieldList, self).process( - formdata, data) + res = super(InlineFieldList, self).process(formdata, data) # Postprocess - contribute flag if formdata: for f in self.entries: - key = 'del-%s' % f.id + key = "del-%s" % f.id f._should_delete = key in formdata return res def validate(self, form, extra_validators=tuple()): """ - Validate this FieldList. + Validate this FieldList. - Note that FieldList validation differs from normal field validation in - that FieldList validates all its enclosed fields first before running any - of its own validators. + Note that FieldList validation differs from normal field validation in + that FieldList validates all its enclosed fields first before running any + of its own validators. """ self.errors = [] @@ -69,7 +71,7 @@ def validate(self, form, extra_validators=tuple()): return len(self.errors) == 0 def should_delete(self, field): - return getattr(field, '_should_delete', False) + return getattr(field, "_should_delete", False) def populate_obj(self, obj, name): values = getattr(obj, name, None) @@ -79,14 +81,14 @@ def populate_obj(self, obj, name): ivalues = iter([]) candidates = itertools.chain(ivalues, itertools.repeat(None)) - _fake = type(str('_fake'), (object, ), {}) + _fake = type("_fake", (object,), {}) output = [] for field, data in zip(self.entries, candidates): if not self.should_delete(field): fake_obj = _fake() fake_obj.data = data - field.populate_obj(fake_obj, 'data') + field.populate_obj(fake_obj, "data") output.append(fake_obj.data) setattr(obj, name, output) @@ -94,18 +96,20 @@ def populate_obj(self, obj, name): class InlineFormField(FormField): """ - Inline version of the ``FormField`` widget. + Inline version of the ``FormField`` widget. """ + widget = InlineFormWidget() class InlineModelFormField(FormField): """ - Customized ``FormField``. + Customized ``FormField``. - Excludes model primary key from the `populate_obj` and - handles `should_delete` flag. + Excludes model primary key from the `populate_obj` and + handles `should_delete` flag. """ + widget = InlineFormWidget() def __init__(self, form_class, pk, form_opts=None, **kwargs): @@ -115,7 +119,6 @@ def __init__(self, form_class, pk, form_opts=None, **kwargs): self.form_opts = form_opts def get_pk(self): - if isinstance(self._pk, (tuple, list)): return tuple(getattr(self.form, pk).data for pk in self._pk) @@ -129,13 +132,22 @@ def populate_obj(self, obj, name): class AjaxSelectField(SelectFieldBase): """ - Ajax Model Select Field + Ajax Model Select Field """ - widget = AjaxSelect2Widget() - separator = ',' + widget = AjaxSelect2Widget() - def __init__(self, loader, label=None, validators=None, allow_blank=False, blank_text=u'', **kwargs): + separator = "," + + def __init__( + self, + loader, + label=None, + validators=None, + allow_blank=False, + blank_text="", + **kwargs, + ): super(AjaxSelectField, self).__init__(label, validators, **kwargs) self.loader = loader @@ -163,7 +175,7 @@ def _format_item(self, item): def process_formdata(self, valuelist): if valuelist: - if self.allow_blank and valuelist[0] == u'__None': + if self.allow_blank and valuelist[0] == "__None": self.data = None else: self._data = None @@ -171,20 +183,23 @@ def process_formdata(self, valuelist): def pre_validate(self, form): if not self.allow_blank and self.data is None: - raise ValidationError(self.gettext(u'Not a valid choice')) + raise ValidationError(self.gettext("Not a valid choice")) class AjaxSelectMultipleField(AjaxSelectField): """ - Ajax-enabled model multi-select field. + Ajax-enabled model multi-select field. """ + widget = AjaxSelect2Widget(multiple=True) def __init__(self, loader, label=None, validators=None, default=None, **kwargs): if default is None: default = [] - super(AjaxSelectMultipleField, self).__init__(loader, label, validators, default=default, **kwargs) + super(AjaxSelectMultipleField, self).__init__( + loader, label, validators, default=default, **kwargs + ) self._invalid_formdata = False def _get_data(self): @@ -220,4 +235,4 @@ def process_formdata(self, valuelist): def pre_validate(self, form): if self._invalid_formdata: - raise ValidationError(self.gettext(u'Not a valid choice')) + raise ValidationError(self.gettext("Not a valid choice")) diff --git a/flask_admin/model/filters.py b/flask_admin/model/filters.py index 414392e95..a01a46b4b 100644 --- a/flask_admin/model/filters.py +++ b/flask_admin/model/filters.py @@ -1,26 +1,27 @@ -import time import datetime +import time import uuid from flask_admin.babel import lazy_gettext -class BaseFilter(object): +class BaseFilter: """ - Base filter class. + Base filter class. """ + def __init__(self, name, options=None, data_type=None, key_name=None): """ - Constructor. - - :param name: - Displayed name - :param options: - List of fixed options. If provided, will use drop down instead of textbox. - :param data_type: - Client-side widget type to use. - :param key_name: - Optional name who represent this filter. + Constructor. + + :param name: + Displayed name + :param options: + List of fixed options. If provided, will use drop down instead of textbox. + :param data_type: + Client-side widget type to use. + :param key_name: + Optional name who represent this filter. """ self.name = name self.options = options @@ -29,12 +30,12 @@ def __init__(self, name, options=None, data_type=None, key_name=None): def get_options(self, view): """ - Return list of predefined options. + Return list of predefined options. - Override to customize behavior. + Override to customize behavior. - :param view: - Associated administrative view class. + :param view: + Associated administrative view class. """ options = self.options @@ -48,12 +49,12 @@ def get_options(self, view): def validate(self, value): """ - Validate value. + Validate value. - If value is valid, returns `True` and `False` otherwise. + If value is valid, returns `True` and `False` otherwise. - :param value: - Value to validate + :param value: + Value to validate """ # useful for filters with date conversions, see if conversion in clean() raises ValueError try: @@ -64,29 +65,29 @@ def validate(self, value): def clean(self, value): """ - Parse value into python format. Occurs before .apply() + Parse value into python format. Occurs before .apply() - :param value: - Value to parse + :param value: + Value to parse """ return value def apply(self, query, value): """ - Apply search criteria to the query and return new query. + Apply search criteria to the query and return new query. - :param query: - Query - :param value: - Search criteria + :param query: + Query + :param value: + Search criteria """ raise NotImplementedError() def operation(self): """ - Return readable operation name. + Return readable operation name. - For example: u'equals' + For example: u'equals' """ raise NotImplementedError() @@ -97,85 +98,93 @@ def __unicode__(self): # Customized filters class BaseBooleanFilter(BaseFilter): """ - Base boolean filter, uses fixed list of options. + Base boolean filter, uses fixed list of options. """ + def __init__(self, name, options=None, data_type=None): - super(BaseBooleanFilter, self).__init__(name, - (('1', lazy_gettext(u'Yes')), - ('0', lazy_gettext(u'No'))), - data_type) + super(BaseBooleanFilter, self).__init__( + name, (("1", lazy_gettext("Yes")), ("0", lazy_gettext("No"))), data_type + ) def validate(self, value): - return value in ('0', '1') + return value in ("0", "1") class BaseIntFilter(BaseFilter): """ - Base Int filter. Adds validation and changes value to python int. + Base Int filter. Adds validation and changes value to python int. - Avoid using int(float(value)) to also allow using decimals, because it - causes precision issues with large numbers. + Avoid using int(float(value)) to also allow using decimals, because it + causes precision issues with large numbers. """ + def clean(self, value): return int(value) class BaseFloatFilter(BaseFilter): """ - Base Float filter. Adds validation and changes value to python float. + Base Float filter. Adds validation and changes value to python float. """ + def clean(self, value): return float(value) class BaseIntListFilter(BaseFilter): """ - Base Integer list filter. Adds validation for int "In List" filter. + Base Integer list filter. Adds validation for int "In List" filter. - Avoid using int(float(value)) to also allow using decimals, because it - causes precision issues with large numbers. + Avoid using int(float(value)) to also allow using decimals, because it + causes precision issues with large numbers. """ + def clean(self, value): - return [int(v.strip()) for v in value.split(',') if v.strip()] + return [int(v.strip()) for v in value.split(",") if v.strip()] class BaseFloatListFilter(BaseFilter): """ - Base Float list filter. Adds validation for float "In List" filter. + Base Float list filter. Adds validation for float "In List" filter. """ + def clean(self, value): - return [float(v.strip()) for v in value.split(',') if v.strip()] + return [float(v.strip()) for v in value.split(",") if v.strip()] class BaseDateFilter(BaseFilter): """ - Base Date filter. Uses client-side date picker control. + Base Date filter. Uses client-side date picker control. """ + def __init__(self, name, options=None, data_type=None): - super(BaseDateFilter, self).__init__(name, - options, - data_type='datepicker') + super(BaseDateFilter, self).__init__(name, options, data_type="datepicker") def clean(self, value): - return datetime.datetime.strptime(value, '%Y-%m-%d').date() + return datetime.datetime.strptime(value, "%Y-%m-%d").date() class BaseDateBetweenFilter(BaseFilter): """ - Base Date Between filter. Consolidates logic for validation and clean. - Apply method is different for each back-end. + Base Date Between filter. Consolidates logic for validation and clean. + Apply method is different for each back-end. """ + def clean(self, value): - return [datetime.datetime.strptime(range, '%Y-%m-%d').date() - for range in value.split(' to ')] + return [ + datetime.datetime.strptime(range, "%Y-%m-%d").date() + for range in value.split(" to ") + ] def operation(self): - return lazy_gettext('between') + return lazy_gettext("between") def validate(self, value): try: - value = [datetime.datetime.strptime(range, '%Y-%m-%d').date() - for range in value.split(' to ')] + value = [ + datetime.datetime.strptime(range, "%Y-%m-%d").date() + for range in value.split(" to ") + ] # if " to " is missing, fail validation # sqlalchemy's .between() will not work if end date is before start date if (len(value) == 2) and (value[0] <= value[1]): @@ -188,34 +197,40 @@ def validate(self, value): class BaseDateTimeFilter(BaseFilter): """ - Base DateTime filter. Uses client-side date time picker control. + Base DateTime filter. Uses client-side date time picker control. """ + def __init__(self, name, options=None, data_type=None): - super(BaseDateTimeFilter, self).__init__(name, - options, - data_type='datetimepicker') + super(BaseDateTimeFilter, self).__init__( + name, options, data_type="datetimepicker" + ) def clean(self, value): # datetime filters will not work in SQLite + SQLAlchemy if value not converted to datetime - return datetime.datetime.strptime(value, '%Y-%m-%d %H:%M:%S') + return datetime.datetime.strptime(value, "%Y-%m-%d %H:%M:%S") class BaseDateTimeBetweenFilter(BaseFilter): """ - Base DateTime Between filter. Consolidates logic for validation and clean. - Apply method is different for each back-end. + Base DateTime Between filter. Consolidates logic for validation and clean. + Apply method is different for each back-end. """ + def clean(self, value): - return [datetime.datetime.strptime(range, '%Y-%m-%d %H:%M:%S') - for range in value.split(' to ')] + return [ + datetime.datetime.strptime(range, "%Y-%m-%d %H:%M:%S") + for range in value.split(" to ") + ] def operation(self): - return lazy_gettext('between') + return lazy_gettext("between") def validate(self, value): try: - value = [datetime.datetime.strptime(range, '%Y-%m-%d %H:%M:%S') - for range in value.split(' to ')] + value = [ + datetime.datetime.strptime(range, "%Y-%m-%d %H:%M:%S") + for range in value.split(" to ") + ] if (len(value) == 2) and (value[0] <= value[1]): return True else: @@ -226,41 +241,39 @@ def validate(self, value): class BaseTimeFilter(BaseFilter): """ - Base Time filter. Uses client-side time picker control. + Base Time filter. Uses client-side time picker control. """ + def __init__(self, name, options=None, data_type=None): - super(BaseTimeFilter, self).__init__(name, - options, - data_type='timepicker') + super(BaseTimeFilter, self).__init__(name, options, data_type="timepicker") def clean(self, value): # time filters will not work in SQLite + SQLAlchemy if value not converted to time - timetuple = time.strptime(value, '%H:%M:%S') - return datetime.time(timetuple.tm_hour, - timetuple.tm_min, - timetuple.tm_sec) + timetuple = time.strptime(value, "%H:%M:%S") + return datetime.time(timetuple.tm_hour, timetuple.tm_min, timetuple.tm_sec) class BaseTimeBetweenFilter(BaseFilter): """ - Base Time Between filter. Consolidates logic for validation and clean. - Apply method is different for each back-end. + Base Time Between filter. Consolidates logic for validation and clean. + Apply method is different for each back-end. """ + def clean(self, value): - timetuples = [time.strptime(range, '%H:%M:%S') - for range in value.split(' to ')] + timetuples = [time.strptime(range, "%H:%M:%S") for range in value.split(" to ")] return [ datetime.time(timetuple.tm_hour, timetuple.tm_min, timetuple.tm_sec) for timetuple in timetuples ] def operation(self): - return lazy_gettext('between') + return lazy_gettext("between") def validate(self, value): try: - timetuples = [time.strptime(range, '%H:%M:%S') - for range in value.split(' to ')] + timetuples = [ + time.strptime(range, "%H:%M:%S") for range in value.split(" to ") + ] if (len(timetuples) == 2) and (timetuples[0] <= timetuples[1]): return True else: @@ -272,12 +285,11 @@ def validate(self, value): class BaseUuidFilter(BaseFilter): """ - Base uuid filter + Base uuid filter """ + def __init__(self, name, options=None, data_type=None): - super(BaseUuidFilter, self).__init__(name, - options, - data_type='uuid') + super(BaseUuidFilter, self).__init__(name, options, data_type="uuid") def clean(self, value): value = uuid.UUID(value) @@ -286,38 +298,41 @@ def clean(self, value): class BaseUuidListFilter(BaseFilter): """ - Base uuid list filter + Base uuid list filter """ def clean(self, value): - return [str(uuid.UUID(v.strip())) for v in value.split(',') if v.strip()] + return [str(uuid.UUID(v.strip())) for v in value.split(",") if v.strip()] def convert(*args): """ - Decorator for field to filter conversion routine. + Decorator for field to filter conversion routine. - See :mod:`flask_admin.contrib.sqla.filters` for usage example. + See :mod:`flask_admin.contrib.sqla.filters` for usage example. """ + def _inner(func): func._converter_for = list(map(lambda x: x.lower(), args)) return func + return _inner -class BaseFilterConverter(object): +class BaseFilterConverter: """ - Base filter converter. + Base filter converter. - Derive from this class to implement custom field to filter conversion - logic. + Derive from this class to implement custom field to filter conversion + logic. """ + def __init__(self): self.converters = dict() for p in dir(self): attr = getattr(self, p) - if hasattr(attr, '_converter_for'): + if hasattr(attr, "_converter_for"): for p in attr._converter_for: self.converters[p] = attr diff --git a/flask_admin/model/form.py b/flask_admin/model/form.py index 63da1ae1b..1c5d40dad 100644 --- a/flask_admin/model/form.py +++ b/flask_admin/model/form.py @@ -1,12 +1,14 @@ import inspect import warnings -from flask_admin.form import BaseForm, rules -from flask_admin._compat import iteritems - from wtforms.fields import HiddenField from wtforms.fields.core import UnboundField from wtforms.validators import InputRequired + +from flask_admin._compat import iteritems +from flask_admin.form import BaseForm +from flask_admin.form import rules + from .widgets import XEditableWidget @@ -14,24 +16,25 @@ def converts(*args): def _inner(func): func._converter_for = frozenset(args) return func + return _inner def create_editable_list_form(form_base_class, form_class, widget=None): """ - Create a form class with all the fields wrapped in a FieldList. + Create a form class with all the fields wrapped in a FieldList. - Wrapping each field in FieldList allows submitting POST requests - in this format: ('<field_name>-<primary_key>', '<value>') + Wrapping each field in FieldList allows submitting POST requests + in this format: ('<field_name>-<primary_key>', '<value>') - Used in the editable list view. + Used in the editable list view. - :param form_base_class: - WTForms form class, by default `form_base_class` from base. - :param form_class: - WTForms form class generated by `form.get_form`. - :param widget: - WTForms widget class. Defaults to `XEditableWidget`. + :param form_base_class: + WTForms form class, by default `form_base_class` from base. + :param form_class: + WTForms form class generated by `form.get_form`. + :param widget: + WTForms widget class. Defaults to `XEditableWidget`. """ if widget is None: widget = XEditableWidget() @@ -42,33 +45,40 @@ class ListForm(form_base_class): # iterate FormMeta to get unbound fields, replace widget, copy to ListForm for name, obj in iteritems(form_class.__dict__): if isinstance(obj, UnboundField): - obj.kwargs['widget'] = widget + obj.kwargs["widget"] = widget setattr(ListForm, name, obj) if name == "list_form_pk": - raise Exception('Form already has a list_form_pk column.') + raise Exception("Form already has a list_form_pk column.") return ListForm -class InlineBaseFormAdmin(object): +class InlineBaseFormAdmin: """ - Settings for inline form administration. + Settings for inline form administration. - You can use this class to customize displayed form. - For example:: + You can use this class to customize displayed form. + For example:: - class MyUserInfoForm(InlineBaseFormAdmin): - form_columns = ('name', 'email') + class MyUserInfoForm(InlineBaseFormAdmin): + form_columns = ('name', 'email') """ - _defaults = ['form_base_class', 'form_columns', 'form_excluded_columns', 'form_args', 'form_extra_fields'] + + _defaults = [ + "form_base_class", + "form_columns", + "form_excluded_columns", + "form_args", + "form_extra_fields", + ] def __init__(self, **kwargs): """ - Constructor + Constructor - :param kwargs: - Additional options + :param kwargs: + Additional options """ for k in self._defaults: if not hasattr(self, k): @@ -78,7 +88,7 @@ def __init__(self, **kwargs): setattr(self, k, v) # Convert form rules - form_rules = getattr(self, 'form_rules', None) + form_rules = getattr(self, "form_rules", None) if form_rules: self._form_rules = rules.RuleSet(self, form_rules) @@ -87,49 +97,51 @@ def __init__(self, **kwargs): def get_form(self): """ - If you want to use completely custom form for inline field, you can override - Flask-Admin form generation logic by overriding this method and returning your form. + If you want to use completely custom form for inline field, you can override + Flask-Admin form generation logic by overriding this method and returning your form. """ return None def postprocess_form(self, form_class): """ - Post process form. Use this to contribute fields. + Post process form. Use this to contribute fields. - For example:: + For example:: - class MyInlineForm(InlineFormAdmin): - def postprocess_form(self, form): - form.value = StringField('value') - return form + class MyInlineForm(InlineFormAdmin): + def postprocess_form(self, form): + form.value = StringField('value') + return form - class MyAdmin(ModelView): - inline_models = (MyInlineForm(ValueModel),) + class MyAdmin(ModelView): + inline_models = (MyInlineForm(ValueModel),) """ return form_class def on_model_change(self, form, model, is_created): """ - Called when inline model is about to be saved. - - :param form: - Inline form - :param model: - Model - :param is_created: - Will be set to True if the model is being created, False if edited + Called when inline model is about to be saved. + + :param form: + Inline form + :param model: + Model + :param is_created: + Will be set to True if the model is being created, False if edited """ pass def _on_model_change(self, form, model, is_created): """ - Compatibility helper. + Compatibility helper. """ try: self.on_model_change(form, model, is_created) except TypeError: - msg = ('%s.on_model_change() now accepts third ' + - 'parameter is_created. Please update your code') % self.model + msg = ( + "%s.on_model_change() now accepts third " + + "parameter is_created. Please update your code" + ) % self.model warnings.warn(msg) self.on_model_change(form, model) @@ -137,22 +149,23 @@ def _on_model_change(self, form, model, is_created): class InlineFormAdmin(InlineBaseFormAdmin): """ - Settings for inline form administration. Used by relational backends (SQLAlchemy, Peewee), where model - class can not be inherited from the parent model definition. + Settings for inline form administration. Used by relational backends (SQLAlchemy, Peewee), where model + class can not be inherited from the parent model definition. """ + def __init__(self, model, **kwargs): """ - Constructor + Constructor - :param model: - Model class + :param model: + Model class """ self.model = model super(InlineFormAdmin, self).__init__(**kwargs) -class ModelConverterBase(object): +class ModelConverterBase: def __init__(self, converters=None, use_mro=True): self.use_mro = use_mro @@ -161,7 +174,7 @@ def __init__(self, converters=None, use_mro=True): for name in dir(self): obj = getattr(self, name) - if hasattr(obj, '_converter_for'): + if hasattr(obj, "_converter_for"): for classname in obj._converter_for: converters[classname] = obj @@ -175,7 +188,7 @@ def get_converter(self, column): # Search by module + name for col_type in types: - type_string = '%s.%s' % (col_type.__module__, col_type.__name__) + type_string = "%s.%s" % (col_type.__module__, col_type.__name__) if type_string in self.converters: return self.converters[type_string] @@ -187,38 +200,38 @@ def get_converter(self, column): return None - def get_form(self, model, base_class=BaseForm, - only=None, exclude=None, - field_args=None): + def get_form( + self, model, base_class=BaseForm, only=None, exclude=None, field_args=None + ): raise NotImplementedError() -class InlineModelConverterBase(object): +class InlineModelConverterBase: form_admin_class = InlineFormAdmin def __init__(self, view): """ - Base constructor + Base constructor - :param view: - View class + :param view: + View class """ self.view = view def get_label(self, info, name): """ - Get inline model field label + Get inline model field label - :param info: - Inline model info - :param name: - Field name + :param info: + Inline model info + :param name: + Field name """ - form_name = getattr(info, 'form_label', None) + form_name = getattr(info, "form_label", None) if form_name: return form_name - column_labels = getattr(self.view, 'column_labels', None) + column_labels = getattr(self.view, "column_labels", None) if column_labels and name in column_labels: return column_labels[name] @@ -227,15 +240,15 @@ def get_label(self, info, name): def get_info(self, p): """ - Figure out InlineFormAdmin information. + Figure out InlineFormAdmin information. - :param p: - Inline model. Can be one of: + :param p: + Inline model. Can be one of: - - ``tuple``, first value is related model instance, - second is dictionary with options - - ``InlineFormAdmin`` instance - - Model class + - ``tuple``, first value is related model instance, + second is dictionary with options + - ``InlineFormAdmin`` instance + - Model class """ if isinstance(p, tuple): return self.form_admin_class(p[0], **p[1]) @@ -245,9 +258,10 @@ def get_info(self, p): return None -class FieldPlaceholder(object): +class FieldPlaceholder: """ - Field placeholder for model convertors. + Field placeholder for model convertors. """ + def __init__(self, field): self.field = field diff --git a/flask_admin/model/helpers.py b/flask_admin/model/helpers.py index 9459b8b35..de562869d 100644 --- a/flask_admin/model/helpers.py +++ b/flask_admin/model/helpers.py @@ -1,35 +1,35 @@ def prettify_name(name): """ - Prettify pythonic variable name. + Prettify pythonic variable name. - For example, 'hello_world' will be converted to 'Hello World' + For example, 'hello_world' will be converted to 'Hello World' - :param name: - Name to prettify + :param name: + Name to prettify """ - return name.replace('_', ' ').title() + return name.replace("_", " ").title() def get_mdict_item_or_list(mdict, key): """ - Return the value for the given key of the multidict. + Return the value for the given key of the multidict. - A werkzeug.datastructures.multidict can have a single - value or a list of items. If there is only one item, - return only this item, else the whole list as a tuple + A werkzeug.datastructures.multidict can have a single + value or a list of items. If there is only one item, + return only this item, else the whole list as a tuple - :param mdict: Multidict to search for the key - :type mdict: werkzeug.datastructures.multidict - :param key: key to look for - :return: the value for the key or None if the Key has not be found + :param mdict: Multidict to search for the key + :type mdict: werkzeug.datastructures.multidict + :param key: key to look for + :return: the value for the key or None if the Key has not be found """ - if hasattr(mdict, 'getlist'): + if hasattr(mdict, "getlist"): v = mdict.getlist(key) if len(v) == 1: value = v[0] # Special case for empty strings, treat them as "no-value" - if value == '': + if value == "": value = None return value diff --git a/flask_admin/model/template.py b/flask_admin/model/template.py index f4acbd0e2..61710d17d 100644 --- a/flask_admin/model/template.py +++ b/flask_admin/model/template.py @@ -6,7 +6,7 @@ from flask_admin.babel import gettext -class BaseListRowAction(object): +class BaseListRowAction: def __init__(self, title=None): self.title = title @@ -18,8 +18,8 @@ def render_ctx(self, context, row_id, row): return self.render(context, row_id, row) def _resolve_symbol(self, context, symbol): - if '.' in symbol: - parts = symbol.split('.') + if "." in symbol: + parts = symbol.split(".") m = context.resolve(parts[0]) return reduce(getattr, parts[1:], m) else: @@ -34,7 +34,7 @@ def __init__(self, icon_class, url, title=None): self.icon_class = icon_class def render(self, context, row_id, row): - m = self._resolve_symbol(context, 'row_actions.link') + m = self._resolve_symbol(context, "row_actions.link") if isinstance(self.url, string_types): url = self.url.format(row_id=row_id) @@ -45,7 +45,7 @@ def render(self, context, row_id, row): class EndpointLinkRowAction(BaseListRowAction): - def __init__(self, icon_class, endpoint, title=None, id_arg='id', url_args=None): + def __init__(self, icon_class, endpoint, title=None, id_arg="id", url_args=None): super(EndpointLinkRowAction, self).__init__(title=title) self.icon_class = icon_class @@ -54,8 +54,8 @@ def __init__(self, icon_class, endpoint, title=None, id_arg='id', url_args=None) self.url_args = url_args def render(self, context, row_id, row): - m = self._resolve_symbol(context, 'row_actions.link') - get_url = self._resolve_symbol(context, 'get_url') + m = self._resolve_symbol(context, "row_actions.link") + get_url = self._resolve_symbol(context, "get_url") kwargs = dict(self.url_args) if self.url_args else {} kwargs[self.id_arg] = row_id @@ -79,46 +79,47 @@ def render(self, context, row_id, row): class ViewRowAction(TemplateLinkRowAction): def __init__(self): super(ViewRowAction, self).__init__( - 'row_actions.view_row', - gettext('View Record')) + "row_actions.view_row", gettext("View Record") + ) class ViewPopupRowAction(TemplateLinkRowAction): def __init__(self): super(ViewPopupRowAction, self).__init__( - 'row_actions.view_row_popup', - gettext('View Record')) + "row_actions.view_row_popup", gettext("View Record") + ) class EditRowAction(TemplateLinkRowAction): def __init__(self): super(EditRowAction, self).__init__( - 'row_actions.edit_row', - gettext('Edit Record')) + "row_actions.edit_row", gettext("Edit Record") + ) class EditPopupRowAction(TemplateLinkRowAction): def __init__(self): super(EditPopupRowAction, self).__init__( - 'row_actions.edit_row_popup', - gettext('Edit Record')) + "row_actions.edit_row_popup", gettext("Edit Record") + ) class DeleteRowAction(TemplateLinkRowAction): def __init__(self): super(DeleteRowAction, self).__init__( - 'row_actions.delete_row', - gettext('Delete Record')) + "row_actions.delete_row", gettext("Delete Record") + ) # Macro helper def macro(name): - ''' - Jinja2 macro list column formatter. + """ + Jinja2 macro list column formatter. + + :param name: + Macro name in the current template + """ - :param name: - Macro name in the current template - ''' def inner(view, context, model, column): m = context.resolve(name) diff --git a/flask_admin/model/typefmt.py b/flask_admin/model/typefmt.py index d59dfed85..5d97375f6 100644 --- a/flask_admin/model/typefmt.py +++ b/flask_admin/model/typefmt.py @@ -1,71 +1,75 @@ -from enum import Enum import json +from enum import Enum from markupsafe import Markup + from flask_admin._compat import text_type from flask_admin._types import T_FORMATTERS def null_formatter(view, value, name): """ - Return `NULL` as the string for `None` value + Return `NULL` as the string for `None` value - :param value: - Value to check + :param value: + Value to check """ - return Markup('<i>NULL</i>') + return Markup("<i>NULL</i>") def empty_formatter(view, value, name): """ - Return empty string for `None` value + Return empty string for `None` value - :param value: - Value to check + :param value: + Value to check """ - return '' + return "" def bool_formatter(view, value, name): """ - Return check icon if value is `True` or empty string otherwise. + Return check icon if value is `True` or empty string otherwise. - :param value: - Value to check + :param value: + Value to check """ - glyph = 'ok-circle' if value else 'minus-sign' - fa = 'fa-check-circle' if value else 'fa-minus-circle' + glyph = "ok-circle" if value else "minus-sign" + fa = "fa-check-circle" if value else "fa-minus-circle" label = f'{name}: {"true" if value else "false"}' - return Markup('<span class="fa %s glyphicon glyphicon-%s icon-%s" title="%s"></span>' % (fa, glyph, glyph, label)) + return Markup( + '<span class="fa %s glyphicon glyphicon-%s icon-%s" title="%s"></span>' + % (fa, glyph, glyph, label) + ) def list_formatter(view, values, name) -> str: """ - Return string with comma separated values + Return string with comma separated values - :param values: - Value to check + :param values: + Value to check """ - return u', '.join(text_type(v) for v in values) + return ", ".join(text_type(v) for v in values) def enum_formatter(view, value, name) -> str: """ - Return the name of the enumerated member. + Return the name of the enumerated member. - :param value: - Value to check + :param value: + Value to check """ return value.name def dict_formatter(view, value, name) -> str: """ - Removes unicode entities when displaying dict as string. Also unescapes - non-ASCII characters stored in the JSON. + Removes unicode entities when displaying dict as string. Also unescapes + non-ASCII characters stored in the JSON. - :param value: - Dict to convert to string + :param value: + Dict to convert to string """ return json.dumps(value, ensure_ascii=False) diff --git a/flask_admin/model/widgets.py b/flask_admin/model/widgets.py index 400476db9..2a00efa77 100644 --- a/flask_admin/model/widgets.py +++ b/flask_admin/model/widgets.py @@ -1,41 +1,45 @@ from flask import json -from markupsafe import escape, Markup +from markupsafe import escape +from markupsafe import Markup from wtforms.widgets import html_params -from flask_admin._compat import as_unicode, text_type +from flask_admin._compat import as_unicode +from flask_admin._compat import text_type from flask_admin.babel import gettext -from flask_admin.helpers import get_url from flask_admin.form import RenderTemplateWidget +from flask_admin.helpers import get_url class InlineFieldListWidget(RenderTemplateWidget): def __init__(self): - super(InlineFieldListWidget, self).__init__('admin/model/inline_field_list.html') + super(InlineFieldListWidget, self).__init__( + "admin/model/inline_field_list.html" + ) class InlineFormWidget(RenderTemplateWidget): def __init__(self): - super(InlineFormWidget, self).__init__('admin/model/inline_form.html') + super(InlineFormWidget, self).__init__("admin/model/inline_form.html") def __call__(self, field, **kwargs): - kwargs.setdefault('form_opts', getattr(field, 'form_opts', None)) + kwargs.setdefault("form_opts", getattr(field, "form_opts", None)) return super(InlineFormWidget, self).__call__(field, **kwargs) -class AjaxSelect2Widget(object): +class AjaxSelect2Widget: def __init__(self, multiple=False): self.multiple = multiple def __call__(self, field, **kwargs): - kwargs.setdefault('data-role', 'select2-ajax') - kwargs.setdefault('data-url', get_url('.ajax_lookup', name=field.loader.name)) + kwargs.setdefault("data-role", "select2-ajax") + kwargs.setdefault("data-url", get_url(".ajax_lookup", name=field.loader.name)) - allow_blank = getattr(field, 'allow_blank', False) + allow_blank = getattr(field, "allow_blank", False) if allow_blank and not self.multiple: - kwargs['data-allow-blank'] = u'1' + kwargs["data-allow-blank"] = "1" - kwargs.setdefault('id', field.id) - kwargs.setdefault('type', 'hidden') + kwargs.setdefault("id", field.id) + kwargs.setdefault("type", "hidden") if self.multiple: result = [] @@ -46,114 +50,120 @@ def __call__(self, field, **kwargs): result.append(data) ids.append(as_unicode(data[0])) - separator = getattr(field, 'separator', ',') + separator = getattr(field, "separator", ",") - kwargs['value'] = separator.join(ids) - kwargs['data-json'] = json.dumps(result) - kwargs['data-multiple'] = u'1' - kwargs['data-separator'] = separator + kwargs["value"] = separator.join(ids) + kwargs["data-json"] = json.dumps(result) + kwargs["data-multiple"] = "1" + kwargs["data-separator"] = separator else: data = field.loader.format(field.data) if data: - kwargs['value'] = data[0] - kwargs['data-json'] = json.dumps(data) + kwargs["value"] = data[0] + kwargs["data-json"] = json.dumps(data) - placeholder = field.loader.options.get('placeholder', gettext('Please select model')) - kwargs.setdefault('data-placeholder', placeholder) + placeholder = field.loader.options.get( + "placeholder", gettext("Please select model") + ) + kwargs.setdefault("data-placeholder", placeholder) - minimum_input_length = int(field.loader.options.get('minimum_input_length', 1)) - kwargs.setdefault('data-minimum-input-length', minimum_input_length) + minimum_input_length = int(field.loader.options.get("minimum_input_length", 1)) + kwargs.setdefault("data-minimum-input-length", minimum_input_length) - kwargs.setdefault('data-separator', ',') + kwargs.setdefault("data-separator", ",") - return Markup('<input %s>' % html_params(name=field.name, **kwargs)) + return Markup("<input %s>" % html_params(name=field.name, **kwargs)) -class XEditableWidget(object): +class XEditableWidget: """ - WTForms widget that provides in-line editing for the list view. + WTForms widget that provides in-line editing for the list view. - Determines how to display the x-editable/ajax form based on the - field inside of the FieldList (StringField, IntegerField, etc). + Determines how to display the x-editable/ajax form based on the + field inside of the FieldList (StringField, IntegerField, etc). """ + def __call__(self, field, **kwargs): - display_value = kwargs.pop('display_value', '') - kwargs.setdefault('data-value', display_value) + display_value = kwargs.pop("display_value", "") + kwargs.setdefault("data-value", display_value) - kwargs.setdefault('data-role', 'x-editable') - kwargs.setdefault('data-url', './ajax/update/') + kwargs.setdefault("data-role", "x-editable") + kwargs.setdefault("data-url", "./ajax/update/") - kwargs.setdefault('id', field.id) - kwargs.setdefault('name', field.name) - kwargs.setdefault('href', '#') + kwargs.setdefault("id", field.id) + kwargs.setdefault("name", field.name) + kwargs.setdefault("href", "#") - if not kwargs.get('pk'): - raise Exception('pk required') - kwargs['data-pk'] = str(kwargs.pop("pk")) + if not kwargs.get("pk"): + raise Exception("pk required") + kwargs["data-pk"] = str(kwargs.pop("pk")) - kwargs['data-csrf'] = kwargs.pop("csrf", "") + kwargs["data-csrf"] = kwargs.pop("csrf", "") kwargs = self.get_kwargs(field, kwargs) - return Markup( - '<a %s>%s</a>' % (html_params(**kwargs), - escape(display_value)) - ) + return Markup("<a %s>%s</a>" % (html_params(**kwargs), escape(display_value))) def get_kwargs(self, field, kwargs): """ - Return extra kwargs based on the field type. + Return extra kwargs based on the field type. """ - if field.type == 'StringField': - kwargs['data-type'] = 'text' - elif field.type == 'TextAreaField': - kwargs['data-type'] = 'textarea' - kwargs['data-rows'] = '5' - elif field.type == 'BooleanField': - kwargs['data-type'] = 'select2' - kwargs['data-value'] = '1' if field.data else '' + if field.type == "StringField": + kwargs["data-type"] = "text" + elif field.type == "TextAreaField": + kwargs["data-type"] = "textarea" + kwargs["data-rows"] = "5" + elif field.type == "BooleanField": + kwargs["data-type"] = "select2" + kwargs["data-value"] = "1" if field.data else "" # data-source = dropdown options - kwargs['data-source'] = json.dumps([ - {'value': '', 'text': gettext('No')}, - {'value': '1', 'text': gettext('Yes')} - ]) - kwargs['data-role'] = 'x-editable-boolean' - elif field.type in ['Select2Field', 'SelectField']: - kwargs['data-type'] = 'select2' - choices = [{'value': x, 'text': y} for x, y in field.choices] + kwargs["data-source"] = json.dumps( + [ + {"value": "", "text": gettext("No")}, + {"value": "1", "text": gettext("Yes")}, + ] + ) + kwargs["data-role"] = "x-editable-boolean" + elif field.type in ["Select2Field", "SelectField"]: + kwargs["data-type"] = "select2" + choices = [{"value": x, "text": y} for x, y in field.choices] # prepend a blank field to choices if allow_blank = True - if getattr(field, 'allow_blank', False): - choices.insert(0, {'value': '__None', 'text': ''}) + if getattr(field, "allow_blank", False): + choices.insert(0, {"value": "__None", "text": ""}) # json.dumps fixes issue with unicode strings not loading correctly - kwargs['data-source'] = json.dumps(choices) - elif field.type == 'DateField': - kwargs['data-type'] = 'combodate' - kwargs['data-format'] = 'YYYY-MM-DD' - kwargs['data-template'] = 'YYYY-MM-DD' - kwargs['data-role'] = 'x-editable-combodate' - elif field.type == 'DateTimeField': - kwargs['data-type'] = 'combodate' - kwargs['data-format'] = 'YYYY-MM-DD HH:mm:ss' - kwargs['data-template'] = 'YYYY-MM-DD HH:mm:ss' + kwargs["data-source"] = json.dumps(choices) + elif field.type == "DateField": + kwargs["data-type"] = "combodate" + kwargs["data-format"] = "YYYY-MM-DD" + kwargs["data-template"] = "YYYY-MM-DD" + kwargs["data-role"] = "x-editable-combodate" + elif field.type == "DateTimeField": + kwargs["data-type"] = "combodate" + kwargs["data-format"] = "YYYY-MM-DD HH:mm:ss" + kwargs["data-template"] = "YYYY-MM-DD HH:mm:ss" # x-editable-combodate uses 1 minute increments - kwargs['data-role'] = 'x-editable-combodate' - elif field.type == 'TimeField': - kwargs['data-type'] = 'combodate' - kwargs['data-format'] = 'HH:mm:ss' - kwargs['data-template'] = 'HH:mm:ss' - kwargs['data-role'] = 'x-editable-combodate' - elif field.type == 'IntegerField': - kwargs['data-type'] = 'number' - elif field.type in ['FloatField', 'DecimalField']: - kwargs['data-type'] = 'number' - kwargs['data-step'] = 'any' - elif field.type in ['QuerySelectField', 'ModelSelectField', - 'QuerySelectMultipleField', 'KeyPropertyField']: + kwargs["data-role"] = "x-editable-combodate" + elif field.type == "TimeField": + kwargs["data-type"] = "combodate" + kwargs["data-format"] = "HH:mm:ss" + kwargs["data-template"] = "HH:mm:ss" + kwargs["data-role"] = "x-editable-combodate" + elif field.type == "IntegerField": + kwargs["data-type"] = "number" + elif field.type in ["FloatField", "DecimalField"]: + kwargs["data-type"] = "number" + kwargs["data-step"] = "any" + elif field.type in [ + "QuerySelectField", + "ModelSelectField", + "QuerySelectMultipleField", + "KeyPropertyField", + ]: # QuerySelectField and ModelSelectField are for relations - kwargs['data-type'] = 'select2' + kwargs["data-type"] = "select2" choices = [] selected_ids = [] @@ -166,23 +176,23 @@ def get_kwargs(self, field, kwargs): label = text_type(label) except TypeError: # unable to display text value - label = '' - choices.append({'value': text_type(value), 'text': label}) + label = "" + choices.append({"value": text_type(value), "text": label}) if selected: selected_ids.append(value) # blank field is already included if allow_blank - kwargs['data-source'] = json.dumps(choices) + kwargs["data-source"] = json.dumps(choices) - if field.type == 'QuerySelectMultipleField': - kwargs['data-role'] = 'x-editable-select2-multiple' + if field.type == "QuerySelectMultipleField": + kwargs["data-role"] = "x-editable-select2-multiple" # must use id instead of text or prefilled values won't work - separator = getattr(field, 'separator', ',') - kwargs['data-value'] = separator.join(selected_ids) + separator = getattr(field, "separator", ",") + kwargs["data-value"] = separator.join(selected_ids) else: - kwargs['data-value'] = text_type(selected_ids[0]) + kwargs["data-value"] = text_type(selected_ids[0]) else: - raise Exception('Unsupported field type: %s' % (type(field),)) + raise Exception("Unsupported field type: %s" % (type(field),)) return kwargs diff --git a/flask_admin/templates/bootstrap4/admin/rediscli/response.html b/flask_admin/templates/bootstrap4/admin/rediscli/response.html index f4a950a87..8830b32c8 100644 --- a/flask_admin/templates/bootstrap4/admin/rediscli/response.html +++ b/flask_admin/templates/bootstrap4/admin/rediscli/response.html @@ -29,4 +29,4 @@ {{ item }} {% endif %} {% endmacro %} -{{ render(result) }} \ No newline at end of file +{{ render(result) }} diff --git a/flask_admin/tests/conftest.py b/flask_admin/tests/conftest.py index fefedf4b4..ae4334a59 100644 --- a/flask_admin/tests/conftest.py +++ b/flask_admin/tests/conftest.py @@ -4,11 +4,11 @@ from flask_admin import Admin -@pytest.fixture(scope='function') +@pytest.fixture(scope="function") def app(): app = Flask(__name__) - app.config['SECRET_KEY'] = '1' - app.config['WTF_CSRF_ENABLED'] = False + app.config["SECRET_KEY"] = "1" + app.config["WTF_CSRF_ENABLED"] = False yield app @@ -18,6 +18,7 @@ def babel(app): babel = None try: from flask_babel import Babel + babel = Babel(app) except ImportError: pass diff --git a/flask_admin/tests/fileadmin/test_fileadmin.py b/flask_admin/tests/fileadmin/test_fileadmin.py index 21156c2b7..5369f5655 100644 --- a/flask_admin/tests/fileadmin/test_fileadmin.py +++ b/flask_admin/tests/fileadmin/test_fileadmin.py @@ -1,15 +1,15 @@ -from io import BytesIO import os import os.path as op +from io import BytesIO -from flask_admin.theme import Bootstrap4Theme -from flask_admin.contrib import fileadmin from flask_admin import Admin +from flask_admin.contrib import fileadmin +from flask_admin.theme import Bootstrap4Theme class Base: class FileAdminTests: - _test_files_root = op.join(op.dirname(__file__), 'files') + _test_files_root = op.join(op.dirname(__file__), "files") def fileadmin_class(self): raise NotImplementedError @@ -22,10 +22,10 @@ def test_file_admin(self, app, admin): fileadmin_args, fileadmin_kwargs = self.fileadmin_args() class MyFileAdmin(fileadmin_class): - editable_extensions = ('txt',) + editable_extensions = ("txt",) view_kwargs = dict(fileadmin_kwargs) - view_kwargs.setdefault('name', 'Files') + view_kwargs.setdefault("name", "Files") view = MyFileAdmin(*fileadmin_args, **view_kwargs) admin.add_view(view) @@ -33,99 +33,106 @@ class MyFileAdmin(fileadmin_class): client = app.test_client() # index - rv = client.get('/admin/myfileadmin/') + rv = client.get("/admin/myfileadmin/") assert rv.status_code == 200 - assert 'path=dummy.txt' in rv.data.decode('utf-8') + assert "path=dummy.txt" in rv.data.decode("utf-8") # edit - rv = client.get('/admin/myfileadmin/edit/?path=dummy.txt') + rv = client.get("/admin/myfileadmin/edit/?path=dummy.txt") assert rv.status_code == 200 - assert 'dummy.txt' in rv.data.decode('utf-8') + assert "dummy.txt" in rv.data.decode("utf-8") - rv = client.post('/admin/myfileadmin/edit/?path=dummy.txt', - data=dict(content='new_string')) + rv = client.post( + "/admin/myfileadmin/edit/?path=dummy.txt", + data=dict(content="new_string"), + ) assert rv.status_code == 302 - rv = client.get('/admin/myfileadmin/edit/?path=dummy.txt') + rv = client.get("/admin/myfileadmin/edit/?path=dummy.txt") assert rv.status_code == 200 - assert 'dummy.txt' in rv.data.decode('utf-8') - assert 'new_string' in rv.data.decode('utf-8') + assert "dummy.txt" in rv.data.decode("utf-8") + assert "new_string" in rv.data.decode("utf-8") # rename - rv = client.get('/admin/myfileadmin/rename/?path=dummy.txt') + rv = client.get("/admin/myfileadmin/rename/?path=dummy.txt") assert rv.status_code == 200 - assert 'dummy.txt' in rv.data.decode('utf-8') + assert "dummy.txt" in rv.data.decode("utf-8") - rv = client.post('/admin/myfileadmin/rename/?path=dummy.txt', - data=dict(name='dummy_renamed.txt', - path='dummy.txt')) + rv = client.post( + "/admin/myfileadmin/rename/?path=dummy.txt", + data=dict(name="dummy_renamed.txt", path="dummy.txt"), + ) assert rv.status_code == 302 - rv = client.get('/admin/myfileadmin/') + rv = client.get("/admin/myfileadmin/") assert rv.status_code == 200 - assert 'path=dummy_renamed.txt' in rv.data.decode('utf-8') - assert 'path=dummy.txt' not in rv.data.decode('utf-8') + assert "path=dummy_renamed.txt" in rv.data.decode("utf-8") + assert "path=dummy.txt" not in rv.data.decode("utf-8") # upload - rv = client.get('/admin/myfileadmin/upload/') + rv = client.get("/admin/myfileadmin/upload/") assert rv.status_code == 200 - rv = client.post('/admin/myfileadmin/upload/', - data=dict(upload=(BytesIO(b""), 'dummy.txt'))) + rv = client.post( + "/admin/myfileadmin/upload/", + data=dict(upload=(BytesIO(b""), "dummy.txt")), + ) assert rv.status_code == 302 - rv = client.get('/admin/myfileadmin/') + rv = client.get("/admin/myfileadmin/") assert rv.status_code == 200 - assert 'path=dummy.txt' in rv.data.decode('utf-8') - assert 'path=dummy_renamed.txt' in rv.data.decode('utf-8') + assert "path=dummy.txt" in rv.data.decode("utf-8") + assert "path=dummy_renamed.txt" in rv.data.decode("utf-8") # delete - rv = client.post('/admin/myfileadmin/delete/', - data=dict(path='dummy_renamed.txt')) + rv = client.post( + "/admin/myfileadmin/delete/", data=dict(path="dummy_renamed.txt") + ) assert rv.status_code == 302 - rv = client.get('/admin/myfileadmin/') + rv = client.get("/admin/myfileadmin/") assert rv.status_code == 200 - assert 'path=dummy_renamed.txt' not in rv.data.decode('utf-8') - assert 'path=dummy.txt' in rv.data.decode('utf-8') + assert "path=dummy_renamed.txt" not in rv.data.decode("utf-8") + assert "path=dummy.txt" in rv.data.decode("utf-8") # mkdir - rv = client.get('/admin/myfileadmin/mkdir/') + rv = client.get("/admin/myfileadmin/mkdir/") assert rv.status_code == 200 - rv = client.post('/admin/myfileadmin/mkdir/', - data=dict(name='dummy_dir')) + rv = client.post("/admin/myfileadmin/mkdir/", data=dict(name="dummy_dir")) assert rv.status_code == 302 - rv = client.get('/admin/myfileadmin/') + rv = client.get("/admin/myfileadmin/") assert rv.status_code == 200 - assert 'path=dummy.txt' in rv.data.decode('utf-8') - assert 'path=dummy_dir' in rv.data.decode('utf-8') + assert "path=dummy.txt" in rv.data.decode("utf-8") + assert "path=dummy_dir" in rv.data.decode("utf-8") # rename - directory - rv = client.get('/admin/myfileadmin/rename/?path=dummy_dir') + rv = client.get("/admin/myfileadmin/rename/?path=dummy_dir") assert rv.status_code == 200 - assert 'dummy_dir' in rv.data.decode('utf-8') + assert "dummy_dir" in rv.data.decode("utf-8") - rv = client.post('/admin/myfileadmin/rename/?path=dummy_dir', - data=dict(name='dummy_renamed_dir', - path='dummy_dir')) + rv = client.post( + "/admin/myfileadmin/rename/?path=dummy_dir", + data=dict(name="dummy_renamed_dir", path="dummy_dir"), + ) assert rv.status_code == 302 - rv = client.get('/admin/myfileadmin/') + rv = client.get("/admin/myfileadmin/") assert rv.status_code == 200 - assert 'path=dummy_renamed_dir' in rv.data.decode('utf-8') - assert 'path=dummy_dir' not in rv.data.decode('utf-8') + assert "path=dummy_renamed_dir" in rv.data.decode("utf-8") + assert "path=dummy_dir" not in rv.data.decode("utf-8") # delete - directory - rv = client.post('/admin/myfileadmin/delete/', - data=dict(path='dummy_renamed_dir')) + rv = client.post( + "/admin/myfileadmin/delete/", data=dict(path="dummy_renamed_dir") + ) assert rv.status_code == 302 - rv = client.get('/admin/myfileadmin/') + rv = client.get("/admin/myfileadmin/") assert rv.status_code == 200 - assert 'path=dummy_renamed_dir' not in rv.data.decode('utf-8') - assert 'path=dummy.txt' in rv.data.decode('utf-8') + assert "path=dummy_renamed_dir" not in rv.data.decode("utf-8") + assert "path=dummy.txt" in rv.data.decode("utf-8") def test_modal_edit_bs4(self, app, babel): admin_bs4 = Admin(app, theme=Bootstrap4Theme()) @@ -135,18 +142,18 @@ def test_modal_edit_bs4(self, app, babel): class EditModalOn(fileadmin_class): edit_modal = True - editable_extensions = ('txt',) + editable_extensions = ("txt",) class EditModalOff(fileadmin_class): edit_modal = False - editable_extensions = ('txt',) + editable_extensions = ("txt",) on_view_kwargs = dict(fileadmin_kwargs) - on_view_kwargs.setdefault('endpoint', 'edit_modal_on') + on_view_kwargs.setdefault("endpoint", "edit_modal_on") edit_modal_on = EditModalOn(*fileadmin_args, **on_view_kwargs) off_view_kwargs = dict(fileadmin_kwargs) - off_view_kwargs.setdefault('endpoint', 'edit_modal_off') + off_view_kwargs.setdefault("endpoint", "edit_modal_off") edit_modal_off = EditModalOff(*fileadmin_args, **off_view_kwargs) admin_bs4.add_view(edit_modal_on) @@ -156,16 +163,16 @@ class EditModalOff(fileadmin_class): # bootstrap 3 - ensure modal window is added when edit_modal is # enabled - rv = client_bs4.get('/admin/edit_modal_on/') + rv = client_bs4.get("/admin/edit_modal_on/") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'fa_modal_window' in data + data = rv.data.decode("utf-8") + assert "fa_modal_window" in data # bootstrap 3 - test modal disabled - rv = client_bs4.get('/admin/edit_modal_off/') + rv = client_bs4.get("/admin/edit_modal_off/") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'fa_modal_window' not in data + data = rv.data.decode("utf-8") + assert "fa_modal_window" not in data class TestLocalFileAdmin(Base.FileAdminTests): @@ -173,37 +180,39 @@ def fileadmin_class(self): return fileadmin.FileAdmin def fileadmin_args(self): - return (self._test_files_root, '/files'), {} + return (self._test_files_root, "/files"), {} def test_fileadmin_sort_bogus_url_param(self, app, admin): fileadmin_class = self.fileadmin_class() fileadmin_args, fileadmin_kwargs = self.fileadmin_args() class MyFileAdmin(fileadmin_class): - editable_extensions = ('txt',) + editable_extensions = ("txt",) view_kwargs = dict(fileadmin_kwargs) - view_kwargs.setdefault('name', 'Files') + view_kwargs.setdefault("name", "Files") view = MyFileAdmin(*fileadmin_args, **view_kwargs) admin.add_view(view) client = app.test_client() - with open(op.join(self._test_files_root, 'dummy2.txt'), 'w') as fp: + with open(op.join(self._test_files_root, "dummy2.txt"), "w") as fp: # make sure that 'files/dummy2.txt' exists, is newest and has bigger size - fp.write('test') + fp.write("test") - rv = client.get('/admin/myfileadmin/?sort=bogus') + rv = client.get("/admin/myfileadmin/?sort=bogus") assert rv.status_code == 200 - assert rv.data.decode('utf-8').find('path=dummy2.txt') < \ - rv.data.decode('utf-8').find('path=dummy.txt') + assert rv.data.decode("utf-8").find("path=dummy2.txt") < rv.data.decode( + "utf-8" + ).find("path=dummy.txt") - rv = client.get('/admin/myfileadmin/?sort=name') + rv = client.get("/admin/myfileadmin/?sort=name") assert rv.status_code == 200 - assert rv.data.decode('utf-8').find('path=dummy.txt') < \ - rv.data.decode('utf-8').find('path=dummy2.txt') + assert rv.data.decode("utf-8").find("path=dummy.txt") < rv.data.decode( + "utf-8" + ).find("path=dummy2.txt") try: # clean up - os.remove(op.join(self._test_files_root, 'dummy2.txt')) - except (IOError, OSError): + os.remove(op.join(self._test_files_root, "dummy2.txt")) + except OSError: pass diff --git a/flask_admin/tests/fileadmin/test_fileadmin_azure.py b/flask_admin/tests/fileadmin/test_fileadmin_azure.py index 51330bb58..0e0ce300c 100644 --- a/flask_admin/tests/fileadmin/test_fileadmin_azure.py +++ b/flask_admin/tests/fileadmin/test_fileadmin_azure.py @@ -1,8 +1,7 @@ import os.path as op from os import getenv -from uuid import uuid4 - from unittest import SkipTest +from uuid import uuid4 import pytest @@ -12,22 +11,22 @@ class TestAzureFileAdmin(Base.FileAdminTests): - _test_storage = getenv('AZURE_STORAGE_CONNECTION_STRING') + _test_storage = getenv("AZURE_STORAGE_CONNECTION_STRING") @pytest.fixture(autouse=True) def setup_and_teardown(self): if not azure.BlockBlobService: - raise SkipTest('AzureFileAdmin dependencies not installed') + raise SkipTest("AzureFileAdmin dependencies not installed") - self._container_name = 'fileadmin-tests-%s' % uuid4() + self._container_name = "fileadmin-tests-%s" % uuid4() if not self._test_storage or not self._container_name: - raise SkipTest('AzureFileAdmin test credentials not set') + raise SkipTest("AzureFileAdmin test credentials not set") client = azure.BlockBlobService(connection_string=self._test_storage) client.create_container(self._container_name) - dummy = op.join(self._test_files_root, 'dummy.txt') - client.create_blob_from_path(self._container_name, 'dummy.txt', dummy) + dummy = op.join(self._test_files_root, "dummy.txt") + client.create_blob_from_path(self._container_name, "dummy.txt", dummy) yield diff --git a/flask_admin/tests/geoa/conftest.py b/flask_admin/tests/geoa/conftest.py index f0ed17354..0884a01da 100644 --- a/flask_admin/tests/geoa/conftest.py +++ b/flask_admin/tests/geoa/conftest.py @@ -1,7 +1,7 @@ import pytest +from flask_sqlalchemy import SQLAlchemy from flask_admin import Admin -from flask_sqlalchemy import SQLAlchemy @pytest.fixture @@ -12,9 +12,11 @@ def db(): @pytest.fixture def admin(app, babel, db): - app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://postgres:postgres@localhost/flask_admin_test' - app.config['SQLALCHEMY_ECHO'] = True - app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False + app.config["SQLALCHEMY_DATABASE_URI"] = ( + "postgresql://postgres:postgres@localhost/flask_admin_test" + ) + app.config["SQLALCHEMY_ECHO"] = True + app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False db.init_app(app) diff --git a/flask_admin/tests/geoa/test_basic.py b/flask_admin/tests/geoa/test_basic.py index d24952691..c4fc8a9b3 100644 --- a/flask_admin/tests/geoa/test_basic.py +++ b/flask_admin/tests/geoa/test_basic.py @@ -1,13 +1,11 @@ -from __future__ import unicode_literals import json import re -import pytest +from geoalchemy2 import Geometry +from geoalchemy2.shape import to_shape from flask_admin.contrib.geoa import ModelView from flask_admin.contrib.geoa.fields import GeoJSONField -from geoalchemy2 import Geometry -from geoalchemy2.shape import to_shape def create_models(db): @@ -36,67 +34,85 @@ def test_model(app, db, admin): admin.add_view(view) assert view.model == GeoModel - assert view._primary_key == 'id' + assert view._primary_key == "id" # Verify form assert view._create_form_class.point.field_class == GeoJSONField - assert view._create_form_class.point.kwargs['geometry_type'] == "POINT" + assert view._create_form_class.point.kwargs["geometry_type"] == "POINT" assert view._create_form_class.line.field_class == GeoJSONField - assert view._create_form_class.line.kwargs['geometry_type'] == "LINESTRING" + assert view._create_form_class.line.kwargs["geometry_type"] == "LINESTRING" assert view._create_form_class.polygon.field_class == GeoJSONField - assert view._create_form_class.polygon.kwargs['geometry_type'] == "POLYGON" + assert view._create_form_class.polygon.kwargs["geometry_type"] == "POLYGON" assert view._create_form_class.multi.field_class == GeoJSONField - assert view._create_form_class.multi.kwargs['geometry_type'] == "MULTIPOINT" + assert view._create_form_class.multi.kwargs["geometry_type"] == "MULTIPOINT" # Make some test clients client = app.test_client() - rv = client.get('/admin/geomodel/') + rv = client.get("/admin/geomodel/") assert rv.status_code == 200 - rv = client.get('/admin/geomodel/new/') + rv = client.get("/admin/geomodel/new/") assert rv.status_code == 200 - rv = client.post('/admin/geomodel/new/', data={ - "name": "test1", - "point": '{"type": "Point", "coordinates": [125.8, 10.0]}', - "line": '{"type": "LineString", "coordinates": [[50.2345, 94.2], [50.21, 94.87]]}', - "polygon": ('{"type": "Polygon", "coordinates": [[[100.0, 0.0], [101.0, 0.0],' - ' [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]]]}'), - "multi": '{"type": "MultiPoint", "coordinates": [[100.0, 0.0], [101.0, 1.0]]}', - }) + rv = client.post( + "/admin/geomodel/new/", + data={ + "name": "test1", + "point": '{"type": "Point", "coordinates": [125.8, 10.0]}', + "line": '{"type": "LineString", "coordinates": [[50.2345, 94.2], [50.21, 94.87]]}', + "polygon": ( + '{"type": "Polygon", "coordinates": [[[100.0, 0.0], [101.0, 0.0],' + " [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]]]}" + ), + "multi": '{"type": "MultiPoint", "coordinates": [[100.0, 0.0], [101.0, 1.0]]}', + }, + ) assert rv.status_code == 302 model = db.session.query(GeoModel).first() assert model.name == "test1" assert to_shape(model.point).geom_type == "Point" - assert list(to_shape(model.point).coords) == [(125.8, 10.0,)] + assert list(to_shape(model.point).coords) == [ + ( + 125.8, + 10.0, + ) + ] assert to_shape(model.line).geom_type == "LineString" assert list(to_shape(model.line).coords) == [(50.2345, 94.2), (50.21, 94.87)] assert to_shape(model.polygon).geom_type == "Polygon" - assert list(to_shape(model.polygon).exterior.coords) == \ - [(100.0, 0.0), (101.0, 0.0), (101.0, 1.0), (100.0, 1.0), (100.0, 0.0)] + assert list(to_shape(model.polygon).exterior.coords) == [ + (100.0, 0.0), + (101.0, 0.0), + (101.0, 1.0), + (100.0, 1.0), + (100.0, 0.0), + ] assert to_shape(model.multi).geom_type == "MultiPoint" assert len(to_shape(model.multi).geoms) == 2 assert list(to_shape(model.multi).geoms[0].coords) == [(100.0, 0.0)] assert list(to_shape(model.multi).geoms[1].coords) == [(101.0, 1.0)] - rv = client.get('/admin/geomodel/') + rv = client.get("/admin/geomodel/") assert rv.status_code == 200 - html = rv.data.decode('utf-8') + html = rv.data.decode("utf-8") pattern = r'(.|\n)+({.*"type": ?"Point".*})</textarea>(.|\n)+' group = re.match(pattern, html).group(2) p = json.loads(group) - assert p['coordinates'][0] == 125.8 - assert p['coordinates'][1] == 10.0 + assert p["coordinates"][0] == 125.8 + assert p["coordinates"][1] == 10.0 - url = '/admin/geomodel/edit/?id=%s' % model.id + url = "/admin/geomodel/edit/?id=%s" % model.id rv = client.get(url) assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert (r'{"type":"MultiPoint","coordinates":[[100,0],[101,1]]}</textarea>' in data or - r'{"type":"MultiPoint","coordinates":[[100,0],[101,1]]}' in data) + data = rv.data.decode("utf-8") + assert ( + r'{"type":"MultiPoint","coordinates":[[100,0],[101,1]]}</textarea>' in data + or r"{"type":"MultiPoint","coordinates":[[100,0],[101,1]]}" + in data + ) # rv = client.post(url, data={ # "name": "edited", @@ -118,7 +134,7 @@ def test_model(app, db, admin): # assert list(to_shape(model.multi).geoms[0].coords) == [(100.0, 0.0]) # assert list(to_shape(model.multi).geoms[1].coords) == [(101.0, 1.0]) - url = '/admin/geomodel/delete/?id=%s' % model.id + url = "/admin/geomodel/delete/?id=%s" % model.id rv = client.post(url) assert rv.status_code == 302 assert db.session.query(GeoModel).count() == 0 @@ -137,17 +153,22 @@ def test_none(app, db, admin): # Make some test clients client = app.test_client() - rv = client.post('/admin/geomodel/new/', data={ - "name": "test1", - }) + rv = client.post( + "/admin/geomodel/new/", + data={ + "name": "test1", + }, + ) assert rv.status_code == 302 model = db.session.query(GeoModel).first() - url = '/admin/geomodel/edit/?id=%s' % model.id + url = "/admin/geomodel/edit/?id=%s" % model.id rv = client.get(url) assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert (r' name="point"></textarea>' in data or - ' name="point">\n</textarea>' in data or - ' name="point">\r\n</textarea>' in data) + data = rv.data.decode("utf-8") + assert ( + r' name="point"></textarea>' in data + or ' name="point">\n</textarea>' in data + or ' name="point">\r\n</textarea>' in data + ) diff --git a/flask_admin/tests/peeweemodel/conftest.py b/flask_admin/tests/peeweemodel/conftest.py index 0cdeb91dc..54a5975d0 100644 --- a/flask_admin/tests/peeweemodel/conftest.py +++ b/flask_admin/tests/peeweemodel/conftest.py @@ -1,18 +1,18 @@ +import peewee import pytest from flask_admin import Admin -import peewee @pytest.fixture def db(): - db = peewee.SqliteDatabase(':memory:') + db = peewee.SqliteDatabase(":memory:") yield db @pytest.fixture def admin(app, babel, db): - app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///" admin = Admin(app) yield admin diff --git a/flask_admin/tests/peeweemodel/test_basic.py b/flask_admin/tests/peeweemodel/test_basic.py index 639465318..3ebd2e34f 100644 --- a/flask_admin/tests/peeweemodel/test_basic.py +++ b/flask_admin/tests/peeweemodel/test_basic.py @@ -1,28 +1,25 @@ -import pytest - -from flask_admin._compat import as_unicode +from datetime import date +from datetime import datetime +from datetime import time import peewee - -from wtforms import fields, validators +from wtforms import fields +from wtforms import validators from flask_admin import form +from flask_admin._compat import as_unicode from flask_admin._compat import iteritems from flask_admin.contrib.peewee import ModelView -from datetime import datetime, time, date - class CustomModelView(ModelView): - def __init__(self, model, - name=None, category=None, endpoint=None, url=None, - **kwargs): + def __init__( + self, model, name=None, category=None, endpoint=None, url=None, **kwargs + ): for k, v in iteritems(kwargs): setattr(self, k, v) - super(CustomModelView, self).__init__(model, - name, category, - endpoint, url) + super(CustomModelView, self).__init__(model, name, category, endpoint, url) def create_models(db): @@ -31,9 +28,17 @@ class Meta: database = db class Model1(BaseModel): - def __init__(self, test1=None, test2=None, test3=None, test4=None, - date_field=None, timeonly_field=None, - datetime_field=None, **kwargs): + def __init__( + self, + test1=None, + test2=None, + test3=None, + test4=None, + date_field=None, + timeonly_field=None, + datetime_field=None, + **kwargs, + ): super(Model1, self).__init__(**kwargs) self.test1 = test1 @@ -55,11 +60,17 @@ def __init__(self, test1=None, test2=None, test3=None, test4=None, def __str__(self): # "or ''" fixes error when loading choices for relation field: # TypeError: coercing to Unicode: need string or buffer, NoneType found - return self.test1 or '' + return self.test1 or "" class Model2(BaseModel): - def __init__(self, char_field=None, int_field=None, float_field=None, - bool_field=0, **kwargs): + def __init__( + self, + char_field=None, + int_field=None, + float_field=None, + bool_field=0, + **kwargs, + ): super(Model2, self).__init__(**kwargs) self.char_field = char_field @@ -82,24 +93,24 @@ def __init__(self, char_field=None, int_field=None, float_field=None, def fill_db(Model1, Model2): - Model1('test1_val_1', 'test2_val_1').save() - Model1('test1_val_2', 'test2_val_2').save() - Model1('test1_val_3', 'test2_val_3').save() - Model1('test1_val_4', 'test2_val_4').save() - Model1(None, 'empty_obj').save() - - Model2('char_field_val_1', None, None, bool_field=True).save() - Model2('char_field_val_2', None, None, bool_field=False).save() - Model2('char_field_val_3', 5000, 25.9).save() - Model2('char_field_val_4', 9000, 75.5).save() - Model2('char_field_val_5', 6169453081680413441).save() - - Model1('date_obj1', date_field=date(2014, 11, 17)).save() - Model1('date_obj2', date_field=date(2013, 10, 16)).save() - Model1('timeonly_obj1', timeonly_field=time(11, 10, 9)).save() - Model1('timeonly_obj2', timeonly_field=time(10, 9, 8)).save() - Model1('datetime_obj1', datetime_field=datetime(2014, 4, 3, 1, 9, 0)).save() - Model1('datetime_obj2', datetime_field=datetime(2013, 3, 2, 0, 8, 0)).save() + Model1("test1_val_1", "test2_val_1").save() + Model1("test1_val_2", "test2_val_2").save() + Model1("test1_val_3", "test2_val_3").save() + Model1("test1_val_4", "test2_val_4").save() + Model1(None, "empty_obj").save() + + Model2("char_field_val_1", None, None, bool_field=True).save() + Model2("char_field_val_2", None, None, bool_field=False).save() + Model2("char_field_val_3", 5000, 25.9).save() + Model2("char_field_val_4", 9000, 75.5).save() + Model2("char_field_val_5", 6169453081680413441).save() + + Model1("date_obj1", date_field=date(2014, 11, 17)).save() + Model1("date_obj2", date_field=date(2013, 10, 16)).save() + Model1("timeonly_obj1", timeonly_field=time(11, 10, 9)).save() + Model1("timeonly_obj2", timeonly_field=time(10, 9, 8)).save() + Model1("datetime_obj1", datetime_field=datetime(2014, 4, 3, 1, 9, 0)).save() + Model1("datetime_obj2", datetime_field=datetime(2013, 3, 2, 0, 8, 0)).save() def test_model(app, db, admin): @@ -109,15 +120,15 @@ def test_model(app, db, admin): admin.add_view(view) assert view.model == Model1 - assert view.name == 'Model1' - assert view.endpoint == 'model1' + assert view.name == "Model1" + assert view.endpoint == "model1" - assert view._primary_key == 'id' + assert view._primary_key == "id" - assert 'test1' in view._sortable_columns - assert 'test2' in view._sortable_columns - assert 'test3' in view._sortable_columns - assert 'test4' in view._sortable_columns + assert "test1" in view._sortable_columns + assert "test2" in view._sortable_columns + assert "test3" in view._sortable_columns + assert "test4" in view._sortable_columns assert view._create_form_class is not None assert view._edit_form_class is not None @@ -133,41 +144,39 @@ def test_model(app, db, admin): # Make some test clients client = app.test_client() - rv = client.get('/admin/model1/') + rv = client.get("/admin/model1/") assert rv.status_code == 200 - rv = client.get('/admin/model1/new/') + rv = client.get("/admin/model1/new/") assert rv.status_code == 200 - rv = client.post('/admin/model1/new/', - data=dict(test1='test1large', test2='test2')) + rv = client.post("/admin/model1/new/", data=dict(test1="test1large", test2="test2")) assert rv.status_code == 302 model = Model1.select().get() - assert model.test1 == 'test1large' - assert model.test2 == 'test2' - assert model.test3 is None or model.test3 == '' - assert model.test4 is None or model.test4 == '' + assert model.test1 == "test1large" + assert model.test2 == "test2" + assert model.test3 is None or model.test3 == "" + assert model.test4 is None or model.test4 == "" - rv = client.get('/admin/model1/') + rv = client.get("/admin/model1/") assert rv.status_code == 200 - assert b'test1large' in rv.data + assert b"test1large" in rv.data - url = '/admin/model1/edit/?id=%s' % model.id + url = "/admin/model1/edit/?id=%s" % model.id rv = client.get(url) assert rv.status_code == 200 - rv = client.post(url, - data=dict(test1='test1small', test2='test2large')) + rv = client.post(url, data=dict(test1="test1small", test2="test2large")) assert rv.status_code == 302 model = Model1.select().get() - assert model.test1 == 'test1small' - assert model.test2 == 'test2large' - assert model.test3 is None or model.test3 == '' - assert model.test4 is None or model.test4 == '' + assert model.test1 == "test1small" + assert model.test2 == "test2large" + assert model.test3 is None or model.test3 == "" + assert model.test4 is None or model.test4 == "" - url = '/admin/model1/delete/?id=%s' % model.id + url = "/admin/model1/delete/?id=%s" % model.id rv = client.post(url) assert rv.status_code == 302 assert Model1.select().count() == 0 @@ -177,13 +186,12 @@ def test_column_editable_list(app, db, admin): Model1, Model2 = create_models(db) # wtf-peewee doesn't automatically add length validators for max_length - form_args = {'test1': {'validators': [validators.Length(max=20)]}} - view = CustomModelView(Model1, column_editable_list=['test1'], - form_args=form_args) + form_args = {"test1": {"validators": [validators.Length(max=20)]}} + view = CustomModelView(Model1, column_editable_list=["test1"], form_args=form_args) admin.add_view(view) # Test in-line editing for relations - view = CustomModelView(Model2, column_editable_list=['model1']) + view = CustomModelView(Model2, column_editable_list=["model1"]) admin.add_view(view) fill_db(Model1, Model2) @@ -191,59 +199,76 @@ def test_column_editable_list(app, db, admin): client = app.test_client() # Test in-line edit field rendering - rv = client.get('/admin/model1/') - data = rv.data.decode('utf-8') + rv = client.get("/admin/model1/") + data = rv.data.decode("utf-8") assert 'data-role="x-editable"' in data # Form - Test basic in-line edit functionality - rv = client.post('/admin/model1/ajax/update/', data={ - 'list_form_pk': '1', - 'test1': 'change-success-1', - }) - data = rv.data.decode('utf-8') - assert 'Record was successfully saved.' == data + rv = client.post( + "/admin/model1/ajax/update/", + data={ + "list_form_pk": "1", + "test1": "change-success-1", + }, + ) + data = rv.data.decode("utf-8") + assert "Record was successfully saved." == data # ensure the value has changed - rv = client.get('/admin/model1/') - data = rv.data.decode('utf-8') - assert 'change-success-1' in data + rv = client.get("/admin/model1/") + data = rv.data.decode("utf-8") + assert "change-success-1" in data # Test validation error - rv = client.post('/admin/model1/ajax/update/', data={ - 'list_form_pk': '1', - 'test1': ('longerthantwentycharacterslongerthantwentycharacterslonger' - 'thantwentycharacterslongerthantwentycharacters'), - }) - data = rv.data.decode('utf-8') + rv = client.post( + "/admin/model1/ajax/update/", + data={ + "list_form_pk": "1", + "test1": ( + "longerthantwentycharacterslongerthantwentycharacterslonger" + "thantwentycharacterslongerthantwentycharacters" + ), + }, + ) + data = rv.data.decode("utf-8") assert rv.status_code == 500 # Test invalid primary key - rv = client.post('/admin/model1/ajax/update/', data={ - 'list_form_pk': '1000', - 'test1': 'problematic-input', - }) - data = rv.data.decode('utf-8') + rv = client.post( + "/admin/model1/ajax/update/", + data={ + "list_form_pk": "1000", + "test1": "problematic-input", + }, + ) + data = rv.data.decode("utf-8") assert rv.status_code == 500 # Test editing column not in column_editable_list - rv = client.post('/admin/model1/ajax/update/', data={ - 'list_form_pk': '1', - 'test2': 'problematic-input', - }) - data = rv.data.decode('utf-8') - assert 'problematic-input' not in data - - rv = client.post('/admin/model2/ajax/update/', data={ - 'list_form_pk': '1', - 'model1': '3', - }) - data = rv.data.decode('utf-8') - assert 'Record was successfully saved.' == data + rv = client.post( + "/admin/model1/ajax/update/", + data={ + "list_form_pk": "1", + "test2": "problematic-input", + }, + ) + data = rv.data.decode("utf-8") + assert "problematic-input" not in data + + rv = client.post( + "/admin/model2/ajax/update/", + data={ + "list_form_pk": "1", + "model1": "3", + }, + ) + data = rv.data.decode("utf-8") + assert "Record was successfully saved." == data # confirm the value has changed - rv = client.get('/admin/model2/') - data = rv.data.decode('utf-8') - assert 'test1_val_3' in data + rv = client.get("/admin/model2/") + data = rv.data.decode("utf-8") + assert "test1_val_3" in data def test_details_view(app, db, admin): @@ -257,9 +282,12 @@ def test_details_view(app, db, admin): admin.add_view(view_w_details) # show only specific fields in details w/ column_details_list - char_field_view = CustomModelView(Model2, can_view_details=True, - column_details_list=["char_field"], - endpoint="cf_view") + char_field_view = CustomModelView( + Model2, + can_view_details=True, + column_details_list=["char_field"], + endpoint="cf_view", + ) admin.add_view(char_field_view) fill_db(Model1, Model2) @@ -267,34 +295,34 @@ def test_details_view(app, db, admin): client = app.test_client() # ensure link to details is hidden when can_view_details is disabled - rv = client.get('/admin/model1/') - data = rv.data.decode('utf-8') - assert '/admin/model1/details/' not in data + rv = client.get("/admin/model1/") + data = rv.data.decode("utf-8") + assert "/admin/model1/details/" not in data # ensure link to details view appears - rv = client.get('/admin/model2/') - data = rv.data.decode('utf-8') - assert '/admin/model2/details/' in data + rv = client.get("/admin/model2/") + data = rv.data.decode("utf-8") + assert "/admin/model2/details/" in data # test redirection when details are disabled - rv = client.get('/admin/model1/details/?url=%2Fadmin%2Fmodel1%2F&id=3') + rv = client.get("/admin/model1/details/?url=%2Fadmin%2Fmodel1%2F&id=3") assert rv.status_code == 302 # test if correct data appears in details view when enabled - rv = client.get('/admin/model2/details/?url=%2Fadmin%2Fmodel2%2F&id=3') - data = rv.data.decode('utf-8') - assert 'Char Field' in data - assert 'char_field_val_3' in data - assert 'Int Field' in data - assert '5000' in data + rv = client.get("/admin/model2/details/?url=%2Fadmin%2Fmodel2%2F&id=3") + data = rv.data.decode("utf-8") + assert "Char Field" in data + assert "char_field_val_3" in data + assert "Int Field" in data + assert "5000" in data # test column_details_list - rv = client.get('/admin/cf_view/details/?url=%2Fadmin%2Fcf_view%2F&id=3') - data = rv.data.decode('utf-8') - assert 'Char Field' in data - assert 'char_field_val_3' in data - assert 'Int Field' not in data - assert '5000' not in data + rv = client.get("/admin/cf_view/details/?url=%2Fadmin%2Fcf_view%2F&id=3") + data = rv.data.decode("utf-8") + assert "Char Field" in data + assert "char_field_val_3" in data + assert "Int Field" not in data + assert "5000" not in data def test_column_filters(app, db, admin): @@ -303,600 +331,599 @@ def test_column_filters(app, db, admin): fill_db(Model1, Model2) # Test string filter - view = CustomModelView(Model1, column_filters=['test1']) + view = CustomModelView(Model1, column_filters=["test1"]) admin.add_view(view) # Test int filter - view2 = CustomModelView(Model2, column_filters=['int_field']) + view2 = CustomModelView(Model2, column_filters=["int_field"]) admin.add_view(view2) # Test boolean filter - view3 = CustomModelView(Model2, column_filters=['bool_field'], - endpoint="_bools") + view3 = CustomModelView(Model2, column_filters=["bool_field"], endpoint="_bools") admin.add_view(view3) # Test float filter - view4 = CustomModelView(Model2, column_filters=['float_field'], - endpoint="_float") + view4 = CustomModelView(Model2, column_filters=["float_field"], endpoint="_float") admin.add_view(view4) # Test date, time, and datetime filters - view5 = CustomModelView(Model1, - column_filters=['date_field', 'datetime_field', 'timeonly_field'], - endpoint="_datetime") + view5 = CustomModelView( + Model1, + column_filters=["date_field", "datetime_field", "timeonly_field"], + endpoint="_datetime", + ) admin.add_view(view5) assert len(view._filters) == 7 - assert \ - [(f['index'], f['operation']) for f in view._filter_groups[u'Test1']] == \ - [ - (0, 'contains'), - (1, 'not contains'), - (2, 'equals'), - (3, 'not equal'), - (4, 'empty'), - (5, 'in list'), - (6, 'not in list'), - ] + assert [(f["index"], f["operation"]) for f in view._filter_groups["Test1"]] == [ + (0, "contains"), + (1, "not contains"), + (2, "equals"), + (3, "not equal"), + (4, "empty"), + (5, "in list"), + (6, "not in list"), + ] # Make some test clients client = app.test_client() # string - equals - rv = client.get('/admin/model1/?flt0_0=test1_val_1') + rv = client.get("/admin/model1/?flt0_0=test1_val_1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_1' in data - assert 'test1_val_2' not in data + data = rv.data.decode("utf-8") + assert "test2_val_1" in data + assert "test1_val_2" not in data # string - not equal - rv = client.get('/admin/model1/?flt0_1=test1_val_1') + rv = client.get("/admin/model1/?flt0_1=test1_val_1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_1' not in data - assert 'test1_val_2' in data + data = rv.data.decode("utf-8") + assert "test2_val_1" not in data + assert "test1_val_2" in data # string - contains - rv = client.get('/admin/model1/?flt0_2=test1_val_1') + rv = client.get("/admin/model1/?flt0_2=test1_val_1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_1' in data - assert 'test1_val_2' not in data + data = rv.data.decode("utf-8") + assert "test2_val_1" in data + assert "test1_val_2" not in data # string - not contains - rv = client.get('/admin/model1/?flt0_3=test1_val_1') + rv = client.get("/admin/model1/?flt0_3=test1_val_1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_1' not in data - assert 'test1_val_2' in data + data = rv.data.decode("utf-8") + assert "test2_val_1" not in data + assert "test1_val_2" in data # string - empty - rv = client.get('/admin/model1/?flt0_4=1') + rv = client.get("/admin/model1/?flt0_4=1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'empty_obj' in data - assert 'test1_val_1' not in data - assert 'test1_val_2' not in data + data = rv.data.decode("utf-8") + assert "empty_obj" in data + assert "test1_val_1" not in data + assert "test1_val_2" not in data # string - not empty - rv = client.get('/admin/model1/?flt0_4=0') + rv = client.get("/admin/model1/?flt0_4=0") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'empty_obj' not in data - assert 'test1_val_1' in data - assert 'test1_val_2' in data + data = rv.data.decode("utf-8") + assert "empty_obj" not in data + assert "test1_val_1" in data + assert "test1_val_2" in data # string - in list - rv = client.get('/admin/model1/?flt0_5=test1_val_1%2Ctest1_val_2') + rv = client.get("/admin/model1/?flt0_5=test1_val_1%2Ctest1_val_2") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_1' in data - assert 'test2_val_2' in data - assert 'test1_val_3' not in data - assert 'test1_val_4' not in data + data = rv.data.decode("utf-8") + assert "test2_val_1" in data + assert "test2_val_2" in data + assert "test1_val_3" not in data + assert "test1_val_4" not in data # string - not in list - rv = client.get('/admin/model1/?flt0_6=test1_val_1%2Ctest1_val_2') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_1' not in data - assert 'test2_val_2' not in data - assert 'test1_val_3' in data - assert 'test1_val_4' in data - - assert \ - [(f['index'], f['operation']) for f in view2._filter_groups[u'Int Field']] == \ - [ - (0, 'equals'), - (1, 'not equal'), - (2, 'greater than'), - (3, 'smaller than'), - (4, 'empty'), - (5, 'in list'), - (6, 'not in list'), - ] + rv = client.get("/admin/model1/?flt0_6=test1_val_1%2Ctest1_val_2") + assert rv.status_code == 200 + data = rv.data.decode("utf-8") + assert "test2_val_1" not in data + assert "test2_val_2" not in data + assert "test1_val_3" in data + assert "test1_val_4" in data + + assert [ + (f["index"], f["operation"]) for f in view2._filter_groups["Int Field"] + ] == [ + (0, "equals"), + (1, "not equal"), + (2, "greater than"), + (3, "smaller than"), + (4, "empty"), + (5, "in list"), + (6, "not in list"), + ] # integer - equals - rv = client.get('/admin/model2/?flt0_0=5000') + rv = client.get("/admin/model2/?flt0_0=5000") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'char_field_val_3' in data - assert 'char_field_val_4' not in data + data = rv.data.decode("utf-8") + assert "char_field_val_3" in data + assert "char_field_val_4" not in data # integer - equals (huge number) - rv = client.get('/admin/model2/?flt0_0=6169453081680413441') + rv = client.get("/admin/model2/?flt0_0=6169453081680413441") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'char_field_val_5' in data - assert 'char_field_val_4' not in data + data = rv.data.decode("utf-8") + assert "char_field_val_5" in data + assert "char_field_val_4" not in data # integer - equals - test validation - rv = client.get('/admin/model2/?flt0_0=badval') + rv = client.get("/admin/model2/?flt0_0=badval") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'Invalid Filter Value' in data + data = rv.data.decode("utf-8") + assert "Invalid Filter Value" in data # integer - not equal - rv = client.get('/admin/model2/?flt0_1=5000') + rv = client.get("/admin/model2/?flt0_1=5000") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'char_field_val_3' not in data - assert 'char_field_val_4' in data + data = rv.data.decode("utf-8") + assert "char_field_val_3" not in data + assert "char_field_val_4" in data # integer - greater - rv = client.get('/admin/model2/?flt0_2=6000') + rv = client.get("/admin/model2/?flt0_2=6000") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'char_field_val_3' not in data - assert 'char_field_val_4' in data + data = rv.data.decode("utf-8") + assert "char_field_val_3" not in data + assert "char_field_val_4" in data # integer - smaller - rv = client.get('/admin/model2/?flt0_3=6000') + rv = client.get("/admin/model2/?flt0_3=6000") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'char_field_val_3' in data - assert 'char_field_val_4' not in data + data = rv.data.decode("utf-8") + assert "char_field_val_3" in data + assert "char_field_val_4" not in data # integer - empty - rv = client.get('/admin/model2/?flt0_4=1') + rv = client.get("/admin/model2/?flt0_4=1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'char_field_val_1' in data - assert 'char_field_val_2' in data - assert 'char_field_val_3' not in data - assert 'char_field_val_4' not in data + data = rv.data.decode("utf-8") + assert "char_field_val_1" in data + assert "char_field_val_2" in data + assert "char_field_val_3" not in data + assert "char_field_val_4" not in data # integer - not empty - rv = client.get('/admin/model2/?flt0_4=0') + rv = client.get("/admin/model2/?flt0_4=0") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'char_field_val_1' not in data - assert 'char_field_val_2' not in data - assert 'char_field_val_3' in data - assert 'char_field_val_4' in data + data = rv.data.decode("utf-8") + assert "char_field_val_1" not in data + assert "char_field_val_2" not in data + assert "char_field_val_3" in data + assert "char_field_val_4" in data # integer - in list - rv = client.get('/admin/model2/?flt0_5=5000%2C9000') + rv = client.get("/admin/model2/?flt0_5=5000%2C9000") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'char_field_val_1' not in data - assert 'char_field_val_2' not in data - assert 'char_field_val_3' in data - assert 'char_field_val_4' in data + data = rv.data.decode("utf-8") + assert "char_field_val_1" not in data + assert "char_field_val_2" not in data + assert "char_field_val_3" in data + assert "char_field_val_4" in data # integer - in list (huge number) - rv = client.get('/admin/model2/?flt0_5=6169453081680413441') + rv = client.get("/admin/model2/?flt0_5=6169453081680413441") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'char_field_val_1' not in data - assert 'char_field_val_5' in data + data = rv.data.decode("utf-8") + assert "char_field_val_1" not in data + assert "char_field_val_5" in data # integer - in list - test validation - rv = client.get('/admin/model2/?flt0_5=5000%2Cbadval') + rv = client.get("/admin/model2/?flt0_5=5000%2Cbadval") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'Invalid Filter Value' in data + data = rv.data.decode("utf-8") + assert "Invalid Filter Value" in data # integer - not in list - rv = client.get('/admin/model2/?flt0_6=5000%2C9000') + rv = client.get("/admin/model2/?flt0_6=5000%2C9000") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'char_field_val_1' in data - assert 'char_field_val_2' in data - assert 'char_field_val_3' not in data - assert 'char_field_val_4' not in data + data = rv.data.decode("utf-8") + assert "char_field_val_1" in data + assert "char_field_val_2" in data + assert "char_field_val_3" not in data + assert "char_field_val_4" not in data - assert \ - [(f['index'], f['operation']) for f in view3._filter_groups[u'Bool Field']] == \ - [ - (0, 'equals'), - (1, 'not equal'), - ] + assert [ + (f["index"], f["operation"]) for f in view3._filter_groups["Bool Field"] + ] == [ + (0, "equals"), + (1, "not equal"), + ] # boolean - equals - Yes - rv = client.get('/admin/_bools/?flt0_0=1') + rv = client.get("/admin/_bools/?flt0_0=1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'char_field_val_1' in data - assert 'char_field_val_2' not in data - assert 'char_field_val_3' not in data + data = rv.data.decode("utf-8") + assert "char_field_val_1" in data + assert "char_field_val_2" not in data + assert "char_field_val_3" not in data # boolean - equals - No - rv = client.get('/admin/_bools/?flt0_0=0') + rv = client.get("/admin/_bools/?flt0_0=0") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'char_field_val_1' not in data - assert 'char_field_val_2' in data - assert 'char_field_val_3' in data + data = rv.data.decode("utf-8") + assert "char_field_val_1" not in data + assert "char_field_val_2" in data + assert "char_field_val_3" in data # boolean - not equals - Yes - rv = client.get('/admin/_bools/?flt0_1=1') + rv = client.get("/admin/_bools/?flt0_1=1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'char_field_val_1' not in data - assert 'char_field_val_2' in data - assert 'char_field_val_3' in data + data = rv.data.decode("utf-8") + assert "char_field_val_1" not in data + assert "char_field_val_2" in data + assert "char_field_val_3" in data # boolean - not equals - No - rv = client.get('/admin/_bools/?flt0_1=0') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'char_field_val_1' in data - assert 'char_field_val_2' not in data - assert 'char_field_val_3' not in data - - assert \ - [(f['index'], f['operation']) for f in view4._filter_groups[u'Float Field']] == \ - [ - (0, 'equals'), - (1, 'not equal'), - (2, 'greater than'), - (3, 'smaller than'), - (4, 'empty'), - (5, 'in list'), - (6, 'not in list'), - ] + rv = client.get("/admin/_bools/?flt0_1=0") + assert rv.status_code == 200 + data = rv.data.decode("utf-8") + assert "char_field_val_1" in data + assert "char_field_val_2" not in data + assert "char_field_val_3" not in data + + assert [ + (f["index"], f["operation"]) for f in view4._filter_groups["Float Field"] + ] == [ + (0, "equals"), + (1, "not equal"), + (2, "greater than"), + (3, "smaller than"), + (4, "empty"), + (5, "in list"), + (6, "not in list"), + ] # float - equals - rv = client.get('/admin/_float/?flt0_0=25.9') + rv = client.get("/admin/_float/?flt0_0=25.9") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'char_field_val_3' in data - assert 'char_field_val_4' not in data + data = rv.data.decode("utf-8") + assert "char_field_val_3" in data + assert "char_field_val_4" not in data # float - equals - test validation - rv = client.get('/admin/_float/?flt0_0=badval') + rv = client.get("/admin/_float/?flt0_0=badval") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'Invalid Filter Value' in data + data = rv.data.decode("utf-8") + assert "Invalid Filter Value" in data # float - not equal - rv = client.get('/admin/_float/?flt0_1=25.9') + rv = client.get("/admin/_float/?flt0_1=25.9") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'char_field_val_3' not in data - assert 'char_field_val_4' in data + data = rv.data.decode("utf-8") + assert "char_field_val_3" not in data + assert "char_field_val_4" in data # float - greater - rv = client.get('/admin/_float/?flt0_2=60.5') + rv = client.get("/admin/_float/?flt0_2=60.5") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'char_field_val_3' not in data - assert 'char_field_val_4' in data + data = rv.data.decode("utf-8") + assert "char_field_val_3" not in data + assert "char_field_val_4" in data # float - smaller - rv = client.get('/admin/_float/?flt0_3=60.5') + rv = client.get("/admin/_float/?flt0_3=60.5") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'char_field_val_3' in data - assert 'char_field_val_4' not in data + data = rv.data.decode("utf-8") + assert "char_field_val_3" in data + assert "char_field_val_4" not in data # float - empty - rv = client.get('/admin/_float/?flt0_4=1') + rv = client.get("/admin/_float/?flt0_4=1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'char_field_val_1' in data - assert 'char_field_val_2' in data - assert 'char_field_val_3' not in data - assert 'char_field_val_4' not in data + data = rv.data.decode("utf-8") + assert "char_field_val_1" in data + assert "char_field_val_2" in data + assert "char_field_val_3" not in data + assert "char_field_val_4" not in data # float - not empty - rv = client.get('/admin/_float/?flt0_4=0') + rv = client.get("/admin/_float/?flt0_4=0") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'char_field_val_1' not in data - assert 'char_field_val_2' not in data - assert 'char_field_val_3' in data - assert 'char_field_val_4' in data + data = rv.data.decode("utf-8") + assert "char_field_val_1" not in data + assert "char_field_val_2" not in data + assert "char_field_val_3" in data + assert "char_field_val_4" in data # float - in list - rv = client.get('/admin/_float/?flt0_5=25.9%2C75.5') + rv = client.get("/admin/_float/?flt0_5=25.9%2C75.5") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'char_field_val_1' not in data - assert 'char_field_val_2' not in data - assert 'char_field_val_3' in data - assert 'char_field_val_4' in data + data = rv.data.decode("utf-8") + assert "char_field_val_1" not in data + assert "char_field_val_2" not in data + assert "char_field_val_3" in data + assert "char_field_val_4" in data # float - in list - test validation - rv = client.get('/admin/_float/?flt0_5=25.9%2Cbadval') + rv = client.get("/admin/_float/?flt0_5=25.9%2Cbadval") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'Invalid Filter Value' in data + data = rv.data.decode("utf-8") + assert "Invalid Filter Value" in data # float - not in list - rv = client.get('/admin/_float/?flt0_6=25.9%2C75.5') - assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'char_field_val_1' in data - assert 'char_field_val_2' in data - assert 'char_field_val_3' not in data - assert 'char_field_val_4' not in data - - assert \ - [(f['index'], f['operation']) for f in view5._filter_groups[u'Date Field']] == \ - [ - (0, 'equals'), - (1, 'not equal'), - (2, 'greater than'), - (3, 'smaller than'), - (4, 'between'), - (5, 'not between'), - (6, 'empty'), - ] - - assert \ - [(f['index'], f['operation']) for f in view5._filter_groups[u'Datetime Field']] == \ - [ - (7, 'equals'), - (8, 'not equal'), - (9, 'greater than'), - (10, 'smaller than'), - (11, 'between'), - (12, 'not between'), - (13, 'empty'), - ] - - assert \ - [(f['index'], f['operation']) for f in view5._filter_groups[u'Timeonly Field']] == \ - [ - (14, 'equals'), - (15, 'not equal'), - (16, 'greater than'), - (17, 'smaller than'), - (18, 'between'), - (19, 'not between'), - (20, 'empty'), - ] + rv = client.get("/admin/_float/?flt0_6=25.9%2C75.5") + assert rv.status_code == 200 + data = rv.data.decode("utf-8") + assert "char_field_val_1" in data + assert "char_field_val_2" in data + assert "char_field_val_3" not in data + assert "char_field_val_4" not in data + + assert [ + (f["index"], f["operation"]) for f in view5._filter_groups["Date Field"] + ] == [ + (0, "equals"), + (1, "not equal"), + (2, "greater than"), + (3, "smaller than"), + (4, "between"), + (5, "not between"), + (6, "empty"), + ] + + assert [ + (f["index"], f["operation"]) for f in view5._filter_groups["Datetime Field"] + ] == [ + (7, "equals"), + (8, "not equal"), + (9, "greater than"), + (10, "smaller than"), + (11, "between"), + (12, "not between"), + (13, "empty"), + ] + + assert [ + (f["index"], f["operation"]) for f in view5._filter_groups["Timeonly Field"] + ] == [ + (14, "equals"), + (15, "not equal"), + (16, "greater than"), + (17, "smaller than"), + (18, "between"), + (19, "not between"), + (20, "empty"), + ] # date - equals - rv = client.get('/admin/_datetime/?flt0_0=2014-11-17') + rv = client.get("/admin/_datetime/?flt0_0=2014-11-17") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'date_obj1' in data - assert 'date_obj2' not in data + data = rv.data.decode("utf-8") + assert "date_obj1" in data + assert "date_obj2" not in data # date - not equal - rv = client.get('/admin/_datetime/?flt0_1=2014-11-17') + rv = client.get("/admin/_datetime/?flt0_1=2014-11-17") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'date_obj1' not in data - assert 'date_obj2' in data + data = rv.data.decode("utf-8") + assert "date_obj1" not in data + assert "date_obj2" in data # date - greater - rv = client.get('/admin/_datetime/?flt0_2=2014-11-16') + rv = client.get("/admin/_datetime/?flt0_2=2014-11-16") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'date_obj1' in data - assert 'date_obj2' not in data + data = rv.data.decode("utf-8") + assert "date_obj1" in data + assert "date_obj2" not in data # date - smaller - rv = client.get('/admin/_datetime/?flt0_3=2014-11-16') + rv = client.get("/admin/_datetime/?flt0_3=2014-11-16") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'date_obj1' not in data - assert 'date_obj2' in data + data = rv.data.decode("utf-8") + assert "date_obj1" not in data + assert "date_obj2" in data # date - between - rv = client.get('/admin/_datetime/?flt0_4=2014-11-13+to+2014-11-20') + rv = client.get("/admin/_datetime/?flt0_4=2014-11-13+to+2014-11-20") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'date_obj1' in data - assert 'date_obj2' not in data + data = rv.data.decode("utf-8") + assert "date_obj1" in data + assert "date_obj2" not in data # date - not between - rv = client.get('/admin/_datetime/?flt0_5=2014-11-13+to+2014-11-20') + rv = client.get("/admin/_datetime/?flt0_5=2014-11-13+to+2014-11-20") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'date_obj1' not in data - assert 'date_obj2' in data + data = rv.data.decode("utf-8") + assert "date_obj1" not in data + assert "date_obj2" in data # date - empty - rv = client.get('/admin/_datetime/?flt0_6=1') + rv = client.get("/admin/_datetime/?flt0_6=1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test1_val_1' in data - assert 'date_obj1' not in data - assert 'date_obj2' not in data + data = rv.data.decode("utf-8") + assert "test1_val_1" in data + assert "date_obj1" not in data + assert "date_obj2" not in data # date - empty - rv = client.get('/admin/_datetime/?flt0_6=0') + rv = client.get("/admin/_datetime/?flt0_6=0") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test1_val_1' not in data - assert 'date_obj1' in data - assert 'date_obj2' in data + data = rv.data.decode("utf-8") + assert "test1_val_1" not in data + assert "date_obj1" in data + assert "date_obj2" in data # datetime - equals - rv = client.get('/admin/_datetime/?flt0_7=2014-04-03+01%3A09%3A00') + rv = client.get("/admin/_datetime/?flt0_7=2014-04-03+01%3A09%3A00") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'datetime_obj1' in data - assert 'datetime_obj2' not in data + data = rv.data.decode("utf-8") + assert "datetime_obj1" in data + assert "datetime_obj2" not in data # datetime - not equal - rv = client.get('/admin/_datetime/?flt0_8=2014-04-03+01%3A09%3A00') + rv = client.get("/admin/_datetime/?flt0_8=2014-04-03+01%3A09%3A00") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'datetime_obj1' not in data - assert 'datetime_obj2' in data + data = rv.data.decode("utf-8") + assert "datetime_obj1" not in data + assert "datetime_obj2" in data # datetime - greater - rv = client.get('/admin/_datetime/?flt0_9=2014-04-03+01%3A08%3A00') + rv = client.get("/admin/_datetime/?flt0_9=2014-04-03+01%3A08%3A00") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'datetime_obj1' in data - assert 'datetime_obj2' not in data + data = rv.data.decode("utf-8") + assert "datetime_obj1" in data + assert "datetime_obj2" not in data # datetime - smaller - rv = client.get('/admin/_datetime/?flt0_10=2014-04-03+01%3A08%3A00') + rv = client.get("/admin/_datetime/?flt0_10=2014-04-03+01%3A08%3A00") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'datetime_obj1' not in data - assert 'datetime_obj2' in data + data = rv.data.decode("utf-8") + assert "datetime_obj1" not in data + assert "datetime_obj2" in data # datetime - between - rv = client.get('/admin/_datetime/?flt0_11=2014-04-02+00%3A00%3A00+to+2014-11-20+23%3A59%3A59') + rv = client.get( + "/admin/_datetime/?flt0_11=2014-04-02+00%3A00%3A00+to+2014-11-20+23%3A59%3A59" + ) assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'datetime_obj1' in data - assert 'datetime_obj2' not in data + data = rv.data.decode("utf-8") + assert "datetime_obj1" in data + assert "datetime_obj2" not in data # datetime - not between - rv = client.get('/admin/_datetime/?flt0_12=2014-04-02+00%3A00%3A00+to+2014-11-20+23%3A59%3A59') + rv = client.get( + "/admin/_datetime/?flt0_12=2014-04-02+00%3A00%3A00+to+2014-11-20+23%3A59%3A59" + ) assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'datetime_obj1' not in data - assert 'datetime_obj2' in data + data = rv.data.decode("utf-8") + assert "datetime_obj1" not in data + assert "datetime_obj2" in data # datetime - empty - rv = client.get('/admin/_datetime/?flt0_13=1') + rv = client.get("/admin/_datetime/?flt0_13=1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test1_val_1' in data - assert 'datetime_obj1' not in data - assert 'datetime_obj2' not in data + data = rv.data.decode("utf-8") + assert "test1_val_1" in data + assert "datetime_obj1" not in data + assert "datetime_obj2" not in data # datetime - not empty - rv = client.get('/admin/_datetime/?flt0_13=0') + rv = client.get("/admin/_datetime/?flt0_13=0") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test1_val_1' not in data - assert 'datetime_obj1' in data - assert 'datetime_obj2' in data + data = rv.data.decode("utf-8") + assert "test1_val_1" not in data + assert "datetime_obj1" in data + assert "datetime_obj2" in data # time - equals - rv = client.get('/admin/_datetime/?flt0_14=11%3A10%3A09') + rv = client.get("/admin/_datetime/?flt0_14=11%3A10%3A09") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'timeonly_obj1' in data - assert 'timeonly_obj2' not in data + data = rv.data.decode("utf-8") + assert "timeonly_obj1" in data + assert "timeonly_obj2" not in data # time - not equal - rv = client.get('/admin/_datetime/?flt0_15=11%3A10%3A09') + rv = client.get("/admin/_datetime/?flt0_15=11%3A10%3A09") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'timeonly_obj1' not in data - assert 'timeonly_obj2' in data + data = rv.data.decode("utf-8") + assert "timeonly_obj1" not in data + assert "timeonly_obj2" in data # time - greater - rv = client.get('/admin/_datetime/?flt0_16=11%3A09%3A09') + rv = client.get("/admin/_datetime/?flt0_16=11%3A09%3A09") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'timeonly_obj1' in data - assert 'timeonly_obj2' not in data + data = rv.data.decode("utf-8") + assert "timeonly_obj1" in data + assert "timeonly_obj2" not in data # time - smaller - rv = client.get('/admin/_datetime/?flt0_17=11%3A09%3A09') + rv = client.get("/admin/_datetime/?flt0_17=11%3A09%3A09") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'timeonly_obj1' not in data - assert 'timeonly_obj2' in data + data = rv.data.decode("utf-8") + assert "timeonly_obj1" not in data + assert "timeonly_obj2" in data # time - between - rv = client.get('/admin/_datetime/?flt0_18=10%3A40%3A00+to+11%3A50%3A59') + rv = client.get("/admin/_datetime/?flt0_18=10%3A40%3A00+to+11%3A50%3A59") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'timeonly_obj1' in data - assert 'timeonly_obj2' not in data + data = rv.data.decode("utf-8") + assert "timeonly_obj1" in data + assert "timeonly_obj2" not in data # time - not between - rv = client.get('/admin/_datetime/?flt0_19=10%3A40%3A00+to+11%3A50%3A59') + rv = client.get("/admin/_datetime/?flt0_19=10%3A40%3A00+to+11%3A50%3A59") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'timeonly_obj1' not in data - assert 'timeonly_obj2' in data + data = rv.data.decode("utf-8") + assert "timeonly_obj1" not in data + assert "timeonly_obj2" in data # time - empty - rv = client.get('/admin/_datetime/?flt0_20=1') + rv = client.get("/admin/_datetime/?flt0_20=1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test1_val_1' in data - assert 'timeonly_obj1' not in data - assert 'timeonly_obj2' not in data + data = rv.data.decode("utf-8") + assert "test1_val_1" in data + assert "timeonly_obj1" not in data + assert "timeonly_obj2" not in data # time - not empty - rv = client.get('/admin/_datetime/?flt0_20=0') + rv = client.get("/admin/_datetime/?flt0_20=0") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test1_val_1' not in data - assert 'timeonly_obj1' in data - assert 'timeonly_obj2' in data + data = rv.data.decode("utf-8") + assert "test1_val_1" not in data + assert "timeonly_obj1" in data + assert "timeonly_obj2" in data def test_default_sort(app, db, admin): M1, _ = create_models(db) - M1('c', 1).save() - M1('b', 1).save() - M1('a', 2).save() + M1("c", 1).save() + M1("b", 1).save() + M1("a", 2).save() assert M1.select().count() == 3 - view = CustomModelView(M1, column_default_sort='test1') + view = CustomModelView(M1, column_default_sort="test1") admin.add_view(view) _, data = view.get_list(0, None, None, None, None) - assert data[0].test1 == 'a' - assert data[1].test1 == 'b' - assert data[2].test1 == 'c' + assert data[0].test1 == "a" + assert data[1].test1 == "b" + assert data[2].test1 == "c" # test default sort with multiple columns - order = [('test2', False), ('test1', False)] - view2 = CustomModelView(M1, column_default_sort=order, endpoint='m1_2') + order = [("test2", False), ("test1", False)] + view2 = CustomModelView(M1, column_default_sort=order, endpoint="m1_2") admin.add_view(view2) _, data = view2.get_list(0, None, None, None, None) assert len(data) == 3 - assert data[0].test1 == 'b' - assert data[1].test1 == 'c' - assert data[2].test1 == 'a' + assert data[0].test1 == "b" + assert data[1].test1 == "c" + assert data[2].test1 == "a" def test_extra_fields(app, db, admin): Model1, _ = create_models(db) view = CustomModelView( - Model1, - form_extra_fields={ - 'extra_field': fields.StringField('Extra Field') - } + Model1, form_extra_fields={"extra_field": fields.StringField("Extra Field")} ) admin.add_view(view) client = app.test_client() - rv = client.get('/admin/model1/new/') + rv = client.get("/admin/model1/new/") assert rv.status_code == 200 # Check presence and order - data = rv.data.decode('utf-8') - assert 'Extra Field' in data - pos1 = data.find('Extra Field') - pos2 = data.find('Test1') + data = rv.data.decode("utf-8") + assert "Extra Field" in data + pos1 = data.find("Extra Field") + pos2 = data.find("Test1") assert pos2 < pos1 @@ -906,13 +933,10 @@ class TestForm(form.BaseForm): Model1, _ = create_models(db) - view = CustomModelView( - Model1, - form_base_class=TestForm - ) + view = CustomModelView(Model1, form_base_class=TestForm) admin.add_view(view) - assert hasattr(view._create_form_class, 'test1') + assert hasattr(view._create_form_class, "test1") create_form = view.create_form() assert isinstance(create_form, TestForm) @@ -928,7 +952,7 @@ class Model(BaseModel): Model.create_table() - shared_form_args = {'test': {'validators': [validators.Regexp('test')]}} + shared_form_args = {"test": {"validators": [validators.Regexp("test")]}} view = CustomModelView(Model, form_args=shared_form_args) admin.add_view(view) @@ -961,148 +985,160 @@ class Model2(BaseModel): Model2.create_table() view = CustomModelView( - Model2, - url='view', - form_ajax_refs={ - 'model1': { - 'fields': ('test1', 'test2') - } - } + Model2, url="view", form_ajax_refs={"model1": {"fields": ("test1", "test2")}} ) admin.add_view(view) - assert u'model1' in view._form_ajax_refs + assert "model1" in view._form_ajax_refs - model = Model1(test1=u'first', test2=u'') + model = Model1(test1="first", test2="") model.save() - model2 = Model1(test1=u'foo', test2=u'bar') + model2 = Model1(test1="foo", test2="bar") model2.save() # Check loader - loader = view._form_ajax_refs[u'model1'] + loader = view._form_ajax_refs["model1"] mdl = loader.get_one(model.id) assert mdl.test1 == model.test1 - items = loader.get_list(u'fir') + items = loader.get_list("fir") assert len(items) == 1 assert items[0].id == model.id - items = loader.get_list(u'bar') + items = loader.get_list("bar") assert len(items) == 1 - assert items[0].test1 == u'foo' + assert items[0].test1 == "foo" # Check form generation form = view.create_form() - assert form.model1.__class__.__name__ == u'AjaxSelectField' + assert form.model1.__class__.__name__ == "AjaxSelectField" - with app.test_request_context('/admin/view/'): - assert u'value=""' not in form.model1() + with app.test_request_context("/admin/view/"): + assert 'value=""' not in form.model1() form.model1.data = model - assert (u'data-json="[%s, "first"]"' % as_unicode(model.id) in form.model1() or - u'data-json="[%s, "first"]"' % as_unicode(model.id)) - assert u'value="%s"' % as_unicode(model.id) in form.model1() + assert 'data-json="[%s, "first"]"' % as_unicode( + model.id + ) in form.model1() or 'data-json="[%s, "first"]"' % as_unicode(model.id) + assert 'value="%s"' % as_unicode(model.id) in form.model1() # Check querying client = app.test_client() - req = client.get(u'/admin/view/ajax/lookup/?name=model1&query=foo') + req = client.get("/admin/view/ajax/lookup/?name=model1&query=foo") assert req.data == b'[[%d, "foo"]]' % model2.id # Check submitting - client.post('/admin/view/new/', data={u'model1': as_unicode(model.id)}) + client.post("/admin/view/new/", data={"model1": as_unicode(model.id)}) mdl = Model2.select().first() assert mdl is not None assert mdl.model1 is not None assert mdl.model1.id == model.id - assert mdl.model1.test1 == u'first' + assert mdl.model1.test1 == "first" def test_customising_page_size(app, db, admin): with app.app_context(): M1, _ = create_models(db) - instances = [M1(f'instance-{x+1:03d}') for x in range(101)] + instances = [M1(f"instance-{x+1:03d}") for x in range(101)] for instance in instances: instance.save() - view1 = CustomModelView(M1, endpoint='view1', page_size=20, can_set_page_size=False) + view1 = CustomModelView( + M1, endpoint="view1", page_size=20, can_set_page_size=False + ) admin.add_view(view1) - view2 = CustomModelView(M1, db, endpoint='view2', page_size=5, can_set_page_size=False) + view2 = CustomModelView( + M1, db, endpoint="view2", page_size=5, can_set_page_size=False + ) admin.add_view(view2) - view3 = CustomModelView(M1, db, endpoint='view3', page_size=20, can_set_page_size=True) + view3 = CustomModelView( + M1, db, endpoint="view3", page_size=20, can_set_page_size=True + ) admin.add_view(view3) - view4 = CustomModelView(M1, db, endpoint='view4', page_size=5, page_size_options=(5, 10, 15), can_set_page_size=True) + view4 = CustomModelView( + M1, + db, + endpoint="view4", + page_size=5, + page_size_options=(5, 10, 15), + can_set_page_size=True, + ) admin.add_view(view4) client = app.test_client() - rv = client.get('/admin/view1/') - assert 'instance-020' in rv.text - assert 'instance-021' not in rv.text + rv = client.get("/admin/view1/") + assert "instance-020" in rv.text + assert "instance-021" not in rv.text # `can_set_page_size=False`, so only the default of 20 is available. - rv = client.get('/admin/view1/?page_size=50') - assert 'instance-020' in rv.text - assert 'instance-021' not in rv.text + rv = client.get("/admin/view1/?page_size=50") + assert "instance-020" in rv.text + assert "instance-021" not in rv.text # Check view2, which has `page_size=5` to change the default page size - rv = client.get('/admin/view2/') - assert 'instance-005' in rv.text - assert 'instance-006' not in rv.text + rv = client.get("/admin/view2/") + assert "instance-005" in rv.text + assert "instance-006" not in rv.text # Check view3, which has `can_set_page_size=True` - rv = client.get('/admin/view3/') - assert 'instance-020' in rv.text - assert 'instance-021' not in rv.text + rv = client.get("/admin/view3/") + assert "instance-020" in rv.text + assert "instance-021" not in rv.text - rv = client.get('/admin/view3/?page_size=50') - assert 'instance-050' in rv.text - assert 'instance-051' not in rv.text + rv = client.get("/admin/view3/?page_size=50") + assert "instance-050" in rv.text + assert "instance-051" not in rv.text - rv = client.get('/admin/view3/?page_size=100') - assert 'instance-100' in rv.text - assert 'instance-101' not in rv.text + rv = client.get("/admin/view3/?page_size=100") + assert "instance-100" in rv.text + assert "instance-101" not in rv.text # Invalid page sizes are reset to the default - rv = client.get('/admin/view3/?page_size=1') - assert 'instance-020' in rv.text - assert 'instance-021' not in rv.text + rv = client.get("/admin/view3/?page_size=1") + assert "instance-020" in rv.text + assert "instance-021" not in rv.text # Check view4, which has custom `page_size_options` - rv = client.get('/admin/view4/') - assert 'instance-005' in rv.text - assert 'instance-006' not in rv.text + rv = client.get("/admin/view4/") + assert "instance-005" in rv.text + assert "instance-006" not in rv.text # Invalid page sizes are reset to the default - rv = client.get('/admin/view4/?page_size=1') - assert 'instance-005' in rv.text - assert 'instance-006' not in rv.text + rv = client.get("/admin/view4/?page_size=1") + assert "instance-005" in rv.text + assert "instance-006" not in rv.text - rv = client.get('/admin/view4/?page_size=10') - assert 'instance-010' in rv.text - assert 'instance-011' not in rv.text + rv = client.get("/admin/view4/?page_size=10") + assert "instance-010" in rv.text + assert "instance-011" not in rv.text - rv = client.get('/admin/view4/?page_size=15') - assert 'instance-015' in rv.text - assert 'instance-016' not in rv.text + rv = client.get("/admin/view4/?page_size=15") + assert "instance-015" in rv.text + assert "instance-016" not in rv.text def test_export_csv(app, db, admin): Model1, Model2 = create_models(db) - view = CustomModelView(Model1, can_export=True, - column_list=['test1', 'test2'], export_max_rows=2, - endpoint='row_limit_2') + view = CustomModelView( + Model1, + can_export=True, + column_list=["test1", "test2"], + export_max_rows=2, + endpoint="row_limit_2", + ) admin.add_view(view) - view2 = CustomModelView(Model1, can_export=True, - column_list=['test1', 'test2'], - endpoint='no_row_limit') + view2 = CustomModelView( + Model1, can_export=True, column_list=["test1", "test2"], endpoint="no_row_limit" + ) admin.add_view(view2) for x in range(5): @@ -1111,15 +1147,18 @@ def test_export_csv(app, db, admin): client = app.test_client() # test export_max_rows - rv = client.get('/admin/row_limit_2/export/csv/') - data = rv.data.decode('utf-8') - assert rv.status_code == 200 - assert "Test1,Test2\r\n" + \ - "test1_val_1,test2_val_1\r\n" + \ - "test1_val_2,test2_val_2\r\n" == data + rv = client.get("/admin/row_limit_2/export/csv/") + data = rv.data.decode("utf-8") + assert rv.status_code == 200 + assert ( + "Test1,Test2\r\n" + + "test1_val_1,test2_val_1\r\n" + + "test1_val_2,test2_val_2\r\n" + == data + ) # test row limit without export_max_rows - rv = client.get('/admin/no_row_limit/export/csv/') - data = rv.data.decode('utf-8') + rv = client.get("/admin/no_row_limit/export/csv/") + data = rv.data.decode("utf-8") assert rv.status_code == 200 assert len(data.splitlines()) > 21 diff --git a/flask_admin/tests/pymongo/test_basic.py b/flask_admin/tests/pymongo/test_basic.py index 7fe31335c..53ea16715 100644 --- a/flask_admin/tests/pymongo/test_basic.py +++ b/flask_admin/tests/pymongo/test_basic.py @@ -1,34 +1,35 @@ -from wtforms import form, fields +from wtforms import fields +from wtforms import form from flask_admin.contrib.pymongo import ModelView class TestForm(form.Form): __test__ = False - test1 = fields.StringField('Test1') - test2 = fields.StringField('Test2') + test1 = fields.StringField("Test1") + test2 = fields.StringField("Test2") class TestView(ModelView): __test__ = False - column_list = ('test1', 'test2', 'test3', 'test4') - column_sortable_list = ('test1', 'test2') + column_list = ("test1", "test2", "test3", "test4") + column_sortable_list = ("test1", "test2") form = TestForm def test_model(app, db, admin): - view = TestView(db.test, 'Test') + view = TestView(db.test, "Test") admin.add_view(view) # Drop existing data (if any) db.test.delete_many({}) - assert view.name == 'Test' - assert view.endpoint == 'testview' + assert view.name == "Test" + assert view.endpoint == "testview" - assert 'test1' in view._sortable_columns - assert 'test2' in view._sortable_columns + assert "test1" in view._sortable_columns + assert "test2" in view._sortable_columns assert view._create_form_class is not None assert view._edit_form_class is not None @@ -38,40 +39,40 @@ def test_model(app, db, admin): # Make some test clients client = app.test_client() - rv = client.get('/admin/testview/') + rv = client.get("/admin/testview/") assert rv.status_code == 200 - rv = client.get('/admin/testview/new/') + rv = client.get("/admin/testview/new/") assert rv.status_code == 200 - rv = client.post('/admin/testview/new/', - data=dict(test1='test1large', test2='test2')) + rv = client.post( + "/admin/testview/new/", data=dict(test1="test1large", test2="test2") + ) assert rv.status_code == 302 model = db.test.find()[0] print(model) - assert model['test1'] == 'test1large' - assert model['test2'] == 'test2' + assert model["test1"] == "test1large" + assert model["test2"] == "test2" - rv = client.get('/admin/testview/') + rv = client.get("/admin/testview/") assert rv.status_code == 200 - assert 'test1large' in rv.data.decode('utf-8') + assert "test1large" in rv.data.decode("utf-8") - url = '/admin/testview/edit/?id=%s' % model['_id'] + url = "/admin/testview/edit/?id=%s" % model["_id"] rv = client.get(url) assert rv.status_code == 200 - rv = client.post(url, - data=dict(test1='test1small', test2='test2large')) + rv = client.post(url, data=dict(test1="test1small", test2="test2large")) assert rv.status_code == 302 print(db.test.find()[0]) model = db.test.find()[0] - assert model['test1'] == 'test1small' - assert model['test2'] == 'test2large' + assert model["test1"] == "test1small" + assert model["test2"] == "test2large" - url = '/admin/testview/delete/?id=%s' % model['_id'] + url = "/admin/testview/delete/?id=%s" % model["_id"] rv = client.post(url) assert rv.status_code == 302 assert db.test.estimated_document_count() == 0 diff --git a/flask_admin/tests/sqla/conftest.py b/flask_admin/tests/sqla/conftest.py index edeb0335f..53aabcde0 100644 --- a/flask_admin/tests/sqla/conftest.py +++ b/flask_admin/tests/sqla/conftest.py @@ -1,36 +1,38 @@ import pytest from flask import Flask +from flask_sqlalchemy import SQLAlchemy from flask_admin import Admin -from flask_sqlalchemy import SQLAlchemy -@pytest.fixture(scope='function') +@pytest.fixture(scope="function") def app(): # Overrides the `app` fixture in `flask_admin/tests/conftest.py` so that the `sqla` # directory/import path is configured as the root path for Flask. This will # cause the `templates` directory here to be used for template resolution. app = Flask(__name__) - app.config['SECRET_KEY'] = '1' - app.config['WTF_CSRF_ENABLED'] = False + app.config["SECRET_KEY"] = "1" + app.config["WTF_CSRF_ENABLED"] = False yield app @pytest.fixture def db(app): - app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' - app.config['SQLALCHEMY_ECHO'] = True - app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False + app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///" + app.config["SQLALCHEMY_ECHO"] = True + app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False db = SQLAlchemy(app) yield db @pytest.fixture def postgres_db(app): - app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://postgres:postgres@localhost/flask_admin_test' - app.config['SQLALCHEMY_ECHO'] = True - app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False + app.config["SQLALCHEMY_DATABASE_URI"] = ( + "postgresql://postgres:postgres@localhost/flask_admin_test" + ) + app.config["SQLALCHEMY_ECHO"] = True + app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False db = SQLAlchemy(app) yield db diff --git a/flask_admin/tests/sqla/test_basic.py b/flask_admin/tests/sqla/test_basic.py index a10e81730..8aafa18a9 100644 --- a/flask_admin/tests/sqla/test_basic.py +++ b/flask_admin/tests/sqla/test_basic.py @@ -1,48 +1,73 @@ -import pytest +import enum +import uuid +from datetime import date +from datetime import datetime +from datetime import time -from wtforms import fields, validators +import arrow +import pytest +from sqlalchemy import cast +from sqlalchemy.ext.hybrid import hybrid_property +from sqlalchemy_utils import ArrowType +from sqlalchemy_utils import ChoiceType +from sqlalchemy_utils import ColorType +from sqlalchemy_utils import CurrencyType +from sqlalchemy_utils import EmailType +from sqlalchemy_utils import IPAddressType +from sqlalchemy_utils import URLType +from sqlalchemy_utils import UUIDType +from wtforms import fields +from wtforms import validators from flask_admin import form -from flask_admin.form.fields import Select2Field, DateTimeField from flask_admin._compat import as_unicode from flask_admin._compat import iteritems -from flask_admin.contrib.sqla import ModelView, filters, tools - -from sqlalchemy.ext.hybrid import hybrid_property -from sqlalchemy import cast -from sqlalchemy_utils import EmailType, ChoiceType, UUIDType, URLType, CurrencyType, ColorType, ArrowType, IPAddressType - -from datetime import datetime, time, date -import uuid -import enum -import arrow - +from flask_admin.contrib.sqla import filters +from flask_admin.contrib.sqla import ModelView +from flask_admin.contrib.sqla import tools +from flask_admin.form.fields import DateTimeField +from flask_admin.form.fields import Select2Field from flask_admin.tests import flask_babel_test_decorator class CustomModelView(ModelView): - def __init__(self, model, session, - name=None, category=None, endpoint=None, url=None, - **kwargs): + def __init__( + self, + model, + session, + name=None, + category=None, + endpoint=None, + url=None, + **kwargs, + ): for k, v in iteritems(kwargs): setattr(self, k, v) - super(CustomModelView, self).__init__(model, session, name, category, - endpoint, url) - form_choices = { - 'choice_field': [ - ('choice-1', 'One'), - ('choice-2', 'Two') - ] - } + super(CustomModelView, self).__init__( + model, session, name, category, endpoint, url + ) + + form_choices = {"choice_field": [("choice-1", "One"), ("choice-2", "Two")]} def create_models(db): class Model1(db.Model): - def __init__(self, test1=None, test2=None, test3=None, test4=None, - bool_field=False, date_field=None, time_field=None, - datetime_field=None, email_field=None, - choice_field=None, enum_field=None, enum_type_field=None): + def __init__( + self, + test1=None, + test2=None, + test3=None, + test4=None, + bool_field=False, + date_field=None, + time_field=None, + datetime_field=None, + email_field=None, + choice_field=None, + enum_field=None, + enum_type_field=None, + ): self.test1 = test1 self.test2 = test2 self.test3 = test3 @@ -70,13 +95,12 @@ class EnumChoices(enum.Enum): time_field = db.Column(db.Time) datetime_field = db.Column(db.DateTime) email_field = db.Column(EmailType) - enum_field = db.Column(db.Enum('model1_v1', 'model1_v2'), nullable=True) + enum_field = db.Column(db.Enum("model1_v1", "model1_v2"), nullable=True) enum_type_field = db.Column(db.Enum(EnumChoices), nullable=True) choice_field = db.Column(db.String, nullable=True) - sqla_utils_choice = db.Column(ChoiceType([ - ('choice-1', u'First choice'), - ('choice-2', u'Second choice') - ])) + sqla_utils_choice = db.Column( + ChoiceType([("choice-1", "First choice"), ("choice-2", "Second choice")]) + ) sqla_utils_enum = db.Column(ChoiceType(EnumChoices, impl=db.Integer())) sqla_utils_arrow = db.Column(ArrowType, default=arrow.utcnow()) sqla_utils_uuid = db.Column(UUIDType(binary=False), default=uuid.uuid4) @@ -92,9 +116,16 @@ def __str__(self): return self.test1 class Model2(db.Model): - def __init__(self, string_field=None, int_field=None, bool_field=None, - model1=None, float_field=None, string_field_default=None, - string_field_empty_default=None): + def __init__( + self, + string_field=None, + int_field=None, + bool_field=None, + model1=None, + float_field=None, + string_field_default=None, + string_field_empty_default=None, + ): self.string_field = string_field self.int_field = int_field self.bool_field = bool_field @@ -105,18 +136,16 @@ def __init__(self, string_field=None, int_field=None, bool_field=None, id = db.Column(db.Integer, primary_key=True) string_field = db.Column(db.String) - string_field_default = db.Column(db.Text, nullable=False, - default='') - string_field_empty_default = db.Column(db.Text, nullable=False, - default='') + string_field_default = db.Column(db.Text, nullable=False, default="") + string_field_empty_default = db.Column(db.Text, nullable=False, default="") int_field = db.Column(db.Integer) bool_field = db.Column(db.Boolean) - enum_field = db.Column(db.Enum('model2_v1', 'model2_v2'), nullable=True) + enum_field = db.Column(db.Enum("model2_v1", "model2_v2"), nullable=True) float_field = db.Column(db.Float) # Relation model1_id = db.Column(db.Integer, db.ForeignKey(Model1.id)) - model1 = db.relationship(lambda: Model1, backref='model2') + model1 = db.relationship(lambda: Model1, backref="model2") db.create_all() @@ -124,39 +153,65 @@ def __init__(self, string_field=None, int_field=None, bool_field=None, def fill_db(db, Model1, Model2): - model1_obj1 = Model1('test1_val_1', 'test2_val_1', bool_field=True) - model1_obj2 = Model1('test1_val_2', 'test2_val_2', bool_field=False) - model1_obj3 = Model1('test1_val_3', 'test2_val_3') - model1_obj4 = Model1('test1_val_4', 'test2_val_4', email_field="test@test.com", choice_field="choice-1") - - model2_obj1 = Model2('test2_val_1', model1=model1_obj1, float_field=None) - model2_obj2 = Model2('test2_val_2', model1=model1_obj2, float_field=None) - model2_obj3 = Model2('test2_val_3', int_field=5000, float_field=25.9) - model2_obj4 = Model2('test2_val_4', int_field=9000, float_field=75.5) - model2_obj5 = Model2('test2_val_5', int_field=6169453081680413441) - - date_obj1 = Model1('date_obj1', date_field=date(2014, 11, 17)) - date_obj2 = Model1('date_obj2', date_field=date(2013, 10, 16)) - timeonly_obj1 = Model1('timeonly_obj1', time_field=time(11, 10, 9)) - timeonly_obj2 = Model1('timeonly_obj2', time_field=time(10, 9, 8)) - datetime_obj1 = Model1('datetime_obj1', datetime_field=datetime(2014, 4, 3, 1, 9, 0)) - datetime_obj2 = Model1('datetime_obj2', datetime_field=datetime(2013, 3, 2, 0, 8, 0)) - - enum_obj1 = Model1('enum_obj1', enum_field="model1_v1") - enum_obj2 = Model1('enum_obj2', enum_field="model1_v2") - - enum_type_obj1 = Model1('enum_type_obj1', enum_type_field=Model1.EnumChoices.first) - enum_type_obj2 = Model1('enum_type_obj2', enum_type_field=Model1.EnumChoices.second) + model1_obj1 = Model1("test1_val_1", "test2_val_1", bool_field=True) + model1_obj2 = Model1("test1_val_2", "test2_val_2", bool_field=False) + model1_obj3 = Model1("test1_val_3", "test2_val_3") + model1_obj4 = Model1( + "test1_val_4", + "test2_val_4", + email_field="test@test.com", + choice_field="choice-1", + ) + + model2_obj1 = Model2("test2_val_1", model1=model1_obj1, float_field=None) + model2_obj2 = Model2("test2_val_2", model1=model1_obj2, float_field=None) + model2_obj3 = Model2("test2_val_3", int_field=5000, float_field=25.9) + model2_obj4 = Model2("test2_val_4", int_field=9000, float_field=75.5) + model2_obj5 = Model2("test2_val_5", int_field=6169453081680413441) + + date_obj1 = Model1("date_obj1", date_field=date(2014, 11, 17)) + date_obj2 = Model1("date_obj2", date_field=date(2013, 10, 16)) + timeonly_obj1 = Model1("timeonly_obj1", time_field=time(11, 10, 9)) + timeonly_obj2 = Model1("timeonly_obj2", time_field=time(10, 9, 8)) + datetime_obj1 = Model1( + "datetime_obj1", datetime_field=datetime(2014, 4, 3, 1, 9, 0) + ) + datetime_obj2 = Model1( + "datetime_obj2", datetime_field=datetime(2013, 3, 2, 0, 8, 0) + ) + + enum_obj1 = Model1("enum_obj1", enum_field="model1_v1") + enum_obj2 = Model1("enum_obj2", enum_field="model1_v2") + + enum_type_obj1 = Model1("enum_type_obj1", enum_type_field=Model1.EnumChoices.first) + enum_type_obj2 = Model1("enum_type_obj2", enum_type_field=Model1.EnumChoices.second) empty_obj = Model1(test2="empty_obj") - db.session.add_all([ - model1_obj1, model1_obj2, model1_obj3, model1_obj4, - model2_obj1, model2_obj2, model2_obj3, model2_obj4, model2_obj5, - date_obj1, timeonly_obj1, datetime_obj1, - date_obj2, timeonly_obj2, datetime_obj2, - enum_obj1, enum_obj2, enum_type_obj1, enum_type_obj2, empty_obj - ]) + db.session.add_all( + [ + model1_obj1, + model1_obj2, + model1_obj3, + model1_obj4, + model2_obj1, + model2_obj2, + model2_obj3, + model2_obj4, + model2_obj5, + date_obj1, + timeonly_obj1, + datetime_obj1, + date_obj2, + timeonly_obj2, + datetime_obj2, + enum_obj1, + enum_obj2, + enum_type_obj1, + enum_type_obj2, + empty_obj, + ] + ) db.session.commit() @@ -172,15 +227,15 @@ def test_model(app, db, admin): admin.add_view(view) assert view.model == Model1 - assert view.name == 'Model1' - assert view.endpoint == 'model1' + assert view.name == "Model1" + assert view.endpoint == "model1" - assert view._primary_key == 'id' + assert view._primary_key == "id" - assert 'test1' in view._sortable_columns - assert 'test2' in view._sortable_columns - assert 'test3' in view._sortable_columns - assert 'test4' in view._sortable_columns + assert "test1" in view._sortable_columns + assert "test2" in view._sortable_columns + assert "test3" in view._sortable_columns + assert "test4" in view._sortable_columns assert view._create_form_class is not None assert view._edit_form_class is not None @@ -200,101 +255,112 @@ def test_model(app, db, admin): assert view._create_form_class.sqla_utils_arrow.field_class == DateTimeField assert view._create_form_class.sqla_utils_uuid.field_class == fields.StringField assert view._create_form_class.sqla_utils_url.field_class == fields.StringField - assert view._create_form_class.sqla_utils_ip_address.field_class == fields.StringField - assert view._create_form_class.sqla_utils_currency.field_class == fields.StringField - assert view._create_form_class.sqla_utils_color.field_class == fields.StringField + assert ( + view._create_form_class.sqla_utils_ip_address.field_class + == fields.StringField + ) + assert ( + view._create_form_class.sqla_utils_currency.field_class + == fields.StringField + ) + assert ( + view._create_form_class.sqla_utils_color.field_class == fields.StringField + ) # Make some test clients client = app.test_client() # check that we can retrieve a list view - rv = client.get('/admin/model1/') + rv = client.get("/admin/model1/") assert rv.status_code == 200 # check that we can retrieve a 'create' view - rv = client.get('/admin/model1/new/') + rv = client.get("/admin/model1/new/") assert rv.status_code == 200 # create a new record uuid_obj = uuid.uuid4() rv = client.post( - '/admin/model1/new/', + "/admin/model1/new/", data=dict( - test1='test1large', - test2='test2', + test1="test1large", + test2="test2", time_field=time(0, 0, 0), email_field="Test@TEST.com", choice_field="choice-1", - enum_field='model1_v1', + enum_field="model1_v1", sqla_utils_choice="choice-1", sqla_utils_enum=1, - sqla_utils_arrow='2018-10-27 14:17:00', + sqla_utils_arrow="2018-10-27 14:17:00", sqla_utils_uuid=str(uuid_obj), sqla_utils_url="http://www.example.com", - sqla_utils_ip_address='127.0.0.1', - sqla_utils_currency='USD', - sqla_utils_color='#f0f0f0', - ) + sqla_utils_ip_address="127.0.0.1", + sqla_utils_currency="USD", + sqla_utils_color="#f0f0f0", + ), ) assert rv.status_code == 302 # check that the new record was persisted model = db.session.query(Model1).first() - assert model.test1 == u'test1large' - assert model.test2 == u'test2' + assert model.test1 == "test1large" + assert model.test2 == "test2" assert model.test3 == None assert model.test4 == None - assert model.email_field == u'test@test.com' - assert model.choice_field == u'choice-1' - assert model.enum_field == u'model1_v1' - assert model.sqla_utils_choice == u'choice-1' + assert model.email_field == "test@test.com" + assert model.choice_field == "choice-1" + assert model.enum_field == "model1_v1" + assert model.sqla_utils_choice == "choice-1" assert model.sqla_utils_enum.value == 1 - assert model.sqla_utils_arrow == arrow.get('2018-10-27 14:17:00') + assert model.sqla_utils_arrow == arrow.get("2018-10-27 14:17:00") assert model.sqla_utils_uuid == uuid_obj assert model.sqla_utils_url == "http://www.example.com" - assert str(model.sqla_utils_ip_address) == '127.0.0.1' - assert str(model.sqla_utils_currency) == 'USD' - assert model.sqla_utils_color.hex == '#f0f0f0' + assert str(model.sqla_utils_ip_address) == "127.0.0.1" + assert str(model.sqla_utils_currency) == "USD" + assert model.sqla_utils_color.hex == "#f0f0f0" # check that the new record shows up on the list view - rv = client.get('/admin/model1/') + rv = client.get("/admin/model1/") assert rv.status_code == 200 - assert u'test1large' in rv.data.decode('utf-8') + assert "test1large" in rv.data.decode("utf-8") # check that we can retrieve an edit view - url = '/admin/model1/edit/?id=%s' % model.id + url = "/admin/model1/edit/?id=%s" % model.id rv = client.get(url) assert rv.status_code == 200 # verify that midnight does not show as blank - assert u'00:00:00' in rv.data.decode('utf-8') + assert "00:00:00" in rv.data.decode("utf-8") # edit the record new_uuid_obj = uuid.uuid4() - rv = client.post(url, - data=dict(test1='test1small', - test2='test2large', - email_field='Test2@TEST.com', - choice_field='__None', - enum_field='__None', - sqla_utils_choice='__None', - sqla_utils_enum='__None', - sqla_utils_arrow='', - sqla_utils_uuid=str(new_uuid_obj), - sqla_utils_url='', - sqla_utils_ip_address='', - sqla_utils_currency='', - sqla_utils_color='', - )) + rv = client.post( + url, + data=dict( + test1="test1small", + test2="test2large", + email_field="Test2@TEST.com", + choice_field="__None", + enum_field="__None", + sqla_utils_choice="__None", + sqla_utils_enum="__None", + sqla_utils_arrow="", + sqla_utils_uuid=str(new_uuid_obj), + sqla_utils_url="", + sqla_utils_ip_address="", + sqla_utils_currency="", + sqla_utils_color="", + ), + ) assert rv.status_code == 302 # check that the changes were persisted model = db.session.query(Model1).first() - assert model.test1 == 'test1small' - assert model.test2 == 'test2large' + assert model.test1 == "test1small" + assert model.test2 == "test2large" assert model.test3 == None assert model.test4 == None - assert model.email_field == u'test2@test.com' + assert model.email_field == "test2@test.com" assert model.choice_field is None assert model.enum_field is None assert model.sqla_utils_choice is None @@ -307,7 +373,7 @@ def test_model(app, db, admin): assert model.sqla_utils_color is None # check that the model can be deleted - url = '/admin/model1/delete/?id=%s' % model.id + url = "/admin/model1/delete/?id=%s" % model.id rv = client.post(url) assert rv.status_code == 302 assert db.session.query(Model1).count() == 0 @@ -327,57 +393,63 @@ def test_list_columns(app, db, admin): Model1, Model2 = create_models(db) # test column_list with a list of strings - view = CustomModelView(Model1, db.session, - column_list=['test1', 'test3'], - column_labels=dict(test1='Column1')) + view = CustomModelView( + Model1, + db.session, + column_list=["test1", "test3"], + column_labels=dict(test1="Column1"), + ) admin.add_view(view) # test column_list with a list of SQLAlchemy columns - view2 = CustomModelView(Model1, db.session, endpoint='model1_2', - column_list=[Model1.test1, Model1.test3], - column_labels=dict(test1='Column1')) + view2 = CustomModelView( + Model1, + db.session, + endpoint="model1_2", + column_list=[Model1.test1, Model1.test3], + column_labels=dict(test1="Column1"), + ) admin.add_view(view2) assert len(view._list_columns) == 2 - assert view._list_columns == [('test1', 'Column1'), ('test3', 'Test3')] + assert view._list_columns == [("test1", "Column1"), ("test3", "Test3")] client = app.test_client() - rv = client.get('/admin/model1/') - data = rv.data.decode('utf-8') - assert 'Column1' in data - assert 'Test2' not in data + rv = client.get("/admin/model1/") + data = rv.data.decode("utf-8") + assert "Column1" in data + assert "Test2" not in data assert len(view2._list_columns) == 2 - assert view2._list_columns == [('test1', 'Column1'), ('test3', 'Test3')] + assert view2._list_columns == [("test1", "Column1"), ("test3", "Test3")] - rv = client.get('/admin/model1_2/') - data = rv.data.decode('utf-8') - assert 'Column1' in data - assert 'Test2' not in data + rv = client.get("/admin/model1_2/") + data = rv.data.decode("utf-8") + assert "Column1" in data + assert "Test2" not in data def test_complex_list_columns(app, db, admin): with app.app_context(): M1, M2 = create_models(db) - m1 = M1('model1_val1') + m1 = M1("model1_val1") db.session.add(m1) - db.session.add(M2('model2_val1', model1=m1)) + db.session.add(M2("model2_val1", model1=m1)) db.session.commit() # test column_list with a list of strings on a relation - view = CustomModelView(M2, db.session, - column_list=['model1.test1']) + view = CustomModelView(M2, db.session, column_list=["model1.test1"]) admin.add_view(view) client = app.test_client() - rv = client.get('/admin/model2/') + rv = client.get("/admin/model2/") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'model1_val1' in data + data = rv.data.decode("utf-8") + assert "model1_val1" in data def test_exclude_columns(app, db, admin): @@ -385,32 +457,51 @@ def test_exclude_columns(app, db, admin): Model1, Model2 = create_models(db) view = CustomModelView( - Model1, db.session, - column_exclude_list=['test2', 'test4', 'enum_field', 'enum_type_field', 'date_field', 'datetime_field', - 'time_field', 'sqla_utils_choice', 'sqla_utils_enum', 'sqla_utils_arrow', 'sqla_utils_uuid', - 'sqla_utils_url', 'sqla_utils_ip_address', 'sqla_utils_currency', 'sqla_utils_color'] + Model1, + db.session, + column_exclude_list=[ + "test2", + "test4", + "enum_field", + "enum_type_field", + "date_field", + "datetime_field", + "time_field", + "sqla_utils_choice", + "sqla_utils_enum", + "sqla_utils_arrow", + "sqla_utils_uuid", + "sqla_utils_url", + "sqla_utils_ip_address", + "sqla_utils_currency", + "sqla_utils_color", + ], ) admin.add_view(view) - assert \ - view._list_columns == \ - [('test1', 'Test1'), ('test3', 'Test3'), ('bool_field', 'Bool Field'), - ('email_field', 'Email Field'), ('choice_field', 'Choice Field')] + assert view._list_columns == [ + ("test1", "Test1"), + ("test3", "Test3"), + ("bool_field", "Bool Field"), + ("email_field", "Email Field"), + ("choice_field", "Choice Field"), + ] client = app.test_client() - rv = client.get('/admin/model1/') - data = rv.data.decode('utf-8') - assert 'Test1' in data - assert 'Test2' not in data + rv = client.get("/admin/model1/") + data = rv.data.decode("utf-8") + assert "Test1" in data + assert "Test2" not in data def test_column_searchable_list(app, db, admin): with app.app_context(): Model1, Model2 = create_models(db) - view = CustomModelView(Model2, db.session, - column_searchable_list=['string_field', 'int_field']) + view = CustomModelView( + Model2, db.session, column_searchable_list=["string_field", "int_field"] + ) admin.add_view(view) assert view._search_supported @@ -418,43 +509,52 @@ def test_column_searchable_list(app, db, admin): assert isinstance(view._search_fields[0][0], db.Column) assert isinstance(view._search_fields[1][0], db.Column) - assert view._search_fields[0][0].name == 'string_field' - assert view._search_fields[1][0].name == 'int_field' + assert view._search_fields[0][0].name == "string_field" + assert view._search_fields[1][0].name == "int_field" - db.session.add(Model2('model1-test', 5000)) - db.session.add(Model2('model2-test', 9000)) + db.session.add(Model2("model1-test", 5000)) + db.session.add(Model2("model2-test", 9000)) db.session.commit() client = app.test_client() - rv = client.get('/admin/model2/?search=model1') - data = rv.data.decode('utf-8') - assert 'model1-test' in data - assert 'model2-test' not in data + rv = client.get("/admin/model2/?search=model1") + data = rv.data.decode("utf-8") + assert "model1-test" in data + assert "model2-test" not in data - rv = client.get('/admin/model2/?search=9000') - data = rv.data.decode('utf-8') - assert 'model1-test' not in data - assert 'model2-test' in data + rv = client.get("/admin/model2/?search=9000") + data = rv.data.decode("utf-8") + assert "model1-test" not in data + assert "model2-test" in data def test_extra_args_search(app, db, admin): with app.app_context(): Model1, Model2 = create_models(db) - view1 = CustomModelView(Model1, db.session, - column_searchable_list=['test1', ]) + view1 = CustomModelView( + Model1, + db.session, + column_searchable_list=[ + "test1", + ], + ) admin.add_view(view1) - db.session.add(Model2('model1-test', )) + db.session.add( + Model2( + "model1-test", + ) + ) db.session.commit() client = app.test_client() # check that extra args in the url are propagated as hidden fields in the search form - rv = client.get('/admin/model1/?search=model1&foo=bar') - data = rv.data.decode('utf-8') + rv = client.get("/admin/model1/?search=model1&foo=bar") + data = rv.data.decode("utf-8") assert '<input type="hidden" name="foo" value="bar">' in data @@ -462,18 +562,23 @@ def test_extra_args_filter(app, db, admin): with app.app_context(): Model1, Model2 = create_models(db) - view2 = CustomModelView(Model2, db.session, - column_filters=['int_field', ]) + view2 = CustomModelView( + Model2, + db.session, + column_filters=[ + "int_field", + ], + ) admin.add_view(view2) - db.session.add(Model2('model2-test', 5000)) + db.session.add(Model2("model2-test", 5000)) db.session.commit() client = app.test_client() # check that extra args in the url are propagated as hidden fields in the form - rv = client.get('/admin/model2/?flt1_0=5000&foo=bar') - data = rv.data.decode('utf-8') + rv = client.get("/admin/model2/?flt1_0=5000&foo=bar") + data = rv.data.decode("utf-8") assert '<input type="hidden" name="foo" value="bar">' in data @@ -481,65 +586,68 @@ def test_complex_searchable_list(app, db, admin): with app.app_context(): Model1, Model2 = create_models(db) - view = CustomModelView(Model2, db.session, - column_searchable_list=['model1.test1']) + view = CustomModelView( + Model2, db.session, column_searchable_list=["model1.test1"] + ) admin.add_view(view) - view2 = CustomModelView(Model1, db.session, - column_searchable_list=[Model2.string_field]) + view2 = CustomModelView( + Model1, db.session, column_searchable_list=[Model2.string_field] + ) admin.add_view(view2) - m1 = Model1('model1-test1-val') - m2 = Model1('model1-test2-val') + m1 = Model1("model1-test1-val") + m2 = Model1("model1-test2-val") db.session.add(m1) db.session.add(m2) - db.session.add(Model2('model2-test1-val', model1=m1)) - db.session.add(Model2('model2-test2-val', model1=m2)) + db.session.add(Model2("model2-test1-val", model1=m1)) + db.session.add(Model2("model2-test2-val", model1=m2)) db.session.commit() client = app.test_client() # test relation string - 'model1.test1' - rv = client.get('/admin/model2/?search=model1-test1') - data = rv.data.decode('utf-8') - assert 'model2-test1-val' in data - assert 'model2-test2-val' not in data + rv = client.get("/admin/model2/?search=model1-test1") + data = rv.data.decode("utf-8") + assert "model2-test1-val" in data + assert "model2-test2-val" not in data # test relation object - Model2.string_field - rv = client.get('/admin/model1/?search=model2-test1') - data = rv.data.decode('utf-8') - assert 'model1-test1-val' in data - assert 'model1-test2-val' not in data + rv = client.get("/admin/model1/?search=model2-test1") + data = rv.data.decode("utf-8") + assert "model1-test1-val" in data + assert "model1-test2-val" not in data def test_complex_searchable_list_missing_children(app, db, admin): with app.app_context(): Model1, Model2 = create_models(db) - view = CustomModelView(Model1, db.session, - column_searchable_list=[ - 'test1', 'model2.string_field']) + view = CustomModelView( + Model1, db.session, column_searchable_list=["test1", "model2.string_field"] + ) admin.add_view(view) - db.session.add(Model1('magic string')) + db.session.add(Model1("magic string")) db.session.commit() client = app.test_client() - rv = client.get('/admin/model1/?search=magic') - data = rv.data.decode('utf-8') - assert 'magic string' in data + rv = client.get("/admin/model1/?search=magic") + data = rv.data.decode("utf-8") + assert "magic string" in data def test_column_editable_list(app, db, admin): with app.app_context(): Model1, Model2 = create_models(db) - view = CustomModelView(Model1, db.session, - column_editable_list=['test1', 'enum_field']) + view = CustomModelView( + Model1, db.session, column_editable_list=["test1", "enum_field"] + ) admin.add_view(view) # Test in-line editing for relations - view = CustomModelView(Model2, db.session, column_editable_list=['model1']) + view = CustomModelView(Model2, db.session, column_editable_list=["model1"]) admin.add_view(view) fill_db(db, Model1, Model2) @@ -547,57 +655,72 @@ def test_column_editable_list(app, db, admin): client = app.test_client() # Test in-line edit field rendering - rv = client.get('/admin/model1/') - data = rv.data.decode('utf-8') + rv = client.get("/admin/model1/") + data = rv.data.decode("utf-8") assert 'data-role="x-editable"' in data # Form - Test basic in-line edit functionality - rv = client.post('/admin/model1/ajax/update/', data={ - 'list_form_pk': '1', - 'test1': 'change-success-1', - }) - data = rv.data.decode('utf-8') - assert 'Record was successfully saved.' == data + rv = client.post( + "/admin/model1/ajax/update/", + data={ + "list_form_pk": "1", + "test1": "change-success-1", + }, + ) + data = rv.data.decode("utf-8") + assert "Record was successfully saved." == data # ensure the value has changed - rv = client.get('/admin/model1/') - data = rv.data.decode('utf-8') - assert 'change-success-1' in data + rv = client.get("/admin/model1/") + data = rv.data.decode("utf-8") + assert "change-success-1" in data # Test validation error - rv = client.post('/admin/model1/ajax/update/', data={ - 'list_form_pk': '1', - 'enum_field': 'problematic-input', - }) + rv = client.post( + "/admin/model1/ajax/update/", + data={ + "list_form_pk": "1", + "enum_field": "problematic-input", + }, + ) assert rv.status_code == 500 # Test invalid primary key - rv = client.post('/admin/model1/ajax/update/', data={ - 'list_form_pk': '1000', - 'test1': 'problematic-input', - }) - data = rv.data.decode('utf-8') + rv = client.post( + "/admin/model1/ajax/update/", + data={ + "list_form_pk": "1000", + "test1": "problematic-input", + }, + ) + data = rv.data.decode("utf-8") assert rv.status_code == 500 # Test editing column not in column_editable_list - rv = client.post('/admin/model1/ajax/update/', data={ - 'list_form_pk': '1', - 'test2': 'problematic-input', - }) - data = rv.data.decode('utf-8') - assert 'problematic-input' not in data - - rv = client.post('/admin/model2/ajax/update/', data={ - 'list_form_pk': '1', - 'model1': '3', - }) - data = rv.data.decode('utf-8') - assert 'Record was successfully saved.' == data + rv = client.post( + "/admin/model1/ajax/update/", + data={ + "list_form_pk": "1", + "test2": "problematic-input", + }, + ) + data = rv.data.decode("utf-8") + assert "problematic-input" not in data + + rv = client.post( + "/admin/model2/ajax/update/", + data={ + "list_form_pk": "1", + "model1": "3", + }, + ) + data = rv.data.decode("utf-8") + assert "Record was successfully saved." == data # confirm the value has changed - rv = client.get('/admin/model2/') - data = rv.data.decode('utf-8') - assert 'test1_val_3' in data + rv = client.get("/admin/model2/") + data = rv.data.decode("utf-8") + assert "test1_val_3" in data def test_details_view(app, db, admin): @@ -612,10 +735,13 @@ def test_details_view(app, db, admin): admin.add_view(view_w_details) # show only specific fields in details w/ column_details_list - string_field_view = CustomModelView(Model2, db.session, - can_view_details=True, - column_details_list=["string_field"], - endpoint="sf_view") + string_field_view = CustomModelView( + Model2, + db.session, + can_view_details=True, + column_details_list=["string_field"], + endpoint="sf_view", + ) admin.add_view(string_field_view) fill_db(db, Model1, Model2) @@ -623,38 +749,38 @@ def test_details_view(app, db, admin): client = app.test_client() # ensure link to details is hidden when can_view_details is disabled - rv = client.get('/admin/model1/') - data = rv.data.decode('utf-8') - assert '/admin/model1/details/' not in data + rv = client.get("/admin/model1/") + data = rv.data.decode("utf-8") + assert "/admin/model1/details/" not in data # ensure link to details view appears - rv = client.get('/admin/model2/') - data = rv.data.decode('utf-8') - assert '/admin/model2/details/' in data + rv = client.get("/admin/model2/") + data = rv.data.decode("utf-8") + assert "/admin/model2/details/" in data # test redirection when details are disabled - rv = client.get('/admin/model1/details/?url=%2Fadmin%2Fmodel1%2F&id=1') + rv = client.get("/admin/model1/details/?url=%2Fadmin%2Fmodel1%2F&id=1") assert rv.status_code == 302 # test if correct data appears in details view when enabled - rv = client.get('/admin/model2/details/?url=%2Fadmin%2Fmodel2%2F&id=1') - data = rv.data.decode('utf-8') - assert 'String Field' in data - assert 'test2_val_1' in data - assert 'test1_val_1' in data + rv = client.get("/admin/model2/details/?url=%2Fadmin%2Fmodel2%2F&id=1") + data = rv.data.decode("utf-8") + assert "String Field" in data + assert "test2_val_1" in data + assert "test1_val_1" in data # test column_details_list - rv = client.get('/admin/sf_view/details/?url=%2Fadmin%2Fsf_view%2F&id=1') - data = rv.data.decode('utf-8') - assert 'String Field' in data - assert 'test2_val_1' in data - assert 'test1_val_1' not in data + rv = client.get("/admin/sf_view/details/?url=%2Fadmin%2Fsf_view%2F&id=1") + data = rv.data.decode("utf-8") + assert "String Field" in data + assert "test2_val_1" in data + assert "test1_val_1" not in data def test_editable_list_special_pks(app, db, admin): - ''' Tests editable list view + a primary key with special characters - ''' + """Tests editable list view + a primary key with special characters""" with app.app_context(): + class Model1(db.Model): def __init__(self, id=None, val1=None): self.id = id @@ -665,37 +791,37 @@ def __init__(self, id=None, val1=None): db.create_all() - view = CustomModelView(Model1, db.session, column_editable_list=['val1']) + view = CustomModelView(Model1, db.session, column_editable_list=["val1"]) admin.add_view(view) - db.session.add(Model1('1-1', 'test1')) - db.session.add(Model1('1-5', 'test2')) + db.session.add(Model1("1-1", "test1")) + db.session.add(Model1("1-5", "test2")) db.session.commit() client = app.test_client() # Form - Test basic in-line edit functionality - rv = client.post('/admin/model1/ajax/update/', data={ - 'list_form_pk': '1-1', - 'val1': 'change-success-1', - }) - data = rv.data.decode('utf-8') - assert 'Record was successfully saved.' == data + rv = client.post( + "/admin/model1/ajax/update/", + data={ + "list_form_pk": "1-1", + "val1": "change-success-1", + }, + ) + data = rv.data.decode("utf-8") + assert "Record was successfully saved." == data # ensure the value has changed - rv = client.get('/admin/model1/') - data = rv.data.decode('utf-8') - assert 'change-success-1' in data + rv = client.get("/admin/model1/") + data = rv.data.decode("utf-8") + assert "change-success-1" in data def test_column_filters(app, db, admin): with app.app_context(): Model1, Model2 = create_models(db) - view1 = CustomModelView( - Model1, db.session, - column_filters=['test1'] - ) + view1 = CustomModelView(Model1, db.session, column_filters=["test1"]) admin.add_view(view1) client = app.test_client() @@ -703,920 +829,948 @@ def test_column_filters(app, db, admin): assert len(view1._filters) == 7 # Generate views - view2 = CustomModelView(Model2, db.session, - column_filters=['model1']) + view2 = CustomModelView(Model2, db.session, column_filters=["model1"]) - view5 = CustomModelView(Model1, db.session, - column_filters=['test1'], endpoint='_strings') + view5 = CustomModelView( + Model1, db.session, column_filters=["test1"], endpoint="_strings" + ) admin.add_view(view5) - view6 = CustomModelView(Model2, db.session, - column_filters=['int_field']) + view6 = CustomModelView(Model2, db.session, column_filters=["int_field"]) admin.add_view(view6) - view7 = CustomModelView(Model1, db.session, column_filters=['bool_field'], - endpoint="_bools") + view7 = CustomModelView( + Model1, db.session, column_filters=["bool_field"], endpoint="_bools" + ) admin.add_view(view7) - view8 = CustomModelView(Model2, db.session, column_filters=['float_field'], - endpoint="_float") + view8 = CustomModelView( + Model2, db.session, column_filters=["float_field"], endpoint="_float" + ) admin.add_view(view8) view9 = CustomModelView( - Model2, db.session, - endpoint='_model2', - column_filters=['model1.bool_field'], + Model2, + db.session, + endpoint="_model2", + column_filters=["model1.bool_field"], column_list=[ - 'string_field', - 'model1.id', - 'model1.bool_field', - ] + "string_field", + "model1.id", + "model1.bool_field", + ], ) admin.add_view(view9) view10 = CustomModelView( - Model1, db.session, - column_filters=['test1'], - endpoint='_model3', - named_filter_urls=True + Model1, + db.session, + column_filters=["test1"], + endpoint="_model3", + named_filter_urls=True, ) admin.add_view(view10) - view11 = CustomModelView(Model1, db.session, - column_filters=['date_field', 'datetime_field', 'time_field'], - endpoint="_datetime") + view11 = CustomModelView( + Model1, + db.session, + column_filters=["date_field", "datetime_field", "time_field"], + endpoint="_datetime", + ) admin.add_view(view11) - view12 = CustomModelView(Model1, db.session, - column_filters=['enum_field'], - endpoint="_enumfield") + view12 = CustomModelView( + Model1, db.session, column_filters=["enum_field"], endpoint="_enumfield" + ) admin.add_view(view12) - view13 = CustomModelView(Model2, db.session, - column_filters=[ - filters.FilterEqual(Model1.test1, "Test1") - ], endpoint='_relation_test') + view13 = CustomModelView( + Model2, + db.session, + column_filters=[filters.FilterEqual(Model1.test1, "Test1")], + endpoint="_relation_test", + ) admin.add_view(view13) - view14 = CustomModelView(Model1, db.session, - column_filters=['enum_type_field'], - endpoint="_enumtypefield") + view14 = CustomModelView( + Model1, + db.session, + column_filters=["enum_type_field"], + endpoint="_enumtypefield", + ) admin.add_view(view14) # Test views - assert \ - [(f['index'], f['operation']) for f in view1._filter_groups[u'Test1']] == \ - [ - (0, u'contains'), - (1, u'not contains'), - (2, u'equals'), - (3, u'not equal'), - (4, u'empty'), - (5, u'in list'), - (6, u'not in list'), - ] + assert [ + (f["index"], f["operation"]) for f in view1._filter_groups["Test1"] + ] == [ + (0, "contains"), + (1, "not contains"), + (2, "equals"), + (3, "not equal"), + (4, "empty"), + (5, "in list"), + (6, "not in list"), + ] # Test filter that references property0 - assert \ - [(f['index'], f['operation']) for f in view2._filter_groups[u'Model1 / Test1']] == \ - [ - (0, u'contains'), - (1, u'not contains'), - (2, u'equals'), - (3, u'not equal'), - (4, u'empty'), - (5, u'in list'), - (6, u'not in list'), - ] + assert [ + (f["index"], f["operation"]) for f in view2._filter_groups["Model1 / Test1"] + ] == [ + (0, "contains"), + (1, "not contains"), + (2, "equals"), + (3, "not equal"), + (4, "empty"), + (5, "in list"), + (6, "not in list"), + ] - assert \ - [(f['index'], f['operation']) for f in view2._filter_groups[u'Model1 / Test2']] == \ - [ - (7, u'contains'), - (8, u'not contains'), - (9, u'equals'), - (10, u'not equal'), - (11, u'empty'), - (12, u'in list'), - (13, u'not in list'), - ] + assert [ + (f["index"], f["operation"]) for f in view2._filter_groups["Model1 / Test2"] + ] == [ + (7, "contains"), + (8, "not contains"), + (9, "equals"), + (10, "not equal"), + (11, "empty"), + (12, "in list"), + (13, "not in list"), + ] - assert \ - [(f['index'], f['operation']) for f in view2._filter_groups[u'Model1 / Test3']] == \ - [ - (14, u'contains'), - (15, u'not contains'), - (16, u'equals'), - (17, u'not equal'), - (18, u'empty'), - (19, u'in list'), - (20, u'not in list'), - ] + assert [ + (f["index"], f["operation"]) for f in view2._filter_groups["Model1 / Test3"] + ] == [ + (14, "contains"), + (15, "not contains"), + (16, "equals"), + (17, "not equal"), + (18, "empty"), + (19, "in list"), + (20, "not in list"), + ] - assert \ - [(f['index'], f['operation']) for f in view2._filter_groups[u'Model1 / Test4']] == \ - [ - (21, u'contains'), - (22, u'not contains'), - (23, u'equals'), - (24, u'not equal'), - (25, u'empty'), - (26, u'in list'), - (27, u'not in list'), - ] + assert [ + (f["index"], f["operation"]) for f in view2._filter_groups["Model1 / Test4"] + ] == [ + (21, "contains"), + (22, "not contains"), + (23, "equals"), + (24, "not equal"), + (25, "empty"), + (26, "in list"), + (27, "not in list"), + ] - assert \ - [(f['index'], f['operation']) for f in view2._filter_groups[u'Model1 / Bool Field']] == \ - [ - (28, u'equals'), - (29, u'not equal'), - ] + assert [ + (f["index"], f["operation"]) + for f in view2._filter_groups["Model1 / Bool Field"] + ] == [ + (28, "equals"), + (29, "not equal"), + ] - assert \ - [(f['index'], f['operation']) for f in view2._filter_groups[u'Model1 / Date Field']] == \ - [ - (30, u'equals'), - (31, u'not equal'), - (32, u'greater than'), - (33, u'smaller than'), - (34, u'between'), - (35, u'not between'), - (36, u'empty'), - ] + assert [ + (f["index"], f["operation"]) + for f in view2._filter_groups["Model1 / Date Field"] + ] == [ + (30, "equals"), + (31, "not equal"), + (32, "greater than"), + (33, "smaller than"), + (34, "between"), + (35, "not between"), + (36, "empty"), + ] - assert \ - [(f['index'], f['operation']) for f in view2._filter_groups[u'Model1 / Time Field']] == \ - [ - (37, u'equals'), - (38, u'not equal'), - (39, u'greater than'), - (40, u'smaller than'), - (41, u'between'), - (42, u'not between'), - (43, u'empty'), - ] + assert [ + (f["index"], f["operation"]) + for f in view2._filter_groups["Model1 / Time Field"] + ] == [ + (37, "equals"), + (38, "not equal"), + (39, "greater than"), + (40, "smaller than"), + (41, "between"), + (42, "not between"), + (43, "empty"), + ] - assert \ - [(f['index'], f['operation']) for f in view2._filter_groups[u'Model1 / Datetime Field']] == \ - [ - (44, u'equals'), - (45, u'not equal'), - (46, u'greater than'), - (47, u'smaller than'), - (48, u'between'), - (49, u'not between'), - (50, u'empty'), - ] + assert [ + (f["index"], f["operation"]) + for f in view2._filter_groups["Model1 / Datetime Field"] + ] == [ + (44, "equals"), + (45, "not equal"), + (46, "greater than"), + (47, "smaller than"), + (48, "between"), + (49, "not between"), + (50, "empty"), + ] - assert \ - [(f['index'], f['operation']) for f in view2._filter_groups[u'Model1 / Email Field']] == \ - [ - (51, u'contains'), - (52, u'not contains'), - (53, u'equals'), - (54, u'not equal'), - (55, u'empty'), - (56, u'in list'), - (57, u'not in list'), - ] + assert [ + (f["index"], f["operation"]) + for f in view2._filter_groups["Model1 / Email Field"] + ] == [ + (51, "contains"), + (52, "not contains"), + (53, "equals"), + (54, "not equal"), + (55, "empty"), + (56, "in list"), + (57, "not in list"), + ] - assert \ - [(f['index'], f['operation']) for f in view2._filter_groups[u'Model1 / Enum Field']] == \ - [ - (58, u'equals'), - (59, u'not equal'), - (60, u'empty'), - (61, u'in list'), - (62, u'not in list'), - ] + assert [ + (f["index"], f["operation"]) + for f in view2._filter_groups["Model1 / Enum Field"] + ] == [ + (58, "equals"), + (59, "not equal"), + (60, "empty"), + (61, "in list"), + (62, "not in list"), + ] - assert \ - [(f['index'], f['operation']) for f in view2._filter_groups[u'Model1 / Enum Type Field']] == \ - [ - (63, u'equals'), - (64, u'not equal'), - (65, u'empty'), - (66, u'in list'), - (67, u'not in list'), - ] + assert [ + (f["index"], f["operation"]) + for f in view2._filter_groups["Model1 / Enum Type Field"] + ] == [ + (63, "equals"), + (64, "not equal"), + (65, "empty"), + (66, "in list"), + (67, "not in list"), + ] - assert \ - [(f['index'], f['operation']) for f in view2._filter_groups[u'Model1 / Choice Field']] == \ - [ - (68, u'contains'), - (69, u'not contains'), - (70, u'equals'), - (71, u'not equal'), - (72, u'empty'), - (73, u'in list'), - (74, u'not in list'), - ] + assert [ + (f["index"], f["operation"]) + for f in view2._filter_groups["Model1 / Choice Field"] + ] == [ + (68, "contains"), + (69, "not contains"), + (70, "equals"), + (71, "not equal"), + (72, "empty"), + (73, "in list"), + (74, "not in list"), + ] - assert \ - [(f['index'], f['operation']) for f in view2._filter_groups[u'Model1 / Sqla Utils Choice']] == \ - [ - (75, u'equals'), - (76, u'not equal'), - (77, u'contains'), - (78, u'not contains'), - (79, u'empty'), - ] + assert [ + (f["index"], f["operation"]) + for f in view2._filter_groups["Model1 / Sqla Utils Choice"] + ] == [ + (75, "equals"), + (76, "not equal"), + (77, "contains"), + (78, "not contains"), + (79, "empty"), + ] - assert \ - [(f['index'], f['operation']) for f in view2._filter_groups[u'Model1 / Sqla Utils Enum']] == \ - [ - (80, u'equals'), - (81, u'not equal'), - (82, u'contains'), - (83, u'not contains'), - (84, u'empty'), - ] + assert [ + (f["index"], f["operation"]) + for f in view2._filter_groups["Model1 / Sqla Utils Enum"] + ] == [ + (80, "equals"), + (81, "not equal"), + (82, "contains"), + (83, "not contains"), + (84, "empty"), + ] # Test filter with a dot - view3 = CustomModelView(Model2, db.session, - column_filters=['model1.bool_field']) + view3 = CustomModelView( + Model2, db.session, column_filters=["model1.bool_field"] + ) - assert \ - [(f['index'], f['operation']) for f in view3._filter_groups[u'model1 / Model1 / Bool Field']] == \ - [ - (0, 'equals'), - (1, 'not equal'), - ] + assert [ + (f["index"], f["operation"]) + for f in view3._filter_groups["model1 / Model1 / Bool Field"] + ] == [ + (0, "equals"), + (1, "not equal"), + ] # Test column_labels on filters - view4 = CustomModelView(Model2, db.session, - column_filters=['model1.bool_field', 'string_field'], - column_labels={ - 'model1.bool_field': 'Test Filter #1', - 'string_field': 'Test Filter #2', - }) + view4 = CustomModelView( + Model2, + db.session, + column_filters=["model1.bool_field", "string_field"], + column_labels={ + "model1.bool_field": "Test Filter #1", + "string_field": "Test Filter #2", + }, + ) - assert list(view4._filter_groups.keys()) == [u'Test Filter #1', u'Test Filter #2'] + assert list(view4._filter_groups.keys()) == ["Test Filter #1", "Test Filter #2"] fill_db(db, Model1, Model2) # Test equals - rv = client.get('/admin/model1/?flt0_0=test1_val_1') + rv = client.get("/admin/model1/?flt0_0=test1_val_1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') + data = rv.data.decode("utf-8") # the filter value is always in "data" # need to check a different column than test1 for the expected row - assert 'test2_val_1' in data - assert 'test1_val_2' not in data + assert "test2_val_1" in data + assert "test1_val_2" not in data # Test NOT IN filter - rv = client.get('/admin/model1/?flt0_6=test1_val_1') + rv = client.get("/admin/model1/?flt0_6=test1_val_1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') + data = rv.data.decode("utf-8") - assert 'test1_val_2' in data - assert 'test2_val_1' not in data + assert "test1_val_2" in data + assert "test2_val_1" not in data # Test string filter - assert \ - [(f['index'], f['operation']) for f in view5._filter_groups[u'Test1']] == \ - [ - (0, 'contains'), - (1, 'not contains'), - (2, 'equals'), - (3, 'not equal'), - (4, 'empty'), - (5, 'in list'), - (6, 'not in list'), - ] + assert [ + (f["index"], f["operation"]) for f in view5._filter_groups["Test1"] + ] == [ + (0, "contains"), + (1, "not contains"), + (2, "equals"), + (3, "not equal"), + (4, "empty"), + (5, "in list"), + (6, "not in list"), + ] # string - equals - rv = client.get('/admin/_strings/?flt0_0=test1_val_1') + rv = client.get("/admin/_strings/?flt0_0=test1_val_1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_1' in data - assert 'test1_val_2' not in data + data = rv.data.decode("utf-8") + assert "test2_val_1" in data + assert "test1_val_2" not in data # string - not equal - rv = client.get('/admin/_strings/?flt0_1=test1_val_1') + rv = client.get("/admin/_strings/?flt0_1=test1_val_1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_1' not in data - assert 'test1_val_2' in data + data = rv.data.decode("utf-8") + assert "test2_val_1" not in data + assert "test1_val_2" in data # string - contains - rv = client.get('/admin/_strings/?flt0_2=test1_val_1') + rv = client.get("/admin/_strings/?flt0_2=test1_val_1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_1' in data - assert 'test1_val_2' not in data + data = rv.data.decode("utf-8") + assert "test2_val_1" in data + assert "test1_val_2" not in data # string - not contains - rv = client.get('/admin/_strings/?flt0_3=test1_val_1') + rv = client.get("/admin/_strings/?flt0_3=test1_val_1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_1' not in data - assert 'test1_val_2' in data + data = rv.data.decode("utf-8") + assert "test2_val_1" not in data + assert "test1_val_2" in data # string - empty - rv = client.get('/admin/_strings/?flt0_4=1') + rv = client.get("/admin/_strings/?flt0_4=1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'empty_obj' in data - assert 'test1_val_1' not in data - assert 'test1_val_2' not in data + data = rv.data.decode("utf-8") + assert "empty_obj" in data + assert "test1_val_1" not in data + assert "test1_val_2" not in data # string - not empty - rv = client.get('/admin/_strings/?flt0_4=0') + rv = client.get("/admin/_strings/?flt0_4=0") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'empty_obj' not in data - assert 'test1_val_1' in data - assert 'test1_val_2' in data + data = rv.data.decode("utf-8") + assert "empty_obj" not in data + assert "test1_val_1" in data + assert "test1_val_2" in data # string - in list - rv = client.get('/admin/_strings/?flt0_5=test1_val_1%2Ctest1_val_2') + rv = client.get("/admin/_strings/?flt0_5=test1_val_1%2Ctest1_val_2") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_1' in data - assert 'test2_val_2' in data - assert 'test1_val_3' not in data - assert 'test1_val_4' not in data + data = rv.data.decode("utf-8") + assert "test2_val_1" in data + assert "test2_val_2" in data + assert "test1_val_3" not in data + assert "test1_val_4" not in data # string - not in list - rv = client.get('/admin/_strings/?flt0_6=test1_val_1%2Ctest1_val_2') + rv = client.get("/admin/_strings/?flt0_6=test1_val_1%2Ctest1_val_2") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_1' not in data - assert 'test2_val_2' not in data - assert 'test1_val_3' in data - assert 'test1_val_4' in data + data = rv.data.decode("utf-8") + assert "test2_val_1" not in data + assert "test2_val_2" not in data + assert "test1_val_3" in data + assert "test1_val_4" in data # Test integer filter - assert \ - [(f['index'], f['operation']) for f in view6._filter_groups[u'Int Field']] == \ - [ - (0, 'equals'), - (1, 'not equal'), - (2, 'greater than'), - (3, 'smaller than'), - (4, 'empty'), - (5, 'in list'), - (6, 'not in list'), - ] + assert [ + (f["index"], f["operation"]) for f in view6._filter_groups["Int Field"] + ] == [ + (0, "equals"), + (1, "not equal"), + (2, "greater than"), + (3, "smaller than"), + (4, "empty"), + (5, "in list"), + (6, "not in list"), + ] # integer - equals - rv = client.get('/admin/model2/?flt0_0=5000') + rv = client.get("/admin/model2/?flt0_0=5000") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_3' in data - assert 'test2_val_4' not in data + data = rv.data.decode("utf-8") + assert "test2_val_3" in data + assert "test2_val_4" not in data # integer - equals (huge number) - rv = client.get('/admin/model2/?flt0_0=6169453081680413441') + rv = client.get("/admin/model2/?flt0_0=6169453081680413441") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_5' in data - assert 'test2_val_4' not in data + data = rv.data.decode("utf-8") + assert "test2_val_5" in data + assert "test2_val_4" not in data # integer - equals - test validation - rv = client.get('/admin/model2/?flt0_0=badval') + rv = client.get("/admin/model2/?flt0_0=badval") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'Invalid Filter Value' in data + data = rv.data.decode("utf-8") + assert "Invalid Filter Value" in data # integer - not equal - rv = client.get('/admin/model2/?flt0_1=5000') + rv = client.get("/admin/model2/?flt0_1=5000") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_3' not in data - assert 'test2_val_4' in data + data = rv.data.decode("utf-8") + assert "test2_val_3" not in data + assert "test2_val_4" in data # integer - greater - rv = client.get('/admin/model2/?flt0_2=6000') + rv = client.get("/admin/model2/?flt0_2=6000") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_3' not in data - assert 'test2_val_4' in data + data = rv.data.decode("utf-8") + assert "test2_val_3" not in data + assert "test2_val_4" in data # integer - smaller - rv = client.get('/admin/model2/?flt0_3=6000') + rv = client.get("/admin/model2/?flt0_3=6000") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_3' in data - assert 'test2_val_4' not in data + data = rv.data.decode("utf-8") + assert "test2_val_3" in data + assert "test2_val_4" not in data # integer - empty - rv = client.get('/admin/model2/?flt0_4=1') + rv = client.get("/admin/model2/?flt0_4=1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_1' in data - assert 'test2_val_2' in data - assert 'test2_val_3' not in data - assert 'test2_val_4' not in data + data = rv.data.decode("utf-8") + assert "test2_val_1" in data + assert "test2_val_2" in data + assert "test2_val_3" not in data + assert "test2_val_4" not in data # integer - not empty - rv = client.get('/admin/model2/?flt0_4=0') + rv = client.get("/admin/model2/?flt0_4=0") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_1' not in data - assert 'test2_val_2' not in data - assert 'test2_val_3' in data - assert 'test2_val_4' in data + data = rv.data.decode("utf-8") + assert "test2_val_1" not in data + assert "test2_val_2" not in data + assert "test2_val_3" in data + assert "test2_val_4" in data # integer - in list - rv = client.get('/admin/model2/?flt0_5=5000%2C9000') + rv = client.get("/admin/model2/?flt0_5=5000%2C9000") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_1' not in data - assert 'test2_val_2' not in data - assert 'test2_val_3' in data - assert 'test2_val_4' in data + data = rv.data.decode("utf-8") + assert "test2_val_1" not in data + assert "test2_val_2" not in data + assert "test2_val_3" in data + assert "test2_val_4" in data # integer - in list (huge number) - rv = client.get('/admin/model2/?flt0_5=6169453081680413441') + rv = client.get("/admin/model2/?flt0_5=6169453081680413441") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_1' not in data - assert 'test2_val_5' in data + data = rv.data.decode("utf-8") + assert "test2_val_1" not in data + assert "test2_val_5" in data # integer - in list - test validation - rv = client.get('/admin/model2/?flt0_5=5000%2Cbadval') + rv = client.get("/admin/model2/?flt0_5=5000%2Cbadval") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'Invalid Filter Value' in data + data = rv.data.decode("utf-8") + assert "Invalid Filter Value" in data # integer - not in list - rv = client.get('/admin/model2/?flt0_6=5000%2C9000') + rv = client.get("/admin/model2/?flt0_6=5000%2C9000") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_1' in data - assert 'test2_val_2' in data - assert 'test2_val_3' not in data - assert 'test2_val_4' not in data + data = rv.data.decode("utf-8") + assert "test2_val_1" in data + assert "test2_val_2" in data + assert "test2_val_3" not in data + assert "test2_val_4" not in data # Test boolean filter - assert \ - [(f['index'], f['operation']) for f in view7._filter_groups[u'Bool Field']] == \ - [ - (0, 'equals'), - (1, 'not equal'), - ] + assert [ + (f["index"], f["operation"]) for f in view7._filter_groups["Bool Field"] + ] == [ + (0, "equals"), + (1, "not equal"), + ] # boolean - equals - Yes - rv = client.get('/admin/_bools/?flt0_0=1') + rv = client.get("/admin/_bools/?flt0_0=1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_1' in data - assert 'test2_val_2' not in data - assert 'test2_val_3' not in data + data = rv.data.decode("utf-8") + assert "test2_val_1" in data + assert "test2_val_2" not in data + assert "test2_val_3" not in data # boolean - equals - No - rv = client.get('/admin/_bools/?flt0_0=0') + rv = client.get("/admin/_bools/?flt0_0=0") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_1' not in data - assert 'test2_val_2' in data - assert 'test2_val_3' in data + data = rv.data.decode("utf-8") + assert "test2_val_1" not in data + assert "test2_val_2" in data + assert "test2_val_3" in data # boolean - not equals - Yes - rv = client.get('/admin/_bools/?flt0_1=1') + rv = client.get("/admin/_bools/?flt0_1=1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_1' not in data - assert 'test2_val_2' in data - assert 'test2_val_3' in data + data = rv.data.decode("utf-8") + assert "test2_val_1" not in data + assert "test2_val_2" in data + assert "test2_val_3" in data # boolean - not equals - No - rv = client.get('/admin/_bools/?flt0_1=0') + rv = client.get("/admin/_bools/?flt0_1=0") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_1' in data - assert 'test2_val_2' not in data - assert 'test2_val_3' not in data + data = rv.data.decode("utf-8") + assert "test2_val_1" in data + assert "test2_val_2" not in data + assert "test2_val_3" not in data # Test float filter - assert \ - [(f['index'], f['operation']) for f in view8._filter_groups[u'Float Field']] == \ - [ - (0, 'equals'), - (1, 'not equal'), - (2, 'greater than'), - (3, 'smaller than'), - (4, 'empty'), - (5, 'in list'), - (6, 'not in list'), - ] + assert [ + (f["index"], f["operation"]) for f in view8._filter_groups["Float Field"] + ] == [ + (0, "equals"), + (1, "not equal"), + (2, "greater than"), + (3, "smaller than"), + (4, "empty"), + (5, "in list"), + (6, "not in list"), + ] # float - equals - rv = client.get('/admin/_float/?flt0_0=25.9') + rv = client.get("/admin/_float/?flt0_0=25.9") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_3' in data - assert 'test2_val_4' not in data + data = rv.data.decode("utf-8") + assert "test2_val_3" in data + assert "test2_val_4" not in data # float - equals - test validation - rv = client.get('/admin/_float/?flt0_0=badval') + rv = client.get("/admin/_float/?flt0_0=badval") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'Invalid Filter Value' in data + data = rv.data.decode("utf-8") + assert "Invalid Filter Value" in data # float - not equal - rv = client.get('/admin/_float/?flt0_1=25.9') + rv = client.get("/admin/_float/?flt0_1=25.9") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_3' not in data - assert 'test2_val_4' in data + data = rv.data.decode("utf-8") + assert "test2_val_3" not in data + assert "test2_val_4" in data # float - greater - rv = client.get('/admin/_float/?flt0_2=60.5') + rv = client.get("/admin/_float/?flt0_2=60.5") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_3' not in data - assert 'test2_val_4' in data + data = rv.data.decode("utf-8") + assert "test2_val_3" not in data + assert "test2_val_4" in data # float - smaller - rv = client.get('/admin/_float/?flt0_3=60.5') + rv = client.get("/admin/_float/?flt0_3=60.5") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_3' in data - assert 'test2_val_4' not in data + data = rv.data.decode("utf-8") + assert "test2_val_3" in data + assert "test2_val_4" not in data # float - empty - rv = client.get('/admin/_float/?flt0_4=1') + rv = client.get("/admin/_float/?flt0_4=1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_1' in data - assert 'test2_val_2' in data - assert 'test2_val_3' not in data - assert 'test2_val_4' not in data + data = rv.data.decode("utf-8") + assert "test2_val_1" in data + assert "test2_val_2" in data + assert "test2_val_3" not in data + assert "test2_val_4" not in data # float - not empty - rv = client.get('/admin/_float/?flt0_4=0') + rv = client.get("/admin/_float/?flt0_4=0") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_1' not in data - assert 'test2_val_2' not in data - assert 'test2_val_3' in data - assert 'test2_val_4' in data + data = rv.data.decode("utf-8") + assert "test2_val_1" not in data + assert "test2_val_2" not in data + assert "test2_val_3" in data + assert "test2_val_4" in data # float - in list - rv = client.get('/admin/_float/?flt0_5=25.9%2C75.5') + rv = client.get("/admin/_float/?flt0_5=25.9%2C75.5") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_1' not in data - assert 'test2_val_2' not in data - assert 'test2_val_3' in data - assert 'test2_val_4' in data + data = rv.data.decode("utf-8") + assert "test2_val_1" not in data + assert "test2_val_2" not in data + assert "test2_val_3" in data + assert "test2_val_4" in data # float - in list - test validation - rv = client.get('/admin/_float/?flt0_5=25.9%2Cbadval') + rv = client.get("/admin/_float/?flt0_5=25.9%2Cbadval") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'Invalid Filter Value' in data + data = rv.data.decode("utf-8") + assert "Invalid Filter Value" in data # float - not in list - rv = client.get('/admin/_float/?flt0_6=25.9%2C75.5') + rv = client.get("/admin/_float/?flt0_6=25.9%2C75.5") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_1' in data - assert 'test2_val_2' in data - assert 'test2_val_3' not in data - assert 'test2_val_4' not in data + data = rv.data.decode("utf-8") + assert "test2_val_1" in data + assert "test2_val_2" in data + assert "test2_val_3" not in data + assert "test2_val_4" not in data # Test filters to joined table field - rv = client.get('/admin/_model2/?flt1_0=1') + rv = client.get("/admin/_model2/?flt1_0=1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2_val_1' in data - assert 'test2_val_2' not in data - assert 'test2_val_3' not in data - assert 'test2_val_4' not in data + data = rv.data.decode("utf-8") + assert "test2_val_1" in data + assert "test2_val_2" not in data + assert "test2_val_3" not in data + assert "test2_val_4" not in data # Test human readable URLs - rv = client.get('/admin/_model3/?flt1_test1_equals=test1_val_1') + rv = client.get("/admin/_model3/?flt1_test1_equals=test1_val_1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test1_val_1' in data - assert 'test1_val_2' not in data + data = rv.data.decode("utf-8") + assert "test1_val_1" in data + assert "test1_val_2" not in data # Test date, time, and datetime filters - assert \ - [(f['index'], f['operation']) for f in view11._filter_groups[u'Date Field']] == \ - [ - (0, 'equals'), - (1, 'not equal'), - (2, 'greater than'), - (3, 'smaller than'), - (4, 'between'), - (5, 'not between'), - (6, 'empty'), - ] + assert [ + (f["index"], f["operation"]) for f in view11._filter_groups["Date Field"] + ] == [ + (0, "equals"), + (1, "not equal"), + (2, "greater than"), + (3, "smaller than"), + (4, "between"), + (5, "not between"), + (6, "empty"), + ] - assert \ - [(f['index'], f['operation']) for f in view11._filter_groups[u'Datetime Field']] == \ - [ - (7, 'equals'), - (8, 'not equal'), - (9, 'greater than'), - (10, 'smaller than'), - (11, 'between'), - (12, 'not between'), - (13, 'empty'), - ] + assert [ + (f["index"], f["operation"]) + for f in view11._filter_groups["Datetime Field"] + ] == [ + (7, "equals"), + (8, "not equal"), + (9, "greater than"), + (10, "smaller than"), + (11, "between"), + (12, "not between"), + (13, "empty"), + ] - assert \ - [(f['index'], f['operation']) for f in view11._filter_groups[u'Time Field']] == \ - [ - (14, 'equals'), - (15, 'not equal'), - (16, 'greater than'), - (17, 'smaller than'), - (18, 'between'), - (19, 'not between'), - (20, 'empty'), - ] + assert [ + (f["index"], f["operation"]) for f in view11._filter_groups["Time Field"] + ] == [ + (14, "equals"), + (15, "not equal"), + (16, "greater than"), + (17, "smaller than"), + (18, "between"), + (19, "not between"), + (20, "empty"), + ] # date - equals - rv = client.get('/admin/_datetime/?flt0_0=2014-11-17') + rv = client.get("/admin/_datetime/?flt0_0=2014-11-17") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'date_obj1' in data - assert 'date_obj2' not in data + data = rv.data.decode("utf-8") + assert "date_obj1" in data + assert "date_obj2" not in data # date - not equal - rv = client.get('/admin/_datetime/?flt0_1=2014-11-17') + rv = client.get("/admin/_datetime/?flt0_1=2014-11-17") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'date_obj1' not in data - assert 'date_obj2' in data + data = rv.data.decode("utf-8") + assert "date_obj1" not in data + assert "date_obj2" in data # date - greater - rv = client.get('/admin/_datetime/?flt0_2=2014-11-16') + rv = client.get("/admin/_datetime/?flt0_2=2014-11-16") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'date_obj1' in data - assert 'date_obj2' not in data + data = rv.data.decode("utf-8") + assert "date_obj1" in data + assert "date_obj2" not in data # date - smaller - rv = client.get('/admin/_datetime/?flt0_3=2014-11-16') + rv = client.get("/admin/_datetime/?flt0_3=2014-11-16") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'date_obj1' not in data - assert 'date_obj2' in data + data = rv.data.decode("utf-8") + assert "date_obj1" not in data + assert "date_obj2" in data # date - between - rv = client.get('/admin/_datetime/?flt0_4=2014-11-13+to+2014-11-20') + rv = client.get("/admin/_datetime/?flt0_4=2014-11-13+to+2014-11-20") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'date_obj1' in data - assert 'date_obj2' not in data + data = rv.data.decode("utf-8") + assert "date_obj1" in data + assert "date_obj2" not in data # date - not between - rv = client.get('/admin/_datetime/?flt0_5=2014-11-13+to+2014-11-20') + rv = client.get("/admin/_datetime/?flt0_5=2014-11-13+to+2014-11-20") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'date_obj1' not in data - assert 'date_obj2' in data + data = rv.data.decode("utf-8") + assert "date_obj1" not in data + assert "date_obj2" in data # date - empty - rv = client.get('/admin/_datetime/?flt0_6=1') + rv = client.get("/admin/_datetime/?flt0_6=1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test1_val_1' in data - assert 'date_obj1' not in data - assert 'date_obj2' not in data + data = rv.data.decode("utf-8") + assert "test1_val_1" in data + assert "date_obj1" not in data + assert "date_obj2" not in data # date - empty - rv = client.get('/admin/_datetime/?flt0_6=0') + rv = client.get("/admin/_datetime/?flt0_6=0") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test1_val_1' not in data - assert 'date_obj1' in data - assert 'date_obj2' in data + data = rv.data.decode("utf-8") + assert "test1_val_1" not in data + assert "date_obj1" in data + assert "date_obj2" in data # datetime - equals - rv = client.get('/admin/_datetime/?flt0_7=2014-04-03+01%3A09%3A00') + rv = client.get("/admin/_datetime/?flt0_7=2014-04-03+01%3A09%3A00") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'datetime_obj1' in data - assert 'datetime_obj2' not in data + data = rv.data.decode("utf-8") + assert "datetime_obj1" in data + assert "datetime_obj2" not in data # datetime - not equal - rv = client.get('/admin/_datetime/?flt0_8=2014-04-03+01%3A09%3A00') + rv = client.get("/admin/_datetime/?flt0_8=2014-04-03+01%3A09%3A00") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'datetime_obj1' not in data - assert 'datetime_obj2' in data + data = rv.data.decode("utf-8") + assert "datetime_obj1" not in data + assert "datetime_obj2" in data # datetime - greater - rv = client.get('/admin/_datetime/?flt0_9=2014-04-03+01%3A08%3A00') + rv = client.get("/admin/_datetime/?flt0_9=2014-04-03+01%3A08%3A00") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'datetime_obj1' in data - assert 'datetime_obj2' not in data + data = rv.data.decode("utf-8") + assert "datetime_obj1" in data + assert "datetime_obj2" not in data # datetime - smaller - rv = client.get('/admin/_datetime/?flt0_10=2014-04-03+01%3A08%3A00') + rv = client.get("/admin/_datetime/?flt0_10=2014-04-03+01%3A08%3A00") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'datetime_obj1' not in data - assert 'datetime_obj2' in data + data = rv.data.decode("utf-8") + assert "datetime_obj1" not in data + assert "datetime_obj2" in data # datetime - between - rv = client.get('/admin/_datetime/?flt0_11=2014-04-02+00%3A00%3A00+to+2014-11-20+23%3A59%3A59') + rv = client.get( + "/admin/_datetime/?flt0_11=2014-04-02+00%3A00%3A00+to+2014-11-20+23%3A59%3A59" + ) assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'datetime_obj1' in data - assert 'datetime_obj2' not in data + data = rv.data.decode("utf-8") + assert "datetime_obj1" in data + assert "datetime_obj2" not in data # datetime - not between - rv = client.get('/admin/_datetime/?flt0_12=2014-04-02+00%3A00%3A00+to+2014-11-20+23%3A59%3A59') + rv = client.get( + "/admin/_datetime/?flt0_12=2014-04-02+00%3A00%3A00+to+2014-11-20+23%3A59%3A59" + ) assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'datetime_obj1' not in data - assert 'datetime_obj2' in data + data = rv.data.decode("utf-8") + assert "datetime_obj1" not in data + assert "datetime_obj2" in data # datetime - empty - rv = client.get('/admin/_datetime/?flt0_13=1') + rv = client.get("/admin/_datetime/?flt0_13=1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test1_val_1' in data - assert 'datetime_obj1' not in data - assert 'datetime_obj2' not in data + data = rv.data.decode("utf-8") + assert "test1_val_1" in data + assert "datetime_obj1" not in data + assert "datetime_obj2" not in data # datetime - not empty - rv = client.get('/admin/_datetime/?flt0_13=0') + rv = client.get("/admin/_datetime/?flt0_13=0") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test1_val_1' not in data - assert 'datetime_obj1' in data - assert 'datetime_obj2' in data + data = rv.data.decode("utf-8") + assert "test1_val_1" not in data + assert "datetime_obj1" in data + assert "datetime_obj2" in data # time - equals - rv = client.get('/admin/_datetime/?flt0_14=11%3A10%3A09') + rv = client.get("/admin/_datetime/?flt0_14=11%3A10%3A09") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'timeonly_obj1' in data - assert 'timeonly_obj2' not in data + data = rv.data.decode("utf-8") + assert "timeonly_obj1" in data + assert "timeonly_obj2" not in data # time - not equal - rv = client.get('/admin/_datetime/?flt0_15=11%3A10%3A09') + rv = client.get("/admin/_datetime/?flt0_15=11%3A10%3A09") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'timeonly_obj1' not in data - assert 'timeonly_obj2' in data + data = rv.data.decode("utf-8") + assert "timeonly_obj1" not in data + assert "timeonly_obj2" in data # time - greater - rv = client.get('/admin/_datetime/?flt0_16=11%3A09%3A09') + rv = client.get("/admin/_datetime/?flt0_16=11%3A09%3A09") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'timeonly_obj1' in data - assert 'timeonly_obj2' not in data + data = rv.data.decode("utf-8") + assert "timeonly_obj1" in data + assert "timeonly_obj2" not in data # time - smaller - rv = client.get('/admin/_datetime/?flt0_17=11%3A09%3A09') + rv = client.get("/admin/_datetime/?flt0_17=11%3A09%3A09") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'timeonly_obj1' not in data - assert 'timeonly_obj2' in data + data = rv.data.decode("utf-8") + assert "timeonly_obj1" not in data + assert "timeonly_obj2" in data # time - between - rv = client.get('/admin/_datetime/?flt0_18=10%3A40%3A00+to+11%3A50%3A59') + rv = client.get("/admin/_datetime/?flt0_18=10%3A40%3A00+to+11%3A50%3A59") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'timeonly_obj1' in data - assert 'timeonly_obj2' not in data + data = rv.data.decode("utf-8") + assert "timeonly_obj1" in data + assert "timeonly_obj2" not in data # time - not between - rv = client.get('/admin/_datetime/?flt0_19=10%3A40%3A00+to+11%3A50%3A59') + rv = client.get("/admin/_datetime/?flt0_19=10%3A40%3A00+to+11%3A50%3A59") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'timeonly_obj1' not in data - assert 'timeonly_obj2' in data + data = rv.data.decode("utf-8") + assert "timeonly_obj1" not in data + assert "timeonly_obj2" in data # time - empty - rv = client.get('/admin/_datetime/?flt0_20=1') + rv = client.get("/admin/_datetime/?flt0_20=1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test1_val_1' in data - assert 'timeonly_obj1' not in data - assert 'timeonly_obj2' not in data + data = rv.data.decode("utf-8") + assert "test1_val_1" in data + assert "timeonly_obj1" not in data + assert "timeonly_obj2" not in data # time - not empty - rv = client.get('/admin/_datetime/?flt0_20=0') + rv = client.get("/admin/_datetime/?flt0_20=0") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test1_val_1' not in data - assert 'timeonly_obj1' in data - assert 'timeonly_obj2' in data + data = rv.data.decode("utf-8") + assert "test1_val_1" not in data + assert "timeonly_obj1" in data + assert "timeonly_obj2" in data # Test enum filter # enum - equals - rv = client.get('/admin/_enumfield/?flt0_0=model1_v1') + rv = client.get("/admin/_enumfield/?flt0_0=model1_v1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'enum_obj1' in data - assert 'enum_obj2' not in data + data = rv.data.decode("utf-8") + assert "enum_obj1" in data + assert "enum_obj2" not in data # enum - not equal - rv = client.get('/admin/_enumfield/?flt0_1=model1_v1') + rv = client.get("/admin/_enumfield/?flt0_1=model1_v1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'enum_obj1' not in data - assert 'enum_obj2' in data + data = rv.data.decode("utf-8") + assert "enum_obj1" not in data + assert "enum_obj2" in data # enum - empty - rv = client.get('/admin/_enumfield/?flt0_2=1') + rv = client.get("/admin/_enumfield/?flt0_2=1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test1_val_1' in data - assert 'enum_obj1' not in data - assert 'enum_obj2' not in data + data = rv.data.decode("utf-8") + assert "test1_val_1" in data + assert "enum_obj1" not in data + assert "enum_obj2" not in data # enum - not empty - rv = client.get('/admin/_enumfield/?flt0_2=0') + rv = client.get("/admin/_enumfield/?flt0_2=0") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test1_val_1' not in data - assert 'enum_obj1' in data - assert 'enum_obj2' in data + data = rv.data.decode("utf-8") + assert "test1_val_1" not in data + assert "enum_obj1" in data + assert "enum_obj2" in data # enum - in list - rv = client.get('/admin/_enumfield/?flt0_3=model1_v1%2Cmodel1_v2') + rv = client.get("/admin/_enumfield/?flt0_3=model1_v1%2Cmodel1_v2") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test1_val_1' not in data - assert 'enum_obj1' in data - assert 'enum_obj2' in data + data = rv.data.decode("utf-8") + assert "test1_val_1" not in data + assert "enum_obj1" in data + assert "enum_obj2" in data # enum - not in list - rv = client.get('/admin/_enumfield/?flt0_4=model1_v1%2Cmodel1_v2') + rv = client.get("/admin/_enumfield/?flt0_4=model1_v1%2Cmodel1_v2") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test1_val_1' in data - assert 'enum_obj1' not in data - assert 'enum_obj2' not in data + data = rv.data.decode("utf-8") + assert "test1_val_1" in data + assert "enum_obj1" not in data + assert "enum_obj2" not in data # Test enum type filter # enum type - equals - rv = client.get('/admin/_enumtypefield/?flt0_0=first') + rv = client.get("/admin/_enumtypefield/?flt0_0=first") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'enum_type_obj1' in data - assert 'enum_type_obj2' not in data + data = rv.data.decode("utf-8") + assert "enum_type_obj1" in data + assert "enum_type_obj2" not in data # enum - not equal - rv = client.get('/admin/_enumtypefield/?flt0_1=first') + rv = client.get("/admin/_enumtypefield/?flt0_1=first") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'enum_type_obj1' not in data - assert 'enum_type_obj2' in data + data = rv.data.decode("utf-8") + assert "enum_type_obj1" not in data + assert "enum_type_obj2" in data # enum - empty - rv = client.get('/admin/_enumtypefield/?flt0_2=1') + rv = client.get("/admin/_enumtypefield/?flt0_2=1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test1_val_1' in data - assert 'enum_type_obj1' not in data - assert 'enum_type_obj2' not in data + data = rv.data.decode("utf-8") + assert "test1_val_1" in data + assert "enum_type_obj1" not in data + assert "enum_type_obj2" not in data # enum - not empty - rv = client.get('/admin/_enumtypefield/?flt0_2=0') + rv = client.get("/admin/_enumtypefield/?flt0_2=0") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test1_val_1' not in data - assert 'enum_type_obj1' in data - assert 'enum_type_obj2' in data + data = rv.data.decode("utf-8") + assert "test1_val_1" not in data + assert "enum_type_obj1" in data + assert "enum_type_obj2" in data # enum - in list - rv = client.get('/admin/_enumtypefield/?flt0_3=first%2Csecond') + rv = client.get("/admin/_enumtypefield/?flt0_3=first%2Csecond") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test1_val_1' not in data - assert 'enum_type_obj1' in data - assert 'enum_type_obj2' in data + data = rv.data.decode("utf-8") + assert "test1_val_1" not in data + assert "enum_type_obj1" in data + assert "enum_type_obj2" in data # enum - not in list - rv = client.get('/admin/_enumtypefield/?flt0_4=first%2Csecond') + rv = client.get("/admin/_enumtypefield/?flt0_4=first%2Csecond") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test1_val_1' in data - assert 'enum_type_obj1' not in data - assert 'enum_type_obj2' not in data + data = rv.data.decode("utf-8") + assert "test1_val_1" in data + assert "enum_type_obj1" not in data + assert "enum_type_obj2" not in data # Test single custom filter on relation - rv = client.get('/admin/_relation_test/?flt1_0=test1_val_1') - data = rv.data.decode('utf-8') + rv = client.get("/admin/_relation_test/?flt1_0=test1_val_1") + data = rv.data.decode("utf-8") - assert 'test1_val_1' in data - assert 'test1_val_2' not in data + assert "test1_val_1" in data + assert "test1_val_2" not in data def test_column_filters_sqla_obj(app, db, admin): with app.app_context(): Model1, Model2 = create_models(db) - view = CustomModelView( - Model1, db.session, - column_filters=[Model1.test1] - ) + view = CustomModelView(Model1, db.session, column_filters=[Model1.test1]) admin.add_view(view) assert len(view._filters) == 7 @@ -1624,6 +1778,7 @@ def test_column_filters_sqla_obj(app, db, admin): def test_hybrid_property(app, db, admin): with app.app_context(): + class Model1(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String) @@ -1644,10 +1799,10 @@ def number_of_pixels_str(cls): db.create_all() - assert tools.is_hybrid_property(Model1, 'number_of_pixels') - assert tools.is_hybrid_property(Model1, 'number_of_pixels_str') - assert not tools.is_hybrid_property(Model1, 'height') - assert not tools.is_hybrid_property(Model1, 'width') + assert tools.is_hybrid_property(Model1, "number_of_pixels") + assert tools.is_hybrid_property(Model1, "number_of_pixels_str") + assert not tools.is_hybrid_property(Model1, "height") + assert not tools.is_hybrid_property(Model1, "width") db.session.add(Model1(id=1, name="test_row_1", width=25, height=25)) db.session.add(Model1(id=2, name="test_row_2", width=10, height=10)) @@ -1656,37 +1811,41 @@ def number_of_pixels_str(cls): client = app.test_client() view = CustomModelView( - Model1, db.session, - column_default_sort='number_of_pixels', - column_filters=[filters.IntGreaterFilter(Model1.number_of_pixels, - 'Number of Pixels')], - column_searchable_list=['number_of_pixels_str', ] + Model1, + db.session, + column_default_sort="number_of_pixels", + column_filters=[ + filters.IntGreaterFilter(Model1.number_of_pixels, "Number of Pixels") + ], + column_searchable_list=[ + "number_of_pixels_str", + ], ) admin.add_view(view) # filters - hybrid_property integer - greater - rv = client.get('/admin/model1/?flt0_0=600') + rv = client.get("/admin/model1/?flt0_0=600") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test_row_1' in data - assert 'test_row_2' not in data + data = rv.data.decode("utf-8") + assert "test_row_1" in data + assert "test_row_2" not in data # sorting - rv = client.get('/admin/model1/?sort=0') + rv = client.get("/admin/model1/?sort=0") assert rv.status_code == 200 _, data = view.get_list(0, None, None, None, None) assert len(data) == 2 - assert data[0].name == 'test_row_2' - assert data[1].name == 'test_row_1' + assert data[0].name == "test_row_2" + assert data[1].name == "test_row_1" # searching - rv = client.get('/admin/model1/?search=100') + rv = client.get("/admin/model1/?search=100") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test_row_2' in data - assert 'test_row_1' not in data + data = rv.data.decode("utf-8") + assert "test_row_2" in data + assert "test_row_1" not in data def test_hybrid_property_nested(app, db, admin): @@ -1699,18 +1858,22 @@ class Model1(db.Model): @hybrid_property def fullname(self): - return '{} {}'.format(self.firstname, self.lastname) + return f"{self.firstname} {self.lastname}" class Model2(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String) - owner_id = db.Column(db.Integer, db.ForeignKey('model1.id', ondelete='CASCADE')) - owner = db.relationship('Model1', backref=db.backref("tiles"), uselist=False) + owner_id = db.Column( + db.Integer, db.ForeignKey("model1.id", ondelete="CASCADE") + ) + owner = db.relationship( + "Model1", backref=db.backref("tiles"), uselist=False + ) db.create_all() - assert tools.is_hybrid_property(Model2, 'owner.fullname') - assert not tools.is_hybrid_property(Model2, 'owner.firstname') + assert tools.is_hybrid_property(Model2, "owner.fullname") + assert not tools.is_hybrid_property(Model2, "owner.firstname") db.session.add(Model1(id=1, firstname="John", lastname="Dow")) db.session.add(Model1(id=2, firstname="Jim", lastname="Smith")) @@ -1722,74 +1885,78 @@ class Model2(db.Model): client = app.test_client() view = CustomModelView( - Model2, db.session, - column_list=('id', 'name', 'owner.fullname'), - column_default_sort='id', + Model2, + db.session, + column_list=("id", "name", "owner.fullname"), + column_default_sort="id", ) admin.add_view(view) - rv = client.get('/admin/model2/') + rv = client.get("/admin/model2/") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'John Dow' in data - assert 'Jim Smith' in data + data = rv.data.decode("utf-8") + assert "John Dow" in data + assert "Jim Smith" in data def test_url_args(app, db, admin): with app.app_context(): Model1, Model2 = create_models(db) - view = CustomModelView(Model1, db.session, - page_size=2, - column_searchable_list=['test1'], - column_filters=['test1']) + view = CustomModelView( + Model1, + db.session, + page_size=2, + column_searchable_list=["test1"], + column_filters=["test1"], + ) admin.add_view(view) - db.session.add(Model1('data1')) - db.session.add(Model1('data2')) - db.session.add(Model1('data3')) - db.session.add(Model1('data4')) + db.session.add(Model1("data1")) + db.session.add(Model1("data2")) + db.session.add(Model1("data3")) + db.session.add(Model1("data4")) db.session.commit() client = app.test_client() - rv = client.get('/admin/model1/') - data = rv.data.decode('utf-8') - assert 'data1' in data - assert 'data3' not in data + rv = client.get("/admin/model1/") + data = rv.data.decode("utf-8") + assert "data1" in data + assert "data3" not in data # page - rv = client.get('/admin/model1/?page=1') - data = rv.data.decode('utf-8') - assert 'data1' not in data - assert 'data3' in data + rv = client.get("/admin/model1/?page=1") + data = rv.data.decode("utf-8") + assert "data1" not in data + assert "data3" in data # sort - rv = client.get('/admin/model1/?sort=0&desc=1') - data = rv.data.decode('utf-8') - assert 'data1' not in data - assert 'data3' in data - assert 'data4' in data + rv = client.get("/admin/model1/?sort=0&desc=1") + data = rv.data.decode("utf-8") + assert "data1" not in data + assert "data3" in data + assert "data4" in data # search - rv = client.get('/admin/model1/?search=data1') - data = rv.data.decode('utf-8') - assert 'data1' in data - assert 'data2' not in data + rv = client.get("/admin/model1/?search=data1") + data = rv.data.decode("utf-8") + assert "data1" in data + assert "data2" not in data - rv = client.get('/admin/model1/?search=^data1') - data = rv.data.decode('utf-8') - assert 'data2' not in data + rv = client.get("/admin/model1/?search=^data1") + data = rv.data.decode("utf-8") + assert "data2" not in data # like - rv = client.get('/admin/model1/?flt0=0&flt0v=data1') - data = rv.data.decode('utf-8') - assert 'data1' in data + rv = client.get("/admin/model1/?flt0=0&flt0v=data1") + data = rv.data.decode("utf-8") + assert "data1" in data # not like - rv = client.get('/admin/model1/?flt0=1&flt0v=data1') - data = rv.data.decode('utf-8') - assert 'data2' in data + rv = client.get("/admin/model1/?flt0=1&flt0v=data1") + data = rv.data.decode("utf-8") + assert "data2" in data def test_non_int_pk(app, db, admin): @@ -1801,27 +1968,26 @@ class Model(db.Model): db.create_all() - view = CustomModelView(Model, db.session, form_columns=['id', 'test']) + view = CustomModelView(Model, db.session, form_columns=["id", "test"]) admin.add_view(view) client = app.test_client() - rv = client.get('/admin/model/') + rv = client.get("/admin/model/") assert rv.status_code == 200 - rv = client.post('/admin/model/new/', - data=dict(id='test1', test='test2')) + rv = client.post("/admin/model/new/", data=dict(id="test1", test="test2")) assert rv.status_code == 302 - rv = client.get('/admin/model/') + rv = client.get("/admin/model/") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test1' in data + data = rv.data.decode("utf-8") + assert "test1" in data - rv = client.get('/admin/model/edit/?id=test1') + rv = client.get("/admin/model/edit/?id=test1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test2' in data + data = rv.data.decode("utf-8") + assert "test2" in data def test_form_columns(app, db, admin): @@ -1841,50 +2007,60 @@ class EnumChoices(enum.Enum): id = db.Column(db.String, primary_key=True) model_id = db.Column(db.Integer, db.ForeignKey(Model.id)) - model = db.relationship(Model, backref='backref') - enum_field = db.Column(db.Enum('model1_v1', 'model1_v2'), nullable=True) + model = db.relationship(Model, backref="backref") + enum_field = db.Column(db.Enum("model1_v1", "model1_v2"), nullable=True) choice_field = db.Column(db.String, nullable=True) - sqla_utils_choice = db.Column(ChoiceType([ - ('choice-1', u'First choice'), - ('choice-2', u'Second choice') - ])) + sqla_utils_choice = db.Column( + ChoiceType( + [("choice-1", "First choice"), ("choice-2", "Second choice")] + ) + ) sqla_utils_enum = db.Column(ChoiceType(EnumChoices, impl=db.Integer())) db.create_all() - view1 = CustomModelView(Model, db.session, endpoint='view1', - form_columns=('int_field', 'text_field')) - view2 = CustomModelView(Model, db.session, endpoint='view2', - form_excluded_columns=('excluded_column',)) - view3 = CustomModelView(ChildModel, db.session, endpoint='view3') + view1 = CustomModelView( + Model, + db.session, + endpoint="view1", + form_columns=("int_field", "text_field"), + ) + view2 = CustomModelView( + Model, + db.session, + endpoint="view2", + form_excluded_columns=("excluded_column",), + ) + view3 = CustomModelView(ChildModel, db.session, endpoint="view3") form1 = view1.create_form() form2 = view2.create_form() form3 = view3.create_form() - assert 'int_field' in form1._fields - assert 'text_field' in form1._fields - assert 'datetime_field' not in form1._fields - assert 'excluded_column' not in form2._fields + assert "int_field" in form1._fields + assert "text_field" in form1._fields + assert "datetime_field" not in form1._fields + assert "excluded_column" not in form2._fields # check that relation shows up as a query select - assert type(form3.model).__name__ == 'QuerySelectField' + assert type(form3.model).__name__ == "QuerySelectField" # check that select field is rendered if form_choices were specified - assert type(form3.choice_field).__name__ == 'Select2Field' + assert type(form3.choice_field).__name__ == "Select2Field" # check that select field is rendered for enum fields - assert type(form3.enum_field).__name__ == 'Select2Field' + assert type(form3.enum_field).__name__ == "Select2Field" # check that sqlalchemy_utils field types are handled appropriately - assert type(form3.sqla_utils_choice).__name__ == 'Select2Field' - assert type(form3.sqla_utils_enum).__name__ == 'Select2Field' + assert type(form3.sqla_utils_choice).__name__ == "Select2Field" + assert type(form3.sqla_utils_enum).__name__ == "Select2Field" # test form_columns with model objects - view4 = CustomModelView(Model, db.session, endpoint='view1', - form_columns=[Model.int_field]) + view4 = CustomModelView( + Model, db.session, endpoint="view1", form_columns=[Model.int_field] + ) form4 = view4.create_form() - assert 'int_field' in form4._fields + assert "int_field" in form4._fields @pytest.mark.xfail(raises=Exception) @@ -1893,19 +2069,20 @@ def test_complex_form_columns(app, db, admin): M1, M2 = create_models(db) # test using a form column in another table - view = CustomModelView(M2, db.session, form_columns=['model1.test1']) + view = CustomModelView(M2, db.session, form_columns=["model1.test1"]) view.create_form() def test_form_args(app, db, admin): with app.app_context(): + class Model(db.Model): id = db.Column(db.String, primary_key=True) test = db.Column(db.String, nullable=False) db.create_all() - shared_form_args = {'test': {'validators': [validators.Regexp('test')]}} + shared_form_args = {"test": {"validators": [validators.Regexp("test")]}} view = CustomModelView(Model, db.session, form_args=shared_form_args) admin.add_view(view) @@ -1920,14 +2097,20 @@ class Model(db.Model): def test_form_override(app, db, admin): with app.app_context(): + class Model(db.Model): id = db.Column(db.String, primary_key=True) test = db.Column(db.String) db.create_all() - view1 = CustomModelView(Model, db.session, endpoint='view1') - view2 = CustomModelView(Model, db.session, endpoint='view2', form_overrides=dict(test=fields.FileField)) + view1 = CustomModelView(Model, db.session, endpoint="view1") + view2 = CustomModelView( + Model, + db.session, + endpoint="view2", + form_overrides=dict(test=fields.FileField), + ) admin.add_view(view1) admin.add_view(view2) @@ -1937,6 +2120,7 @@ class Model(db.Model): def test_form_onetoone(app, db, admin): with app.app_context(): + class Model1(db.Model): id = db.Column(db.Integer, primary_key=True) test = db.Column(db.String) @@ -1945,16 +2129,18 @@ class Model2(db.Model): id = db.Column(db.Integer, primary_key=True) model1_id = db.Column(db.Integer, db.ForeignKey(Model1.id)) - model1 = db.relationship(Model1, backref=db.backref('model2', uselist=False)) + model1 = db.relationship( + Model1, backref=db.backref("model2", uselist=False) + ) db.create_all() - view1 = CustomModelView(Model1, db.session, endpoint='view1') - view2 = CustomModelView(Model2, db.session, endpoint='view2') + view1 = CustomModelView(Model1, db.session, endpoint="view1") + view2 = CustomModelView(Model2, db.session, endpoint="view2") admin.add_view(view1) admin.add_view(view2) - model1 = Model1(test='test') + model1 = Model1(test="test") model2 = Model2(model1=model1) db.session.add(model1) db.session.add(model2) @@ -1988,19 +2174,18 @@ def on_model_delete(self, model): client = app.test_client() - client.post('/admin/model1/new/', - data=dict(test1='test1large', test2='test2')) + client.post("/admin/model1/new/", data=dict(test1="test1large", test2="test2")) model = db.session.query(Model1).first() - assert model.test1 == 'TEST1LARGE' + assert model.test1 == "TEST1LARGE" - url = '/admin/model1/edit/?id=%s' % model.id - client.post(url, data=dict(test1='test1small', test2='test2large')) + url = "/admin/model1/edit/?id=%s" % model.id + client.post(url, data=dict(test1="test1small", test2="test2large")) model = db.session.query(Model1).first() - assert model.test1 == 'TEST1SMALL' + assert model.test1 == "TEST1SMALL" - url = '/admin/model1/delete/?id=%s' % model.id + url = "/admin/model1/delete/?id=%s" % model.id client.post(url) assert view.deleted @@ -2009,7 +2194,7 @@ def test_multiple_delete(app, db, admin): with app.app_context(): M1, _ = create_models(db) - db.session.add_all([M1('a'), M1('b'), M1('c')]) + db.session.add_all([M1("a"), M1("b"), M1("c")]) db.session.commit() assert M1.query.count() == 3 @@ -2018,7 +2203,9 @@ def test_multiple_delete(app, db, admin): client = app.test_client() - rv = client.post('/admin/model1/action/', data=dict(action='delete', rowid=[1, 2, 3])) + rv = client.post( + "/admin/model1/action/", data=dict(action="delete", rowid=[1, 2, 3]) + ) assert rv.status_code == 302 assert M1.query.count() == 0 @@ -2027,106 +2214,125 @@ def test_default_sort(app, db, admin): with app.app_context(): M1, _ = create_models(db) - db.session.add_all([M1('c', 'x'), M1('b', 'x'), M1('a', 'y')]) + db.session.add_all([M1("c", "x"), M1("b", "x"), M1("a", "y")]) db.session.commit() assert M1.query.count() == 3 - view = CustomModelView(M1, db.session, column_default_sort='test1') + view = CustomModelView(M1, db.session, column_default_sort="test1") admin.add_view(view) _, data = view.get_list(0, None, None, None, None) assert len(data) == 3 - assert data[0].test1 == 'a' - assert data[1].test1 == 'b' - assert data[2].test1 == 'c' + assert data[0].test1 == "a" + assert data[1].test1 == "b" + assert data[2].test1 == "c" # test default sort on renamed columns - with column_list scaffolding - view2 = CustomModelView(M1, db.session, column_default_sort='test1', - column_labels={'test1': 'blah'}, endpoint='m1_2') + view2 = CustomModelView( + M1, + db.session, + column_default_sort="test1", + column_labels={"test1": "blah"}, + endpoint="m1_2", + ) admin.add_view(view2) _, data = view2.get_list(0, None, None, None, None) assert len(data) == 3 - assert data[0].test1 == 'a' - assert data[1].test1 == 'b' - assert data[2].test1 == 'c' + assert data[0].test1 == "a" + assert data[1].test1 == "b" + assert data[2].test1 == "c" # test default sort on renamed columns - without column_list scaffolding - view3 = CustomModelView(M1, db.session, column_default_sort='test1', - column_labels={'test1': 'blah'}, endpoint='m1_3', - column_list=['test1']) + view3 = CustomModelView( + M1, + db.session, + column_default_sort="test1", + column_labels={"test1": "blah"}, + endpoint="m1_3", + column_list=["test1"], + ) admin.add_view(view3) _, data = view3.get_list(0, None, None, None, None) assert len(data) == 3 - assert data[0].test1 == 'a' - assert data[1].test1 == 'b' - assert data[2].test1 == 'c' + assert data[0].test1 == "a" + assert data[1].test1 == "b" + assert data[2].test1 == "c" # test default sort with multiple columns - order = [('test2', False), ('test1', False)] - view4 = CustomModelView(M1, db.session, column_default_sort=order, endpoint='m1_4') + order = [("test2", False), ("test1", False)] + view4 = CustomModelView( + M1, db.session, column_default_sort=order, endpoint="m1_4" + ) admin.add_view(view4) _, data = view4.get_list(0, None, None, None, None) assert len(data) == 3 - assert data[0].test1 == 'b' - assert data[1].test1 == 'c' - assert data[2].test1 == 'a' + assert data[0].test1 == "b" + assert data[1].test1 == "c" + assert data[2].test1 == "a" def test_complex_sort(app, db, admin): with app.app_context(): M1, M2 = create_models(db) - m1 = M1(test1='c', test2='x') + m1 = M1(test1="c", test2="x") db.session.add(m1) - db.session.add(M2('c', model1=m1)) + db.session.add(M2("c", model1=m1)) - m2 = M1(test1='b', test2='x') + m2 = M1(test1="b", test2="x") db.session.add(m2) - db.session.add(M2('b', model1=m2)) + db.session.add(M2("b", model1=m2)) - m3 = M1(test1='a', test2='y') + m3 = M1(test1="a", test2="y") db.session.add(m3) - db.session.add(M2('a', model1=m3)) + db.session.add(M2("a", model1=m3)) db.session.commit() # test sorting on relation string - 'model1.test1' - view = CustomModelView(M2, db.session, - column_list=['string_field', 'model1.test1'], - column_sortable_list=['model1.test1']) + view = CustomModelView( + M2, + db.session, + column_list=["string_field", "model1.test1"], + column_sortable_list=["model1.test1"], + ) admin.add_view(view) - view2 = CustomModelView(M2, db.session, - column_list=['string_field', 'model1'], - column_sortable_list=[('model1', ('model1.test2', 'model1.test1'))], endpoint="m1_2") + view2 = CustomModelView( + M2, + db.session, + column_list=["string_field", "model1"], + column_sortable_list=[("model1", ("model1.test2", "model1.test1"))], + endpoint="m1_2", + ) admin.add_view(view2) client = app.test_client() - rv = client.get('/admin/model2/?sort=0') + rv = client.get("/admin/model2/?sort=0") assert rv.status_code == 200 - _, data = view.get_list(0, 'model1.test1', False, None, None) + _, data = view.get_list(0, "model1.test1", False, None, None) - assert data[0].model1.test1 == 'a' - assert data[1].model1.test1 == 'b' - assert data[2].model1.test1 == 'c' + assert data[0].model1.test1 == "a" + assert data[1].model1.test1 == "b" + assert data[2].model1.test1 == "c" # test sorting on multiple columns in related model - rv = client.get('/admin/m1_2/?sort=0') + rv = client.get("/admin/m1_2/?sort=0") assert rv.status_code == 200 - _, data = view2.get_list(0, 'model1', False, None, None) + _, data = view2.get_list(0, "model1", False, None, None) - assert data[0].model1.test1 == 'b' - assert data[1].model1.test1 == 'c' - assert data[2].model1.test1 == 'a' + assert data[0].model1.test1 == "b" + assert data[1].model1.test1 == "c" + assert data[2].model1.test1 == "a" @pytest.mark.xfail(raises=Exception) @@ -2135,51 +2341,53 @@ def test_complex_sort_exception(app, db, admin): M1, M2 = create_models(db) # test column_sortable_list on a related table's column object - view = CustomModelView(M2, db.session, endpoint="model2_3", - column_sortable_list=[M1.test1]) + view = CustomModelView( + M2, db.session, endpoint="model2_3", column_sortable_list=[M1.test1] + ) admin.add_view(view) sort_column = view._get_column_by_idx(0)[0] _, data = view.get_list(0, sort_column, False, None, None) assert len(data) == 2 - assert data[0].model1.test1 == 'a' - assert data[1].model1.test1 == 'b' + assert data[0].model1.test1 == "a" + assert data[1].model1.test1 == "b" def test_default_complex_sort(app, db, admin): with app.app_context(): M1, M2 = create_models(db) - m1 = M1('b') + m1 = M1("b") db.session.add(m1) - db.session.add(M2('c', model1=m1)) + db.session.add(M2("c", model1=m1)) - m2 = M1('a') + m2 = M1("a") db.session.add(m2) - db.session.add(M2('c', model1=m2)) + db.session.add(M2("c", model1=m2)) db.session.commit() - view = CustomModelView(M2, db.session, column_default_sort='model1.test1') + view = CustomModelView(M2, db.session, column_default_sort="model1.test1") admin.add_view(view) _, data = view.get_list(0, None, None, None, None) assert len(data) == 2 - assert data[0].model1.test1 == 'a' - assert data[1].model1.test1 == 'b' + assert data[0].model1.test1 == "a" + assert data[1].model1.test1 == "b" # test column_default_sort on a related table's column object - view2 = CustomModelView(M2, db.session, endpoint="model2_2", - column_default_sort=(M1.test1, False)) + view2 = CustomModelView( + M2, db.session, endpoint="model2_2", column_default_sort=(M1.test1, False) + ) admin.add_view(view2) _, data = view2.get_list(0, None, None, None, None) assert len(data) == 2 - assert data[0].model1.test1 == 'a' - assert data[1].model1.test1 == 'b' + assert data[0].model1.test1 == "a" + assert data[1].model1.test1 == "b" @pytest.mark.filterwarnings( @@ -2190,23 +2398,22 @@ def test_extra_fields(app, db, admin): Model1, _ = create_models(db) view = CustomModelView( - Model1, db.session, - form_extra_fields={ - 'extra_field': fields.StringField('Extra Field') - } + Model1, + db.session, + form_extra_fields={"extra_field": fields.StringField("Extra Field")}, ) admin.add_view(view) client = app.test_client() - rv = client.get('/admin/model1/new/') + rv = client.get("/admin/model1/new/") assert rv.status_code == 200 # Check presence and order - data = rv.data.decode('utf-8') - assert 'Extra Field' in data - pos1 = data.find('Extra Field') - pos2 = data.find('Test1') + data = rv.data.decode("utf-8") + assert "Extra Field" in data + pos1 = data.find("Extra Field") + pos2 = data.find("Test1") assert pos2 < pos1 @@ -2215,41 +2422,40 @@ def test_extra_field_order(app, db, admin): Model1, _ = create_models(db) view = CustomModelView( - Model1, db.session, - form_columns=('extra_field', 'test1'), - form_extra_fields={ - 'extra_field': fields.StringField('Extra Field') - } + Model1, + db.session, + form_columns=("extra_field", "test1"), + form_extra_fields={"extra_field": fields.StringField("Extra Field")}, ) admin.add_view(view) client = app.test_client() - rv = client.get('/admin/model1/new/') + rv = client.get("/admin/model1/new/") assert rv.status_code == 200 # Check presence and order - data = rv.data.decode('utf-8') - pos1 = data.find('Extra Field') - pos2 = data.find('Test1') + data = rv.data.decode("utf-8") + pos1 = data.find("Extra Field") + pos2 = data.find("Test1") assert pos2 > pos1 @pytest.mark.parametrize( - 'locale, expect_text', + "locale, expect_text", ( - ('en', 'Home'), - ('cs', 'Domů'), - ('de', 'Start'), - ('es', 'Inicio'), - ('fa', 'خانه'), - ('fr', 'Accueil'), - ('pt', 'Início'), - ('ru', 'Главная'), - ('pa', 'ਹੋਮ'), - ('zh_CN', '首页'), - ('zh_TW', '首頁'), - ) + ("en", "Home"), + ("cs", "Domů"), + ("de", "Start"), + ("es", "Inicio"), + ("fa", "خانه"), + ("fr", "Accueil"), + ("pt", "Início"), + ("ru", "Главная"), + ("pa", "ਹੋਮ"), + ("zh_CN", "首页"), + ("zh_TW", "首頁"), + ), ) @pytest.mark.filterwarnings( "ignore:'iter_groups' is expected to return 4 items tuple since wtforms 3.1, this will be mandatory in wtforms 3.2:DeprecationWarning", @@ -2260,27 +2466,34 @@ def test_modelview_localization(request, app, locale, expect_text): # initialised, so we have to use `request.getfixturevalue` to pull the fixture # within the test function rather than the test signature. The `admin` fixture # pulls in the `babel` fixture, which will then use the configuration here. - app.config['BABEL_DEFAULT_LOCALE'] = locale - db = request.getfixturevalue('db') - admin = request.getfixturevalue('admin') + app.config["BABEL_DEFAULT_LOCALE"] = locale + db = request.getfixturevalue("db") + admin = request.getfixturevalue("admin") with app.app_context(): Model1, _ = create_models(db) view = CustomModelView( - Model1, db.session, - column_filters=['test1', 'bool_field', 'date_field', 'datetime_field', 'time_field'] + Model1, + db.session, + column_filters=[ + "test1", + "bool_field", + "date_field", + "datetime_field", + "time_field", + ], ) admin.add_view(view) client = app.test_client() - rv = client.get('/admin/model1/') + rv = client.get("/admin/model1/") assert expect_text in rv.text assert rv.status_code == 200 - rv = client.get('/admin/model1/new/') + rv = client.get("/admin/model1/new/") assert rv.status_code == 200 @@ -2290,40 +2503,39 @@ def test_modelview_named_filter_localization(request, app): # initialised, so we have to use `request.getfixturevalue` to pull the fixture # within the test function rather than the test signature. The `admin` fixture # pulls in the `babel` fixture, which will then use the configuration here. - app.config['BABEL_DEFAULT_LOCALE'] = 'de' - db = request.getfixturevalue('db') - _ = request.getfixturevalue('admin') + app.config["BABEL_DEFAULT_LOCALE"] = "de" + db = request.getfixturevalue("db") + _ = request.getfixturevalue("admin") with app.app_context(): Model1, _ = create_models(db) view = CustomModelView( - Model1, db.session, + Model1, + db.session, named_filter_urls=True, - column_filters=['test1'], + column_filters=["test1"], ) filters = view.get_filters() flt = filters[2] with app.test_request_context(): flt_name = view.get_filter_arg(2, flt) - assert 'test1_equals' == flt_name + assert "test1_equals" == flt_name def test_custom_form_base(app, db, admin): with app.app_context(): + class TestForm(form.BaseForm): pass Model1, _ = create_models(db) - view = CustomModelView( - Model1, db.session, - form_base_class=TestForm - ) + view = CustomModelView(Model1, db.session, form_base_class=TestForm) admin.add_view(view) - assert hasattr(view._create_form_class, 'test1') + assert hasattr(view._create_form_class, "test1") create_form = view.create_form() assert isinstance(create_form, TestForm) @@ -2334,68 +2546,68 @@ def test_ajax_fk(app, db, admin): Model1, Model2 = create_models(db) view = CustomModelView( - Model2, db.session, - url='view', - form_ajax_refs={ - 'model1': { - 'fields': ('test1', 'test2') - } - } + Model2, + db.session, + url="view", + form_ajax_refs={"model1": {"fields": ("test1", "test2")}}, ) admin.add_view(view) - assert u'model1' in view._form_ajax_refs + assert "model1" in view._form_ajax_refs - model = Model1(u'first') - model2 = Model1(u'foo', u'bar') + model = Model1("first") + model2 = Model1("foo", "bar") db.session.add_all([model, model2]) db.session.commit() # Check loader - loader = view._form_ajax_refs[u'model1'] + loader = view._form_ajax_refs["model1"] mdl = loader.get_one(model.id) assert mdl.test1 == model.test1 - items = loader.get_list(u'fir') + items = loader.get_list("fir") assert len(items) == 1 assert items[0].id == model.id - items = loader.get_list(u'bar') + items = loader.get_list("bar") assert len(items) == 1 - assert items[0].test1 == u'foo' + assert items[0].test1 == "foo" # Check form generation form = view.create_form() - assert form.model1.__class__.__name__ == u'AjaxSelectField' + assert form.model1.__class__.__name__ == "AjaxSelectField" - with app.test_request_context('/admin/view/'): - assert u'value=""' not in form.model1() + with app.test_request_context("/admin/view/"): + assert 'value=""' not in form.model1() form.model1.data = model - assert (u'data-json="[%s, "first"]"' % model.id in form.model1() or - u'data-json="[%s, "first"]"' % model.id in form.model1()) - assert u'value="1"' in form.model1() + assert ( + 'data-json="[%s, "first"]"' % model.id in form.model1() + or 'data-json="[%s, "first"]"' % model.id in form.model1() + ) + assert 'value="1"' in form.model1() # Check querying client = app.test_client() - req = client.get(u'/admin/view/ajax/lookup/?name=model1&query=foo') - assert req.data.decode('utf-8') == u'[[%s, "foo"]]' % model2.id + req = client.get("/admin/view/ajax/lookup/?name=model1&query=foo") + assert req.data.decode("utf-8") == '[[%s, "foo"]]' % model2.id # Check submitting - req = client.post('/admin/view/new/', data={u'model1': as_unicode(model.id)}) + req = client.post("/admin/view/new/", data={"model1": as_unicode(model.id)}) mdl = db.session.query(Model2).first() assert mdl is not None assert mdl.model1 is not None assert mdl.model1.id == model.id - assert mdl.model1.test1 == u'first' + assert mdl.model1.test1 == "first" def test_ajax_fk_multi(app, db, admin): with app.app_context(): + class Model1(db.Model): - __tablename__ = 'model1' + __tablename__ = "model1" id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(20)) @@ -2403,53 +2615,54 @@ class Model1(db.Model): def __str__(self): return self.name - table = db.Table('m2m', db.Model.metadata, - db.Column('model1_id', db.Integer, db.ForeignKey('model1.id')), - db.Column('model2_id', db.Integer, db.ForeignKey('model2.id')) - ) + table = db.Table( + "m2m", + db.Model.metadata, + db.Column("model1_id", db.Integer, db.ForeignKey("model1.id")), + db.Column("model2_id", db.Integer, db.ForeignKey("model2.id")), + ) class Model2(db.Model): - __tablename__ = 'model2' + __tablename__ = "model2" id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(20)) model1_id = db.Column(db.Integer(), db.ForeignKey(Model1.id)) - model1 = db.relationship(Model1, backref='models2', secondary=table) + model1 = db.relationship(Model1, backref="models2", secondary=table) db.create_all() view = CustomModelView( - Model2, db.session, - url='view', - form_ajax_refs={ - 'model1': { - 'fields': ['name'] - } - } + Model2, + db.session, + url="view", + form_ajax_refs={"model1": {"fields": ["name"]}}, ) admin.add_view(view) - assert u'model1' in view._form_ajax_refs + assert "model1" in view._form_ajax_refs - model = Model1(name=u'first') - db.session.add_all([model, Model1(name=u'foo')]) + model = Model1(name="first") + db.session.add_all([model, Model1(name="foo")]) db.session.commit() # Check form generation form = view.create_form() - assert form.model1.__class__.__name__ == u'AjaxSelectMultipleField' + assert form.model1.__class__.__name__ == "AjaxSelectMultipleField" - with app.test_request_context('/admin/view/'): - assert u'data-json="[]"' in form.model1() + with app.test_request_context("/admin/view/"): + assert 'data-json="[]"' in form.model1() form.model1.data = [model] - assert (u'data-json="[[1, "first"]]"' in form.model1() or - u'data-json="[[1, "first"]]"' in form.model1()) + assert ( + 'data-json="[[1, "first"]]"' in form.model1() + or 'data-json="[[1, "first"]]"' in form.model1() + ) # Check submitting client = app.test_client() - client.post('/admin/view/new/', data={u'model1': as_unicode(model.id)}) + client.post("/admin/view/new/", data={"model1": as_unicode(model.id)}) mdl = db.session.query(Model2).first() assert mdl is not None @@ -2466,31 +2679,44 @@ def test_safe_redirect(app, db, admin): client = app.test_client() - rv = client.post('/admin/model1/new/?url=http://localhost/admin/model2view/', - data=dict(test1='test1large', test2='test2', - _continue_editing='Save and Continue Editing')) + rv = client.post( + "/admin/model1/new/?url=http://localhost/admin/model2view/", + data=dict( + test1="test1large", + test2="test2", + _continue_editing="Save and Continue Editing", + ), + ) assert rv.status_code == 302 # werkzeug 2.1.0+ now returns *relative* redirect/location by default. - expected = '/admin/model1/edit/' + expected = "/admin/model1/edit/" # handle old werkzeug (or if relative location is disabled via `autocorrect_location_header=True`) - if not hasattr(rv, 'autocorrect_location_header') or rv.autocorrect_location_header: - expected = 'http://localhost' + expected + if ( + not hasattr(rv, "autocorrect_location_header") + or rv.autocorrect_location_header + ): + expected = "http://localhost" + expected assert rv.location.startswith(expected) - assert 'url=http://localhost/admin/model2view/' in rv.location - assert 'id=1' in rv.location + assert "url=http://localhost/admin/model2view/" in rv.location + assert "id=1" in rv.location - rv = client.post('/admin/model1/new/?url=http://google.com/evil/', - data=dict(test1='test1large', test2='test2', - _continue_editing='Save and Continue Editing')) + rv = client.post( + "/admin/model1/new/?url=http://google.com/evil/", + data=dict( + test1="test1large", + test2="test2", + _continue_editing="Save and Continue Editing", + ), + ) assert rv.status_code == 302 assert rv.location.startswith(expected) - assert 'url=/admin/model1/' in rv.location - assert 'id=2' in rv.location + assert "url=/admin/model1/" in rv.location + assert "id=2" in rv.location def test_simple_list_pager(app, db, admin): @@ -2514,99 +2740,132 @@ def test_customising_page_size(app, db, admin): with app.app_context(): M1, _ = create_models(db) - db.session.add_all( - [M1(str(f'instance-{x+1:03d}')) for x in range(101)] - ) + db.session.add_all([M1(str(f"instance-{x+1:03d}")) for x in range(101)]) - view1 = CustomModelView(M1, db.session, endpoint='view1', page_size=20, can_set_page_size=False) + view1 = CustomModelView( + M1, db.session, endpoint="view1", page_size=20, can_set_page_size=False + ) admin.add_view(view1) - view2 = CustomModelView(M1, db.session, endpoint='view2', page_size=5, can_set_page_size=False) + view2 = CustomModelView( + M1, db.session, endpoint="view2", page_size=5, can_set_page_size=False + ) admin.add_view(view2) - view3 = CustomModelView(M1, db.session, endpoint='view3', page_size=20, can_set_page_size=True) + view3 = CustomModelView( + M1, db.session, endpoint="view3", page_size=20, can_set_page_size=True + ) admin.add_view(view3) - view4 = CustomModelView(M1, db.session, endpoint='view4', page_size=5, page_size_options=(5, 10, 15), can_set_page_size=True) + view4 = CustomModelView( + M1, + db.session, + endpoint="view4", + page_size=5, + page_size_options=(5, 10, 15), + can_set_page_size=True, + ) admin.add_view(view4) client = app.test_client() - rv = client.get('/admin/view1/') - assert 'instance-020' in rv.text - assert 'instance-021' not in rv.text + rv = client.get("/admin/view1/") + assert "instance-020" in rv.text + assert "instance-021" not in rv.text # `can_set_page_size=False`, so only the default of 20 is available. - rv = client.get('/admin/view1/?page_size=50') - assert 'instance-020' in rv.text - assert 'instance-021' not in rv.text + rv = client.get("/admin/view1/?page_size=50") + assert "instance-020" in rv.text + assert "instance-021" not in rv.text # Check view2, which has `page_size=5` to change the default page size - rv = client.get('/admin/view2/') - assert 'instance-005' in rv.text - assert 'instance-006' not in rv.text + rv = client.get("/admin/view2/") + assert "instance-005" in rv.text + assert "instance-006" not in rv.text # Check view3, which has `can_set_page_size=True` - rv = client.get('/admin/view3/') - assert 'instance-020' in rv.text - assert 'instance-021' not in rv.text + rv = client.get("/admin/view3/") + assert "instance-020" in rv.text + assert "instance-021" not in rv.text - rv = client.get('/admin/view3/?page_size=50') - assert 'instance-050' in rv.text - assert 'instance-051' not in rv.text + rv = client.get("/admin/view3/?page_size=50") + assert "instance-050" in rv.text + assert "instance-051" not in rv.text - rv = client.get('/admin/view3/?page_size=100') - assert 'instance-100' in rv.text - assert 'instance-101' not in rv.text + rv = client.get("/admin/view3/?page_size=100") + assert "instance-100" in rv.text + assert "instance-101" not in rv.text # Invalid page sizes are reset to the default - rv = client.get('/admin/view3/?page_size=1') - assert 'instance-020' in rv.text - assert 'instance-021' not in rv.text + rv = client.get("/admin/view3/?page_size=1") + assert "instance-020" in rv.text + assert "instance-021" not in rv.text # Check view4, which has custom `page_size_options` - rv = client.get('/admin/view4/') - assert 'instance-005' in rv.text - assert 'instance-006' not in rv.text + rv = client.get("/admin/view4/") + assert "instance-005" in rv.text + assert "instance-006" not in rv.text # Invalid page sizes are reset to the default - rv = client.get('/admin/view4/?page_size=1') - assert 'instance-005' in rv.text - assert 'instance-006' not in rv.text + rv = client.get("/admin/view4/?page_size=1") + assert "instance-005" in rv.text + assert "instance-006" not in rv.text - rv = client.get('/admin/view4/?page_size=10') - assert 'instance-010' in rv.text - assert 'instance-011' not in rv.text + rv = client.get("/admin/view4/?page_size=10") + assert "instance-010" in rv.text + assert "instance-011" not in rv.text - rv = client.get('/admin/view4/?page_size=15') - assert 'instance-015' in rv.text - assert 'instance-016' not in rv.text + rv = client.get("/admin/view4/?page_size=15") + assert "instance-015" in rv.text + assert "instance-016" not in rv.text def test_unlimited_page_size(app, db, admin): with app.app_context(): M1, _ = create_models(db) - db.session.add_all([M1('1'), M1('2'), M1('3'), M1('4'), M1('5'), M1('6'), - M1('7'), M1('8'), M1('9'), M1('10'), M1('11'), - M1('12'), M1('13'), M1('14'), M1('15'), M1('16'), - M1('17'), M1('18'), M1('19'), M1('20'), M1('21')]) + db.session.add_all( + [ + M1("1"), + M1("2"), + M1("3"), + M1("4"), + M1("5"), + M1("6"), + M1("7"), + M1("8"), + M1("9"), + M1("10"), + M1("11"), + M1("12"), + M1("13"), + M1("14"), + M1("15"), + M1("16"), + M1("17"), + M1("18"), + M1("19"), + M1("20"), + M1("21"), + ] + ) view = CustomModelView(M1, db.session) # test 0 as page_size - _, data = view.get_list(0, None, None, None, None, execute=True, - page_size=0) + _, data = view.get_list(0, None, None, None, None, execute=True, page_size=0) assert len(data) == 21 # test False as page_size - _, data = view.get_list(0, None, None, None, None, execute=True, - page_size=False) + _, data = view.get_list( + 0, None, None, None, None, execute=True, page_size=False + ) assert len(data) == 21 def test_advanced_joins(app, db, admin): with app.app_context(): + class Model1(db.Model): id = db.Column(db.Integer, primary_key=True) val1 = db.Column(db.String(20)) @@ -2617,14 +2876,14 @@ class Model2(db.Model): val2 = db.Column(db.String(20)) model1_id = db.Column(db.Integer, db.ForeignKey(Model1.id)) - model1 = db.relationship(Model1, backref='model2') + model1 = db.relationship(Model1, backref="model2") class Model3(db.Model): id = db.Column(db.Integer, primary_key=True) val2 = db.Column(db.String(20)) model2_id = db.Column(db.Integer, db.ForeignKey(Model2.id)) - model2 = db.relationship(Model2, backref='model3') + model2 = db.relationship(Model2, backref="model3") view1 = CustomModelView(Model1, db.session) admin.add_view(view1) @@ -2636,15 +2895,15 @@ class Model3(db.Model): admin.add_view(view3) # Test joins - attr, path = tools.get_field_with_path(Model2, 'model1.val1') + attr, path = tools.get_field_with_path(Model2, "model1.val1") assert attr == Model1.val1 assert path == [Model2.model1] - attr, path = tools.get_field_with_path(Model1, 'model2.val2') + attr, path = tools.get_field_with_path(Model1, "model2.val2") assert attr == Model2.val2 assert id(path[0]) == id(Model1.model2) - attr, path = tools.get_field_with_path(Model3, 'model2.model1.val1') + attr, path = tools.get_field_with_path(Model3, "model2.model1.val1") assert attr == Model1.val1 assert path == [Model3.model2, Model2.model1] @@ -2658,12 +2917,12 @@ class Model3(db.Model): assert alias is not None # Check if another join would use same path - attr, path = tools.get_field_with_path(Model2, 'model1.test') + attr, path = tools.get_field_with_path(Model2, "model1.test") q2, joins, alias = view2._apply_path_joins(query, joins, path) assert len(joins) == 2 - if hasattr(q2, '_join_entities'): + if hasattr(q2, "_join_entities"): for p in q2._join_entities: assert p in q1._join_entities @@ -2681,6 +2940,7 @@ class Model3(db.Model): def test_multipath_joins(app, db, admin): with app.app_context(): + class Model1(db.Model): id = db.Column(db.Integer, primary_key=True) val1 = db.Column(db.String(20)) @@ -2691,35 +2951,36 @@ class Model2(db.Model): val2 = db.Column(db.String(20)) first_id = db.Column(db.Integer, db.ForeignKey(Model1.id)) - first = db.relationship(Model1, backref='first', foreign_keys=[first_id]) + first = db.relationship(Model1, backref="first", foreign_keys=[first_id]) second_id = db.Column(db.Integer, db.ForeignKey(Model1.id)) - second = db.relationship(Model1, backref='second', foreign_keys=[second_id]) + second = db.relationship(Model1, backref="second", foreign_keys=[second_id]) db.create_all() - view = CustomModelView(Model2, db.session, filters=['first.test']) + view = CustomModelView(Model2, db.session, filters=["first.test"]) admin.add_view(view) client = app.test_client() - rv = client.get('/admin/model2/') + rv = client.get("/admin/model2/") assert rv.status_code == 200 def test_different_bind_joins(request, app): - app.config['SQLALCHEMY_BINDS'] = {'other': 'sqlite:///'} + app.config["SQLALCHEMY_BINDS"] = {"other": "sqlite:///"} - db = request.getfixturevalue('db') - admin = request.getfixturevalue('admin') + db = request.getfixturevalue("db") + admin = request.getfixturevalue("admin") with app.app_context(): + class Model1(db.Model): id = db.Column(db.Integer, primary_key=True) val1 = db.Column(db.String(20)) class Model2(db.Model): - __bind_key__ = 'other' + __bind_key__ = "other" id = db.Column(db.Integer, primary_key=True) val1 = db.Column(db.String(20)) first_id = db.Column(db.Integer, db.ForeignKey(Model1.id)) @@ -2732,7 +2993,7 @@ class Model2(db.Model): client = app.test_client() - rv = client.get('/admin/model2/') + rv = client.get("/admin/model2/") assert rv.status_code == 200 @@ -2747,8 +3008,8 @@ class ModelView(CustomModelView): admin.add_view(view) client = app.test_client() - rv = client.post('/admin/model2/new/', data=dict()) - assert b'This field is required' not in rv.data + rv = client.post("/admin/model2/new/", data=dict()) + assert b"This field is required" not in rv.data def test_export_csv(app, db, admin): @@ -2758,28 +3019,40 @@ def test_export_csv(app, db, admin): for x in range(5): fill_db(db, Model1, Model2) - view1 = CustomModelView(Model1, db.session, can_export=True, - column_list=['test1', 'test2'], export_max_rows=2, - endpoint='row_limit_2') + view1 = CustomModelView( + Model1, + db.session, + can_export=True, + column_list=["test1", "test2"], + export_max_rows=2, + endpoint="row_limit_2", + ) admin.add_view(view1) - view2 = CustomModelView(Model1, db.session, can_export=True, - column_list=['test1', 'test2'], - endpoint='no_row_limit') + view2 = CustomModelView( + Model1, + db.session, + can_export=True, + column_list=["test1", "test2"], + endpoint="no_row_limit", + ) admin.add_view(view2) client = app.test_client() # test export_max_rows - rv = client.get('/admin/row_limit_2/export/csv/') - data = rv.data.decode('utf-8') - assert rv.status_code == 200 - assert "Test1,Test2\r\n" + \ - "test1_val_1,test2_val_1\r\n" + \ - "test1_val_2,test2_val_2\r\n" == data + rv = client.get("/admin/row_limit_2/export/csv/") + data = rv.data.decode("utf-8") + assert rv.status_code == 200 + assert ( + "Test1,Test2\r\n" + + "test1_val_1,test2_val_1\r\n" + + "test1_val_2,test2_val_2\r\n" + == data + ) # test row limit without export_max_rows - rv = client.get('/admin/no_row_limit/export/csv/') - data = rv.data.decode('utf-8') + rv = client.get("/admin/no_row_limit/export/csv/") + data = rv.data.decode("utf-8") assert rv.status_code == 200 assert len(data.splitlines()) > 21 @@ -2789,15 +3062,18 @@ def test_export_csv(app, db, admin): def test_string_null_behavior(app, db, admin): with app.app_context(): + class StringTestModel(db.Model): id = db.Column(db.Integer, primary_key=True) test_no = db.Column(db.Integer, nullable=False) string_field = db.Column(db.String) string_field_nonull = db.Column(db.String, nullable=False) - string_field_nonull_default = db.Column(db.String, nullable=False, default='') + string_field_nonull_default = db.Column( + db.String, nullable=False, default="" + ) text_field = db.Column(db.Text) text_field_nonull = db.Column(db.Text, nullable=False) - text_field_nonull_default = db.Column(db.Text, nullable=False, default='') + text_field_nonull_default = db.Column(db.Text, nullable=False, default="") db.create_all() @@ -2811,18 +3087,19 @@ class StringTestModel(db.Model): "string_field_nonull": STRING_CONSTANT, "text_field_nonull": STRING_CONSTANT, } - rv = client.post('/admin/stringtestmodel/new/', - data=valid_params) + rv = client.post("/admin/stringtestmodel/new/", data=valid_params) assert rv.status_code == 302 # Assert on defaults - valid_inst = db.session.query(StringTestModel).filter(StringTestModel.test_no == 1).one() + valid_inst = ( + db.session.query(StringTestModel).filter(StringTestModel.test_no == 1).one() + ) assert valid_inst.string_field is None assert valid_inst.string_field_nonull == STRING_CONSTANT - assert valid_inst.string_field_nonull_default == '' + assert valid_inst.string_field_nonull_default == "" assert valid_inst.text_field is None assert valid_inst.text_field_nonull == STRING_CONSTANT - assert valid_inst.text_field_nonull_default == '' + assert valid_inst.text_field_nonull_default == "" # Assert that nulls are caught on the non-null fields invalid_string_field = { @@ -2830,22 +3107,26 @@ class StringTestModel(db.Model): "string_field_nonull": None, "text_field_nonull": STRING_CONSTANT, } - rv = client.post('/admin/stringtestmodel/new/', - data=invalid_string_field) + rv = client.post("/admin/stringtestmodel/new/", data=invalid_string_field) assert rv.status_code == 200 - assert b'This field is required.' in rv.data - assert db.session.query(StringTestModel).filter(StringTestModel.test_no == 2).all() == [] + assert b"This field is required." in rv.data + assert ( + db.session.query(StringTestModel).filter(StringTestModel.test_no == 2).all() + == [] + ) invalid_text_field = { "test_no": 3, "string_field_nonull": STRING_CONSTANT, "text_field_nonull": None, } - rv = client.post('/admin/stringtestmodel/new/', - data=invalid_text_field) + rv = client.post("/admin/stringtestmodel/new/", data=invalid_text_field) assert rv.status_code == 200 - assert b'This field is required.' in rv.data - assert db.session.query(StringTestModel).filter(StringTestModel.test_no == 3).all() == [] + assert b"This field is required." in rv.data + assert ( + db.session.query(StringTestModel).filter(StringTestModel.test_no == 3).all() + == [] + ) # Assert that empty strings are converted to None on nullable fields. empty_strings = { @@ -2855,9 +3136,10 @@ class StringTestModel(db.Model): "string_field_nonull": STRING_CONSTANT, "text_field_nonull": STRING_CONSTANT, } - rv = client.post('/admin/stringtestmodel/new/', - data=empty_strings) + rv = client.post("/admin/stringtestmodel/new/", data=empty_strings) assert rv.status_code == 302 - empty_string_inst = db.session.query(StringTestModel).filter(StringTestModel.test_no == 4).one() + empty_string_inst = ( + db.session.query(StringTestModel).filter(StringTestModel.test_no == 4).one() + ) assert empty_string_inst.string_field is None assert empty_string_inst.text_field is None diff --git a/flask_admin/tests/sqla/test_form_rules.py b/flask_admin/tests/sqla/test_form_rules.py index 53ce55c32..11a5c3de8 100644 --- a/flask_admin/tests/sqla/test_form_rules.py +++ b/flask_admin/tests/sqla/test_form_rules.py @@ -1,9 +1,10 @@ import pytest -from .test_basic import CustomModelView, create_models - from flask_admin.form import rules +from .test_basic import create_models +from .test_basic import CustomModelView + @pytest.mark.filterwarnings("ignore:Fields missing:UserWarning") def test_form_rules(app, db, admin): @@ -11,20 +12,21 @@ def test_form_rules(app, db, admin): Model1, _ = create_models(db) db.create_all() - view = CustomModelView(Model1, db.session, - form_rules=('test2', 'test1', rules.Field('test4'))) + view = CustomModelView( + Model1, db.session, form_rules=("test2", "test1", rules.Field("test4")) + ) admin.add_view(view) client = app.test_client() - rv = client.get('/admin/model1/new/') + rv = client.get("/admin/model1/new/") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - pos1 = data.find('Test1') - pos2 = data.find('Test2') - pos3 = data.find('Test3') - pos4 = data.find('Test4') + data = rv.data.decode("utf-8") + pos1 = data.find("Test1") + pos2 = data.find("Test2") + pos3 = data.find("Test3") + pos4 = data.find("Test4") assert pos1 > pos2 assert pos4 > pos1 assert pos3 == -1 @@ -36,20 +38,25 @@ def test_rule_macro(app, db, admin): Model1, _ = create_models(db) db.create_all() - view = CustomModelView(Model1, db.session, - create_template='macro.html', - form_create_rules=(rules.Macro('test', arg='foobar'), - rules.Macro('test_lib.another_test'))) + view = CustomModelView( + Model1, + db.session, + create_template="macro.html", + form_create_rules=( + rules.Macro("test", arg="foobar"), + rules.Macro("test_lib.another_test"), + ), + ) admin.add_view(view) client = app.test_client() - rv = client.get('/admin/model1/new/') + rv = client.get("/admin/model1/new/") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'Value = foobar' in data - assert 'Hello another_test' in data + data = rv.data.decode("utf-8") + assert "Value = foobar" in data + assert "Hello another_test" in data @pytest.mark.filterwarnings("ignore:Fields missing:UserWarning") @@ -58,20 +65,25 @@ def test_rule_container(app, db, admin): Model1, _ = create_models(db) db.create_all() - view = CustomModelView(Model1, db.session, - create_template='macro.html', - form_create_rules=(rules.Container('wrap', rules.Macro('test_lib.another_test')),)) + view = CustomModelView( + Model1, + db.session, + create_template="macro.html", + form_create_rules=( + rules.Container("wrap", rules.Macro("test_lib.another_test")), + ), + ) admin.add_view(view) client = app.test_client() - rv = client.get('/admin/model1/new/') + rv = client.get("/admin/model1/new/") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - pos1 = data.find('<wrapper>') - pos2 = data.find('another_test') - pos3 = data.find('</wrapper>') + data = rv.data.decode("utf-8") + pos1 = data.find("<wrapper>") + pos2 = data.find("another_test") + pos3 = data.find("</wrapper>") assert pos1 != -1 assert pos2 != -1 assert pos3 != -1 @@ -84,17 +96,18 @@ def test_rule_header(app, db, admin): Model1, _ = create_models(db) db.create_all() - view = CustomModelView(Model1, db.session, - form_create_rules=(rules.Header('hello'),)) + view = CustomModelView( + Model1, db.session, form_create_rules=(rules.Header("hello"),) + ) admin.add_view(view) client = app.test_client() - rv = client.get('/admin/model1/new/') + rv = client.get("/admin/model1/new/") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert '<h3>hello</h3>' in data + data = rv.data.decode("utf-8") + assert "<h3>hello</h3>" in data @pytest.mark.filterwarnings("ignore:Fields missing:UserWarning") @@ -103,21 +116,24 @@ def test_rule_field_set(app, db, admin): Model1, _ = create_models(db) db.create_all() - view = CustomModelView(Model1, db.session, - form_create_rules=(rules.FieldSet(['test2', 'test1', 'test4'], 'header'),)) + view = CustomModelView( + Model1, + db.session, + form_create_rules=(rules.FieldSet(["test2", "test1", "test4"], "header"),), + ) admin.add_view(view) client = app.test_client() - rv = client.get('/admin/model1/new/') + rv = client.get("/admin/model1/new/") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert '<h3>header</h3>' in data - pos1 = data.find('Test1') - pos2 = data.find('Test2') - pos3 = data.find('Test3') - pos4 = data.find('Test4') + data = rv.data.decode("utf-8") + assert "<h3>header</h3>" in data + pos1 = data.find("Test1") + pos2 = data.find("Test2") + pos3 = data.find("Test3") + pos4 = data.find("Test4") assert pos1 > pos2 assert pos4 > pos1 assert pos3 == -1 @@ -132,14 +148,17 @@ def test_rule_inlinefieldlist(app, db, admin): Model1, Model2 = create_models(db) db.create_all() - view = CustomModelView(Model1, db.session, - inline_models=(Model2,), - form_create_rules=('test1', 'model2')) + view = CustomModelView( + Model1, + db.session, + inline_models=(Model2,), + form_create_rules=("test1", "model2"), + ) admin.add_view(view) client = app.test_client() - rv = client.get('/admin/model1/new/') + rv = client.get("/admin/model1/new/") assert rv.status_code == 200 @@ -151,14 +170,17 @@ def test_inline_model_rules(app, db, admin): Model1, Model2 = create_models(db) db.create_all() - view = CustomModelView(Model1, db.session, - inline_models=[(Model2, dict(form_rules=('string_field', 'bool_field')))]) + view = CustomModelView( + Model1, + db.session, + inline_models=[(Model2, dict(form_rules=("string_field", "bool_field")))], + ) admin.add_view(view) client = app.test_client() - rv = client.get('/admin/model1/new/') + rv = client.get("/admin/model1/new/") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'int_field' not in data + data = rv.data.decode("utf-8") + assert "int_field" not in data diff --git a/flask_admin/tests/sqla/test_inlineform.py b/flask_admin/tests/sqla/test_inlineform.py index eaf74baa7..c3b476bcf 100644 --- a/flask_admin/tests/sqla/test_inlineform.py +++ b/flask_admin/tests/sqla/test_inlineform.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- from wtforms import fields from flask_admin import form @@ -13,7 +12,7 @@ def test_inline_form(app, db, admin): # Set up models and database class User(db.Model): - __tablename__ = 'users' + __tablename__ = "users" id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String, unique=True) @@ -21,12 +20,17 @@ def __init__(self, name=None): self.name = name class UserInfo(db.Model): - __tablename__ = 'user_info' + __tablename__ = "user_info" id = db.Column(db.Integer, primary_key=True) key = db.Column(db.String, nullable=False) val = db.Column(db.String) user_id = db.Column(db.Integer, db.ForeignKey(User.id)) - user = db.relationship(User, backref=db.backref('info', cascade="all, delete-orphan", single_parent=True)) + user = db.relationship( + User, + backref=db.backref( + "info", cascade="all, delete-orphan", single_parent=True + ), + ) db.create_all() @@ -40,67 +44,67 @@ class UserModelView(ModelView): # Basic tests assert view._create_form_class is not None assert view._edit_form_class is not None - assert view.endpoint == 'user' + assert view.endpoint == "user" # Verify form assert view._create_form_class.name.field_class == fields.StringField assert view._create_form_class.info.field_class == InlineModelFormList - rv = client.get('/admin/user/') + rv = client.get("/admin/user/") assert rv.status_code == 200 - rv = client.get('/admin/user/new/') + rv = client.get("/admin/user/new/") assert rv.status_code == 200 # Create - rv = client.post('/admin/user/new/', data=dict(name=u'äõüxyz')) + rv = client.post("/admin/user/new/", data=dict(name="äõüxyz")) assert rv.status_code == 302 assert User.query.count() == 1 assert UserInfo.query.count() == 0 - data = {'name': u'fbar', 'info-0-key': 'foo', 'info-0-val': 'bar'} - rv = client.post('/admin/user/new/', data=data) + data = {"name": "fbar", "info-0-key": "foo", "info-0-val": "bar"} + rv = client.post("/admin/user/new/", data=data) assert rv.status_code == 302 assert User.query.count() == 2 assert UserInfo.query.count() == 1 # Edit - rv = client.get('/admin/user/edit/?id=2') + rv = client.get("/admin/user/edit/?id=2") assert rv.status_code == 200 # Edit - update data = { - 'name': u'barfoo', - 'info-0-id': 1, - 'info-0-key': u'xxx', - 'info-0-val': u'yyy', + "name": "barfoo", + "info-0-id": 1, + "info-0-key": "xxx", + "info-0-val": "yyy", } - rv = client.post('/admin/user/edit/?id=2', data=data) + rv = client.post("/admin/user/edit/?id=2", data=data) assert UserInfo.query.count() == 1 - assert UserInfo.query.one().key == u'xxx' + assert UserInfo.query.one().key == "xxx" # Edit - add & delete data = { - 'name': u'barf', - 'del-info-0': 'on', - 'info-0-id': '1', - 'info-0-key': 'yyy', - 'info-0-val': 'xxx', - 'info-1-id': None, - 'info-1-key': u'bar', - 'info-1-val': u'foo', + "name": "barf", + "del-info-0": "on", + "info-0-id": "1", + "info-0-key": "yyy", + "info-0-val": "xxx", + "info-1-id": None, + "info-1-key": "bar", + "info-1-val": "foo", } - rv = client.post('/admin/user/edit/?id=2', data=data) + rv = client.post("/admin/user/edit/?id=2", data=data) assert rv.status_code == 302 assert User.query.count() == 2 - assert db.session.get(User, 2).name == 'barf' + assert db.session.get(User, 2).name == "barf" assert UserInfo.query.count() == 1 - assert UserInfo.query.one().key == u'bar' + assert UserInfo.query.one().key == "bar" # Delete - rv = client.post('/admin/user/delete/?id=2') + rv = client.post("/admin/user/delete/?id=2") assert rv.status_code == 302 assert User.query.count() == 1 - rv = client.post('/admin/user/delete/?id=1') + rv = client.post("/admin/user/delete/?id=1") assert rv.status_code == 302 assert User.query.count() == 0 assert UserInfo.query.count() == 0 @@ -112,7 +116,7 @@ def test_inline_form_required(app, db, admin): # Set up models and database class User(db.Model): - __tablename__ = 'users' + __tablename__ = "users" id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String, unique=True) @@ -120,46 +124,49 @@ def __init__(self, name=None): self.name = name class UserEmail(db.Model): - __tablename__ = 'user_info' + __tablename__ = "user_info" id = db.Column(db.Integer, primary_key=True) email = db.Column(db.String, nullable=False, unique=True) verified_at = db.Column(db.DateTime) user_id = db.Column(db.Integer, db.ForeignKey(User.id)) - user = db.relationship(User, backref=db.backref('emails', cascade="all, delete-orphan", single_parent=True)) + user = db.relationship( + User, + backref=db.backref( + "emails", cascade="all, delete-orphan", single_parent=True + ), + ) db.create_all() # Set up Admin class UserModelView(ModelView): inline_models = (UserEmail,) - form_args = { - "emails": {"validators": [ItemsRequired()]} - } + form_args = {"emails": {"validators": [ItemsRequired()]}} view = UserModelView(User, db.session) admin.add_view(view) # Create - rv = client.post('/admin/user/new/', data=dict(name=u'no-email')) + rv = client.post("/admin/user/new/", data=dict(name="no-email")) assert rv.status_code == 200 assert User.query.count() == 0 data = { - 'name': 'hasEmail', - 'emails-0-email': 'foo@bar.com', + "name": "hasEmail", + "emails-0-email": "foo@bar.com", } - rv = client.post('/admin/user/new/', data=data) + rv = client.post("/admin/user/new/", data=data) assert rv.status_code == 302 assert User.query.count() == 1 assert UserEmail.query.count() == 1 # Attempted delete, prevented by ItemsRequired data = { - 'name': 'hasEmail', - 'del-emails-0': 'on', - 'emails-0-email': 'foo@bar.com', + "name": "hasEmail", + "del-emails-0": "on", + "emails-0-email": "foo@bar.com", } - rv = client.post('/admin/user/edit/?id=1', data=data) + rv = client.post("/admin/user/edit/?id=1", data=data) assert rv.status_code == 200 assert User.query.count() == 1 assert UserEmail.query.count() == 1 @@ -169,7 +176,7 @@ def test_inline_form_ajax_fk(app, db, admin): with app.app_context(): # Set up models and database class User(db.Model): - __tablename__ = 'users' + __tablename__ = "users" id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String, unique=True) @@ -177,34 +184,33 @@ def __init__(self, name=None): self.name = name class Tag(db.Model): - __tablename__ = 'tags' + __tablename__ = "tags" id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String, unique=True) class UserInfo(db.Model): - __tablename__ = 'user_info' + __tablename__ = "user_info" id = db.Column(db.Integer, primary_key=True) key = db.Column(db.String, nullable=False) val = db.Column(db.String) user_id = db.Column(db.Integer, db.ForeignKey(User.id)) - user = db.relationship(User, backref=db.backref('info', cascade="all, delete-orphan", single_parent=True)) + user = db.relationship( + User, + backref=db.backref( + "info", cascade="all, delete-orphan", single_parent=True + ), + ) tag_id = db.Column(db.Integer, db.ForeignKey(Tag.id)) - tag = db.relationship(Tag, backref='user_info') + tag = db.relationship(Tag, backref="user_info") db.create_all() # Set up Admin class UserModelView(ModelView): - opts = { - 'form_ajax_refs': { - 'tag': { - 'fields': ['name'] - } - } - } + opts = {"form_ajax_refs": {"tag": {"fields": ["name"]}}} inline_models = [(UserInfo, opts)] @@ -214,18 +220,19 @@ class UserModelView(ModelView): form = view.create_form() user_info_form = form.info.unbound_field.args[0] loader = user_info_form.tag.args[0] - assert loader.name == 'userinfo-tag' + assert loader.name == "userinfo-tag" assert loader.model == Tag - assert 'userinfo-tag' in view._form_ajax_refs + assert "userinfo-tag" in view._form_ajax_refs def test_inline_form_self(app, db, admin): with app.app_context(): + class Tree(db.Model): id = db.Column(db.Integer, primary_key=True) - parent_id = db.Column(db.Integer, db.ForeignKey('tree.id')) - parent = db.relationship('Tree', remote_side=[id], backref='children') + parent_id = db.Column(db.Integer, db.ForeignKey("tree.id")) + parent = db.relationship("Tree", remote_side=[id], backref="children") db.create_all() @@ -246,7 +253,7 @@ def test_inline_form_base_class(app, db, admin): with app.app_context(): # Set up models and database class User(db.Model): - __tablename__ = 'users' + __tablename__ = "users" id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String, unique=True) @@ -254,22 +261,27 @@ def __init__(self, name=None): self.name = name class UserEmail(db.Model): - __tablename__ = 'user_info' + __tablename__ = "user_info" id = db.Column(db.Integer, primary_key=True) email = db.Column(db.String, nullable=False, unique=True) verified_at = db.Column(db.DateTime) user_id = db.Column(db.Integer, db.ForeignKey(User.id)) - user = db.relationship(User, backref=db.backref('emails', cascade="all, delete-orphan", single_parent=True)) + user = db.relationship( + User, + backref=db.backref( + "emails", cascade="all, delete-orphan", single_parent=True + ), + ) db.create_all() # Customize error message - class StubTranslation(object): + class StubTranslation: def gettext(self, *args): - return 'success!' + return "success!" def ngettext(self, *args): - return 'success!' + return "success!" class StubBaseForm(form.BaseForm): class Meta: @@ -279,19 +291,17 @@ def get_translations(self, form): # Set up Admin class UserModelView(ModelView): inline_models = ((UserEmail, {"form_base_class": StubBaseForm}),) - form_args = { - "emails": {"validators": [ItemsRequired()]} - } + form_args = {"emails": {"validators": [ItemsRequired()]}} view = UserModelView(User, db.session) admin.add_view(view) # Create data = { - 'name': 'emptyEmail', - 'emails-0-email': '', + "name": "emptyEmail", + "emails-0-email": "", } - rv = client.post('/admin/user/new/', data=data) + rv = client.post("/admin/user/new/", data=data) assert rv.status_code == 200 assert User.query.count() == 0 - assert b'success!' in rv.data, rv.data + assert b"success!" in rv.data, rv.data diff --git a/flask_admin/tests/sqla/test_multi_pk.py b/flask_admin/tests/sqla/test_multi_pk.py index bbb769bfd..c5bf0e478 100644 --- a/flask_admin/tests/sqla/test_multi_pk.py +++ b/flask_admin/tests/sqla/test_multi_pk.py @@ -1,12 +1,13 @@ -from .test_basic import CustomModelView - from flask_sqlalchemy.model import Model from sqlalchemy.orm import declarative_base +from .test_basic import CustomModelView + def test_multiple_pk(app, db, admin): # Test multiple primary keys - mix int and string together with app.app_context(): + class Model(db.Model): id = db.Column(db.Integer, primary_key=True) id2 = db.Column(db.String(20), primary_key=True) @@ -14,153 +15,152 @@ class Model(db.Model): db.create_all() - view = CustomModelView(Model, db.session, form_columns=['id', 'id2', 'test']) + view = CustomModelView(Model, db.session, form_columns=["id", "id2", "test"]) admin.add_view(view) client = app.test_client() - rv = client.get('/admin/model/') + rv = client.get("/admin/model/") assert rv.status_code == 200 - rv = client.post('/admin/model/new/', - data=dict(id=1, id2='two', test='test3')) + rv = client.post("/admin/model/new/", data=dict(id=1, id2="two", test="test3")) assert rv.status_code == 302 - rv = client.get('/admin/model/') + rv = client.get("/admin/model/") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test3' in data + data = rv.data.decode("utf-8") + assert "test3" in data - rv = client.get('/admin/model/edit/?id=1,two') + rv = client.get("/admin/model/edit/?id=1,two") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test3' in data + data = rv.data.decode("utf-8") + assert "test3" in data # Correct order is mandatory -> fail here - rv = client.get('/admin/model/edit/?id=two,1') + rv = client.get("/admin/model/edit/?id=two,1") assert rv.status_code == 302 def test_joined_inheritance(app, db, admin): # Test multiple primary keys - mix int and string together with app.app_context(): + class Parent(db.Model): id = db.Column(db.Integer, primary_key=True) test = db.Column(db.String) - discriminator = db.Column('type', db.String(50)) - __mapper_args__ = {'polymorphic_on': discriminator} + discriminator = db.Column("type", db.String(50)) + __mapper_args__ = {"polymorphic_on": discriminator} class Child(Parent): - __tablename__ = 'children' - __mapper_args__ = {'polymorphic_identity': 'child'} + __tablename__ = "children" + __mapper_args__ = {"polymorphic_identity": "child"} id = db.Column(db.ForeignKey(Parent.id), primary_key=True) name = db.Column(db.String(100)) db.create_all() - view = CustomModelView(Child, db.session, form_columns=['id', 'test', 'name']) + view = CustomModelView(Child, db.session, form_columns=["id", "test", "name"]) admin.add_view(view) client = app.test_client() - rv = client.get('/admin/child/') + rv = client.get("/admin/child/") assert rv.status_code == 200 - rv = client.post('/admin/child/new/', - data=dict(id=1, test='foo', name='bar')) + rv = client.post("/admin/child/new/", data=dict(id=1, test="foo", name="bar")) assert rv.status_code == 302 - rv = client.get('/admin/child/edit/?id=1') + rv = client.get("/admin/child/edit/?id=1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'foo' in data - assert 'bar' in data + data = rv.data.decode("utf-8") + assert "foo" in data + assert "bar" in data def test_single_table_inheritance(app, db, admin): # Test multiple primary keys - mix int and string together with app.app_context(): - CustomModel = declarative_base(cls=Model, name='Model') + CustomModel = declarative_base(cls=Model, name="Model") class Parent(CustomModel): - __tablename__ = 'parent' + __tablename__ = "parent" id = db.Column(db.Integer, primary_key=True) test = db.Column(db.String) - discriminator = db.Column('type', db.String(50)) - __mapper_args__ = {'polymorphic_on': discriminator} + discriminator = db.Column("type", db.String(50)) + __mapper_args__ = {"polymorphic_on": discriminator} class Child(Parent): - __mapper_args__ = {'polymorphic_identity': 'child'} + __mapper_args__ = {"polymorphic_identity": "child"} name = db.Column(db.String(100)) CustomModel.metadata.create_all(db.engine) - view = CustomModelView(Child, db.session, form_columns=['id', 'test', 'name']) + view = CustomModelView(Child, db.session, form_columns=["id", "test", "name"]) admin.add_view(view) client = app.test_client() - rv = client.get('/admin/child/') + rv = client.get("/admin/child/") assert rv.status_code == 200 - rv = client.post('/admin/child/new/', - data=dict(id=1, test='foo', name='bar')) + rv = client.post("/admin/child/new/", data=dict(id=1, test="foo", name="bar")) assert rv.status_code == 302 - rv = client.get('/admin/child/edit/?id=1') + rv = client.get("/admin/child/edit/?id=1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'foo' in data - assert 'bar' in data + data = rv.data.decode("utf-8") + assert "foo" in data + assert "bar" in data def test_concrete_table_inheritance(app, db, admin): # Test multiple primary keys - mix int and string together with app.app_context(): + class Parent(db.Model): id = db.Column(db.Integer, primary_key=True) test = db.Column(db.String) class Child(Parent): - __mapper_args__ = {'concrete': True} + __mapper_args__ = {"concrete": True} id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100)) test = db.Column(db.String) db.create_all() - view = CustomModelView(Child, db.session, form_columns=['id', 'test', 'name']) + view = CustomModelView(Child, db.session, form_columns=["id", "test", "name"]) admin.add_view(view) client = app.test_client() - rv = client.get('/admin/child/') + rv = client.get("/admin/child/") assert rv.status_code == 200 - rv = client.post('/admin/child/new/', - data=dict(id=1, test='foo', name='bar')) + rv = client.post("/admin/child/new/", data=dict(id=1, test="foo", name="bar")) assert rv.status_code == 302 - rv = client.get('/admin/child/edit/?id=1') + rv = client.get("/admin/child/edit/?id=1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'foo' in data - assert 'bar' in data + data = rv.data.decode("utf-8") + assert "foo" in data + assert "bar" in data def test_concrete_multipk_inheritance(app, db, admin): # Test multiple primary keys - mix int and string together with app.app_context(): + class Parent(db.Model): id = db.Column(db.Integer, primary_key=True) test = db.Column(db.String) class Child(Parent): - __mapper_args__ = {'concrete': True} + __mapper_args__ = {"concrete": True} id = db.Column(db.Integer, primary_key=True) id2 = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100)) @@ -168,20 +168,23 @@ class Child(Parent): db.create_all() - view = CustomModelView(Child, db.session, form_columns=['id', 'id2', 'test', 'name']) + view = CustomModelView( + Child, db.session, form_columns=["id", "id2", "test", "name"] + ) admin.add_view(view) client = app.test_client() - rv = client.get('/admin/child/') + rv = client.get("/admin/child/") assert rv.status_code == 200 - rv = client.post('/admin/child/new/', - data=dict(id=1, id2=2, test='foo', name='bar')) + rv = client.post( + "/admin/child/new/", data=dict(id=1, id2=2, test="foo", name="bar") + ) assert rv.status_code == 302 - rv = client.get('/admin/child/edit/?id=1,2') + rv = client.get("/admin/child/edit/?id=1,2") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'foo' in data - assert 'bar' in data + data = rv.data.decode("utf-8") + assert "foo" in data + assert "bar" in data diff --git a/flask_admin/tests/sqla/test_postgres.py b/flask_admin/tests/sqla/test_postgres.py index 7c23bd307..a9cbc30c1 100644 --- a/flask_admin/tests/sqla/test_postgres.py +++ b/flask_admin/tests/sqla/test_postgres.py @@ -1,14 +1,18 @@ -from .test_basic import CustomModelView - -from sqlalchemy import text -from sqlalchemy.dialects.postgresql import HSTORE, JSON from citext import CIText +from sqlalchemy import text +from sqlalchemy.dialects.postgresql import HSTORE +from sqlalchemy.dialects.postgresql import JSON + +from .test_basic import CustomModelView def test_hstore(app, postgres_db, postgres_admin): with app.app_context(): + class Model(postgres_db.Model): - id = postgres_db.Column(postgres_db.Integer, primary_key=True, autoincrement=True) + id = postgres_db.Column( + postgres_db.Integer, primary_key=True, autoincrement=True + ) hstore_test = postgres_db.Column(HSTORE) postgres_db.create_all() @@ -18,32 +22,35 @@ class Model(postgres_db.Model): client = app.test_client() - rv = client.get('/admin/model/') + rv = client.get("/admin/model/") assert rv.status_code == 200 - rv = client.post('/admin/model/new/', data={ - 'hstore_test-0-key': 'test_val1', - 'hstore_test-0-value': 'test_val2' - }) + rv = client.post( + "/admin/model/new/", + data={"hstore_test-0-key": "test_val1", "hstore_test-0-value": "test_val2"}, + ) assert rv.status_code == 302 - rv = client.get('/admin/model/') + rv = client.get("/admin/model/") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test_val1' in data - assert 'test_val2' in data + data = rv.data.decode("utf-8") + assert "test_val1" in data + assert "test_val2" in data - rv = client.get('/admin/model/edit/?id=1') + rv = client.get("/admin/model/edit/?id=1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test_val1' in data - assert 'test_val2' in data + data = rv.data.decode("utf-8") + assert "test_val1" in data + assert "test_val2" in data def test_json(app, postgres_db, postgres_admin): with app.app_context(): + class JSONModel(postgres_db.Model): - id = postgres_db.Column(postgres_db.Integer, primary_key=True, autoincrement=True) + id = postgres_db.Column( + postgres_db.Integer, primary_key=True, autoincrement=True + ) json_test = postgres_db.Column(JSON) postgres_db.create_all() @@ -53,36 +60,44 @@ class JSONModel(postgres_db.Model): client = app.test_client() - rv = client.get('/admin/jsonmodel/') + rv = client.get("/admin/jsonmodel/") assert rv.status_code == 200 - rv = client.post('/admin/jsonmodel/new/', data={ - 'json_test': '{"test_key1": "test_value1"}', - }) + rv = client.post( + "/admin/jsonmodel/new/", + data={ + "json_test": '{"test_key1": "test_value1"}', + }, + ) assert rv.status_code == 302 - rv = client.get('/admin/jsonmodel/') + rv = client.get("/admin/jsonmodel/") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'json_test' in data - assert '{"test_key1": "test_value1"}' in data + data = rv.data.decode("utf-8") + assert "json_test" in data + assert "{"test_key1": "test_value1"}" in data - rv = client.get('/admin/jsonmodel/edit/?id=1') + rv = client.get("/admin/jsonmodel/edit/?id=1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'json_test' in data - assert ('>{"test_key1": "test_value1"}<' in data or - '{"test_key1": "test_value1"}<' in data) + data = rv.data.decode("utf-8") + assert "json_test" in data + assert ( + '>{"test_key1": "test_value1"}<' in data + or "{"test_key1": "test_value1"}<" in data + ) def test_citext(app, postgres_db, postgres_admin): with app.app_context(): + class CITextModel(postgres_db.Model): - id = postgres_db.Column(postgres_db.Integer, primary_key=True, autoincrement=True) + id = postgres_db.Column( + postgres_db.Integer, primary_key=True, autoincrement=True + ) citext_test = postgres_db.Column(CIText) with postgres_db.engine.begin() as connection: - connection.execute(text('CREATE EXTENSION IF NOT EXISTS citext')) + connection.execute(text("CREATE EXTENSION IF NOT EXISTS citext")) postgres_db.create_all() view = CustomModelView(CITextModel, postgres_db.session) @@ -90,24 +105,25 @@ class CITextModel(postgres_db.Model): client = app.test_client() - rv = client.get('/admin/citextmodel/') + rv = client.get("/admin/citextmodel/") assert rv.status_code == 200 - rv = client.post('/admin/citextmodel/new/', data={ - 'citext_test': 'Foo', - }) + rv = client.post( + "/admin/citextmodel/new/", + data={ + "citext_test": "Foo", + }, + ) assert rv.status_code == 302 - rv = client.get('/admin/citextmodel/') + rv = client.get("/admin/citextmodel/") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'citext_test' in data - assert 'Foo' in data + data = rv.data.decode("utf-8") + assert "citext_test" in data + assert "Foo" in data - rv = client.get('/admin/citextmodel/edit/?id=1') + rv = client.get("/admin/citextmodel/edit/?id=1") assert rv.status_code == 200 - data = rv.data.decode('utf-8') + data = rv.data.decode("utf-8") assert 'name="citext_test"' in data - assert ('>Foo</' in data or - '>\nFoo</' in data or - '>\r\nFoo</' in data) + assert ">Foo</" in data or ">\nFoo</" in data or ">\r\nFoo</" in data diff --git a/flask_admin/tests/sqla/test_translation.py b/flask_admin/tests/sqla/test_translation.py index ba951318b..2f2030fd9 100644 --- a/flask_admin/tests/sqla/test_translation.py +++ b/flask_admin/tests/sqla/test_translation.py @@ -1,8 +1,9 @@ from flask_admin.babel import gettext -from .test_basic import CustomModelView, create_models -from .. import flask_babel_test_decorator from ...contrib.sqla import ModelView +from .. import flask_babel_test_decorator +from .test_basic import create_models +from .test_basic import CustomModelView @flask_babel_test_decorator @@ -11,31 +12,35 @@ def test_column_label_translation(request, app): # initialised, so we have to use `request.getfixturevalue` to pull the fixture # within the test function rather than the test signature. The `admin` fixture # pulls in the `babel` fixture, which will then use the configuration here. - app.config['BABEL_DEFAULT_LOCALE'] = 'es' - db = request.getfixturevalue('db') - admin = request.getfixturevalue('admin') + app.config["BABEL_DEFAULT_LOCALE"] = "es" + db = request.getfixturevalue("db") + admin = request.getfixturevalue("admin") with app.app_context(): Model1, _ = create_models(db) - label = gettext('Name') + label = gettext("Name") - view = CustomModelView(Model1, db.session, - column_list=['test1', 'test3'], - column_labels=dict(test1=label), - column_filters=('test1',)) + view = CustomModelView( + Model1, + db.session, + column_list=["test1", "test3"], + column_labels=dict(test1=label), + column_filters=("test1",), + ) admin.add_view(view) client = app.test_client() - rv = client.get('/admin/model1/?flt1_0=test') + rv = client.get("/admin/model1/?flt1_0=test") assert rv.status_code == 200 - assert '{"Nombre":' in rv.data.decode('utf-8') + assert '{"Nombre":' in rv.data.decode("utf-8") @flask_babel_test_decorator def test_unique_validator_translation_is_dynamic(app, db, admin): with app.app_context(): + class UniqueTable(db.Model): id = db.Column(db.Integer, primary_key=True) value = db.Column(db.String, unique=True) @@ -47,15 +52,28 @@ class UniqueTable(db.Model): admin.add_view(view) client = app.test_client() - rv = client.post('/admin/uniquetable/new', data=dict(id="1", value='hello'), follow_redirects=True) + rv = client.post( + "/admin/uniquetable/new", + data=dict(id="1", value="hello"), + follow_redirects=True, + ) assert rv.status_code == 200 - rv = client.post('/admin/uniquetable/new', data=dict(id="1", value='hello'), follow_redirects=True) + rv = client.post( + "/admin/uniquetable/new", + data=dict(id="1", value="hello"), + follow_redirects=True, + ) assert rv.status_code == 200 assert "Already exists." in rv.text from flask_babel import force_locale - with force_locale('fr'): - rv = client.post('/admin/uniquetable/new', data=dict(id="1", value='hello'), follow_redirects=True) + + with force_locale("fr"): + rv = client.post( + "/admin/uniquetable/new", + data=dict(id="1", value="hello"), + follow_redirects=True, + ) assert rv.status_code == 200 assert "Existe déjà." in rv.text diff --git a/flask_admin/tests/templates/method.html b/flask_admin/tests/templates/method.html index 8e9c6f6ea..9fa96824c 100644 --- a/flask_admin/tests/templates/method.html +++ b/flask_admin/tests/templates/method.html @@ -1 +1 @@ -{{ request.method }} - {{ name }} \ No newline at end of file +{{ request.method }} - {{ name }} diff --git a/flask_admin/tests/templates/mock.html b/flask_admin/tests/templates/mock.html index e2746ad4c..ac0d10c6d 100644 --- a/flask_admin/tests/templates/mock.html +++ b/flask_admin/tests/templates/mock.html @@ -1 +1 @@ -{% if admin_view %}Success!{% else %}Failure{% endif %} \ No newline at end of file +{% if admin_view %}Success!{% else %}Failure{% endif %} diff --git a/flask_admin/tests/test_babel.py b/flask_admin/tests/test_babel.py index b9fe5c11f..b9bf68a31 100644 --- a/flask_admin/tests/test_babel.py +++ b/flask_admin/tests/test_babel.py @@ -2,7 +2,8 @@ import pytest -from flask_admin import babel, translations +from flask_admin import babel +from flask_admin import translations from . import flask_babel_test_decorator diff --git a/flask_admin/tests/test_base.py b/flask_admin/tests/test_base.py index 74664adc5..b79fb3a72 100644 --- a/flask_admin/tests/test_base.py +++ b/flask_admin/tests/test_base.py @@ -1,8 +1,10 @@ import os import pytest - -from flask import Flask, request, abort, url_for +from flask import abort +from flask import Flask +from flask import request +from flask import url_for from flask.views import MethodView from flask_admin import base @@ -14,8 +16,8 @@ def app(): # directory/import path is configured as the root path for Flask. This will # cause the `templates` directory here to be used for template resolution. app = Flask(__name__) - app.config['SECRET_KEY'] = '1' - app.config['WTF_CSRF_ENABLED'] = False + app.config["SECRET_KEY"] = "1" + app.config["WTF_CSRF_ENABLED"] = False yield app @@ -26,19 +28,19 @@ class MockView(base.BaseView): allow_access = True visible = True - @base.expose('/') + @base.expose("/") def index(self): - return 'Success!' + return "Success!" - @base.expose('/test/') + @base.expose("/test/") def test(self): - return self.render('mock.html') + return self.render("mock.html") def _handle_view(self, name, **kwargs): if self.allow_call: return super(MockView, self)._handle_view(name, **kwargs) else: - return 'Failure!' + return "Failure!" def is_accessible(self): if self.allow_access: @@ -54,44 +56,44 @@ def is_visible(self): class MockMethodView(base.BaseView): - @base.expose('/') + @base.expose("/") def index(self): - return 'Success!' + return "Success!" - @base.expose_plugview('/_api/1') + @base.expose_plugview("/_api/1") class API1(MethodView): def get(self, cls): - return cls.render('method.html', request=request, name='API1') + return cls.render("method.html", request=request, name="API1") def post(self, cls): - return cls.render('method.html', request=request, name='API1') + return cls.render("method.html", request=request, name="API1") def put(self, cls): - return cls.render('method.html', request=request, name='API1') + return cls.render("method.html", request=request, name="API1") def delete(self, cls): - return cls.render('method.html', request=request, name='API1') + return cls.render("method.html", request=request, name="API1") - @base.expose_plugview('/_api/2') + @base.expose_plugview("/_api/2") class API2(MethodView): def get(self, cls): - return cls.render('method.html', request=request, name='API2') + return cls.render("method.html", request=request, name="API2") def post(self, cls): - return cls.render('method.html', request=request, name='API2') + return cls.render("method.html", request=request, name="API2") - @base.expose_plugview('/_api/3') - @base.expose_plugview('/_api/4') + @base.expose_plugview("/_api/3") + @base.expose_plugview("/_api/4") class DoubleExpose(MethodView): def get(self, cls): - return cls.render('method.html', request=request, name='API3') + return cls.render("method.html", request=request, name="API3") def test_baseview_defaults(): view = MockView() assert view.name is None assert view.category is None - assert view.endpoint == 'mockview' + assert view.endpoint == "mockview" assert view.url is None assert view.static_folder is None assert view.admin is None @@ -100,12 +102,12 @@ def test_baseview_defaults(): def test_base_defaults(): admin = base.Admin() - assert admin.name == 'Admin' - assert admin.url == '/admin' - assert admin.endpoint == 'admin' + assert admin.name == "Admin" + assert admin.url == "/admin" + assert admin.endpoint == "admin" assert admin.app is None assert admin.index_view is not None - assert admin.index_view._template == 'admin/index.html' + assert admin.index_view._template == "admin/index.html" # Check if default view was added assert len(admin._views) == 1 @@ -113,16 +115,17 @@ def test_base_defaults(): def test_custom_index_view(): - view = base.AdminIndexView(name='a', category='b', endpoint='c', - url='/d', template='e') + view = base.AdminIndexView( + name="a", category="b", endpoint="c", url="/d", template="e" + ) admin = base.Admin(index_view=view) - assert admin.endpoint == 'c' - assert admin.url == '/d' + assert admin.endpoint == "c" + assert admin.url == "/d" assert admin.index_view is view - assert view.name == 'a' - assert view.category == 'b' - assert view._template == 'e' + assert view.name == "a" + assert view.category == "b" + assert view._template == "e" # Check if view was added assert len(admin._views) == 1 @@ -130,17 +133,18 @@ def test_custom_index_view(): def test_custom_index_view_in_init_app(app, babel): - view = base.AdminIndexView(name='a', category='b', endpoint='c', - url='/d', template='e') + view = base.AdminIndexView( + name="a", category="b", endpoint="c", url="/d", template="e" + ) admin = base.Admin() admin.init_app(app, index_view=view) - assert admin.endpoint == 'c' - assert admin.url == '/d' + assert admin.endpoint == "c" + assert admin.url == "/d" assert admin.index_view is view - assert view.name == 'a' - assert view.category == 'b' - assert view._template == 'e' + assert view.name == "a" + assert view.category == "b" + assert view._template == "e" # Check if view was added assert len(admin._views) == 1 @@ -153,18 +157,24 @@ def test_base_registration(app, admin): def test_admin_customizations(app, babel): - admin = base.Admin(app, name='Test', url='/foobar', static_url_path='/static/my/admin') - assert admin.name == 'Test' - assert admin.url == '/foobar' - assert admin.index_view.blueprint.static_url_path == '/static/my/admin' + admin = base.Admin( + app, name="Test", url="/foobar", static_url_path="/static/my/admin" + ) + assert admin.name == "Test" + assert admin.url == "/foobar" + assert admin.index_view.blueprint.static_url_path == "/static/my/admin" client = app.test_client() - rv = client.get('/foobar/') + rv = client.get("/foobar/") assert rv.status_code == 200 # test custom static_url_path - with app.test_request_context('/'): - rv = client.get(url_for('admin.static', filename='bootstrap/bootstrap4/css/bootstrap.min.css')) + with app.test_request_context("/"): + rv = client.get( + url_for( + "admin.static", filename="bootstrap/bootstrap4/css/bootstrap.min.css" + ) + ) assert rv.status_code == 200 @@ -179,39 +189,39 @@ def test_baseview_registration(): assert view.blueprint is not None # Calculated properties - assert view.endpoint == 'mockview' - assert view.url == '/admin/mockview' - assert view.name == 'Mock View' + assert view.endpoint == "mockview" + assert view.url == "/admin/mockview" + assert view.name == "Mock View" # Verify generated blueprint properties assert bp.name == view.endpoint assert bp.url_prefix == view.url - assert bp.template_folder == os.path.join('templates', 'bootstrap4') + assert bp.template_folder == os.path.join("templates", "bootstrap4") assert bp.static_folder == view.static_folder # Verify customizations - view = MockView(name='Test', endpoint='foobar') + view = MockView(name="Test", endpoint="foobar") view.create_blueprint(base.Admin()) - assert view.name == 'Test' - assert view.endpoint == 'foobar' - assert view.url == '/admin/foobar' + assert view.name == "Test" + assert view.endpoint == "foobar" + assert view.url == "/admin/foobar" - view = MockView(url='test') + view = MockView(url="test") view.create_blueprint(base.Admin()) - assert view.url == '/admin/test' + assert view.url == "/admin/test" - view = MockView(url='/test/test') + view = MockView(url="/test/test") view.create_blueprint(base.Admin()) - assert view.url == '/test/test' + assert view.url == "/test/test" - view = MockView(endpoint='test') - view.create_blueprint(base.Admin(url='/')) - assert view.url == '/test' + view = MockView(endpoint="test") + view.create_blueprint(base.Admin(url="/")) + assert view.url == "/test" - view = MockView(static_url_path='/static/my/test') + view = MockView(static_url_path="/static/my/test") view.create_blueprint(base.Admin()) - assert view.blueprint.static_url_path == '/static/my/test' + assert view.blueprint.static_url_path == "/static/my/test" @pytest.mark.filterwarnings("ignore:unclosed file:ResourceWarning") @@ -224,33 +234,33 @@ def test_baseview_urls(admin): @pytest.mark.filterwarnings("ignore:unclosed file:ResourceWarning") def test_add_views(admin): - admin.add_views(MockView(endpoint='test1'), MockView(endpoint='test2')) + admin.add_views(MockView(endpoint="test1"), MockView(endpoint="test2")) assert len(admin.menu()) == 3 def test_add_category(admin): - admin.add_category('Category1', 'class-name', 'icon-type', 'icon-value') - admin.add_view(MockView(name='Test 1', endpoint='test1', category='Category1')) - admin.add_view(MockView(name='Test 2', endpoint='test2', category='Category2')) + admin.add_category("Category1", "class-name", "icon-type", "icon-value") + admin.add_view(MockView(name="Test 1", endpoint="test1", category="Category1")) + admin.add_view(MockView(name="Test 2", endpoint="test2", category="Category2")) assert len(admin.menu()) == 3 # Test 1 should be underneath Category1 - assert admin.menu()[1].name == 'Category1' - assert admin.menu()[1].get_class_name() == 'class-name' - assert admin.menu()[1].get_icon_type() == 'icon-type' - assert admin.menu()[1].get_icon_value() == 'icon-value' + assert admin.menu()[1].name == "Category1" + assert admin.menu()[1].get_class_name() == "class-name" + assert admin.menu()[1].get_icon_type() == "icon-type" + assert admin.menu()[1].get_icon_value() == "icon-value" assert len(admin.menu()[1].get_children()) == 1 - assert admin.menu()[1].get_children()[0].name == 'Test 1' + assert admin.menu()[1].get_children()[0].name == "Test 1" # Test 2 should be underneath Category2 - assert admin.menu()[2].name == 'Category2' + assert admin.menu()[2].name == "Category2" assert admin.menu()[2].get_class_name() is None assert admin.menu()[2].get_icon_type() is None assert admin.menu()[2].get_icon_value() is None assert len(admin.menu()[2].get_children()) == 1 - assert admin.menu()[2].get_children()[0].name == 'Test 2' + assert admin.menu()[2].get_children()[0].name == "Test 2" @pytest.mark.xfail(raises=Exception) @@ -263,19 +273,19 @@ def test_call(app, admin): admin.add_view(view) client = app.test_client() - rv = client.get('/admin/') + rv = client.get("/admin/") assert rv.status_code == 200 - rv = client.get('/admin/mockview/') - assert rv.data == b'Success!' + rv = client.get("/admin/mockview/") + assert rv.data == b"Success!" - rv = client.get('/admin/mockview/test/') - assert rv.data == b'Success!' + rv = client.get("/admin/mockview/test/") + assert rv.data == b"Success!" # Check authentication failure view.allow_call = False - rv = client.get('/admin/mockview/') - assert rv.data == b'Failure!' + rv = client.get("/admin/mockview/") + assert rv.data == b"Failure!" def test_permissions(app, admin): @@ -285,7 +295,7 @@ def test_permissions(app, admin): view.allow_access = False - rv = client.get('/admin/mockview/') + rv = client.get("/admin/mockview/") assert rv.status_code == 403 @@ -297,33 +307,33 @@ def test_inaccessible_callback(app, admin): view.allow_access = False view.inaccessible_callback = lambda *args, **kwargs: abort(418) - rv = client.get('/admin/mockview/') + rv = client.get("/admin/mockview/") assert rv.status_code == 418 def get_visibility(app, admin): - view = MockView(name='TestMenuItem') + view = MockView(name="TestMenuItem") view.visible = False admin.add_view(view) client = app.test_client() - rv = client.get('/admin/mockview/') - assert 'TestMenuItem' not in rv.data.decode('utf-8') + rv = client.get("/admin/mockview/") + assert "TestMenuItem" not in rv.data.decode("utf-8") def test_submenu(admin): - admin.add_view(MockView(name='Test 1', category='Test', endpoint='test1')) + admin.add_view(MockView(name="Test 1", category="Test", endpoint="test1")) # Second view is not normally accessible - view = MockView(name='Test 2', category='Test', endpoint='test2') + view = MockView(name="Test 2", category="Test", endpoint="test2") view.allow_access = False admin.add_view(view) - assert 'Test' in admin._menu_categories + assert "Test" in admin._menu_categories assert len(admin._menu) == 2 - assert admin._menu[1].name == 'Test' + assert admin._menu[1].name == "Test" assert len(admin._menu[1]._children) == 2 # Categories don't have URLs @@ -343,15 +353,15 @@ def test_delayed_init(app, admin): client = app.test_client() - rv = client.get('/admin/mockview/') - assert rv.data == b'Success!' + rv = client.get("/admin/mockview/") + assert rv.data == b"Success!" def test_multi_instances_init(app, admin): class ManageIndex(base.AdminIndexView): pass - _ = base.Admin(app, index_view=ManageIndex(url='/manage', endpoint='manage')) # noqa: F841 + _ = base.Admin(app, index_view=ManageIndex(url="/manage", endpoint="manage")) # noqa: F841 @pytest.mark.xfail(raises=Exception) @@ -365,79 +375,85 @@ def test_nested_flask_views(app, admin): client = app.test_client() - rv = client.get('/admin/mockmethodview/_api/1') + rv = client.get("/admin/mockmethodview/_api/1") print('"', rv.data, '"') - assert rv.data == b'GET - API1' - rv = client.put('/admin/mockmethodview/_api/1') - assert rv.data == b'PUT - API1' - rv = client.post('/admin/mockmethodview/_api/1') - assert rv.data == b'POST - API1' - rv = client.delete('/admin/mockmethodview/_api/1') - assert rv.data == b'DELETE - API1' - - rv = client.get('/admin/mockmethodview/_api/2') - assert rv.data == b'GET - API2' - rv = client.post('/admin/mockmethodview/_api/2') - assert rv.data == b'POST - API2' - rv = client.delete('/admin/mockmethodview/_api/2') + assert rv.data == b"GET - API1" + rv = client.put("/admin/mockmethodview/_api/1") + assert rv.data == b"PUT - API1" + rv = client.post("/admin/mockmethodview/_api/1") + assert rv.data == b"POST - API1" + rv = client.delete("/admin/mockmethodview/_api/1") + assert rv.data == b"DELETE - API1" + + rv = client.get("/admin/mockmethodview/_api/2") + assert rv.data == b"GET - API2" + rv = client.post("/admin/mockmethodview/_api/2") + assert rv.data == b"POST - API2" + rv = client.delete("/admin/mockmethodview/_api/2") assert rv.status_code == 405 - rv = client.put('/admin/mockmethodview/_api/2') + rv = client.put("/admin/mockmethodview/_api/2") assert rv.status_code == 405 - rv = client.get('/admin/mockmethodview/_api/3') - assert rv.data == b'GET - API3' - rv = client.get('/admin/mockmethodview/_api/4') - assert rv.data == b'GET - API3' + rv = client.get("/admin/mockmethodview/_api/3") + assert rv.data == b"GET - API3" + rv = client.get("/admin/mockmethodview/_api/4") + assert rv.data == b"GET - API3" def test_root_mount(app, babel): - admin = base.Admin(app, url='/') + admin = base.Admin(app, url="/") admin.add_view(MockView()) client = app.test_client() - rv = client.get('/mockview/') - assert rv.data == b'Success!' + rv = client.get("/mockview/") + assert rv.data == b"Success!" # test static files when url='/' - with app.test_request_context('/'): - rv = client.get(url_for('admin.static', filename='bootstrap/bootstrap4/css/bootstrap.min.css')) + with app.test_request_context("/"): + rv = client.get( + url_for( + "admin.static", filename="bootstrap/bootstrap4/css/bootstrap.min.css" + ) + ) rv.close() assert rv.status_code == 200 def test_menu_links(app, admin): - admin.add_link(base.MenuLink('TestMenuLink1', endpoint='.index')) - admin.add_link(base.MenuLink('TestMenuLink2', url='http://python.org/')) + admin.add_link(base.MenuLink("TestMenuLink1", endpoint=".index")) + admin.add_link(base.MenuLink("TestMenuLink2", url="http://python.org/")) client = app.test_client() - rv = client.get('/admin/') + rv = client.get("/admin/") - data = rv.data.decode('utf-8') - assert 'TestMenuLink1' in data - assert 'TestMenuLink2' in data + data = rv.data.decode("utf-8") + assert "TestMenuLink1" in data + assert "TestMenuLink2" in data def test_add_links(app, admin): - admin.add_links(base.MenuLink('TestMenuLink1', endpoint='.index'), - base.MenuLink('TestMenuLink2', url='http://python.org/')) + admin.add_links( + base.MenuLink("TestMenuLink1", endpoint=".index"), + base.MenuLink("TestMenuLink2", url="http://python.org/"), + ) client = app.test_client() - rv = client.get('/admin/') + rv = client.get("/admin/") - data = rv.data.decode('utf-8') - assert 'TestMenuLink1' in data - assert 'TestMenuLink2' in data + data = rv.data.decode("utf-8") + assert "TestMenuLink1" in data + assert "TestMenuLink2" in data def check_class_name(): view = MockView() - assert view.name == 'Mock View' + assert view.name == "Mock View" def check_endpoint(): class CustomView(MockView): def _get_endpoint(self, endpoint): - return 'admin.' + super(CustomView, self)._get_endpoint(endpoint) + return "admin." + super(CustomView, self)._get_endpoint(endpoint) view = CustomView() - assert view.endpoint == 'admin.customview' + assert view.endpoint == "admin.customview" diff --git a/flask_admin/tests/test_csp.py b/flask_admin/tests/test_csp.py index 88562e994..b3e6a6949 100644 --- a/flask_admin/tests/test_csp.py +++ b/flask_admin/tests/test_csp.py @@ -1,7 +1,7 @@ import secrets -from bs4 import BeautifulSoup import pytest +from bs4 import BeautifulSoup from flask_admin import Admin @@ -10,6 +10,7 @@ def nonce(): return secrets.token_urlsafe(32) + @pytest.fixture def admin(app, babel, nonce): def csp_nonce_generator(): @@ -21,17 +22,17 @@ def csp_nonce_generator(): def test_csp_nonces_injected(app, admin, nonce): client = app.test_client() - rv = client.get('/admin/') + rv = client.get("/admin/") assert rv.status_code == 200 - soup = BeautifulSoup(rv.data, 'html.parser') + soup = BeautifulSoup(rv.data, "html.parser") - scripts = soup.select('script') + scripts = soup.select("script") assert len(scripts) == 9 for tag in scripts: - assert tag.attrs['nonce'] == nonce + assert tag.attrs["nonce"] == nonce - styles = soup.select('style') + styles = soup.select("style") assert len(styles) == 0 for tag in styles: - assert tag.attrs['nonce'] == nonce + assert tag.attrs["nonce"] == nonce diff --git a/flask_admin/tests/test_form_upload.py b/flask_admin/tests/test_form_upload.py index 73c4ee858..bf31511a9 100644 --- a/flask_admin/tests/test_form_upload.py +++ b/flask_admin/tests/test_form_upload.py @@ -1,19 +1,20 @@ import os import os.path as op - from io import BytesIO -from flask import Flask, url_for +from flask import Flask +from flask import url_for -from flask_admin import form, helpers +from flask_admin import form +from flask_admin import helpers def _create_temp(): - path = op.join(op.dirname(__file__), 'tmp') + path = op.join(op.dirname(__file__), "tmp") if not op.exists(path): os.mkdir(path) - inner = op.join(path, 'inner') + inner = op.join(path, "inner") if not op.exists(inner): os.mkdir(inner) @@ -31,16 +32,16 @@ def test_upload_field(app, babel): path = _create_temp() def _remove_testfiles(): - safe_delete(path, 'test1.txt') - safe_delete(path, 'test2.txt') + safe_delete(path, "test1.txt") + safe_delete(path, "test2.txt") class TestForm(form.BaseForm): - upload = form.FileUploadField('Upload', base_path=path) + upload = form.FileUploadField("Upload", base_path=path) class TestNoOverWriteForm(form.BaseForm): - upload = form.FileUploadField('Upload', base_path=path, allow_overwrite=False) + upload = form.FileUploadField("Upload", base_path=path, allow_overwrite=False) - class Dummy(object): + class Dummy: pass my_form = TestForm() @@ -51,30 +52,33 @@ class Dummy(object): dummy = Dummy() # Check upload - with app.test_request_context(method='POST', data={'upload': (BytesIO(b'Hello World 1'), 'test1.txt')}): + with app.test_request_context( + method="POST", data={"upload": (BytesIO(b"Hello World 1"), "test1.txt")} + ): my_form = TestForm(helpers.get_form_data()) assert my_form.validate() my_form.populate_obj(dummy) - assert dummy.upload == 'test1.txt' - assert op.exists(op.join(path, 'test1.txt')) + assert dummy.upload == "test1.txt" + assert op.exists(op.join(path, "test1.txt")) # Check replace - with app.test_request_context(method='POST', data={'upload': (BytesIO(b'Hello World 2'), 'test2.txt')}): + with app.test_request_context( + method="POST", data={"upload": (BytesIO(b"Hello World 2"), "test2.txt")} + ): my_form = TestForm(helpers.get_form_data()) assert my_form.validate() my_form.populate_obj(dummy) - assert dummy.upload == 'test2.txt' - assert not op.exists(op.join(path, 'test1.txt')) - assert op.exists(op.join(path, 'test2.txt')) + assert dummy.upload == "test2.txt" + assert not op.exists(op.join(path, "test1.txt")) + assert op.exists(op.join(path, "test2.txt")) # Check delete - with app.test_request_context(method='POST', data={'_upload-delete': 'checked'}): - + with app.test_request_context(method="POST", data={"_upload-delete": "checked"}): my_form = TestForm(helpers.get_form_data()) assert my_form.validate() @@ -82,20 +86,24 @@ class Dummy(object): my_form.populate_obj(dummy) assert dummy.upload is None - assert not op.exists(op.join(path, 'test2.txt')) + assert not op.exists(op.join(path, "test2.txt")) # Check overwrite _remove_testfiles() my_form_ow = TestNoOverWriteForm() - with app.test_request_context(method='POST', data={'upload': (BytesIO(b'Hullo'), 'test1.txt')}): + with app.test_request_context( + method="POST", data={"upload": (BytesIO(b"Hullo"), "test1.txt")} + ): my_form_ow = TestNoOverWriteForm(helpers.get_form_data()) assert my_form_ow.validate() my_form_ow.populate_obj(dummy) - assert dummy.upload == 'test1.txt' - assert op.exists(op.join(path, 'test1.txt')) + assert dummy.upload == "test1.txt" + assert op.exists(op.join(path, "test1.txt")) - with app.test_request_context(method='POST', data={'upload': (BytesIO(b'Hullo'), 'test1.txt')}): + with app.test_request_context( + method="POST", data={"upload": (BytesIO(b"Hullo"), "test1.txt")} + ): my_form_ow = TestNoOverWriteForm(helpers.get_form_data()) assert not my_form_ow.validate() @@ -109,73 +117,77 @@ def test_image_upload_field(): path = _create_temp() def _remove_testimages(): - safe_delete(path, 'test1.png') - safe_delete(path, 'test1_thumb.jpg') - safe_delete(path, 'test2.png') - safe_delete(path, 'test2_thumb.jpg') - safe_delete(path, 'test1.jpg') - safe_delete(path, 'test1.jpeg') - safe_delete(path, 'test1.gif') - safe_delete(path, 'test1.png') - safe_delete(path, 'test1.tiff') + safe_delete(path, "test1.png") + safe_delete(path, "test1_thumb.jpg") + safe_delete(path, "test2.png") + safe_delete(path, "test2_thumb.jpg") + safe_delete(path, "test1.jpg") + safe_delete(path, "test1.jpeg") + safe_delete(path, "test1.gif") + safe_delete(path, "test1.png") + safe_delete(path, "test1.tiff") class TestForm(form.BaseForm): - upload = form.ImageUploadField('Upload', - base_path=path, - thumbnail_size=(100, 100, True)) + upload = form.ImageUploadField( + "Upload", base_path=path, thumbnail_size=(100, 100, True) + ) class TestNoResizeForm(form.BaseForm): - upload = form.ImageUploadField('Upload', base_path=path, endpoint='test') + upload = form.ImageUploadField("Upload", base_path=path, endpoint="test") class TestAutoResizeForm(form.BaseForm): - upload = form.ImageUploadField('Upload', - base_path=path, - max_size=(64, 64, True)) + upload = form.ImageUploadField( + "Upload", base_path=path, max_size=(64, 64, True) + ) - class Dummy(object): + class Dummy: pass my_form = TestForm() assert my_form.upload.base_path == path - assert my_form.upload.endpoint == 'static' + assert my_form.upload.endpoint == "static" _remove_testimages() dummy = Dummy() # Check upload - filename = op.join(op.dirname(__file__), 'data', 'copyleft.png') + filename = op.join(op.dirname(__file__), "data", "copyleft.png") - with open(filename, 'rb') as fp: - with app.test_request_context(method='POST', data={'upload': (fp, 'test1.png')}): + with open(filename, "rb") as fp: + with app.test_request_context( + method="POST", data={"upload": (fp, "test1.png")} + ): my_form = TestForm(helpers.get_form_data()) assert my_form.validate() my_form.populate_obj(dummy) - assert dummy.upload == 'test1.png' - assert op.exists(op.join(path, 'test1.png')) - assert op.exists(op.join(path, 'test1_thumb.png')) + assert dummy.upload == "test1.png" + assert op.exists(op.join(path, "test1.png")) + assert op.exists(op.join(path, "test1_thumb.png")) # Check replace - with open(filename, 'rb') as fp: - with app.test_request_context(method='POST', data={'upload': (fp, 'test2.png')}): + with open(filename, "rb") as fp: + with app.test_request_context( + method="POST", data={"upload": (fp, "test2.png")} + ): my_form = TestForm(helpers.get_form_data()) assert my_form.validate() my_form.populate_obj(dummy) - assert dummy.upload == 'test2.png' - assert op.exists(op.join(path, 'test2.png')) - assert op.exists(op.join(path, 'test2_thumb.png')) + assert dummy.upload == "test2.png" + assert op.exists(op.join(path, "test2.png")) + assert op.exists(op.join(path, "test2_thumb.png")) - assert not op.exists(op.join(path, 'test1.png')) - assert not op.exists(op.join(path, 'test1_thumb.jpg')) + assert not op.exists(op.join(path, "test1.png")) + assert not op.exists(op.join(path, "test1_thumb.jpg")) # Check delete - with app.test_request_context(method='POST', data={'_upload-delete': 'checked'}): + with app.test_request_context(method="POST", data={"_upload-delete": "checked"}): my_form = TestForm(helpers.get_form_data()) assert my_form.validate() @@ -183,64 +195,74 @@ class Dummy(object): my_form.populate_obj(dummy) assert dummy.upload is None - assert not op.exists(op.join(path, 'test2.png')) - assert not op.exists(op.join(path, 'test2_thumb.png')) + assert not op.exists(op.join(path, "test2.png")) + assert not op.exists(op.join(path, "test2_thumb.png")) # Check upload no-resize - with open(filename, 'rb') as fp: - with app.test_request_context(method='POST', data={'upload': (fp, 'test1.png')}): + with open(filename, "rb") as fp: + with app.test_request_context( + method="POST", data={"upload": (fp, "test1.png")} + ): my_form = TestNoResizeForm(helpers.get_form_data()) assert my_form.validate() my_form.populate_obj(dummy) - assert dummy.upload == 'test1.png' - assert op.exists(op.join(path, 'test1.png')) - assert not op.exists(op.join(path, 'test1_thumb.png')) + assert dummy.upload == "test1.png" + assert op.exists(op.join(path, "test1.png")) + assert not op.exists(op.join(path, "test1_thumb.png")) # Check upload, auto-resize - filename = op.join(op.dirname(__file__), 'data', 'copyleft.png') + filename = op.join(op.dirname(__file__), "data", "copyleft.png") - with open(filename, 'rb') as fp: - with app.test_request_context(method='POST', data={'upload': (fp, 'test1.png')}): + with open(filename, "rb") as fp: + with app.test_request_context( + method="POST", data={"upload": (fp, "test1.png")} + ): my_form = TestAutoResizeForm(helpers.get_form_data()) assert my_form.validate() my_form.populate_obj(dummy) - assert dummy.upload == 'test1.png' - assert op.exists(op.join(path, 'test1.png')) + assert dummy.upload == "test1.png" + assert op.exists(op.join(path, "test1.png")) - filename = op.join(op.dirname(__file__), 'data', 'copyleft.tiff') + filename = op.join(op.dirname(__file__), "data", "copyleft.tiff") - with open(filename, 'rb') as fp: - with app.test_request_context(method='POST', data={'upload': (fp, 'test1.tiff')}): + with open(filename, "rb") as fp: + with app.test_request_context( + method="POST", data={"upload": (fp, "test1.tiff")} + ): my_form = TestAutoResizeForm(helpers.get_form_data()) assert my_form.validate() my_form.populate_obj(dummy) - assert dummy.upload == 'test1.jpg' - assert op.exists(op.join(path, 'test1.jpg')) + assert dummy.upload == "test1.jpg" + assert op.exists(op.join(path, "test1.jpg")) # check allowed extensions - for extension in ('gif', 'jpg', 'jpeg', 'png', 'tiff'): - filename = 'copyleft.' + extension - filepath = op.join(op.dirname(__file__), 'data', filename) - with open(filepath, 'rb') as fp: - with app.test_request_context(method='POST', data={'upload': (fp, filename)}): + for extension in ("gif", "jpg", "jpeg", "png", "tiff"): + filename = "copyleft." + extension + filepath = op.join(op.dirname(__file__), "data", filename) + with open(filepath, "rb") as fp: + with app.test_request_context( + method="POST", data={"upload": (fp, filename)} + ): my_form = TestNoResizeForm(helpers.get_form_data()) assert my_form.validate() my_form.populate_obj(dummy) assert dummy.upload == my_form.upload.data.filename # check case-sensitivity for extensions - filename = op.join(op.dirname(__file__), 'data', 'copyleft.jpg') - with open(filename, 'rb') as fp: - with app.test_request_context(method='POST', data={'upload': (fp, 'copyleft.JPG')}): + filename = op.join(op.dirname(__file__), "data", "copyleft.jpg") + with open(filename, "rb") as fp: + with app.test_request_context( + method="POST", data={"upload": (fp, "copyleft.JPG")} + ): my_form = TestNoResizeForm(helpers.get_form_data()) assert my_form.validate() @@ -251,32 +273,33 @@ def test_relative_path(): path = _create_temp() def _remove_testfiles(): - safe_delete(path, 'test1.txt') + safe_delete(path, "test1.txt") class TestForm(form.BaseForm): - upload = form.FileUploadField('Upload', base_path=path, relative_path='inner/') + upload = form.FileUploadField("Upload", base_path=path, relative_path="inner/") - class Dummy(object): + class Dummy: pass my_form = TestForm() assert my_form.upload.base_path == path - assert my_form.upload.relative_path == 'inner/' + assert my_form.upload.relative_path == "inner/" _remove_testfiles() dummy = Dummy() # Check upload - with app.test_request_context(method='POST', data={'upload': (BytesIO(b'Hello World 1'), 'test1.txt')}): + with app.test_request_context( + method="POST", data={"upload": (BytesIO(b"Hello World 1"), "test1.txt")} + ): my_form = TestForm(helpers.get_form_data()) assert my_form.validate() my_form.populate_obj(dummy) - assert dummy.upload == 'inner/test1.txt' - assert op.exists(op.join(path, 'inner/test1.txt')) + assert dummy.upload == "inner/test1.txt" + assert op.exists(op.join(path, "inner/test1.txt")) - assert url_for('static', filename=dummy.upload) \ - == '/static/inner/test1.txt' + assert url_for("static", filename=dummy.upload) == "/static/inner/test1.txt" diff --git a/flask_admin/tests/test_helpers.py b/flask_admin/tests/test_helpers.py index ad6cb755f..ddbf4dda4 100644 --- a/flask_admin/tests/test_helpers.py +++ b/flask_admin/tests/test_helpers.py @@ -6,19 +6,19 @@ def test_is_safe_url(): app = flask.Flask(__name__) - with app.test_request_context('http://127.0.0.1/admin/car/edit/'): - assert helpers.is_safe_url('http://127.0.0.1/admin/car/') - assert helpers.is_safe_url('https://127.0.0.1/admin/car/') - assert helpers.is_safe_url('/admin/car/') - assert helpers.is_safe_url('admin/car/') - assert helpers.is_safe_url('http////www.google.com') + with app.test_request_context("http://127.0.0.1/admin/car/edit/"): + assert helpers.is_safe_url("http://127.0.0.1/admin/car/") + assert helpers.is_safe_url("https://127.0.0.1/admin/car/") + assert helpers.is_safe_url("/admin/car/") + assert helpers.is_safe_url("admin/car/") + assert helpers.is_safe_url("http////www.google.com") - assert not helpers.is_safe_url('http://127.0.0.2/admin/car/') - assert not helpers.is_safe_url(' javascript:alert(document.domain)') - assert not helpers.is_safe_url('javascript:alert(document.domain)') - assert not helpers.is_safe_url('javascrip\nt:alert(document.domain)') - assert not helpers.is_safe_url(r'\\www.google.com') - assert not helpers.is_safe_url(r'\\/www.google.com') - assert not helpers.is_safe_url('/////www.google.com') - assert not helpers.is_safe_url('http:///www.google.com') - assert not helpers.is_safe_url('https:////www.google.com') + assert not helpers.is_safe_url("http://127.0.0.2/admin/car/") + assert not helpers.is_safe_url(" javascript:alert(document.domain)") + assert not helpers.is_safe_url("javascript:alert(document.domain)") + assert not helpers.is_safe_url("javascrip\nt:alert(document.domain)") + assert not helpers.is_safe_url(r"\\www.google.com") + assert not helpers.is_safe_url(r"\\/www.google.com") + assert not helpers.is_safe_url("/////www.google.com") + assert not helpers.is_safe_url("http:///www.google.com") + assert not helpers.is_safe_url("https:////www.google.com") diff --git a/flask_admin/tests/test_host_matching.py b/flask_admin/tests/test_host_matching.py index c6dc662a9..6efe2e031 100644 --- a/flask_admin/tests/test_host_matching.py +++ b/flask_admin/tests/test_host_matching.py @@ -1,14 +1,15 @@ import pytest -from flask import Flask, url_for +from flask import Flask +from flask import url_for from flask_admin import base @pytest.fixture def app(): - app = Flask(__name__, host_matching=True, static_host='static.test.localhost') - app.config['SECRET_KEY'] = '1' - app.config['WTF_CSRF_ENABLED'] = False + app = Flask(__name__, host_matching=True, static_host="static.test.localhost") + app.config["SECRET_KEY"] = "1" + app.config["WTF_CSRF_ENABLED"] = False yield app @@ -29,23 +30,23 @@ class MockView(base.BaseView): allow_access = True visible = True - @base.expose('/') + @base.expose("/") def index(self): - return 'Success!' + return "Success!" - @base.expose('/test/') + @base.expose("/test/") def test(self): - return self.render('mock.html') + return self.render("mock.html") - @base.expose('/base/') + @base.expose("/base/") def base(self): - return self.render('admin/base.html') + return self.render("admin/base.html") def _handle_view(self, name, **kwargs): if self.allow_call: return super(MockView, self)._handle_view(name, **kwargs) else: - return 'Failure!' + return "Failure!" def is_accessible(self): if self.allow_access: @@ -61,12 +62,14 @@ def is_visible(self): @pytest.mark.parametrize("initialise_using_init_app", [True, False]) -def test_mounting_on_host_with_variable_is_unsupported(app, babel, initialise_using_init_app): +def test_mounting_on_host_with_variable_is_unsupported( + app, babel, initialise_using_init_app +): with pytest.raises(ValueError) as e: init_admin( app, using_init_app=initialise_using_init_app, - admin_kwargs=dict(url='/', host="<blah>"), + admin_kwargs=dict(url="/", host="<blah>"), ) assert str(e.value) == ( @@ -83,7 +86,7 @@ def test_mounting_on_host_with_flask_mismatch(initialise_using_init_app): init_admin( app=app, using_init_app=initialise_using_init_app, - admin_kwargs=dict(url='/', host="host"), + admin_kwargs=dict(url="/", host="host"), ) assert str(e.value) == ( @@ -99,7 +102,7 @@ def test_mounting_on_subdomain_and_host_is_rejected( init_admin( app, using_init_app=initialise_using_init_app, - admin_kwargs=dict(url='/', subdomain='subdomain', host="host"), + admin_kwargs=dict(url="/", subdomain="subdomain", host="host"), ) assert str(e.value) == "`subdomain` and `host` are mutually-exclusive" @@ -110,43 +113,41 @@ def test_mounting_on_host(app, babel, initialise_using_init_app): admin = init_admin( app, using_init_app=initialise_using_init_app, - admin_kwargs=dict(url='/', host="admin.test.localhost"), + admin_kwargs=dict(url="/", host="admin.test.localhost"), ) admin.add_view(MockView()) client = app.test_client() - rv = client.get('/mockview/') + rv = client.get("/mockview/") assert rv.status_code == 404 - rv = client.get('/mockview/', headers={"Host": "admin.test.localhost"}) + rv = client.get("/mockview/", headers={"Host": "admin.test.localhost"}) assert rv.status_code == 200 - assert rv.data == b'Success!' + assert rv.data == b"Success!" client = app.test_client() - rv = client.get('/mockview/base/') + rv = client.get("/mockview/base/") assert rv.status_code == 404 - rv = client.get('/mockview/base/', headers={"Host": "admin.test.localhost"}) + rv = client.get("/mockview/base/", headers={"Host": "admin.test.localhost"}) assert rv.status_code == 200 # Check that static assets are embedded with the expected (relative) URLs assert ( b'<link href="/static/admin/bootstrap/bootstrap4/swatch' - b'/default/bootstrap.min.css?v=4.2.1"' - in rv.data + b'/default/bootstrap.min.css?v=4.2.1"' in rv.data ) assert ( b'<script src="/static/admin/vendor' - b'/jquery.min.js?v=3.5.1" type="text/javascript">' - in rv.data + b'/jquery.min.js?v=3.5.1" type="text/javascript">' in rv.data ) # test static files when url='/' - with app.test_request_context('/', headers={"Host": "admin.test.localhost"}): + with app.test_request_context("/", headers={"Host": "admin.test.localhost"}): rv = client.get( url_for( - 'admin.static', - filename='bootstrap/bootstrap4/css/bootstrap.min.css', + "admin.static", + filename="bootstrap/bootstrap4/css/bootstrap.min.css", ) ) rv.close() @@ -154,10 +155,10 @@ def test_mounting_on_host(app, babel, initialise_using_init_app): rv = client.get( url_for( - 'admin.static', - filename='bootstrap/bootstrap4/css/bootstrap.min.css', + "admin.static", + filename="bootstrap/bootstrap4/css/bootstrap.min.css", ), - headers={"Host": "admin.test.localhost"} + headers={"Host": "admin.test.localhost"}, ) rv.close() assert rv.status_code == 200 @@ -168,7 +169,7 @@ def test_mounting_on_wildcard_host(app, babel, initialise_using_init_app): admin = init_admin( app, using_init_app=initialise_using_init_app, - admin_kwargs=dict(url='/', host="*"), + admin_kwargs=dict(url="/", host="*"), ) admin.add_view(MockView()) @@ -179,28 +180,26 @@ def test_mounting_on_wildcard_host(app, babel, initialise_using_init_app): {"Host": "admin.test.localhost"}, {"Host": "absolutely.any.value"}, ]: - rv = client.get('/mockview/base/', headers=host_header) + rv = client.get("/mockview/base/", headers=host_header) rv.close() assert rv.status_code == 200 # Check that static assets are embedded with the expected (relative) URLs assert ( b'<link href="/static/admin/bootstrap/bootstrap4/swatch' - b'/default/bootstrap.min.css?v=4.2.1"' - in rv.data + b'/default/bootstrap.min.css?v=4.2.1"' in rv.data ) assert ( b'<script src="/static/admin/vendor' - b'/jquery.min.js?v=3.5.1" type="text/javascript">' - in rv.data + b'/jquery.min.js?v=3.5.1" type="text/javascript">' in rv.data ) # test static files when url='/' - with app.test_request_context('/'): + with app.test_request_context("/"): rv = client.get( url_for( - 'admin.static', - filename='bootstrap/bootstrap4/css/bootstrap.min.css', + "admin.static", + filename="bootstrap/bootstrap4/css/bootstrap.min.css", headers=host_header, ), ) diff --git a/flask_admin/tests/test_model.py b/flask_admin/tests/test_model.py index d4c229dd9..7ce7e32cf 100644 --- a/flask_admin/tests/test_model.py +++ b/flask_admin/tests/test_model.py @@ -1,20 +1,19 @@ -import copy - from flask import Flask - from werkzeug.middleware.dispatcher import DispatcherMiddleware from werkzeug.test import Client - from wtforms import fields -from flask_admin import Admin, form -from flask_admin._compat import iteritems, itervalues -from flask_admin.theme import Bootstrap4Theme -from flask_admin.model import base, filters +from flask_admin import Admin +from flask_admin import form +from flask_admin._compat import iteritems +from flask_admin._compat import itervalues +from flask_admin.model import base +from flask_admin.model import filters from flask_admin.model.template import macro +from flask_admin.theme import Bootstrap4Theme -class Model(object): +class Model: def __init__(self, id=None, c1=1, c2=2, c3=3): self.id = id self.col1 = c1 @@ -34,12 +33,20 @@ def apply(self, query): return query def operation(self): - return 'test' + return "test" class MockModelView(base.BaseModelView): - def __init__(self, model, data=None, name=None, category=None, - endpoint=None, url=None, **kwargs): + def __init__( + self, + model, + data=None, + name=None, + category=None, + endpoint=None, + url=None, + **kwargs, + ): # Allow to set any attributes from parameters for k, v in iteritems(kwargs): setattr(self, k, v) @@ -64,7 +71,7 @@ def get_pk_value(self, model): return model.id def scaffold_list_columns(self): - columns = ['col1', 'col2', 'col3'] + columns = ["col1", "col2", "col3"] if self.column_exclude_list: return filter(lambda x: x not in self.column_exclude_list, columns) @@ -78,14 +85,13 @@ def scaffold_filters(self, name): return [SimpleFilter(name)] def scaffold_sortable_columns(self): - return ['col1', 'col2', 'col3'] + return ["col1", "col2", "col3"] def scaffold_form(self): return Form # Data - def get_list(self, page, sort_field, sort_desc, search, filters, - page_size=None): + def get_list(self, page, sort_field, sort_desc, search, filters, page_size=None): self.search_arguments.append((page, sort_field, sort_desc, search, filters)) return len(self.all_models), itervalues(self.all_models) @@ -118,11 +124,11 @@ def test_mockview(app, admin): assert view.model == Model - assert view.name == 'Model' - assert view.endpoint == 'model' + assert view.name == "Model" + assert view.endpoint == "model" # Verify scaffolding - assert view._sortable_columns == ['col1', 'col2', 'col3'] + assert view._sortable_columns == ["col1", "col2", "col3"] assert view._create_form_class == Form assert view._edit_form_class == Form assert view._search_supported is False @@ -131,58 +137,63 @@ def test_mockview(app, admin): client = app.test_client() # Make model view requests - rv = client.get('/admin/model/') + rv = client.get("/admin/model/") assert rv.status_code == 200 # Test model creation view - rv = client.get('/admin/model/new/') + rv = client.get("/admin/model/new/") assert rv.status_code == 200 - rv = client.post('/admin/model/new/', - data=dict(col1='test1', col2='test2', col3='test3')) + rv = client.post( + "/admin/model/new/", data=dict(col1="test1", col2="test2", col3="test3") + ) assert rv.status_code == 302 assert len(view.created_models) == 1 model = view.created_models.pop() assert model.id == 3 - assert model.col1 == 'test1' - assert model.col2 == 'test2' - assert model.col3 == 'test3' + assert model.col1 == "test1" + assert model.col2 == "test2" + assert model.col3 == "test3" # Try model edit view - rv = client.get('/admin/model/edit/?id=3') + rv = client.get("/admin/model/edit/?id=3") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'test1' in data + data = rv.data.decode("utf-8") + assert "test1" in data - rv = client.post('/admin/model/edit/?id=3', - data=dict(col1='test!', col2='test@', col3='test#')) + rv = client.post( + "/admin/model/edit/?id=3", data=dict(col1="test!", col2="test@", col3="test#") + ) assert rv.status_code == 302 assert len(view.updated_models) == 1 model = view.updated_models.pop() - assert model.col1 == 'test!' - assert model.col2 == 'test@' - assert model.col3 == 'test#' + assert model.col1 == "test!" + assert model.col2 == "test@" + assert model.col3 == "test#" - rv = client.get('/admin/model/edit/?id=4') + rv = client.get("/admin/model/edit/?id=4") assert rv.status_code == 302 # Attempt to delete model - rv = client.post('/admin/model/delete/?id=3') + rv = client.post("/admin/model/delete/?id=3") assert rv.status_code == 302 # werkzeug 2.1.0+ returns *relative* location header by default, so just check the end - assert rv.headers['location'].endswith('/admin/model/') + assert rv.headers["location"].endswith("/admin/model/") # Create a dispatched application to test that edit view's "save and # continue" functionality works when app is not located at root - dummy_app = Flask('dummy_app') - dispatched_app = DispatcherMiddleware(dummy_app, {'/dispatched': app}) + dummy_app = Flask("dummy_app") + dispatched_app = DispatcherMiddleware(dummy_app, {"/dispatched": app}) dispatched_client = Client(dispatched_app) rv = dispatched_client.post( - '/dispatched/admin/model/edit/?id=3', - data=dict(col1='another test!', col2='test@', col3='test#', _continue_editing='True')) + "/dispatched/admin/model/edit/?id=3", + data=dict( + col1="another test!", col2="test@", col3="test#", _continue_editing="True" + ), + ) # werkzeug 2.1.0+ always returns a `TestResponse` instance (backward-compat as tuple is removed) if isinstance(rv, tuple): @@ -191,10 +202,10 @@ def test_mockview(app, admin): status = rv.status headers = rv.headers - assert status == '302 FOUND' - assert headers['Location'].endswith('/dispatched/admin/model/edit/?id=3') + assert status == "302 FOUND" + assert headers["Location"].endswith("/dispatched/admin/model/edit/?id=3") model = view.updated_models.pop() - assert model.col1 == 'another test!' + assert model.col1 == "another test!" def test_permissions(app, admin): @@ -204,15 +215,15 @@ def test_permissions(app, admin): client = app.test_client() view.can_create = False - rv = client.get('/admin/model/new/') + rv = client.get("/admin/model/new/") assert rv.status_code == 302 view.can_edit = False - rv = client.get('/admin/model/edit/?id=1') + rv = client.get("/admin/model/edit/?id=1") assert rv.status_code == 302 view.can_delete = False - rv = client.post('/admin/model/delete/?id=1') + rv = client.post("/admin/model/delete/?id=1") assert rv.status_code == 302 @@ -222,60 +233,60 @@ def test_templates(app, admin): client = app.test_client() - view.list_template = 'mock.html' - view.create_template = 'mock.html' - view.edit_template = 'mock.html' + view.list_template = "mock.html" + view.create_template = "mock.html" + view.edit_template = "mock.html" - rv = client.get('/admin/model/') - assert rv.data == b'Success!' + rv = client.get("/admin/model/") + assert rv.data == b"Success!" - rv = client.get('/admin/model/new/') - assert rv.data == b'Success!' + rv = client.get("/admin/model/new/") + assert rv.data == b"Success!" - rv = client.get('/admin/model/edit/?id=1') - assert rv.data == b'Success!' + rv = client.get("/admin/model/edit/?id=1") + assert rv.data == b"Success!" def test_list_columns(app, admin): - view = MockModelView(Model, - column_list=['col1', 'col3'], - column_labels=dict(col1='Column1')) + view = MockModelView( + Model, column_list=["col1", "col3"], column_labels=dict(col1="Column1") + ) admin.add_view(view) assert len(view._list_columns) == 2 - assert view._list_columns == [('col1', 'Column1'), ('col3', 'Col3')] + assert view._list_columns == [("col1", "Column1"), ("col3", "Col3")] client = app.test_client() - rv = client.get('/admin/model/') - data = rv.data.decode('utf-8') - assert 'Column1' in data - assert 'Col2' not in data + rv = client.get("/admin/model/") + data = rv.data.decode("utf-8") + assert "Column1" in data + assert "Col2" not in data def test_exclude_columns(app, admin): - view = MockModelView(Model, column_exclude_list=['col2']) + view = MockModelView(Model, column_exclude_list=["col2"]) admin.add_view(view) - assert view._list_columns == [('col1', 'Col1'), ('col3', 'Col3')] + assert view._list_columns == [("col1", "Col1"), ("col3", "Col3")] client = app.test_client() - rv = client.get('/admin/model/') - data = rv.data.decode('utf-8') - assert 'Col1' in data - assert 'Col2' not in data + rv = client.get("/admin/model/") + data = rv.data.decode("utf-8") + assert "Col1" in data + assert "Col2" not in data def test_sortable_columns(app, admin): - view = MockModelView(Model, column_sortable_list=['col1', ('col2', 'test1')]) + view = MockModelView(Model, column_sortable_list=["col1", ("col2", "test1")]) admin.add_view(view) - assert view._sortable_columns == dict(col1='col1', col2='test1') + assert view._sortable_columns == dict(col1="col1", col2="test1") def test_column_searchable_list(app, admin): - view = MockModelView(Model, column_searchable_list=['col1', 'col2']) + view = MockModelView(Model, column_searchable_list=["col1", "col2"]) admin.add_view(view) assert view._search_supported is True @@ -284,28 +295,32 @@ def test_column_searchable_list(app, admin): def test_column_filters(app, admin): - view = MockModelView(Model, column_filters=['col1', 'col2']) + view = MockModelView(Model, column_filters=["col1", "col2"]) admin.add_view(view) assert len(view._filters) == 2 - assert view._filters[0].name == 'col1' - assert view._filters[1].name == 'col2' + assert view._filters[0].name == "col1" + assert view._filters[1].name == "col2" - assert [(f['index'] == f['operation']) for f in view._filter_groups[u'col1']], [(0, 'test')] - assert [(f['index'] == f['operation']) for f in view._filter_groups[u'col2']], [(1, 'test')] + assert [(f["index"] == f["operation"]) for f in view._filter_groups["col1"]], [ + (0, "test") + ] + assert [(f["index"] == f["operation"]) for f in view._filter_groups["col2"]], [ + (1, "test") + ] # TODO: Make calls with filters def test_filter_list_callable(app, admin): - flt = SimpleFilter('test', options=lambda: [('1', 'Test 1'), ('2', 'Test 2')]) + flt = SimpleFilter("test", options=lambda: [("1", "Test 1"), ("2", "Test 2")]) view = MockModelView(Model, column_filters=[flt]) admin.add_view(view) opts = flt.get_options(view) assert len(opts) == 2 - assert opts == [('1', 'Test 1'), ('2', 'Test 2')] + assert opts == [("1", "Test 1"), ("2", "Test 2")] def test_form(): @@ -328,7 +343,7 @@ def get_csrf_token(data): token = data.split('"')[0] return token - view = SecureModelView(Model, endpoint='secure') + view = SecureModelView(Model, endpoint="secure") admin.add_view(view) client = app.test_client() @@ -336,79 +351,90 @@ def get_csrf_token(data): ################ # create_view ################ - rv = client.get('/admin/secure/new/') + rv = client.get("/admin/secure/new/") assert rv.status_code == 200 - assert u'name="csrf_token"' in rv.data.decode('utf-8') + assert 'name="csrf_token"' in rv.data.decode("utf-8") - csrf_token = get_csrf_token(rv.data.decode('utf-8')) + csrf_token = get_csrf_token(rv.data.decode("utf-8")) # Create without CSRF token - rv = client.post('/admin/secure/new/', data=dict(name='test1')) + rv = client.post("/admin/secure/new/", data=dict(name="test1")) assert rv.status_code == 200 # Create with CSRF token - rv = client.post('/admin/secure/new/', data=dict(name='test1', - csrf_token=csrf_token)) + rv = client.post( + "/admin/secure/new/", data=dict(name="test1", csrf_token=csrf_token) + ) assert rv.status_code == 302 ############### # edit_view ############### - rv = client.get('/admin/secure/edit/?url=%2Fadmin%2Fsecure%2F&id=1') + rv = client.get("/admin/secure/edit/?url=%2Fadmin%2Fsecure%2F&id=1") assert rv.status_code == 200 - assert u'name="csrf_token"' in rv.data.decode('utf-8') + assert 'name="csrf_token"' in rv.data.decode("utf-8") - csrf_token = get_csrf_token(rv.data.decode('utf-8')) + csrf_token = get_csrf_token(rv.data.decode("utf-8")) # Edit without CSRF token - rv = client.post('/admin/secure/edit/?url=%2Fadmin%2Fsecure%2F&id=1', - data=dict(name='test1')) + rv = client.post( + "/admin/secure/edit/?url=%2Fadmin%2Fsecure%2F&id=1", data=dict(name="test1") + ) assert rv.status_code == 200 # Edit with CSRF token - rv = client.post('/admin/secure/edit/?url=%2Fadmin%2Fsecure%2F&id=1', - data=dict(name='test1', csrf_token=csrf_token)) + rv = client.post( + "/admin/secure/edit/?url=%2Fadmin%2Fsecure%2F&id=1", + data=dict(name="test1", csrf_token=csrf_token), + ) assert rv.status_code == 302 ################ # delete_view ################ - rv = client.get('/admin/secure/') + rv = client.get("/admin/secure/") assert rv.status_code == 200 - assert u'name="csrf_token"' in rv.data.decode('utf-8') + assert 'name="csrf_token"' in rv.data.decode("utf-8") - csrf_token = get_csrf_token(rv.data.decode('utf-8')) + csrf_token = get_csrf_token(rv.data.decode("utf-8")) # Delete without CSRF token, test validation errors - rv = client.post('/admin/secure/delete/', - data=dict(id="1", url="/admin/secure/"), follow_redirects=True) + rv = client.post( + "/admin/secure/delete/", + data=dict(id="1", url="/admin/secure/"), + follow_redirects=True, + ) assert rv.status_code == 200 - assert u'Record was successfully deleted.' not in rv.data.decode('utf-8') - assert u'Failed to delete record.' in rv.data.decode('utf-8') + assert "Record was successfully deleted." not in rv.data.decode("utf-8") + assert "Failed to delete record." in rv.data.decode("utf-8") # Delete with CSRF token - rv = client.post('/admin/secure/delete/', - data=dict(id="1", url="/admin/secure/", csrf_token=csrf_token), - follow_redirects=True) + rv = client.post( + "/admin/secure/delete/", + data=dict(id="1", url="/admin/secure/", csrf_token=csrf_token), + follow_redirects=True, + ) assert rv.status_code == 200 - assert u'Record was successfully deleted.' in rv.data.decode('utf-8') + assert "Record was successfully deleted." in rv.data.decode("utf-8") ################ # actions ################ - rv = client.get('/admin/secure/') + rv = client.get("/admin/secure/") assert rv.status_code == 200 - assert u'name="csrf_token"' in rv.data.decode('utf-8') + assert 'name="csrf_token"' in rv.data.decode("utf-8") - csrf_token = get_csrf_token(rv.data.decode('utf-8')) + csrf_token = get_csrf_token(rv.data.decode("utf-8")) # Delete without CSRF token, test validation errors - rv = client.post('/admin/secure/action/', - data=dict(rowid='1', url='/admin/secure/', action='delete'), - follow_redirects=True) + rv = client.post( + "/admin/secure/action/", + data=dict(rowid="1", url="/admin/secure/", action="delete"), + follow_redirects=True, + ) assert rv.status_code == 200 - assert u'Record was successfully deleted.' not in rv.data.decode('utf-8') - assert u'Failed to perform action.' in rv.data.decode('utf-8') + assert "Record was successfully deleted." not in rv.data.decode("utf-8") + assert "Failed to perform action." in rv.data.decode("utf-8") def test_custom_form(app, admin): @@ -421,7 +447,7 @@ class TestForm(form.BaseForm): assert view._create_form_class == TestForm assert view._edit_form_class == TestForm - assert not hasattr(view._create_form_class, 'col1') + assert not hasattr(view._create_form_class, "col1") def test_modal_edit_bs4(app, babel): @@ -429,8 +455,12 @@ def test_modal_edit_bs4(app, babel): edit_modal_on = MockModelView(Model, edit_modal=True, endpoint="edit_modal_on") edit_modal_off = MockModelView(Model, edit_modal=False, endpoint="edit_modal_off") - create_modal_on = MockModelView(Model, create_modal=True, endpoint="create_modal_on") - create_modal_off = MockModelView(Model, create_modal=False, endpoint="create_modal_off") + create_modal_on = MockModelView( + Model, create_modal=True, endpoint="create_modal_on" + ) + create_modal_off = MockModelView( + Model, create_modal=False, endpoint="create_modal_off" + ) admin_bs4.add_view(edit_modal_on) admin_bs4.add_view(edit_modal_off) admin_bs4.add_view(create_modal_on) @@ -439,28 +469,28 @@ def test_modal_edit_bs4(app, babel): client_bs4 = app.test_client() # bootstrap 2 - ensure modal window is added when edit_modal is enabled - rv = client_bs4.get('/admin/edit_modal_on/') + rv = client_bs4.get("/admin/edit_modal_on/") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'fa_modal_window' in data + data = rv.data.decode("utf-8") + assert "fa_modal_window" in data # bootstrap 2 - test edit modal disabled - rv = client_bs4.get('/admin/edit_modal_off/') + rv = client_bs4.get("/admin/edit_modal_off/") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'fa_modal_window' not in data + data = rv.data.decode("utf-8") + assert "fa_modal_window" not in data # bootstrap 2 - ensure modal window is added when create_modal is enabled - rv = client_bs4.get('/admin/create_modal_on/') + rv = client_bs4.get("/admin/create_modal_on/") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'fa_modal_window' in data + data = rv.data.decode("utf-8") + assert "fa_modal_window" in data # bootstrap 2 - test create modal disabled - rv = client_bs4.get('/admin/create_modal_off/') + rv = client_bs4.get("/admin/create_modal_off/") assert rv.status_code == 200 - data = rv.data.decode('utf-8') - assert 'fa_modal_window' not in data + data = rv.data.decode("utf-8") + assert "fa_modal_window" not in data def check_class_name(): @@ -468,14 +498,14 @@ class DummyView(MockModelView): pass view = DummyView(Model) - assert view.name == 'Dummy View' + assert view.name == "Dummy View" def test_export_csv(app, admin): client = app.test_client() # test redirect when csv export is disabled - view = MockModelView(Model, column_list=['col1', 'col2'], endpoint="test") + view = MockModelView(Model, column_list=["col1", "col2"], endpoint="test") admin.add_view(view) # basic test of csv export with a few records @@ -485,28 +515,42 @@ def test_export_csv(app, admin): 3: Model(3, "col1_3", "col2_3"), } - view2 = MockModelView(Model, view_data, can_export=True, - column_list=['col1', 'col2']) + view2 = MockModelView( + Model, view_data, can_export=True, column_list=["col1", "col2"] + ) admin.add_view(view2) # test explicit use of column_export_list - view3 = MockModelView(Model, view_data, can_export=True, - column_list=['col1', 'col2'], - column_export_list=['id', 'col1', 'col2'], - endpoint='exportinclusion') + view3 = MockModelView( + Model, + view_data, + can_export=True, + column_list=["col1", "col2"], + column_export_list=["id", "col1", "col2"], + endpoint="exportinclusion", + ) admin.add_view(view3) # test explicit use of column_export_exclude_list - view4 = MockModelView(Model, view_data, can_export=True, - column_list=['col1', 'col2'], - column_export_exclude_list=['col2'], - endpoint='exportexclusion') + view4 = MockModelView( + Model, + view_data, + can_export=True, + column_list=["col1", "col2"], + column_export_exclude_list=["col2"], + endpoint="exportexclusion", + ) admin.add_view(view4) # test utf8 characters in csv export - view_data_v2 = {**view_data, 4: Model(1, u'\u2013ut8_1\u2013', u'\u2013utf8_2\u2013')} - view5 = MockModelView(Model, view_data_v2, can_export=True, - column_list=['col1', 'col2'], endpoint="utf8") + view_data_v2 = {**view_data, 4: Model(1, "\u2013ut8_1\u2013", "\u2013utf8_2\u2013")} + view5 = MockModelView( + Model, + view_data_v2, + can_export=True, + column_list=["col1", "col2"], + endpoint="utf8", + ) admin.add_view(view5) # test None type, integer type, column_labels, and column_formatters @@ -517,10 +561,13 @@ def test_export_csv(app, admin): } view6 = MockModelView( - Model, view_data_v3, can_export=True, column_list=['col1', 'col2'], - column_labels={'col1': 'Str Field', 'col2': 'Int Field'}, + Model, + view_data_v3, + can_export=True, + column_list=["col1", "col2"], + column_labels={"col1": "Str Field", "col2": "Int Field"}, column_formatters=dict(col2=lambda v, c, m, p: m.col2 * 2), - endpoint="types_and_formatters" + endpoint="types_and_formatters", ) admin.add_view(view6) @@ -528,145 +575,152 @@ def test_export_csv(app, admin): type_formatters = {type(None): lambda view, value, name: "null"} view7 = MockModelView( - Model, view_data_v3, can_export=True, column_list=['col1', 'col2'], + Model, + view_data_v3, + can_export=True, + column_list=["col1", "col2"], column_formatters_export=dict(col2=lambda v, c, m, p: m.col2 * 3), column_formatters=dict(col2=lambda v, c, m, p: m.col2 * 2), # overridden column_type_formatters_export=type_formatters, - endpoint="export_types_and_formatters" + endpoint="export_types_and_formatters", ) admin.add_view(view7) # Macros are not implemented for csv export yet and will throw an error view8 = MockModelView( - Model, can_export=True, column_list=['col1', 'col2'], - column_formatters=dict(col1=macro('render_macro')), - endpoint="macro_exception" + Model, + can_export=True, + column_list=["col1", "col2"], + column_formatters=dict(col1=macro("render_macro")), + endpoint="macro_exception", ) admin.add_view(view8) # We should be able to specify column_formatters_export # and not get an exception if a column_formatter is using a macro def export_formatter(v, c, m, p): - return m.col1 if m else '' + return m.col1 if m else "" view9 = MockModelView( - Model, view_data_v3, can_export=True, column_list=['col1', 'col2'], - column_formatters=dict(col1=macro('render_macro')), + Model, + view_data_v3, + can_export=True, + column_list=["col1", "col2"], + column_formatters=dict(col1=macro("render_macro")), column_formatters_export=dict(col1=export_formatter), - endpoint="macro_exception_formatter_override" + endpoint="macro_exception_formatter_override", ) admin.add_view(view9) # We should not get an exception if a column_formatter is # using a macro but it is on the column_export_exclude_list view10 = MockModelView( - Model, view_data_v3, can_export=True, column_list=['col1', 'col2'], - column_formatters=dict(col1=macro('render_macro')), - column_export_exclude_list=['col1'], - endpoint="macro_exception_exclude_override" + Model, + view_data_v3, + can_export=True, + column_list=["col1", "col2"], + column_formatters=dict(col1=macro("render_macro")), + column_export_exclude_list=["col1"], + endpoint="macro_exception_exclude_override", ) admin.add_view(view10) # When we use column_export_list to hide the macro field # we should not get an exception view11 = MockModelView( - Model, view_data_v3, can_export=True, column_list=['col1', 'col2'], - column_formatters=dict(col1=macro('render_macro')), - column_export_list=['col2'], - endpoint="macro_exception_list_override" + Model, + view_data_v3, + can_export=True, + column_list=["col1", "col2"], + column_formatters=dict(col1=macro("render_macro")), + column_export_list=["col2"], + endpoint="macro_exception_list_override", ) admin.add_view(view11) # If they define a macro on the column_formatters_export list # then raise an exception view12 = MockModelView( - Model, view_data_v3, can_export=True, column_list=['col1', 'col2'], - column_formatters=dict(col1=macro('render_macro')), - endpoint="macro_exception_macro_override" + Model, + view_data_v3, + can_export=True, + column_list=["col1", "col2"], + column_formatters=dict(col1=macro("render_macro")), + endpoint="macro_exception_macro_override", ) admin.add_view(view12) - rv = client.get('/admin/test/export/csv/') + rv = client.get("/admin/test/export/csv/") assert rv.status_code == 302 - rv = client.get('/admin/model/export/csv/') - data = rv.data.decode('utf-8') - assert rv.mimetype == 'text/csv' + rv = client.get("/admin/model/export/csv/") + data = rv.data.decode("utf-8") + assert rv.mimetype == "text/csv" assert rv.status_code == 200 - assert "Col1,Col2\r\n" + \ - "col1_1,col2_1\r\n" + \ - "col1_2,col2_2\r\n" + \ - "col1_3,col2_3\r\n" == data - - rv = client.get('/admin/exportinclusion/export/csv/') - data = rv.data.decode('utf-8') - assert rv.mimetype == 'text/csv' + assert ( + "Col1,Col2\r\n" + + "col1_1,col2_1\r\n" + + "col1_2,col2_2\r\n" + + "col1_3,col2_3\r\n" + == data + ) + + rv = client.get("/admin/exportinclusion/export/csv/") + data = rv.data.decode("utf-8") + assert rv.mimetype == "text/csv" assert rv.status_code == 200 - assert "Id,Col1,Col2\r\n" + \ - "1,col1_1,col2_1\r\n" + \ - "2,col1_2,col2_2\r\n" + \ - "3,col1_3,col2_3\r\n" == data - - rv = client.get('/admin/exportexclusion/export/csv/') - data = rv.data.decode('utf-8') - assert rv.mimetype == 'text/csv' + assert ( + "Id,Col1,Col2\r\n" + + "1,col1_1,col2_1\r\n" + + "2,col1_2,col2_2\r\n" + + "3,col1_3,col2_3\r\n" + == data + ) + + rv = client.get("/admin/exportexclusion/export/csv/") + data = rv.data.decode("utf-8") + assert rv.mimetype == "text/csv" assert rv.status_code == 200 - assert "Col1\r\n" + \ - "col1_1\r\n" + \ - "col1_2\r\n" + \ - "col1_3\r\n" == data + assert "Col1\r\n" + "col1_1\r\n" + "col1_2\r\n" + "col1_3\r\n" == data - rv = client.get('/admin/utf8/export/csv/') - data = rv.data.decode('utf-8') + rv = client.get("/admin/utf8/export/csv/") + data = rv.data.decode("utf-8") assert rv.status_code == 200 - assert u'\u2013ut8_1\u2013,\u2013utf8_2\u2013\r\n' in data + assert "\u2013ut8_1\u2013,\u2013utf8_2\u2013\r\n" in data - rv = client.get('/admin/types_and_formatters/export/csv/') - data = rv.data.decode('utf-8') + rv = client.get("/admin/types_and_formatters/export/csv/") + data = rv.data.decode("utf-8") assert rv.status_code == 200 - assert "Str Field,Int Field\r\n" + \ - "col1_1,2\r\n" + \ - "col1_2,4\r\n" + \ - ",6\r\n" == data + assert ( + "Str Field,Int Field\r\n" + "col1_1,2\r\n" + "col1_2,4\r\n" + ",6\r\n" == data + ) - rv = client.get('/admin/export_types_and_formatters/export/csv/') - data = rv.data.decode('utf-8') + rv = client.get("/admin/export_types_and_formatters/export/csv/") + data = rv.data.decode("utf-8") assert rv.status_code == 200 - assert "Col1,Col2\r\n" + \ - "col1_1,3\r\n" + \ - "col1_2,6\r\n" + \ - "null,9\r\n" == data + assert "Col1,Col2\r\n" + "col1_1,3\r\n" + "col1_2,6\r\n" + "null,9\r\n" == data - rv = client.get('/admin/macro_exception/export/csv/') - data = rv.data.decode('utf-8') + rv = client.get("/admin/macro_exception/export/csv/") + data = rv.data.decode("utf-8") assert rv.status_code == 500 - rv = client.get('/admin/macro_exception_formatter_override/export/csv/') - data = rv.data.decode('utf-8') + rv = client.get("/admin/macro_exception_formatter_override/export/csv/") + data = rv.data.decode("utf-8") assert rv.status_code == 200 - assert "Col1,Col2\r\n" + \ - "col1_1,1\r\n" + \ - "col1_2,2\r\n" + \ - ",3\r\n" == data + assert "Col1,Col2\r\n" + "col1_1,1\r\n" + "col1_2,2\r\n" + ",3\r\n" == data - rv = client.get('/admin/macro_exception_exclude_override/export/csv/') - data = rv.data.decode('utf-8') + rv = client.get("/admin/macro_exception_exclude_override/export/csv/") + data = rv.data.decode("utf-8") assert rv.status_code == 200 - assert "Col2\r\n" + \ - "1\r\n" + \ - "2\r\n" + \ - "3\r\n" == data + assert "Col2\r\n" + "1\r\n" + "2\r\n" + "3\r\n" == data - rv = client.get('/admin/macro_exception_list_override/export/csv/') - data = rv.data.decode('utf-8') + rv = client.get("/admin/macro_exception_list_override/export/csv/") + data = rv.data.decode("utf-8") assert rv.status_code == 200 - assert "Col2\r\n" + \ - "1\r\n" + \ - "2\r\n" + \ - "3\r\n" == data + assert "Col2\r\n" + "1\r\n" + "2\r\n" + "3\r\n" == data - rv = client.get('/admin/macro_exception_macro_override/export/csv/') - data = rv.data.decode('utf-8') + rv = client.get("/admin/macro_exception_macro_override/export/csv/") + data = rv.data.decode("utf-8") assert rv.status_code == 500 @@ -680,19 +734,26 @@ def test_export_tablib(app, admin): 3: Model(3, "col1_3", "col2_3"), } - view = MockModelView(Model, view_data, can_export=True, - column_list=['col1', 'col2'], - export_types=['tsv']) + view = MockModelView( + Model, + view_data, + can_export=True, + column_list=["col1", "col2"], + export_types=["tsv"], + ) admin.add_view(view) - rv = client.get('/admin/model/export/tsv/') - data = rv.data.decode('utf-8') - assert rv.mimetype == 'text/tab-separated-values' + rv = client.get("/admin/model/export/tsv/") + data = rv.data.decode("utf-8") + assert rv.mimetype == "text/tab-separated-values" assert rv.status_code == 200 - assert "Col1\tCol2\r\n" + \ - "col1_1\tcol2_1\r\n" + \ - "col1_2\tcol2_2\r\n" + \ - "col1_3\tcol2_3\r\n" == data + assert ( + "Col1\tCol2\r\n" + + "col1_1\tcol2_1\r\n" + + "col1_2\tcol2_2\r\n" + + "col1_3\tcol2_3\r\n" + == data + ) def test_list_row_actions(app, admin): @@ -701,7 +762,7 @@ def test_list_row_actions(app, admin): from flask_admin.model import template # Test default actions - view = MockModelView(Model, endpoint='test') + view = MockModelView(Model, endpoint="test") admin.add_view(view) actions = view.get_list_row_actions() @@ -709,7 +770,9 @@ def test_list_row_actions(app, admin): assert isinstance(actions[1], template.DeleteRowAction) # Test default actions - view = MockModelView(Model, endpoint='test1', can_edit=False, can_delete=False, can_view_details=True) + view = MockModelView( + Model, endpoint="test1", can_edit=False, can_delete=False, can_view_details=True + ) admin.add_view(view) actions = view.get_list_row_actions() @@ -717,10 +780,13 @@ def test_list_row_actions(app, admin): assert isinstance(actions[0], template.ViewRowAction) # Test popups - view = MockModelView(Model, endpoint='test2', - can_view_details=True, - details_modal=True, - edit_modal=True) + view = MockModelView( + Model, + endpoint="test2", + can_view_details=True, + details_modal=True, + edit_modal=True, + ) admin.add_view(view) actions = view.get_list_row_actions() @@ -729,11 +795,18 @@ def test_list_row_actions(app, admin): assert isinstance(actions[2], template.DeleteRowAction) # Test custom views - view = MockModelView(Model, endpoint='test3', - column_extra_row_actions=[ - template.LinkRowAction('glyphicon glyphicon-off', 'http://localhost/?id={row_id}'), - template.EndpointLinkRowAction('glyphicon glyphicon-test', 'test1.index_view') - ]) + view = MockModelView( + Model, + endpoint="test3", + column_extra_row_actions=[ + template.LinkRowAction( + "glyphicon glyphicon-off", "http://localhost/?id={row_id}" + ), + template.EndpointLinkRowAction( + "glyphicon glyphicon-test", "test1.index_view" + ), + ], + ) admin.add_view(view) actions = view.get_list_row_actions() @@ -742,20 +815,20 @@ def test_list_row_actions(app, admin): assert isinstance(actions[2], template.LinkRowAction) assert isinstance(actions[3], template.EndpointLinkRowAction) - rv = client.get('/admin/test/') + rv = client.get("/admin/test/") assert rv.status_code == 200 - rv = client.get('/admin/test1/') + rv = client.get("/admin/test1/") assert rv.status_code == 200 - rv = client.get('/admin/test2/') + rv = client.get("/admin/test2/") assert rv.status_code == 200 - rv = client.get('/admin/test3/') + rv = client.get("/admin/test3/") assert rv.status_code == 200 - data = rv.data.decode('utf-8') + data = rv.data.decode("utf-8") - assert 'glyphicon-off' in data - assert 'http://localhost/?id=' in data - assert 'glyphicon-test' in data + assert "glyphicon-off" in data + assert "http://localhost/?id=" in data + assert "glyphicon-test" in data diff --git a/flask_admin/tests/test_tools.py b/flask_admin/tests/test_tools.py index 04e097b57..1733aa5d6 100644 --- a/flask_admin/tests/test_tools.py +++ b/flask_admin/tests/test_tools.py @@ -2,16 +2,22 @@ def test_encode_decode(): - assert tools.iterdecode(tools.iterencode([1, 2, 3])) == (u'1', u'2', u'3') + assert tools.iterdecode(tools.iterencode([1, 2, 3])) == ("1", "2", "3") - assert tools.iterdecode(tools.iterencode([',', ',', ','])) == (u',', u',', u',') + assert tools.iterdecode(tools.iterencode([",", ",", ","])) == (",", ",", ",") - assert tools.iterdecode(tools.iterencode(['.hello.,', ',', ','])) == (u'.hello.,', u',', u',') + assert tools.iterdecode(tools.iterencode([".hello.,", ",", ","])) == ( + ".hello.,", + ",", + ",", + ) - assert tools.iterdecode(tools.iterencode(['.....,,,.,,..,.,,.,'])) == (u'.....,,,.,,..,.,,.,',) + assert tools.iterdecode(tools.iterencode([".....,,,.,,..,.,,.,"])) == ( + ".....,,,.,,..,.,,.,", + ) assert tools.iterdecode(tools.iterencode([])) == tuple() # Malformed inputs should not crash - assert tools.iterdecode('.') - assert tools.iterdecode(',') == (u'', u'') + assert tools.iterdecode(".") + assert tools.iterdecode(",") == ("", "") diff --git a/flask_admin/theme.py b/flask_admin/theme.py index bbee6b877..014344745 100644 --- a/flask_admin/theme.py +++ b/flask_admin/theme.py @@ -1,5 +1,5 @@ -from dataclasses import dataclass import typing +from dataclasses import dataclass from functools import partial @@ -11,10 +11,10 @@ class Theme: @dataclass class BootstrapTheme(Theme): - folder: typing.Literal['bootstrap4'] - base_template: str = 'admin/base.html' - swatch: str = 'default' + folder: typing.Literal["bootstrap4"] + base_template: str = "admin/base.html" + swatch: str = "default" fluid: bool = False -Bootstrap4Theme = partial(BootstrapTheme, folder='bootstrap4') +Bootstrap4Theme = partial(BootstrapTheme, folder="bootstrap4") diff --git a/flask_admin/tools.py b/flask_admin/tools.py index 5723104f9..29f2670b1 100644 --- a/flask_admin/tools.py +++ b/flask_admin/tools.py @@ -1,24 +1,24 @@ -from functools import reduce import sys import traceback +from functools import reduce # Python 3 compatibility from ._compat import as_unicode -CHAR_ESCAPE = u'.' -CHAR_SEPARATOR = u',' +CHAR_ESCAPE = "." +CHAR_SEPARATOR = "," def import_module(name, required=True): """ - Import module by name - - :param name: - Module name - :param required: - If set to `True` and module was not found - will throw exception. - If set to `False` and module was not found - will return None. - Default is `True`. + Import module by name + + :param name: + Module name + :param required: + If set to `True` and module was not found - will throw exception. + If set to `False` and module was not found - will return None. + Default is `True`. """ try: __import__(name, globals(), locals(), []) @@ -31,19 +31,19 @@ def import_module(name, required=True): def import_attribute(name): """ - Import attribute using string reference. + Import attribute using string reference. - :param name: - String reference. + :param name: + String reference. - Raises ImportError or AttributeError if module or attribute do not exist. + Raises ImportError or AttributeError if module or attribute do not exist. - Example:: + Example:: - import_attribute('a.b.c.foo') + import_attribute('a.b.c.foo') """ - path, attr = name.rsplit('.', 1) + path, attr = name.rsplit(".", 1) module = __import__(path, globals(), locals(), [attr]) return getattr(module, attr) @@ -51,13 +51,13 @@ def import_attribute(name): def module_not_found(additional_depth=0): """ - Checks if ImportError was raised because module does not exist or - something inside it raised ImportError + Checks if ImportError was raised because module does not exist or + something inside it raised ImportError - :param additional_depth: - supply int of depth of your call if you're not doing - import on the same level of code - f.e., if you call function, which is - doing import, you should pass 1 for single additional level of depth + :param additional_depth: + supply int of depth of your call if you're not doing + import on the same level of code - f.e., if you call function, which is + doing import, you should pass 1 for single additional level of depth """ tb = sys.exc_info()[2] if len(traceback.extract_tb(tb)) > (1 + additional_depth): @@ -67,33 +67,33 @@ def module_not_found(additional_depth=0): def rec_getattr(obj, attr, default=None): """ - Recursive getattr. + Recursive getattr. - :param attr: - Dot delimited attribute name - :param default: - Default value + :param attr: + Dot delimited attribute name + :param default: + Default value - Example:: + Example:: - rec_getattr(obj, 'a.b.c') + rec_getattr(obj, 'a.b.c') """ try: - return reduce(getattr, attr.split('.'), obj) + return reduce(getattr, attr.split("."), obj) except AttributeError: return default def get_dict_attr(obj, attr, default=None): """ - Get attribute of the object without triggering its __getattr__. - - :param obj: - Object - :param attr: - Attribute name - :param default: - Default value if attribute was not found + Get attribute of the object without triggering its __getattr__. + + :param obj: + Object + :param attr: + Attribute name + :param default: + Default value if attribute was not found """ for obj in [obj] + obj.__class__.mro(): if attr in obj.__dict__: @@ -103,34 +103,38 @@ def get_dict_attr(obj, attr, default=None): def escape(value): - return (as_unicode(value) - .replace(CHAR_ESCAPE, CHAR_ESCAPE + CHAR_ESCAPE) - .replace(CHAR_SEPARATOR, CHAR_ESCAPE + CHAR_SEPARATOR)) + return ( + as_unicode(value) + .replace(CHAR_ESCAPE, CHAR_ESCAPE + CHAR_ESCAPE) + .replace(CHAR_SEPARATOR, CHAR_ESCAPE + CHAR_SEPARATOR) + ) def iterencode(iter): """ - Encode enumerable as compact string representation. + Encode enumerable as compact string representation. - :param iter: - Enumerable + :param iter: + Enumerable """ - return ','.join(as_unicode(v) - .replace(CHAR_ESCAPE, CHAR_ESCAPE + CHAR_ESCAPE) - .replace(CHAR_SEPARATOR, CHAR_ESCAPE + CHAR_SEPARATOR) - for v in iter) + return ",".join( + as_unicode(v) + .replace(CHAR_ESCAPE, CHAR_ESCAPE + CHAR_ESCAPE) + .replace(CHAR_SEPARATOR, CHAR_ESCAPE + CHAR_SEPARATOR) + for v in iter + ) def iterdecode(value): """ - Decode enumerable from string presentation as a tuple + Decode enumerable from string presentation as a tuple """ if not value: return tuple() result = [] - accumulator = u'' + accumulator = "" escaped = False @@ -141,7 +145,7 @@ def iterdecode(value): continue elif c == CHAR_SEPARATOR: result.append(accumulator) - accumulator = u'' + accumulator = "" continue else: escaped = False diff --git a/flask_admin/translations/af/LC_MESSAGES/admin.po b/flask_admin/translations/af/LC_MESSAGES/admin.po index 3dd6ece40..6c4fdeeeb 100644 --- a/flask_admin/translations/af/LC_MESSAGES/admin.po +++ b/flask_admin/translations/af/LC_MESSAGES/admin.po @@ -596,4 +596,3 @@ msgstr "Kies ten minste een rekord." #~ msgid "Size" #~ msgstr "" - diff --git a/flask_admin/translations/ar/LC_MESSAGES/admin.po b/flask_admin/translations/ar/LC_MESSAGES/admin.po index 6b9f43687..113c6f6af 100644 --- a/flask_admin/translations/ar/LC_MESSAGES/admin.po +++ b/flask_admin/translations/ar/LC_MESSAGES/admin.po @@ -605,4 +605,3 @@ msgstr "الرجاء تحديد سجل واحد على الأقل." #~ msgid "Size" #~ msgstr "" - diff --git a/flask_admin/translations/be/LC_MESSAGES/admin.po b/flask_admin/translations/be/LC_MESSAGES/admin.po index 404ca1d17..fcd37e5b4 100644 --- a/flask_admin/translations/be/LC_MESSAGES/admin.po +++ b/flask_admin/translations/be/LC_MESSAGES/admin.po @@ -599,4 +599,3 @@ msgstr "Выберыце, калі ласка, як найменш адзін з #~ msgid "Size" #~ msgstr "Памер" - diff --git a/flask_admin/translations/ca_ES/LC_MESSAGES/admin.po b/flask_admin/translations/ca_ES/LC_MESSAGES/admin.po index e735ee24b..fe802931d 100644 --- a/flask_admin/translations/ca_ES/LC_MESSAGES/admin.po +++ b/flask_admin/translations/ca_ES/LC_MESSAGES/admin.po @@ -596,4 +596,3 @@ msgstr "Seleccionar almenys un registre." #~ msgid "Size" #~ msgstr "" - diff --git a/flask_admin/translations/cs/LC_MESSAGES/admin.po b/flask_admin/translations/cs/LC_MESSAGES/admin.po index b5eeace60..3adba12d9 100644 --- a/flask_admin/translations/cs/LC_MESSAGES/admin.po +++ b/flask_admin/translations/cs/LC_MESSAGES/admin.po @@ -598,4 +598,3 @@ msgstr "Vyberte prosím alespoň jeden model." #~ msgid "Size" #~ msgstr "" - diff --git a/flask_admin/translations/da/LC_MESSAGES/admin.po b/flask_admin/translations/da/LC_MESSAGES/admin.po index 5601b83f0..976134453 100644 --- a/flask_admin/translations/da/LC_MESSAGES/admin.po +++ b/flask_admin/translations/da/LC_MESSAGES/admin.po @@ -596,4 +596,3 @@ msgstr "Vælg mindst én post." #~ msgid "Size" #~ msgstr "" - diff --git a/flask_admin/translations/el/LC_MESSAGES/admin.po b/flask_admin/translations/el/LC_MESSAGES/admin.po index 81c83df92..4f3781f44 100644 --- a/flask_admin/translations/el/LC_MESSAGES/admin.po +++ b/flask_admin/translations/el/LC_MESSAGES/admin.po @@ -596,4 +596,3 @@ msgstr "Παρακαλώ επιλέξτε τουλάχιστον μία εγγρ #~ msgid "Size" #~ msgstr "" - diff --git a/flask_admin/translations/es/LC_MESSAGES/admin.po b/flask_admin/translations/es/LC_MESSAGES/admin.po index a367db535..3eee75063 100644 --- a/flask_admin/translations/es/LC_MESSAGES/admin.po +++ b/flask_admin/translations/es/LC_MESSAGES/admin.po @@ -596,4 +596,3 @@ msgstr "Por favor, seleccione al menos un elemento." #~ msgid "Size" #~ msgstr "Tamaño" - diff --git a/flask_admin/translations/et/LC_MESSAGES/admin.po b/flask_admin/translations/et/LC_MESSAGES/admin.po index 7a271244f..0e0b4307a 100644 --- a/flask_admin/translations/et/LC_MESSAGES/admin.po +++ b/flask_admin/translations/et/LC_MESSAGES/admin.po @@ -596,4 +596,3 @@ msgstr "Palun valige vähemalt üks kirje." #~ msgid "Size" #~ msgstr "" - diff --git a/flask_admin/translations/fa/LC_MESSAGES/admin.po b/flask_admin/translations/fa/LC_MESSAGES/admin.po index 52a863e69..394de5933 100644 --- a/flask_admin/translations/fa/LC_MESSAGES/admin.po +++ b/flask_admin/translations/fa/LC_MESSAGES/admin.po @@ -596,4 +596,3 @@ msgstr "حداقل یک پوشه انتخاب کنید" #~ msgid "Size" #~ msgstr "" - diff --git a/flask_admin/translations/fi/LC_MESSAGES/admin.po b/flask_admin/translations/fi/LC_MESSAGES/admin.po index a3f8c5439..8d0c3c80a 100644 --- a/flask_admin/translations/fi/LC_MESSAGES/admin.po +++ b/flask_admin/translations/fi/LC_MESSAGES/admin.po @@ -596,4 +596,3 @@ msgstr "Valitse vähintään yksi tietue." #~ msgid "Size" #~ msgstr "" - diff --git a/flask_admin/translations/he/LC_MESSAGES/admin.po b/flask_admin/translations/he/LC_MESSAGES/admin.po index 6d6ec1e20..c6fe0d454 100644 --- a/flask_admin/translations/he/LC_MESSAGES/admin.po +++ b/flask_admin/translations/he/LC_MESSAGES/admin.po @@ -601,4 +601,3 @@ msgstr "נא בחר רשומה אחת לפחות." #~ msgid "Size" #~ msgstr "" - diff --git a/flask_admin/translations/hu/LC_MESSAGES/admin.po b/flask_admin/translations/hu/LC_MESSAGES/admin.po index d2180e783..0d6e4cca6 100644 --- a/flask_admin/translations/hu/LC_MESSAGES/admin.po +++ b/flask_admin/translations/hu/LC_MESSAGES/admin.po @@ -596,4 +596,3 @@ msgstr "Jelöljön ki legalább egy bejegyzést." #~ msgid "Size" #~ msgstr "" - diff --git a/flask_admin/translations/it/LC_MESSAGES/admin.po b/flask_admin/translations/it/LC_MESSAGES/admin.po index 537fc1c62..8c0a6f3f4 100644 --- a/flask_admin/translations/it/LC_MESSAGES/admin.po +++ b/flask_admin/translations/it/LC_MESSAGES/admin.po @@ -596,4 +596,3 @@ msgstr "Selezionare almeno un record." #~ msgid "Size" #~ msgstr "" - diff --git a/flask_admin/translations/ja/LC_MESSAGES/admin.po b/flask_admin/translations/ja/LC_MESSAGES/admin.po index 0acdac536..a643340d5 100644 --- a/flask_admin/translations/ja/LC_MESSAGES/admin.po +++ b/flask_admin/translations/ja/LC_MESSAGES/admin.po @@ -594,4 +594,3 @@ msgstr "少なくとも1つのレコードを選択してください。" #~ msgid "Size" #~ msgstr "" - diff --git a/flask_admin/translations/ko/LC_MESSAGES/admin.po b/flask_admin/translations/ko/LC_MESSAGES/admin.po index 95d2e395a..d8defb1fa 100644 --- a/flask_admin/translations/ko/LC_MESSAGES/admin.po +++ b/flask_admin/translations/ko/LC_MESSAGES/admin.po @@ -594,4 +594,3 @@ msgstr "최소한 하나 이상의 레코드를 선택하십시오." #~ msgid "Size" #~ msgstr "" - diff --git a/flask_admin/translations/nl/LC_MESSAGES/admin.po b/flask_admin/translations/nl/LC_MESSAGES/admin.po index f4baa1909..f7b582593 100644 --- a/flask_admin/translations/nl/LC_MESSAGES/admin.po +++ b/flask_admin/translations/nl/LC_MESSAGES/admin.po @@ -596,4 +596,3 @@ msgstr "Selecteer ten minste één record." #~ msgid "Size" #~ msgstr "" - diff --git a/flask_admin/translations/no/LC_MESSAGES/admin.po b/flask_admin/translations/no/LC_MESSAGES/admin.po index 139d2935c..21422cb19 100644 --- a/flask_admin/translations/no/LC_MESSAGES/admin.po +++ b/flask_admin/translations/no/LC_MESSAGES/admin.po @@ -595,4 +595,3 @@ msgstr "Velg minst én post." #~ msgid "Size" #~ msgstr "" - diff --git a/flask_admin/translations/pa/LC_MESSAGES/admin.po b/flask_admin/translations/pa/LC_MESSAGES/admin.po index 3731e7a81..484c640c5 100644 --- a/flask_admin/translations/pa/LC_MESSAGES/admin.po +++ b/flask_admin/translations/pa/LC_MESSAGES/admin.po @@ -598,4 +598,3 @@ msgstr "ਕਿਰਪਾ ਕਰਕੇ ਘੱਟੋ ਘੱਟ ਇੱਕ ਰਿਕ #~ msgid "Size" #~ msgstr "" - diff --git a/flask_admin/translations/pl/LC_MESSAGES/admin.po b/flask_admin/translations/pl/LC_MESSAGES/admin.po index 4f5ada8ca..c1c1ff038 100644 --- a/flask_admin/translations/pl/LC_MESSAGES/admin.po +++ b/flask_admin/translations/pl/LC_MESSAGES/admin.po @@ -599,4 +599,3 @@ msgstr "Wybierz co najmniej jeden rekord." #~ msgid "Size" #~ msgstr "" - diff --git a/flask_admin/translations/pt/LC_MESSAGES/admin.po b/flask_admin/translations/pt/LC_MESSAGES/admin.po index 94c5108ad..69bc0c719 100644 --- a/flask_admin/translations/pt/LC_MESSAGES/admin.po +++ b/flask_admin/translations/pt/LC_MESSAGES/admin.po @@ -596,4 +596,3 @@ msgstr "Por favor, selecione pelo menos um model." #~ msgid "Size" #~ msgstr "" - diff --git a/flask_admin/translations/pt_BR/LC_MESSAGES/admin.po b/flask_admin/translations/pt_BR/LC_MESSAGES/admin.po index e2581d513..d952fc03c 100644 --- a/flask_admin/translations/pt_BR/LC_MESSAGES/admin.po +++ b/flask_admin/translations/pt_BR/LC_MESSAGES/admin.po @@ -596,4 +596,3 @@ msgstr "Por favor, selecione pelo menos um registro." #~ msgid "Size" #~ msgstr "" - diff --git a/flask_admin/translations/ro/LC_MESSAGES/admin.po b/flask_admin/translations/ro/LC_MESSAGES/admin.po index 9a5a35901..47d849566 100644 --- a/flask_admin/translations/ro/LC_MESSAGES/admin.po +++ b/flask_admin/translations/ro/LC_MESSAGES/admin.po @@ -599,4 +599,3 @@ msgstr "Vă rugăm să selectaţi cel puţin o înregistrare." #~ msgid "Size" #~ msgstr "" - diff --git a/flask_admin/translations/sk/LC_MESSAGES/admin.po b/flask_admin/translations/sk/LC_MESSAGES/admin.po index 626c1dbff..6f0db38d3 100644 --- a/flask_admin/translations/sk/LC_MESSAGES/admin.po +++ b/flask_admin/translations/sk/LC_MESSAGES/admin.po @@ -598,4 +598,3 @@ msgstr "Prosím, vyberte aspoň jeden záznam." #~ msgid "Size" #~ msgstr "" - diff --git a/flask_admin/translations/sr/LC_MESSAGES/admin.po b/flask_admin/translations/sr/LC_MESSAGES/admin.po index 46cb90988..ae4c99fbf 100644 --- a/flask_admin/translations/sr/LC_MESSAGES/admin.po +++ b/flask_admin/translations/sr/LC_MESSAGES/admin.po @@ -595,4 +595,3 @@ msgstr "Molimo odaberite najmanje jedan zapis." #~ msgid "Size" #~ msgstr "" - diff --git a/flask_admin/translations/sv/LC_MESSAGES/admin.po b/flask_admin/translations/sv/LC_MESSAGES/admin.po index 568a6cc24..afae55c6d 100644 --- a/flask_admin/translations/sv/LC_MESSAGES/admin.po +++ b/flask_admin/translations/sv/LC_MESSAGES/admin.po @@ -596,4 +596,3 @@ msgstr "Välj minst en post." #~ msgid "Size" #~ msgstr "" - diff --git a/flask_admin/translations/tr/LC_MESSAGES/admin.po b/flask_admin/translations/tr/LC_MESSAGES/admin.po index 4a6d99933..3d7890eaa 100644 --- a/flask_admin/translations/tr/LC_MESSAGES/admin.po +++ b/flask_admin/translations/tr/LC_MESSAGES/admin.po @@ -596,4 +596,3 @@ msgstr "Lütfen en az bir kayıt seçin." #~ msgid "Size" #~ msgstr "Boyut" - diff --git a/flask_admin/translations/uk/LC_MESSAGES/admin.po b/flask_admin/translations/uk/LC_MESSAGES/admin.po index 8bbb917dc..f33f75f7a 100644 --- a/flask_admin/translations/uk/LC_MESSAGES/admin.po +++ b/flask_admin/translations/uk/LC_MESSAGES/admin.po @@ -599,4 +599,3 @@ msgstr "Будь ласка, оберіть хоча б один запис." #~ msgid "Size" #~ msgstr "" - diff --git a/flask_admin/translations/vi/LC_MESSAGES/admin.po b/flask_admin/translations/vi/LC_MESSAGES/admin.po index 5a94e7771..32b7ff287 100644 --- a/flask_admin/translations/vi/LC_MESSAGES/admin.po +++ b/flask_admin/translations/vi/LC_MESSAGES/admin.po @@ -594,4 +594,3 @@ msgstr "Vui lòng chọn ít nhất một kỷ lục." #~ msgid "Size" #~ msgstr "" - diff --git a/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/admin.po b/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/admin.po index 21127afc7..74c937f5e 100644 --- a/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/admin.po +++ b/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/admin.po @@ -594,4 +594,3 @@ msgstr "请至少选择一个 model。" #~ msgid "Size" #~ msgstr "大小" - diff --git a/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/introduction.po b/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/introduction.po index 13154ca48..21c19e520 100644 --- a/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/introduction.po +++ b/flask_admin/translations/zh_Hans_CN/LC_MESSAGES/introduction.po @@ -800,4 +800,3 @@ msgstr "" #: ../../doc/introduction.rst:487 msgid "If your view endpoint was defined like::" msgstr "您的视图端点定义如下::" - diff --git a/flask_admin/translations/zh_Hant_TW/LC_MESSAGES/admin.po b/flask_admin/translations/zh_Hant_TW/LC_MESSAGES/admin.po index 433726958..f510f1827 100644 --- a/flask_admin/translations/zh_Hant_TW/LC_MESSAGES/admin.po +++ b/flask_admin/translations/zh_Hant_TW/LC_MESSAGES/admin.po @@ -599,4 +599,3 @@ msgstr "請至少選擇一筆資料。" #~ msgid "Size" #~ msgstr "" - From a8ae9c5614a08260b31e9965a14b967d84cf339b Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Fri, 11 Oct 2024 21:14:03 +0100 Subject: [PATCH 142/156] Run `ruff check . --unsafe-fixes` and re-format --- examples/auth-flask-login/app.py | 6 +- examples/auth/app.py | 2 +- examples/datetime-timezone/app.py | 2 +- examples/forms-files-images/app.py | 7 +- examples/pymongo/app.py | 6 +- examples/sqla-association_proxy/app.py | 2 +- examples/sqla-custom-inline-forms/app.py | 4 +- examples/sqla/admin/main.py | 6 +- examples/tinymongo/app.py | 6 +- flask_admin/_backwards.py | 5 +- flask_admin/babel.py | 2 +- flask_admin/base.py | 11 ++- flask_admin/contrib/fileadmin/__init__.py | 9 +-- flask_admin/contrib/fileadmin/azure.py | 4 +- flask_admin/contrib/fileadmin/s3.py | 2 +- flask_admin/contrib/geoa/fields.py | 4 +- flask_admin/contrib/geoa/typefmt.py | 2 +- flask_admin/contrib/geoa/widgets.py | 2 +- flask_admin/contrib/peewee/ajax.py | 11 ++- flask_admin/contrib/peewee/filters.py | 18 ++--- flask_admin/contrib/peewee/form.py | 18 ++--- flask_admin/contrib/peewee/tools.py | 4 +- flask_admin/contrib/peewee/view.py | 13 ++- flask_admin/contrib/pymongo/filters.py | 2 +- flask_admin/contrib/pymongo/view.py | 8 +- flask_admin/contrib/rediscli.py | 8 +- flask_admin/contrib/sqla/ajax.py | 17 ++-- flask_admin/contrib/sqla/fields.py | 12 ++- flask_admin/contrib/sqla/filters.py | 46 +++++------ flask_admin/contrib/sqla/form.py | 27 +++---- flask_admin/contrib/sqla/tools.py | 8 +- flask_admin/contrib/sqla/validators.py | 2 +- flask_admin/contrib/sqla/view.py | 43 ++++------ flask_admin/form/__init__.py | 7 +- flask_admin/form/fields.py | 12 ++- flask_admin/form/rules.py | 81 +++++++++++-------- flask_admin/form/upload.py | 26 +++--- flask_admin/form/widgets.py | 10 +-- flask_admin/menu.py | 12 ++- flask_admin/model/base.py | 27 +++---- flask_admin/model/fields.py | 14 ++-- flask_admin/model/filters.py | 12 ++- flask_admin/model/form.py | 4 +- flask_admin/model/template.py | 26 ++---- flask_admin/model/typefmt.py | 3 +- flask_admin/model/widgets.py | 14 ++-- .../tests/fileadmin/test_fileadmin_azure.py | 2 +- flask_admin/tests/geoa/test_basic.py | 6 +- flask_admin/tests/peeweemodel/test_basic.py | 21 ++--- flask_admin/tests/pymongo/test_basic.py | 4 +- flask_admin/tests/sqla/test_basic.py | 30 ++++--- flask_admin/tests/test_base.py | 8 +- flask_admin/tests/test_host_matching.py | 6 +- flask_admin/tests/test_model.py | 2 +- 54 files changed, 294 insertions(+), 352 deletions(-) diff --git a/examples/auth-flask-login/app.py b/examples/auth-flask-login/app.py index 3cd59750f..cde5bda1d 100644 --- a/examples/auth-flask-login/app.py +++ b/examples/auth-flask-login/app.py @@ -117,7 +117,7 @@ class MyAdminIndexView(admin.AdminIndexView): def index(self): if not login.current_user.is_authenticated: return redirect(url_for(".login_view")) - return super(MyAdminIndexView, self).index() + return super().index() @expose("/login/", methods=("GET", "POST")) def login_view(self): @@ -136,7 +136,7 @@ def login_view(self): ) self._template_args["form"] = form self._template_args["link"] = link - return super(MyAdminIndexView, self).index() + return super().index() @expose("/register/", methods=("GET", "POST")) def register_view(self): @@ -161,7 +161,7 @@ def register_view(self): ) self._template_args["form"] = form self._template_args["link"] = link - return super(MyAdminIndexView, self).index() + return super().index() @expose("/logout/") def logout_view(self): diff --git a/examples/auth/app.py b/examples/auth/app.py index a852a49eb..97ddc189f 100644 --- a/examples/auth/app.py +++ b/examples/auth/app.py @@ -134,7 +134,7 @@ def build_sample_db(): db.session.add(super_user_role) db.session.commit() - test_user = user_datastore.create_user( + user_datastore.create_user( first_name="Admin", email="admin@example.com", password=hash_password("admin"), diff --git a/examples/datetime-timezone/app.py b/examples/datetime-timezone/app.py index b72d8047c..42ea8b03c 100644 --- a/examples/datetime-timezone/app.py +++ b/examples/datetime-timezone/app.py @@ -78,7 +78,7 @@ def on_model_change(self, form, model, is_created): # Assign the UTC time to the model setattr(model, field_name, utc_time) - super(TimezoneAwareModelView, self).on_model_change(form, model, is_created) + super().on_model_change(form, model, is_created) # inherit TimeZoneAwareModelView to make any admin page timezone-aware diff --git a/examples/forms-files-images/app.py b/examples/forms-files-images/app.py index 2f850a32e..699df5469 100644 --- a/examples/forms-files-images/app.py +++ b/examples/forms-files-images/app.py @@ -110,7 +110,7 @@ def __call__(self, field, **kwargs): # add WYSIWYG class to existing classes existing_classes = kwargs.pop("class", "") or kwargs.pop("class_", "") kwargs["class"] = "{} {}".format(existing_classes, "ckeditor") - return super(CKTextAreaWidget, self).__call__(field, **kwargs) + return super().__call__(field, **kwargs) class CKTextAreaField(fields.TextAreaField): @@ -140,8 +140,9 @@ def _list_thumbnail(view, context, model, name): return "" return Markup( - '<img src="%s">' - % url_for("static", filename=form.thumbgen_filename(model.path)) + '<img src="{}">'.format( + url_for("static", filename=form.thumbgen_filename(model.path)) + ) ) column_formatters = {"path": _list_thumbnail} diff --git a/examples/pymongo/app.py b/examples/pymongo/app.py index 554b44260..f998bdcaf 100644 --- a/examples/pymongo/app.py +++ b/examples/pymongo/app.py @@ -72,7 +72,7 @@ class TweetView(ModelView): form = TweetForm def get_list(self, *args, **kwargs): - count, data = super(TweetView, self).get_list(*args, **kwargs) + count, data = super().get_list(*args, **kwargs) # Grab user names query = {"_id": {"$in": [x["user_id"] for x in data]}} @@ -93,11 +93,11 @@ def _feed_user_choices(self, form): return form def create_form(self): - form = super(TweetView, self).create_form() + form = super().create_form() return self._feed_user_choices(form) def edit_form(self, obj): - form = super(TweetView, self).edit_form(obj) + form = super().edit_form(obj) return self._feed_user_choices(form) # Correct user_id reference before saving diff --git a/examples/sqla-association_proxy/app.py b/examples/sqla-association_proxy/app.py index 16984e2c5..1fad1d819 100644 --- a/examples/sqla-association_proxy/app.py +++ b/examples/sqla-association_proxy/app.py @@ -70,7 +70,7 @@ def __init__(self, keyword=None): self.keyword = keyword def __repr__(self): - return "Keyword(%s)" % repr(self.keyword) + return f"Keyword({repr(self.keyword)})" class UserAdmin(sqla.ModelView): diff --git a/examples/sqla-custom-inline-forms/app.py b/examples/sqla-custom-inline-forms/app.py index 3e1517051..adf185298 100644 --- a/examples/sqla-custom-inline-forms/app.py +++ b/examples/sqla-custom-inline-forms/app.py @@ -80,7 +80,7 @@ def _handle_image_delete(mapper, conn, target): # This widget uses custom template for inline field list class CustomInlineFieldListWidget(RenderTemplateWidget): def __init__(self): - super(CustomInlineFieldListWidget, self).__init__("field_list.html") + super().__init__("field_list.html") # This InlineModelFormList will use our custom widget and hide row controls @@ -116,7 +116,7 @@ class LocationImageInlineModelForm(InlineFormAdmin): } def __init__(self): - super(LocationImageInlineModelForm, self).__init__(LocationImage) + super().__init__(LocationImage) def postprocess_form(self, form_class): form_class.upload = fields.FileField("Image") diff --git a/examples/sqla/admin/main.py b/examples/sqla/admin/main.py index e7a48349e..d2e3e8747 100644 --- a/examples/sqla/admin/main.py +++ b/examples/sqla/admin/main.py @@ -155,7 +155,7 @@ class UserAdmin(sqla.ModelView): # setup edit forms so that only posts created by this user can be selected as 'featured' def edit_form(self, obj): - return self._filtered_posts(super(UserAdmin, self).edit_form(obj)) + return self._filtered_posts(super().edit_form(obj)) def _filtered_posts(self, form): form.featured_post.query_factory = lambda: Post.query.filter( @@ -239,7 +239,7 @@ class PostAdmin(sqla.ModelView): def __init__(self, session): # Just call parent class with predefined model. - super(PostAdmin, self).__init__(Post, session) + super().__init__(Post, session) class TreeView(sqla.ModelView): @@ -261,7 +261,7 @@ class TreeView(sqla.ModelView): # override the 'render' method to pass your own parameters to the template def render(self, template, **kwargs): - return super(TreeView, self).render(template, foo="bar", **kwargs) + return super().render(template, foo="bar", **kwargs) # Create admin diff --git a/examples/tinymongo/app.py b/examples/tinymongo/app.py index 93ff21a94..b21cf4e8d 100644 --- a/examples/tinymongo/app.py +++ b/examples/tinymongo/app.py @@ -90,7 +90,7 @@ class TweetView(ModelView): form = TweetForm def get_list(self, *args, **kwargs): - count, data = super(TweetView, self).get_list(*args, **kwargs) + count, data = super().get_list(*args, **kwargs) # Contribute user_name to the models for item in data: @@ -105,11 +105,11 @@ def _feed_user_choices(self, form): return form def create_form(self): - form = super(TweetView, self).create_form() + form = super().create_form() return self._feed_user_choices(form) def edit_form(self, obj): - form = super(TweetView, self).edit_form(obj) + form = super().edit_form(obj) return self._feed_user_choices(form) # Correct user_id reference before saving diff --git a/flask_admin/_backwards.py b/flask_admin/_backwards.py index 528278a17..db2d40c8d 100644 --- a/flask_admin/_backwards.py +++ b/flask_admin/_backwards.py @@ -25,7 +25,7 @@ def get_property(obj, name, old_name, default=None): """ if hasattr(obj, old_name): warnings.warn( - "Property %s is obsolete, please use %s instead" % (old_name, name), + f"Property {old_name} is obsolete, please use {name} instead", stacklevel=2, ) return getattr(obj, old_name) @@ -51,8 +51,7 @@ def __get__(self, obj, objtype=None): # Check if there's old attribute if hasattr(obj, self.old_name): warnings.warn( - "Property %s is obsolete, please use %s instead" - % (self.old_name, self.new_name), + f"Property {self.old_name} is obsolete, please use {self.new_name} instead", stacklevel=2, ) return getattr(obj, self.old_name) diff --git a/flask_admin/babel.py b/flask_admin/babel.py index 230f501e5..6e1784927 100644 --- a/flask_admin/babel.py +++ b/flask_admin/babel.py @@ -26,7 +26,7 @@ def ngettext(self, singular, plural, n): class CustomDomain(Domain): def __init__(self): - super(CustomDomain, self).__init__(translations.__path__[0], domain="admin") + super().__init__(translations.__path__[0], domain="admin") @property def translation_directories(self): diff --git a/flask_admin/base.py b/flask_admin/base.py index 8920f7f8c..eebae9262 100644 --- a/flask_admin/base.py +++ b/flask_admin/base.py @@ -234,8 +234,7 @@ def __init__( # Default view if self._default_view is None: raise Exception( - "Attempted to instantiate admin view %s without default view" - % self.__class__.__name__ + f"Attempted to instantiate admin view {self.__class__.__name__} without default view" ) def _get_endpoint(self, endpoint): @@ -254,15 +253,15 @@ def _get_view_url(self, admin, url): """ if url is None: if admin.url != "/": - url = "%s/%s" % (admin.url, self.endpoint) + url = f"{admin.url}/{self.endpoint}" else: if self == admin.index_view: url = "/" else: - url = "/%s" % self.endpoint + url = f"/{self.endpoint}" else: if not url.startswith("/"): - url = "%s/%s" % (admin.url, url) + url = f"{admin.url}/{url}" return url @@ -486,7 +485,7 @@ def __init__( menu_icon_type=None, menu_icon_value=None, ): - super(AdminIndexView, self).__init__( + super().__init__( name or babel.lazy_gettext("Home"), category, endpoint or "admin", diff --git a/flask_admin/contrib/fileadmin/__init__.py b/flask_admin/contrib/fileadmin/__init__.py index 54964b29e..e23f2b5ba 100644 --- a/flask_admin/contrib/fileadmin/__init__.py +++ b/flask_admin/contrib/fileadmin/__init__.py @@ -52,8 +52,7 @@ def __init__(self, base_path): if not self.path_exists(self.base_path): raise OSError( - 'FileAdmin path "%s" does not exist or is not accessible' - % self.base_path + f'FileAdmin path "{self.base_path}" does not exist or is not accessible' ) def get_base_path(self): @@ -352,7 +351,7 @@ def __init__( if self.editable_extensions and not isinstance(self.editable_extensions, set): self.editable_extensions = set(self.editable_extensions) - super(BaseFileAdmin, self).__init__( + super().__init__( name, category, endpoint, @@ -403,7 +402,7 @@ class UploadForm(self.form_base_class): upload = fields.FileField(lazy_gettext("File to upload")) def __init__(self, *args, **kwargs): - super(UploadForm, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) self.admin = kwargs["admin"] def validate_upload(self, field): @@ -1359,4 +1358,4 @@ class FileAdmin(BaseFileAdmin): def __init__(self, base_path, *args, **kwargs): storage = LocalFileStorage(base_path) - super(FileAdmin, self).__init__(*args, storage=storage, **kwargs) + super().__init__(*args, storage=storage, **kwargs) diff --git a/flask_admin/contrib/fileadmin/azure.py b/flask_admin/contrib/fileadmin/azure.py index 88a7cef16..b72389f67 100644 --- a/flask_admin/contrib/fileadmin/azure.py +++ b/flask_admin/contrib/fileadmin/azure.py @@ -180,7 +180,7 @@ def send_file(self, file_path): expiry=now + self._send_file_validity, start=now - self._send_file_lookback, ) - return redirect("%s?%s" % (url, sas)) + return redirect(f"{url}?{sas}") def read_file(self, path): path = self._ensure_blob_path(path) @@ -268,4 +268,4 @@ class AzureFileAdmin(BaseFileAdmin): def __init__(self, container_name, connection_string, *args, **kwargs): storage = AzureStorage(container_name, connection_string) - super(AzureFileAdmin, self).__init__(*args, storage=storage, **kwargs) + super().__init__(*args, storage=storage, **kwargs) diff --git a/flask_admin/contrib/fileadmin/s3.py b/flask_admin/contrib/fileadmin/s3.py index ebc3292fa..759ceb50b 100644 --- a/flask_admin/contrib/fileadmin/s3.py +++ b/flask_admin/contrib/fileadmin/s3.py @@ -221,4 +221,4 @@ def __init__( storage = S3Storage( bucket_name, region, aws_access_key_id, aws_secret_access_key ) - super(S3FileAdmin, self).__init__(*args, storage=storage, **kwargs) + super().__init__(*args, storage=storage, **kwargs) diff --git a/flask_admin/contrib/geoa/fields.py b/flask_admin/contrib/geoa/fields.py index 99b55d88d..990c086b5 100644 --- a/flask_admin/contrib/geoa/fields.py +++ b/flask_admin/contrib/geoa/fields.py @@ -22,7 +22,7 @@ def __init__( self.widget = LeafletWidget( tile_layer_url=tile_layer_url, tile_layer_attribution=tile_layer_attribution ) - super(GeoJSONField, self).__init__(label, validators, **kwargs) + super().__init__(label, validators, **kwargs) self.web_srid = 4326 self.srid = srid if self.srid == -1: @@ -46,7 +46,7 @@ def _value(self): return "" def process_formdata(self, valuelist): - super(GeoJSONField, self).process_formdata(valuelist) + super().process_formdata(valuelist) if str(self.data) == "": self.data = None if self.data is not None: diff --git a/flask_admin/contrib/geoa/typefmt.py b/flask_admin/contrib/geoa/typefmt.py index 8346c33c0..5828d25c8 100644 --- a/flask_admin/contrib/geoa/typefmt.py +++ b/flask_admin/contrib/geoa/typefmt.py @@ -32,7 +32,7 @@ def geom_formatter(view, value, name) -> str: geojson = ( view.session.query(view.model).with_entities(func.ST_AsGeoJSON(value)).scalar() ) - return Markup("<textarea %s>%s</textarea>" % (params, geojson)) + return Markup(f"<textarea {params}>{geojson}</textarea>") DEFAULT_FORMATTERS = BASE_FORMATTERS.copy() diff --git a/flask_admin/contrib/geoa/widgets.py b/flask_admin/contrib/geoa/widgets.py index 04ec8f3b4..b1996b643 100644 --- a/flask_admin/contrib/geoa/widgets.py +++ b/flask_admin/contrib/geoa/widgets.py @@ -85,4 +85,4 @@ def __call__(self, field, **kwargs): kwargs["data-max-bounds-ne-lat"] = maxx kwargs["data-max-bounds-ne-lng"] = maxy - return super(LeafletWidget, self).__call__(field, **kwargs) + return super().__call__(field, **kwargs) diff --git a/flask_admin/contrib/peewee/ajax.py b/flask_admin/contrib/peewee/ajax.py index 61a5f4952..87b587f9b 100644 --- a/flask_admin/contrib/peewee/ajax.py +++ b/flask_admin/contrib/peewee/ajax.py @@ -14,15 +14,14 @@ def __init__(self, name, model, **options): :param fields: Fields to run query against """ - super(QueryAjaxModelLoader, self).__init__(name, options) + super().__init__(name, options) self.model = model self.fields = options.get("fields") if not self.fields: raise ValueError( - "AJAX loading requires `fields` to be specified for %s.%s" - % (model, self.name) + f"AJAX loading requires `fields` to be specified for {model}.{self.name}" ) self._cached_fields = self._process_fields() @@ -37,7 +36,7 @@ def _process_fields(self): attr = getattr(self.model, field, None) if not attr: - raise ValueError("%s.%s does not exist." % (self.model, field)) + raise ValueError(f"{self.model}.{field} does not exist.") remote_fields.append(attr) else: @@ -60,7 +59,7 @@ def get_list(self, term, offset=0, limit=DEFAULT_PAGE_SIZE): if len(term) > 0: stmt = None for field in self._cached_fields: - q = field ** ("%%%s%%" % term) + q = field ** (f"%{term}%") if stmt is None: stmt = q @@ -79,7 +78,7 @@ def create_ajax_loader(model, name, field_name, options): prop = getattr(model, field_name, None) if prop is None: - raise ValueError("Model %s does not have field %s." % (model, field_name)) + raise ValueError(f"Model {model} does not have field {field_name}.") # TODO: Check for field remote_model = prop.rel_model diff --git a/flask_admin/contrib/peewee/filters.py b/flask_admin/contrib/peewee/filters.py index 1db9cae32..605571663 100644 --- a/flask_admin/contrib/peewee/filters.py +++ b/flask_admin/contrib/peewee/filters.py @@ -22,7 +22,7 @@ def __init__(self, column, name, options=None, data_type=None): :param data_type: Client data type """ - super(BasePeeweeFilter, self).__init__(name, options, data_type) + super().__init__(name, options, data_type) self.column = column @@ -91,9 +91,7 @@ def operation(self): class FilterInList(BasePeeweeFilter): def __init__(self, column, name, options=None, data_type=None): - super(FilterInList, self).__init__( - column, name, options, data_type="select2-tags" - ) + super().__init__(column, name, options, data_type="select2-tags") def clean(self, value): return [v.strip() for v in value.split(",") if v.strip()] @@ -191,9 +189,7 @@ class DateSmallerFilter(FilterSmaller, filters.BaseDateFilter): class DateBetweenFilter(BasePeeweeFilter, filters.BaseDateBetweenFilter): def __init__(self, column, name, options=None, data_type=None): - super(DateBetweenFilter, self).__init__( - column, name, options, data_type="daterangepicker" - ) + super().__init__(column, name, options, data_type="daterangepicker") def apply(self, query, value): start, end = value @@ -227,9 +223,7 @@ class DateTimeSmallerFilter(FilterSmaller, filters.BaseDateTimeFilter): class DateTimeBetweenFilter(BasePeeweeFilter, filters.BaseDateTimeBetweenFilter): def __init__(self, column, name, options=None, data_type=None): - super(DateTimeBetweenFilter, self).__init__( - column, name, options, data_type="datetimerangepicker" - ) + super().__init__(column, name, options, data_type="datetimerangepicker") def apply(self, query, value): start, end = value @@ -263,9 +257,7 @@ class TimeSmallerFilter(FilterSmaller, filters.BaseTimeFilter): class TimeBetweenFilter(BasePeeweeFilter, filters.BaseTimeBetweenFilter): def __init__(self, column, name, options=None, data_type=None): - super(TimeBetweenFilter, self).__init__( - column, name, options, data_type="timerangepicker" - ) + super().__init__(column, name, options, data_type="timerangepicker") def apply(self, query, value): start, end = value diff --git a/flask_admin/contrib/peewee/form.py b/flask_admin/contrib/peewee/form.py index 5ae87ad5c..b3c6c7ecd 100644 --- a/flask_admin/contrib/peewee/form.py +++ b/flask_admin/contrib/peewee/form.py @@ -53,9 +53,7 @@ def __init__(self, form, model, prop, inline_view, **kwargs): self.inline_view = inline_view self._pk = get_primary_key(model) - super(InlineModelFormList, self).__init__( - self.form_field_type(form, self._pk), **kwargs - ) + super().__init__(self.form_field_type(form, self._pk), **kwargs) def display_row_controls(self, field): return field.get_pk() is not None @@ -119,7 +117,7 @@ def save_related(self, obj): class CustomModelConverter(ModelConverter): def __init__(self, view, additional=None): - super(CustomModelConverter, self).__init__(additional) + super().__init__(additional) self.view = view # @todo: This really should be done within wtfpeewee @@ -145,9 +143,7 @@ def handle_foreign_key(self, model, field, **kwargs): return field.name, AjaxSelectField(loader, **kwargs) - return super(CustomModelConverter, self).handle_foreign_key( - model, field, **kwargs - ) + return super().handle_foreign_key(model, field, **kwargs) def handle_pk(self, model, field, **kwargs): kwargs["validators"] = [] @@ -212,7 +208,7 @@ class InlineModelConverter(InlineModelConverterBase): """ def get_info(self, p): - info = super(InlineModelConverter, self).get_info(p) + info = super().get_info(p) if info is None: if isinstance(p, BaseModel): @@ -220,7 +216,7 @@ def get_info(self, p): else: model = getattr(p, "model", None) if model is None: - raise Exception("Unknown inline model admin: %s" % repr(p)) + raise Exception(f"Unknown inline model admin: {repr(p)}") attrs = dict() @@ -242,7 +238,7 @@ def process_ajax_refs(self, info): if refs: for name, opts in iteritems(refs): - new_name = "%s.%s" % (info.model.__name__.lower(), name) + new_name = f"{info.model.__name__.lower()}.{name}" loader = None if isinstance(opts, (list, tuple)): @@ -269,7 +265,7 @@ def contribute(self, converter, model, form_class, inline_model): reverse_field = field break else: - raise Exception("Cannot find reverse relation for model %s" % info.model) + raise Exception(f"Cannot find reverse relation for model {info.model}") # Remove reverse property from the list ignore = [reverse_field.name] diff --git a/flask_admin/contrib/peewee/tools.py b/flask_admin/contrib/peewee/tools.py index 2a1087d4f..4010f837e 100644 --- a/flask_admin/contrib/peewee/tools.py +++ b/flask_admin/contrib/peewee/tools.py @@ -4,11 +4,11 @@ def get_primary_key(model): def parse_like_term(term): if term.startswith("^"): - stmt = "%s%%" % term[1:] + stmt = f"{term[1:]}%" elif term.startswith("="): stmt = term[1:] else: - stmt = "%%%s%%" % term + stmt = f"%{term}%" return stmt diff --git a/flask_admin/contrib/peewee/view.py b/flask_admin/contrib/peewee/view.py index 06b415008..c77df2b21 100644 --- a/flask_admin/contrib/peewee/view.py +++ b/flask_admin/contrib/peewee/view.py @@ -184,7 +184,7 @@ def __init__( ): self._search_fields = [] - super(ModelView, self).__init__( + super().__init__( model, name, category, @@ -260,7 +260,7 @@ def scaffold_filters(self, name): attr = name if attr is None: - raise Exception("Failed to find field for filter: %s" % name) + raise Exception(f"Failed to find field for filter: {name}") # Check if field is in different model model_class = None @@ -270,10 +270,7 @@ def scaffold_filters(self, name): model_class = attr.model if model_class != self.model: - visible_name = "%s / %s" % ( - self.get_column_name(model_class.__name__), - self.get_column_name(attr.name), - ) + visible_name = f"{self.get_column_name(model_class.__name__)} / {self.get_column_name(attr.name)}" else: if not isinstance(name, string_types): visible_name = self.get_column_name(attr.name) @@ -447,7 +444,7 @@ def get_list( # Filters if self._filters: - for flt, flt_name, value in filters: + for flt, _flt_name, value in filters: f = self._filters[flt] query = self._handle_join(query, f.column, joins) @@ -557,7 +554,7 @@ def is_action_allowed(self, name): if name == "delete" and not self.can_delete: return False - return super(ModelView, self).is_action_allowed(name) + return super().is_action_allowed(name) @action( "delete", diff --git a/flask_admin/contrib/pymongo/filters.py b/flask_admin/contrib/pymongo/filters.py index a02ad91e1..9ecd0474f 100644 --- a/flask_admin/contrib/pymongo/filters.py +++ b/flask_admin/contrib/pymongo/filters.py @@ -24,7 +24,7 @@ def __init__(self, column, name, options=None, data_type=None): :param data_type: Client data type """ - super(BasePyMongoFilter, self).__init__(name, options, data_type) + super().__init__(name, options, data_type) self.column = column diff --git a/flask_admin/contrib/pymongo/view.py b/flask_admin/contrib/pymongo/view.py index b51e25a3f..e37f05090 100644 --- a/flask_admin/contrib/pymongo/view.py +++ b/flask_admin/contrib/pymongo/view.py @@ -106,9 +106,9 @@ def __init__( name = self._prettify_name(coll.name) if endpoint is None: - endpoint = ("%sview" % coll.name).lower() + endpoint = (f"{coll.name}view").lower() - super(ModelView, self).__init__( + super().__init__( None, name, category, @@ -259,7 +259,7 @@ def get_list( if self._filters: data = [] - for flt, flt_name, value in filters: + for flt, _flt_name, value in filters: f = self._filters[flt] data = f.apply(data, f.clean(value)) @@ -403,7 +403,7 @@ def is_action_allowed(self, name): if name == "delete" and not self.can_delete: return False - return super(ModelView, self).is_action_allowed(name) + return super().is_action_allowed(name) @action( "delete", diff --git a/flask_admin/contrib/rediscli.py b/flask_admin/contrib/rediscli.py index 9ec1268a5..efdabecf0 100644 --- a/flask_admin/contrib/rediscli.py +++ b/flask_admin/contrib/rediscli.py @@ -63,7 +63,7 @@ def __init__(self, redis, name=None, category=None, endpoint=None, url=None): :param url: Base URL. If not provided, will use endpoint as a URL. """ - super(RedisCli, self).__init__(name, category, endpoint, url) + super().__init__(name, category, endpoint, url) self.redis = redis @@ -129,7 +129,7 @@ def _error(self, msg): :param msg: Message to format """ - return Markup('<div class="error">%s</div>' % msg) + return Markup(f'<div class="error">{msg}</div>') def _result(self, result): """ @@ -188,7 +188,7 @@ def execute_view(self): return self._execute_command(parts[0], parts[1:]) except CommandError as err: - return self._error("Cli: %s" % err) + return self._error(f"Cli: {err}") except Exception as ex: log.exception(ex) - return self._error("Cli: %s" % ex) + return self._error(f"Cli: {ex}") diff --git a/flask_admin/contrib/sqla/ajax.py b/flask_admin/contrib/sqla/ajax.py index 3a75a5a96..80bbe0cca 100644 --- a/flask_admin/contrib/sqla/ajax.py +++ b/flask_admin/contrib/sqla/ajax.py @@ -25,7 +25,7 @@ def __init__(self, name, session, model, **options): :param filters: Additional filters to apply to the loader """ - super(QueryAjaxModelLoader, self).__init__(name, options) + super().__init__(name, options) self.session = session self.model = model @@ -35,8 +35,7 @@ def __init__(self, name, session, model, **options): if not self.fields: raise ValueError( - "AJAX loading requires `fields` to be specified for %s.%s" - % (model, self.name) + f"AJAX loading requires `fields` to be specified for {model}.{self.name}" ) self._cached_fields = self._process_fields() @@ -56,7 +55,7 @@ def _process_fields(self): attr = getattr(self.model, field, None) if not attr: - raise ValueError("%s.%s does not exist." % (self.model, field)) + raise ValueError(f"{self.model}.{field} does not exist.") remote_fields.append(attr) else: @@ -84,16 +83,16 @@ def get_list(self, term, offset=0, limit=DEFAULT_PAGE_SIZE): # no type casting to string if a ColumnAssociationProxyInstance is given filters = ( - field.ilike("%%%s%%" % term) + field.ilike(f"%{term}%") if is_association_proxy(field) - else cast(field, String).ilike("%%%s%%" % term) + else cast(field, String).ilike(f"%{term}%") for field in self._cached_fields ) query = query.filter(or_(*filters)) if self.filters: filters = [ - text("%s.%s" % (self.model.__tablename__.lower(), value)) + text(f"{self.model.__tablename__.lower()}.{value}") for value in self.filters ] query = query.filter(and_(*filters)) @@ -108,10 +107,10 @@ def create_ajax_loader(model, session, name, field_name, options): attr = getattr(model, field_name, None) if attr is None: - raise ValueError("Model %s does not have field %s." % (model, field_name)) + raise ValueError(f"Model {model} does not have field {field_name}.") if not is_relationship(attr) and not is_association_proxy(attr): - raise ValueError("%s.%s is not a relation." % (model, field_name)) + raise ValueError(f"{model}.{field_name} is not a relation.") if is_association_proxy(attr): attr = attr.remote_attr diff --git a/flask_admin/contrib/sqla/fields.py b/flask_admin/contrib/sqla/fields.py index c074c077e..b5a68b258 100644 --- a/flask_admin/contrib/sqla/fields.py +++ b/flask_admin/contrib/sqla/fields.py @@ -68,7 +68,7 @@ def __init__( blank_text="", **kwargs, ): - super(QuerySelectField, self).__init__(label, validators, **kwargs) + super().__init__(label, validators, **kwargs) self.query_factory = query_factory if get_pk is None: @@ -126,7 +126,7 @@ def process_formdata(self, valuelist): def pre_validate(self, form): if not self.allow_blank or self.data is not None: - for pk, obj in self._get_object_list(): + for _pk, obj in self._get_object_list(): if self.data == obj: break else: @@ -148,9 +148,7 @@ class QuerySelectMultipleField(QuerySelectField): def __init__(self, label=None, validators=None, default=None, **kwargs): if default is None: default = [] - super(QuerySelectMultipleField, self).__init__( - label, validators, default=default, **kwargs - ) + super().__init__(label, validators, default=default, **kwargs) self._invalid_formdata = False def _get_data(self): @@ -241,7 +239,7 @@ def process(self, formdata, data=unset_value, extra_filters=None): returned by SQLAlchemy to a list of classes before processing.""" if isinstance(data, dict): data = [KeyValue(k, v) for k, v in iteritems(data)] - super(InlineHstoreList, self).process(formdata, data, extra_filters) + super().process(formdata, data, extra_filters) def populate_obj(self, obj, name): """Combines each FormField key/value into a dictionary for storage""" @@ -299,7 +297,7 @@ def __init__(self, form, session, model, prop, inline_view, **kwargs): form_field = self.form_field_type(form, self._pk, form_opts=form_opts) - super(InlineModelFormList, self).__init__(form_field, **kwargs) + super().__init__(form_field, **kwargs) def display_row_controls(self, field): return field.get_pk() is not None diff --git a/flask_admin/contrib/sqla/filters.py b/flask_admin/contrib/sqla/filters.py index e92b976bc..47f1b3c03 100644 --- a/flask_admin/contrib/sqla/filters.py +++ b/flask_admin/contrib/sqla/filters.py @@ -26,7 +26,7 @@ def __init__(self, column, name, options=None, data_type=None): :param data_type: Client data type """ - super(BaseSQLAFilter, self).__init__(name, options, data_type) + super().__init__(name, options, data_type) self.column = column @@ -34,7 +34,7 @@ def get_column(self, alias): return self.column if alias is None else getattr(alias, self.column.key) def apply(self, query, value, alias=None): - return super(BaseSQLAFilter, self).apply(query, value) + return super().apply(query, value) # Common filters @@ -101,9 +101,7 @@ def operation(self): class FilterInList(BaseSQLAFilter): def __init__(self, column, name, options=None, data_type=None): - super(FilterInList, self).__init__( - column, name, options, data_type="select2-tags" - ) + super().__init__(column, name, options, data_type="select2-tags") def clean(self, value): return [v.strip() for v in value.split(",") if v.strip()] @@ -200,9 +198,7 @@ class DateSmallerFilter(FilterSmaller, filters.BaseDateFilter): class DateBetweenFilter(BaseSQLAFilter, filters.BaseDateBetweenFilter): def __init__(self, column, name, options=None, data_type=None): - super(DateBetweenFilter, self).__init__( - column, name, options, data_type="daterangepicker" - ) + super().__init__(column, name, options, data_type="daterangepicker") def apply(self, query, value, alias=None): start, end = value @@ -236,9 +232,7 @@ class DateTimeSmallerFilter(FilterSmaller, filters.BaseDateTimeFilter): class DateTimeBetweenFilter(BaseSQLAFilter, filters.BaseDateTimeBetweenFilter): def __init__(self, column, name, options=None, data_type=None): - super(DateTimeBetweenFilter, self).__init__( - column, name, options, data_type="datetimerangepicker" - ) + super().__init__(column, name, options, data_type="datetimerangepicker") def apply(self, query, value, alias=None): start, end = value @@ -272,9 +266,7 @@ class TimeSmallerFilter(FilterSmaller, filters.BaseTimeFilter): class TimeBetweenFilter(BaseSQLAFilter, filters.BaseTimeBetweenFilter): def __init__(self, column, name, options=None, data_type=None): - super(TimeBetweenFilter, self).__init__( - column, name, options, data_type="timerangepicker" - ) + super().__init__(column, name, options, data_type="timerangepicker") def apply(self, query, value, alias=None): start, end = value @@ -293,38 +285,38 @@ def operation(self): class EnumEqualFilter(FilterEqual): def __init__(self, column, name, options=None, **kwargs): self.enum_class = column.type.enum_class - super(EnumEqualFilter, self).__init__(column, name, options, **kwargs) + super().__init__(column, name, options, **kwargs) def clean(self, value): if self.enum_class is None: - return super(EnumEqualFilter, self).clean(value) + return super().clean(value) return self.enum_class[value] class EnumFilterNotEqual(FilterNotEqual): def __init__(self, column, name, options=None, **kwargs): self.enum_class = column.type.enum_class - super(EnumFilterNotEqual, self).__init__(column, name, options, **kwargs) + super().__init__(column, name, options, **kwargs) def clean(self, value): if self.enum_class is None: - return super(EnumFilterNotEqual, self).clean(value) + return super().clean(value) return self.enum_class[value] class EnumFilterEmpty(FilterEmpty): def __init__(self, column, name, options=None, **kwargs): self.enum_class = column.type.enum_class - super(EnumFilterEmpty, self).__init__(column, name, options, **kwargs) + super().__init__(column, name, options, **kwargs) class EnumFilterInList(FilterInList): def __init__(self, column, name, options=None, **kwargs): self.enum_class = column.type.enum_class - super(EnumFilterInList, self).__init__(column, name, options, **kwargs) + super().__init__(column, name, options, **kwargs) def clean(self, value): - values = super(EnumFilterInList, self).clean(value) + values = super().clean(value) if self.enum_class is not None: values = [self.enum_class[val] for val in values] return values @@ -333,10 +325,10 @@ def clean(self, value): class EnumFilterNotInList(FilterNotInList): def __init__(self, column, name, options=None, **kwargs): self.enum_class = column.type.enum_class - super(EnumFilterNotInList, self).__init__(column, name, options, **kwargs) + super().__init__(column, name, options, **kwargs) def clean(self, value): - values = super(EnumFilterNotInList, self).clean(value) + values = super().clean(value) if self.enum_class is not None: values = [self.enum_class[val] for val in values] return values @@ -344,7 +336,7 @@ def clean(self, value): class ChoiceTypeEqualFilter(FilterEqual): def __init__(self, column, name, options=None, **kwargs): - super(ChoiceTypeEqualFilter, self).__init__(column, name, options, **kwargs) + super().__init__(column, name, options, **kwargs) def apply(self, query, user_query, alias=None): column = self.get_column(alias) @@ -368,7 +360,7 @@ def apply(self, query, user_query, alias=None): class ChoiceTypeNotEqualFilter(FilterNotEqual): def __init__(self, column, name, options=None, **kwargs): - super(ChoiceTypeNotEqualFilter, self).__init__(column, name, options, **kwargs) + super().__init__(column, name, options, **kwargs) def apply(self, query, user_query, alias=None): column = self.get_column(alias) @@ -393,7 +385,7 @@ def apply(self, query, user_query, alias=None): class ChoiceTypeLikeFilter(FilterLike): def __init__(self, column, name, options=None, **kwargs): - super(ChoiceTypeLikeFilter, self).__init__(column, name, options, **kwargs) + super().__init__(column, name, options, **kwargs) def apply(self, query, user_query, alias=None): column = self.get_column(alias) @@ -416,7 +408,7 @@ def apply(self, query, user_query, alias=None): class ChoiceTypeNotLikeFilter(FilterNotLike): def __init__(self, column, name, options=None, **kwargs): - super(ChoiceTypeNotLikeFilter, self).__init__(column, name, options, **kwargs) + super().__init__(column, name, options, **kwargs) def apply(self, query, user_query, alias=None): column = self.get_column(alias) diff --git a/flask_admin/contrib/sqla/form.py b/flask_admin/contrib/sqla/form.py index ddc3eb829..1f756e4bf 100644 --- a/flask_admin/contrib/sqla/form.py +++ b/flask_admin/contrib/sqla/form.py @@ -45,7 +45,7 @@ class AdminModelConverter(ModelConverterBase): """ def __init__(self, session, view): - super(AdminModelConverter, self).__init__() + super().__init__() self.session = session self.view = view @@ -186,8 +186,7 @@ def convert(self, model, mapper, name, prop, field_args, hidden_pk): return None elif len(columns) > 1: warnings.warn( - "Can not convert multiple-column properties (%s.%s)" - % (model, prop.key) + f"Can not convert multiple-column properties ({model}.{prop.key})" ) return None @@ -588,7 +587,7 @@ def find(name): if column is not None and hasattr(column, "property"): return relation_name, column.property - raise ValueError("Invalid model property name %s.%s" % (model, name)) + raise ValueError(f"Invalid model property name {model}.{name}") # Filter properties while maintaining property order in 'only' list properties = (find(x) for x in only) @@ -642,12 +641,12 @@ def __init__(self, session, view, model_converter): Model converter class. Will be automatically instantiated with appropriate `InlineFormAdmin` instance. """ - super(InlineModelConverter, self).__init__(view) + super().__init__(view) self.session = session self.model_converter = model_converter def get_info(self, p): - info = super(InlineModelConverter, self).get_info(p) + info = super().get_info(p) # Special case for model instances if info is None: @@ -657,7 +656,7 @@ def get_info(self, p): model = getattr(p, "model", None) if model is None: - raise Exception("Unknown inline model admin: %s" % repr(p)) + raise Exception(f"Unknown inline model admin: {repr(p)}") attrs = dict() for attr in dir(p): @@ -680,7 +679,7 @@ def process_ajax_refs(self, info): if refs: for name, opts in iteritems(refs): - new_name = "%s-%s" % (info.model.__name__.lower(), name) + new_name = f"{info.model.__name__.lower()}-{name}" loader = None if isinstance(opts, dict): @@ -732,7 +731,7 @@ def _calculate_mapping_key_pair(self, model, info): reverse_props.append(prop) if not reverse_props: - raise Exception("Cannot find reverse relation for model %s" % info.model) + raise Exception(f"Cannot find reverse relation for model {info.model}") for reverse_prop in reverse_props: # Find forward property @@ -752,9 +751,7 @@ def _calculate_mapping_key_pair(self, model, info): forward_reverse_props_keys[prop.key] = reverse_prop.key break else: - raise Exception( - "Cannot find forward relation for model %s" % info.model - ) + raise Exception(f"Cannot find forward relation for model {info.model}") return forward_reverse_props_keys @@ -888,13 +885,11 @@ def _calculate_mapping_key_pair(self, model, info): inline_relationship[backward_prop.key] = forward_prop.key break else: - raise Exception( - "Cannot find reverse relation for model %s" % info.model - ) + raise Exception(f"Cannot find reverse relation for model {info.model}") break if not inline_relationship: - raise Exception("Cannot find forward relation for model %s" % info.model) + raise Exception(f"Cannot find forward relation for model {info.model}") return inline_relationship diff --git a/flask_admin/contrib/sqla/tools.py b/flask_admin/contrib/sqla/tools.py index ac2cd261b..a08bffe4c 100644 --- a/flask_admin/contrib/sqla/tools.py +++ b/flask_admin/contrib/sqla/tools.py @@ -30,11 +30,11 @@ def parse_like_term(term): if term.startswith("^"): - stmt = "%s%%" % term[1:] + stmt = f"{term[1:]}%" elif term.startswith("="): stmt = term[1:] else: - stmt = "%%%s%%" % term + stmt = f"%{term}%" return stmt @@ -138,7 +138,7 @@ def get_columns_for_field(field): or not hasattr(field.property, "columns") or not field.property.columns ): - raise Exception("Invalid field %s: does not contains any columns." % field) + raise Exception(f"Invalid field {field}: does not contains any columns.") return field.property.columns @@ -190,7 +190,7 @@ def get_field_with_path(model, name, return_remote_proxy_attr=True): columns = get_columns_for_field(attr) if len(columns) > 1: - raise Exception("Can only handle one column for %s" % name) + raise Exception(f"Can only handle one column for {name}") column = columns[0] diff --git a/flask_admin/contrib/sqla/validators.py b/flask_admin/contrib/sqla/validators.py index f0ce862db..16c65fe55 100644 --- a/flask_admin/contrib/sqla/validators.py +++ b/flask_admin/contrib/sqla/validators.py @@ -52,7 +52,7 @@ class ItemsRequired(InputRequired): """ def __init__(self, min=1, message=None): - super(ItemsRequired, self).__init__(message=message) + super().__init__(message=message) self.min = min def __call__(self, form, field): diff --git a/flask_admin/contrib/sqla/view.py b/flask_admin/contrib/sqla/view.py index ce0ca1364..e178e6d82 100644 --- a/flask_admin/contrib/sqla/view.py +++ b/flask_admin/contrib/sqla/view.py @@ -365,7 +365,7 @@ def __init__( if self.form_choices is None: self.form_choices = {} - super(ModelView, self).__init__( + super().__init__( model, name, category, @@ -383,7 +383,7 @@ def __init__( self._primary_key = self.scaffold_pk() if self._primary_key is None: - raise Exception("Model %s does not have primary key." % self.model.__name__) + raise Exception(f"Model {self.model.__name__} does not have primary key.") # Configuration if not self.column_select_related_list: @@ -477,8 +477,7 @@ def scaffold_list_columns(self): continue elif len(filtered) > 1: warnings.warn( - "Can not convert multiple-column properties (%s.%s)" - % (self.model, p.key) + f"Can not convert multiple-column properties ({self.model}.{p.key})" ) continue @@ -633,7 +632,7 @@ def init_search(self): attr, joins = tools.get_field_with_path(self.model, name) if not attr: - raise Exception("Failed to find field for search field: %s" % name) + raise Exception(f"Failed to find field for search field: {name}") if tools.is_hybrid_property(self.model, name): column = attr @@ -681,7 +680,7 @@ def scaffold_filters(self, name): attr, joins = tools.get_field_with_path(self.model, name) if attr is None: - raise Exception("Failed to find field for filter: %s" % name) + raise Exception(f"Failed to find field for filter: {name}") # Figure out filters for related column if is_relationship(attr): @@ -695,10 +694,7 @@ def scaffold_filters(self, name): if column.foreign_keys or column.primary_key: continue - visible_name = "%s / %s" % ( - self.get_column_name(attr.prop.target.name), - self.get_column_name(p.key), - ) + visible_name = f"{self.get_column_name(attr.prop.target.name)} / {self.get_column_name(p.key)}" type_name = type(column.type).__name__ flt = self.filter_converter.convert(type_name, column, visible_name) @@ -725,7 +721,7 @@ def scaffold_filters(self, name): if len(columns) > 1: raise Exception( - "Can not filter more than on one column for %s" % name + f"Can not filter more than on one column for {name}" ) column = columns[0] @@ -743,16 +739,9 @@ def scaffold_filters(self, name): and name not in self.column_labels ): if joined_column_name: - visible_name = "%s / %s / %s" % ( - joined_column_name, - self.get_column_name(column.table.name), - self.get_column_name(column.name), - ) + visible_name = f"{joined_column_name} / {self.get_column_name(column.table.name)} / {self.get_column_name(column.name)}" else: - visible_name = "%s / %s" % ( - self.get_column_name(column.table.name), - self.get_column_name(column.name), - ) + visible_name = f"{self.get_column_name(column.table.name)} / {self.get_column_name(column.name)}" else: if not isinstance(name, string_types): visible_name = self.get_column_name(name.property.key) @@ -892,7 +881,7 @@ def scaffold_auto_joins(self): joined = [] - for prop, name in self._list_columns: + for prop, _name in self._list_columns: if prop in relations: joined.append(getattr(self.model, prop)) @@ -963,7 +952,7 @@ def _order_by(self, query, joins, sort_joins, sort_field, sort_desc): return query, joins def _get_default_order(self): - order = super(ModelView, self)._get_default_order() + order = super()._get_default_order() for field, direction in order or []: attr, joins = tools.get_field_with_path(self.model, field) yield attr, joins, direction @@ -1038,7 +1027,7 @@ def _apply_search(self, query, count_query, joins, count_joins, search): return query, count_query, joins, count_joins def _apply_filters(self, query, count_query, joins, count_joins, filters): - for idx, flt_name, value in filters: + for idx, _flt_name, value in filters: flt = self._filters[idx] alias = None @@ -1069,8 +1058,8 @@ def _apply_filters(self, query, count_query, joins, count_joins, filters): if len(spec.args) == 3: warnings.warn( - "Please update your custom filter %s to " - "include additional `alias` parameter." % repr(flt) + f"Please update your custom filter {repr(flt)} to " + "include additional `alias` parameter." ) else: raise @@ -1205,7 +1194,7 @@ def handle_view_exception(self, exc): ) return True - return super(ModelView, self).handle_view_exception(exc) + return super().handle_view_exception(exc) def build_new_instance(self): """ @@ -1315,7 +1304,7 @@ def is_action_allowed(self, name): if name == "delete" and not self.can_delete: return False - return super(ModelView, self).is_action_allowed(name) + return super().is_action_allowed(name) @action( "delete", diff --git a/flask_admin/form/__init__.py b/flask_admin/form/__init__.py index 84f5c2d30..282207af0 100644 --- a/flask_admin/form/__init__.py +++ b/flask_admin/form/__init__.py @@ -24,9 +24,7 @@ def get_translations(self, form): def __init__(self, formdata=None, obj=None, prefix="", **kwargs): self._obj = obj - super(BaseForm, self).__init__( - formdata=formdata, obj=obj, prefix=prefix, **kwargs - ) + super().__init__(formdata=formdata, obj=obj, prefix=prefix, **kwargs) class FormOpts: @@ -46,8 +44,7 @@ def recreate_field(unbound): """ if not isinstance(unbound, UnboundField): raise ValueError( - "recreate_field expects UnboundField instance, %s was passed." - % type(unbound) + f"recreate_field expects UnboundField instance, {type(unbound)} was passed." ) return unbound.field_class(*unbound.args, **unbound.kwargs) diff --git a/flask_admin/form/fields.py b/flask_admin/form/fields.py index 3e7328a77..8b802648f 100644 --- a/flask_admin/form/fields.py +++ b/flask_admin/form/fields.py @@ -45,9 +45,7 @@ def __init__(self, label=None, validators=None, format=None, **kwargs): :param kwargs: Any additional parameters """ - super(DateTimeField, self).__init__( - label, validators, format or "%Y-%m-%d %H:%M:%S", **kwargs - ) + super().__init__(label, validators, format or "%Y-%m-%d %H:%M:%S", **kwargs) class TimeField(fields.Field): @@ -81,7 +79,7 @@ def __init__( :param kwargs: Any additional parameters """ - super(TimeField, self).__init__(label, validators, **kwargs) + super().__init__(label, validators, **kwargs) self.formats = formats or ( "%H:%M:%S", @@ -142,7 +140,7 @@ def __init__( blank_text=None, **kwargs, ): - super(Select2Field, self).__init__(label, validators, coerce, choices, **kwargs) + super().__init__(label, validators, coerce, choices, **kwargs) self.allow_blank = allow_blank self.blank_text = blank_text or " " @@ -183,7 +181,7 @@ def pre_validate(self, form): if self.allow_blank and self.data is None: return - super(Select2Field, self).pre_validate(form) + super().pre_validate(form) class Select2TagsField(fields.StringField): @@ -216,7 +214,7 @@ def __init__( self.allow_duplicates = allow_duplicates self.coerce = coerce - super(Select2TagsField, self).__init__(label, validators, **kwargs) + super().__init__(label, validators, **kwargs) def process_formdata(self, valuelist): if valuelist: diff --git a/flask_admin/form/rules.py b/flask_admin/form/rules.py index e93089662..881fafa65 100644 --- a/flask_admin/form/rules.py +++ b/flask_admin/form/rules.py @@ -33,7 +33,7 @@ def visible_fields(self): """ return [] - def __call__(self, form, form_opts=None, field_args={}): + def __call__(self, form, form_opts=None, field_args=None): """ Render rule. @@ -52,7 +52,7 @@ class NestedRule(BaseRule): Nested rule. Can contain child rules and render them. """ - def __init__(self, rules=[], separator=""): + def __init__(self, rules=None, separator=""): """ Constructor. @@ -61,7 +61,9 @@ def __init__(self, rules=[], separator=""): :param separator: Default separator between rules when rendering them. """ - super(NestedRule, self).__init__() + if rules is None: + rules = [] + super().__init__() self.rules = list(rules) self.separator = separator @@ -75,7 +77,7 @@ def configure(self, rule_set, parent): Parent rule (if any) """ self.rules = rule_set.configure_rules(self.rules, self) - return super(NestedRule, self).configure(rule_set, parent) + return super().configure(rule_set, parent) @property def visible_fields(self): @@ -94,7 +96,7 @@ def __iter__(self): """ return self.rules - def __call__(self, form, form_opts=None, field_args={}): + def __call__(self, form, form_opts=None, field_args=None): """ Render all children. @@ -105,6 +107,8 @@ def __call__(self, form, form_opts=None, field_args={}): :param field_args: Optional arguments that should be passed to template or the field """ + if field_args is None: + field_args = {} result = [] for r in self.rules: @@ -127,12 +131,14 @@ def __init__(self, text, escape=True): :param escape: Should text be escaped or not. Default is `True`. """ - super(Text, self).__init__() + super().__init__() self.text = text self.escape = escape - def __call__(self, form, form_opts=None, field_args={}): + def __call__(self, form, form_opts=None, field_args=None): + if field_args is None: + field_args = {} if self.escape: return self.text @@ -145,7 +151,7 @@ class HTML(Text): """ def __init__(self, html): - super(HTML, self).__init__(html, escape=False) + super().__init__(html, escape=False) class Macro(BaseRule): @@ -162,7 +168,7 @@ def __init__(self, macro_name, **kwargs): :param kwargs: Default macro parameters """ - super(Macro, self).__init__() + super().__init__() self.macro_name = macro_name self.default_args = kwargs @@ -196,7 +202,7 @@ def _resolve(self, context, name): return field - def __call__(self, form, form_opts=None, field_args={}): + def __call__(self, form, form_opts=None, field_args=None): """ Render macro rule. @@ -207,13 +213,13 @@ def __call__(self, form, form_opts=None, field_args={}): :param field_args: Optional arguments that should be passed to the macro """ + if field_args is None: + field_args = {} context = helpers.get_render_ctx() macro = self._resolve(context, self.macro_name) if not macro: - raise ValueError( - "Cannot find macro %s in current context." % self.macro_name - ) + raise ValueError(f"Cannot find macro {self.macro_name} in current context.") opts = dict(self.default_args) opts.update(field_args) @@ -236,7 +242,7 @@ def __init__(self, macro_name, child_rule, **kwargs): :param kwargs: Container macro arguments """ - super(Container, self).__init__(macro_name, **kwargs) + super().__init__(macro_name, **kwargs) self.child_rule = child_rule def configure(self, rule_set, parent): @@ -249,13 +255,13 @@ def configure(self, rule_set, parent): Parent rule (if any) """ self.child_rule.configure(rule_set, self) - return super(Container, self).configure(rule_set, parent) + return super().configure(rule_set, parent) @property def visible_fields(self): return self.child_rule.visible_fields - def __call__(self, form, form_opts=None, field_args={}): + def __call__(self, form, form_opts=None, field_args=None): """ Render container. @@ -266,6 +272,8 @@ def __call__(self, form, form_opts=None, field_args={}): :param field_args: Optional arguments that should be passed to template or the field """ + if field_args is None: + field_args = {} context = helpers.get_render_ctx() def caller(**kwargs): @@ -274,7 +282,7 @@ def caller(**kwargs): args = dict(field_args) args["caller"] = caller - return super(Container, self).__call__(form, form_opts, args) + return super().__call__(form, form_opts, args) class Field(Macro): @@ -291,14 +299,14 @@ def __init__(self, field_name, render_field="lib.render_field"): :param render_field: Macro that will be used to render the field. """ - super(Field, self).__init__(render_field) + super().__init__(render_field) self.field_name = field_name @property def visible_fields(self): return [self.field_name] - def __call__(self, form, form_opts=None, field_args={}): + def __call__(self, form, form_opts=None, field_args=None): """ Render field. @@ -309,10 +317,12 @@ def __call__(self, form, form_opts=None, field_args={}): :param field_args: Optional arguments that should be passed to template or the field """ + if field_args is None: + field_args = {} field = getattr(form, self.field_name, None) if field is None: - raise ValueError("Form %s does not have field %s" % (form, self.field_name)) + raise ValueError(f"Form {form} does not have field {self.field_name}") opts = {} @@ -323,7 +333,7 @@ def __call__(self, form, form_opts=None, field_args={}): params = {"form": form, "field": field, "kwargs": opts} - return super(Field, self).__call__(form, form_opts, params) + return super().__call__(form, form_opts, params) class Header(Macro): @@ -340,7 +350,7 @@ def __init__(self, text, header_macro="lib.render_header"): :param header_macro: Header rendering macro """ - super(Header, self).__init__(header_macro, text=text) + super().__init__(header_macro, text=text) class FieldSet(NestedRule): @@ -364,15 +374,17 @@ def __init__(self, rules, header=None, separator=""): else: rule_set = list(rules) - super(FieldSet, self).__init__(rule_set, separator=separator) + super().__init__(rule_set, separator=separator) class Row(NestedRule): def __init__(self, *columns, **kw): - super(Row, self).__init__() + super().__init__() self.rules = columns - def __call__(self, form, form_opts=None, field_args={}): + def __call__(self, form, form_opts=None, field_args=None): + if field_args is None: + field_args = {} cols = [] for col in self.rules: if col.visible_fields: @@ -380,7 +392,7 @@ def __call__(self, form, form_opts=None, field_args={}): w_args.setdefault("column_class", "col") cols.append(col(form, form_opts, field_args)) - return Markup('<div class="form-row">%s</div>' % "".join(cols)) + return Markup('<div class="form-row">{}</div>'.format("".join(cols))) class Group(Macro): @@ -389,7 +401,7 @@ def __init__(self, field_name, prepend=None, append=None, **kwargs): Bootstrap Input group. """ render_field = kwargs.get("render_field", "lib.render_field") - super(Group, self).__init__(render_field) + super().__init__(render_field) self.field_name = field_name self._addons = [] @@ -429,7 +441,7 @@ def visible_fields(self): fields.append(cnf["name"]) return fields - def __call__(self, form, form_opts=None, field_args={}): + def __call__(self, form, form_opts=None, field_args=None): """ Render field. @@ -440,10 +452,12 @@ def __call__(self, form, form_opts=None, field_args={}): :param field_args: Optional arguments that should be passed to template or the field """ + if field_args is None: + field_args = {} field = getattr(form, self.field_name, None) if field is None: - raise ValueError("Form %s does not have field %s" % (form, self.field_name)) + raise ValueError(f"Form {form} does not have field {self.field_name}") if form_opts: widget_args = form_opts.widget_args @@ -467,7 +481,7 @@ def __call__(self, form, form_opts=None, field_args={}): w_args.setdefault("class", "form-control") ctn = fld(**w_args) elif typ == "text": - ctn = '<span class="input-group-text">%s</span>' % cnf["text"] + ctn = '<span class="input-group-text">{}</span>'.format(cnf["text"]) elif typ == "html": ctn = cnf["html"] @@ -488,7 +502,7 @@ def __call__(self, form, form_opts=None, field_args={}): params = {"form": form, "field": field, "kwargs": opts} - return super(Group, self).__call__(form, form_opts, params) + return super().__call__(form, form_opts, params) class RuleSet: @@ -546,7 +560,7 @@ def configure_rules(self, rules, parent=None): try: result.append(r.configure(self, parent)) except AttributeError: - raise TypeError('Could not convert "%s" to rule' % repr(r)) + raise TypeError(f'Could not convert "{repr(r)}" to rule') return result @@ -554,5 +568,4 @@ def __iter__(self): """ Iterate through registered rules. """ - for r in self.rules: - yield r + yield from self.rules diff --git a/flask_admin/form/upload.py b/flask_admin/form/upload.py index dbf86edff..160244d09 100644 --- a/flask_admin/form/upload.py +++ b/flask_admin/form/upload.py @@ -79,7 +79,7 @@ def __call__(self, field, **kwargs): type="text", readonly="readonly", value=value, name=field.name ), "file": html_params(type="file", value=value, **kwargs), - "marker": "_%s-delete" % field.name, + "marker": f"_{field.name}-delete", } ) @@ -111,7 +111,7 @@ def __call__(self, field, **kwargs): args = { "text": html_params(type="hidden", value=field.data, name=field.name), "file": html_params(type="file", **kwargs), - "marker": "_%s-delete" % field.name, + "marker": f"_{field.name}-delete", } if field.data and isinstance(field.data, string_types): @@ -208,7 +208,7 @@ class MyForm(BaseForm): if int(wtforms_version[0]) < 3: kwargs.pop("extra_filters", None) - super(FileUploadField, self).__init__(label, validators, **kwargs) + super().__init__(label, validators, **kwargs) def is_file_allowed(self, filename): """ @@ -241,17 +241,17 @@ def pre_validate(self, form): self._get_path(self.data.filename) ): raise ValidationError( - gettext('File "%s" already exists.' % self.data.filename) + gettext(f'File "{self.data.filename}" already exists.') ) def process(self, formdata, data=unset_value, extra_filters=None): if formdata: - marker = "_%s-delete" % self.name + marker = f"_{self.name}-delete" if marker in formdata: self._should_delete = True if int(wtforms_version[0]) < 3: - return super(FileUploadField, self).process(formdata, data) + return super().process(formdata, data) else: return super(FileUploadField, self).process(formdata, data, extra_filters) # noqa @@ -312,7 +312,7 @@ def _save_file(self, data, filename): os.makedirs(os.path.dirname(path), self.permission | 0o111) if (self._allow_overwrite is False) and os.path.exists(path): - raise ValueError(gettext('File "%s" already exists.' % path)) + raise ValueError(gettext(f'File "{path}" already exists.')) data.save(path) @@ -434,7 +434,7 @@ class MyForm(BaseForm): if not allowed_extensions: allowed_extensions = ("gif", "jpg", "jpeg", "png", "tiff") - super(ImageUploadField, self).__init__( + super().__init__( label, validators, base_path=base_path, @@ -446,17 +446,17 @@ class MyForm(BaseForm): ) def pre_validate(self, form): - super(ImageUploadField, self).pre_validate(form) + super().pre_validate(form) if self._is_uploaded_file(self.data): try: self.image = Image.open(self.data) except Exception as e: - raise ValidationError("Invalid image: %s" % e) + raise ValidationError(f"Invalid image: {e}") # Deletion def _delete_file(self, filename): - super(ImageUploadField, self)._delete_file(filename) + super()._delete_file(filename) self._delete_thumbnail(filename) @@ -527,7 +527,7 @@ def _save_image(self, image, path, format="JPEG"): def _get_save_format(self, filename, image): if image.format not in self.keep_image_formats: name, ext = op.splitext(filename) - filename = "%s.jpg" % name + filename = f"{name}.jpg" return filename, "JPEG" return filename, image.format @@ -546,4 +546,4 @@ def thumbgen_filename(filename): Generate thumbnail name from filename. """ name, ext = op.splitext(filename) - return "%s_thumb%s" % (name, ext) + return f"{name}_thumb{ext}" diff --git a/flask_admin/form/widgets.py b/flask_admin/form/widgets.py index 09008c8be..495066206 100644 --- a/flask_admin/form/widgets.py +++ b/flask_admin/form/widgets.py @@ -29,7 +29,7 @@ def __call__(self, field, **kwargs): if allow_blank and not self.multiple: kwargs["data-allow-blank"] = "1" - return super(Select2Widget, self).__call__(field, **kwargs) + return super().__call__(field, **kwargs) class Select2TagsWidget(widgets.TextInput): @@ -43,7 +43,7 @@ def __call__(self, field, **kwargs): "data-allow-duplicate-tags", "true" if getattr(field, "allow_duplicates", False) else "false", ) - return super(Select2TagsWidget, self).__call__(field, **kwargs) + return super().__call__(field, **kwargs) class DatePickerWidget(widgets.TextInput): @@ -58,7 +58,7 @@ def __call__(self, field, **kwargs): kwargs.setdefault("data-date-format", "YYYY-MM-DD") self.date_format = kwargs["data-date-format"] - return super(DatePickerWidget, self).__call__(field, **kwargs) + return super().__call__(field, **kwargs) class DateTimePickerWidget(widgets.TextInput): @@ -71,7 +71,7 @@ class DateTimePickerWidget(widgets.TextInput): def __call__(self, field, **kwargs): kwargs.setdefault("data-role", "datetimepicker") kwargs.setdefault("data-date-format", "YYYY-MM-DD HH:mm:ss") - return super(DateTimePickerWidget, self).__call__(field, **kwargs) + return super().__call__(field, **kwargs) class TimePickerWidget(widgets.TextInput): @@ -84,7 +84,7 @@ class TimePickerWidget(widgets.TextInput): def __call__(self, field, **kwargs): kwargs.setdefault("data-role", "timepicker") kwargs.setdefault("data-date-format", "HH:mm:ss") - return super(TimePickerWidget, self).__call__(field, **kwargs) + return super().__call__(field, **kwargs) class RenderTemplateWidget: diff --git a/flask_admin/menu.py b/flask_admin/menu.py index f72a3039d..89dcc5b49 100644 --- a/flask_admin/menu.py +++ b/flask_admin/menu.py @@ -87,7 +87,7 @@ class MenuView(BaseMenu): """ def __init__(self, name, view=None, cache=True): - super(MenuView, self).__init__( + super().__init__( name, class_name=view.menu_class_name, icon_type=view.menu_icon_type, @@ -107,9 +107,7 @@ def get_url(self): if self._cached_url: return self._cached_url - url = self._view.get_url( - "%s.%s" % (self._view.endpoint, self._view._default_view) - ) + url = self._view.get_url(f"{self._view.endpoint}.{self._view._default_view}") if self._cache: self._cached_url = url @@ -120,7 +118,7 @@ def is_active(self, view): if view == self._view: return True - return super(MenuView, self).is_active(view) + return super().is_active(view) def is_visible(self): if self._view is None: @@ -151,7 +149,7 @@ def __init__( icon_value=None, target=None, ): - super(MenuLink, self).__init__(name, class_name, icon_type, icon_value, target) + super().__init__(name, class_name, icon_type, icon_value, target) self.category = category @@ -164,5 +162,5 @@ def get_url(self): class SubMenuCategory(MenuCategory): def __init__(self, *args, **kwargs): - super(SubMenuCategory, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) self.class_name += " dropdown-submenu dropright" diff --git a/flask_admin/model/base.py b/flask_admin/model/base.py index 27578c7b8..f81808667 100644 --- a/flask_admin/model/base.py +++ b/flask_admin/model/base.py @@ -862,9 +862,9 @@ def __init__( # If name not provided, it is model name if name is None: - name = "%s" % self._prettify_class_name(model.__name__) + name = f"{self._prettify_class_name(model.__name__)}" - super(BaseModelView, self).__init__( + super().__init__( name, category, endpoint, @@ -889,7 +889,7 @@ def __init__( # Endpoint def _get_endpoint(self, endpoint): if endpoint: - return super(BaseModelView, self)._get_endpoint(endpoint) + return super()._get_endpoint(endpoint) return self.model.__name__.lower() @@ -1235,7 +1235,7 @@ def get_filters(self): if flt: collection.extend(flt) else: - raise Exception("Unsupported filter type %s" % n) + raise Exception(f"Unsupported filter type {n}") return collection else: return None @@ -1261,7 +1261,7 @@ def get_filter_arg(self, index, flt): except AttributeError: pass - name = ("%s %s" % (flt.name, as_unicode(operation))).lower() + name = (f"{flt.name} {as_unicode(operation)}").lower() name = filter_char_re.sub("", name) name = filter_compact_re.sub("_", name) return name @@ -1505,7 +1505,7 @@ def _validate_form_class(self, ruleset, form_class, remove_missing=True): if missing_fields: self._show_missing_fields_warning( - "Fields missing from ruleset: %s" % (",".join(missing_fields)) + "Fields missing from ruleset: {}".format(",".join(missing_fields)) ) if remove_missing: self._remove_fields_from_form_class(missing_fields, form_class) @@ -1514,7 +1514,7 @@ def _validate_form_instance(self, ruleset, form, remove_missing=True): missing_fields = self._get_ruleset_missing_fields(ruleset=ruleset, form=form) if missing_fields: self._show_missing_fields_warning( - "Fields missing from ruleset: %s" % (",".join(missing_fields)) + "Fields missing from ruleset: {}".format(",".join(missing_fields)) ) if remove_missing: self._remove_fields_from_form_instance(missing_fields, form) @@ -2030,7 +2030,7 @@ def get_export_name(self, export_type="csv"): """ :return: The exported csv file name. """ - filename = "%s_%s.%s" % ( + filename = "{}_{}.{}".format( self.name, time.strftime("%Y-%m-%d_%H-%M-%S"), export_type, @@ -2053,8 +2053,7 @@ def _process_ajax_references(self): result[name] = options else: raise ValueError( - "%s.form_ajax_refs can not handle %s types" - % (self, type(options)) + f"{self}.form_ajax_refs can not handle {type(options)} types" ) return result @@ -2387,7 +2386,7 @@ def _export_data(self): raise NotImplementedError( "Macros are not implemented in export. Exclude column in" " column_formatters_export, column_export_list, or " - " column_export_exclude_list. Column: %s" % (col,) + f" column_export_exclude_list. Column: {col}" ) # Grab parameters from URL @@ -2459,7 +2458,7 @@ def generate(): filename = self.get_export_name(export_type="csv") - disposition = "attachment;filename=%s" % (secure_filename(filename),) + disposition = f"attachment;filename={secure_filename(filename)}" return Response( stream_with_context(generate()), @@ -2479,13 +2478,13 @@ def _export_tablib(self, export_type, return_url): filename = self.get_export_name(export_type) - disposition = "attachment;filename=%s" % (secure_filename(filename),) + disposition = f"attachment;filename={secure_filename(filename)}" mimetype, encoding = mimetypes.guess_type(filename) if not mimetype: mimetype = "application/octet-stream" if encoding: - mimetype = "%s; charset=%s" % (mimetype, encoding) + mimetype = f"{mimetype}; charset={encoding}" ds = tablib.Dataset(headers=[csv_encode(c[1]) for c in self._export_columns]) diff --git a/flask_admin/model/fields.py b/flask_admin/model/fields.py index c703f1a39..6db7bfdfd 100644 --- a/flask_admin/model/fields.py +++ b/flask_admin/model/fields.py @@ -17,7 +17,7 @@ class InlineFieldList(FieldList): widget = InlineFieldListWidget() def __init__(self, *args, **kwargs): - super(InlineFieldList, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) def __call__(self, **kwargs): # Create template @@ -40,12 +40,12 @@ def display_row_controls(self, field): return True def process(self, formdata, data=unset_value, extra_filters=None): - res = super(InlineFieldList, self).process(formdata, data) + res = super().process(formdata, data) # Postprocess - contribute flag if formdata: for f in self.entries: - key = "del-%s" % f.id + key = f"del-{f.id}" f._should_delete = key in formdata return res @@ -113,7 +113,7 @@ class InlineModelFormField(FormField): widget = InlineFormWidget() def __init__(self, form_class, pk, form_opts=None, **kwargs): - super(InlineModelFormField, self).__init__(form_class, **kwargs) + super().__init__(form_class, **kwargs) self._pk = pk self.form_opts = form_opts @@ -148,7 +148,7 @@ def __init__( blank_text="", **kwargs, ): - super(AjaxSelectField, self).__init__(label, validators, **kwargs) + super().__init__(label, validators, **kwargs) self.loader = loader self.allow_blank = allow_blank @@ -197,9 +197,7 @@ def __init__(self, loader, label=None, validators=None, default=None, **kwargs): if default is None: default = [] - super(AjaxSelectMultipleField, self).__init__( - loader, label, validators, default=default, **kwargs - ) + super().__init__(loader, label, validators, default=default, **kwargs) self._invalid_formdata = False def _get_data(self): diff --git a/flask_admin/model/filters.py b/flask_admin/model/filters.py index a01a46b4b..cc485d74b 100644 --- a/flask_admin/model/filters.py +++ b/flask_admin/model/filters.py @@ -102,7 +102,7 @@ class BaseBooleanFilter(BaseFilter): """ def __init__(self, name, options=None, data_type=None): - super(BaseBooleanFilter, self).__init__( + super().__init__( name, (("1", lazy_gettext("Yes")), ("0", lazy_gettext("No"))), data_type ) @@ -158,7 +158,7 @@ class BaseDateFilter(BaseFilter): """ def __init__(self, name, options=None, data_type=None): - super(BaseDateFilter, self).__init__(name, options, data_type="datepicker") + super().__init__(name, options, data_type="datepicker") def clean(self, value): return datetime.datetime.strptime(value, "%Y-%m-%d").date() @@ -201,9 +201,7 @@ class BaseDateTimeFilter(BaseFilter): """ def __init__(self, name, options=None, data_type=None): - super(BaseDateTimeFilter, self).__init__( - name, options, data_type="datetimepicker" - ) + super().__init__(name, options, data_type="datetimepicker") def clean(self, value): # datetime filters will not work in SQLite + SQLAlchemy if value not converted to datetime @@ -245,7 +243,7 @@ class BaseTimeFilter(BaseFilter): """ def __init__(self, name, options=None, data_type=None): - super(BaseTimeFilter, self).__init__(name, options, data_type="timepicker") + super().__init__(name, options, data_type="timepicker") def clean(self, value): # time filters will not work in SQLite + SQLAlchemy if value not converted to time @@ -289,7 +287,7 @@ class BaseUuidFilter(BaseFilter): """ def __init__(self, name, options=None, data_type=None): - super(BaseUuidFilter, self).__init__(name, options, data_type="uuid") + super().__init__(name, options, data_type="uuid") def clean(self, value): value = uuid.UUID(value) diff --git a/flask_admin/model/form.py b/flask_admin/model/form.py index 1c5d40dad..e8da071be 100644 --- a/flask_admin/model/form.py +++ b/flask_admin/model/form.py @@ -162,7 +162,7 @@ def __init__(self, model, **kwargs): """ self.model = model - super(InlineFormAdmin, self).__init__(**kwargs) + super().__init__(**kwargs) class ModelConverterBase: @@ -188,7 +188,7 @@ def get_converter(self, column): # Search by module + name for col_type in types: - type_string = "%s.%s" % (col_type.__module__, col_type.__name__) + type_string = f"{col_type.__module__}.{col_type.__name__}" if type_string in self.converters: return self.converters[type_string] diff --git a/flask_admin/model/template.py b/flask_admin/model/template.py index 61710d17d..6de3fb001 100644 --- a/flask_admin/model/template.py +++ b/flask_admin/model/template.py @@ -28,7 +28,7 @@ def _resolve_symbol(self, context, symbol): class LinkRowAction(BaseListRowAction): def __init__(self, icon_class, url, title=None): - super(LinkRowAction, self).__init__(title=title) + super().__init__(title=title) self.url = url self.icon_class = icon_class @@ -46,7 +46,7 @@ def render(self, context, row_id, row): class EndpointLinkRowAction(BaseListRowAction): def __init__(self, icon_class, endpoint, title=None, id_arg="id", url_args=None): - super(EndpointLinkRowAction, self).__init__(title=title) + super().__init__(title=title) self.icon_class = icon_class self.endpoint = endpoint @@ -67,7 +67,7 @@ def render(self, context, row_id, row): class TemplateLinkRowAction(BaseListRowAction): def __init__(self, template_name, title=None): - super(TemplateLinkRowAction, self).__init__(title=title) + super().__init__(title=title) self.template_name = template_name @@ -78,37 +78,27 @@ def render(self, context, row_id, row): class ViewRowAction(TemplateLinkRowAction): def __init__(self): - super(ViewRowAction, self).__init__( - "row_actions.view_row", gettext("View Record") - ) + super().__init__("row_actions.view_row", gettext("View Record")) class ViewPopupRowAction(TemplateLinkRowAction): def __init__(self): - super(ViewPopupRowAction, self).__init__( - "row_actions.view_row_popup", gettext("View Record") - ) + super().__init__("row_actions.view_row_popup", gettext("View Record")) class EditRowAction(TemplateLinkRowAction): def __init__(self): - super(EditRowAction, self).__init__( - "row_actions.edit_row", gettext("Edit Record") - ) + super().__init__("row_actions.edit_row", gettext("Edit Record")) class EditPopupRowAction(TemplateLinkRowAction): def __init__(self): - super(EditPopupRowAction, self).__init__( - "row_actions.edit_row_popup", gettext("Edit Record") - ) + super().__init__("row_actions.edit_row_popup", gettext("Edit Record")) class DeleteRowAction(TemplateLinkRowAction): def __init__(self): - super(DeleteRowAction, self).__init__( - "row_actions.delete_row", gettext("Delete Record") - ) + super().__init__("row_actions.delete_row", gettext("Delete Record")) # Macro helper diff --git a/flask_admin/model/typefmt.py b/flask_admin/model/typefmt.py index 5d97375f6..e157ab729 100644 --- a/flask_admin/model/typefmt.py +++ b/flask_admin/model/typefmt.py @@ -38,8 +38,7 @@ def bool_formatter(view, value, name): fa = "fa-check-circle" if value else "fa-minus-circle" label = f'{name}: {"true" if value else "false"}' return Markup( - '<span class="fa %s glyphicon glyphicon-%s icon-%s" title="%s"></span>' - % (fa, glyph, glyph, label) + f'<span class="fa {fa} glyphicon glyphicon-{glyph} icon-{glyph}" title="{label}"></span>' ) diff --git a/flask_admin/model/widgets.py b/flask_admin/model/widgets.py index 2a00efa77..ee222e3d4 100644 --- a/flask_admin/model/widgets.py +++ b/flask_admin/model/widgets.py @@ -12,18 +12,16 @@ class InlineFieldListWidget(RenderTemplateWidget): def __init__(self): - super(InlineFieldListWidget, self).__init__( - "admin/model/inline_field_list.html" - ) + super().__init__("admin/model/inline_field_list.html") class InlineFormWidget(RenderTemplateWidget): def __init__(self): - super(InlineFormWidget, self).__init__("admin/model/inline_form.html") + super().__init__("admin/model/inline_form.html") def __call__(self, field, **kwargs): kwargs.setdefault("form_opts", getattr(field, "form_opts", None)) - return super(InlineFormWidget, self).__call__(field, **kwargs) + return super().__call__(field, **kwargs) class AjaxSelect2Widget: @@ -73,7 +71,7 @@ def __call__(self, field, **kwargs): kwargs.setdefault("data-separator", ",") - return Markup("<input %s>" % html_params(name=field.name, **kwargs)) + return Markup(f"<input {html_params(name=field.name, **kwargs)}>") class XEditableWidget: @@ -103,7 +101,7 @@ def __call__(self, field, **kwargs): kwargs = self.get_kwargs(field, kwargs) - return Markup("<a %s>%s</a>" % (html_params(**kwargs), escape(display_value))) + return Markup(f"<a {html_params(**kwargs)}>{escape(display_value)}</a>") def get_kwargs(self, field, kwargs): """ @@ -193,6 +191,6 @@ def get_kwargs(self, field, kwargs): else: kwargs["data-value"] = text_type(selected_ids[0]) else: - raise Exception("Unsupported field type: %s" % (type(field),)) + raise Exception(f"Unsupported field type: {type(field)}") return kwargs diff --git a/flask_admin/tests/fileadmin/test_fileadmin_azure.py b/flask_admin/tests/fileadmin/test_fileadmin_azure.py index 0e0ce300c..d88e16b26 100644 --- a/flask_admin/tests/fileadmin/test_fileadmin_azure.py +++ b/flask_admin/tests/fileadmin/test_fileadmin_azure.py @@ -18,7 +18,7 @@ def setup_and_teardown(self): if not azure.BlockBlobService: raise SkipTest("AzureFileAdmin dependencies not installed") - self._container_name = "fileadmin-tests-%s" % uuid4() + self._container_name = f"fileadmin-tests-{uuid4()}" if not self._test_storage or not self._container_name: raise SkipTest("AzureFileAdmin test credentials not set") diff --git a/flask_admin/tests/geoa/test_basic.py b/flask_admin/tests/geoa/test_basic.py index c4fc8a9b3..cdeadc6f7 100644 --- a/flask_admin/tests/geoa/test_basic.py +++ b/flask_admin/tests/geoa/test_basic.py @@ -104,7 +104,7 @@ def test_model(app, db, admin): assert p["coordinates"][0] == 125.8 assert p["coordinates"][1] == 10.0 - url = "/admin/geomodel/edit/?id=%s" % model.id + url = f"/admin/geomodel/edit/?id={model.id}" rv = client.get(url) assert rv.status_code == 200 data = rv.data.decode("utf-8") @@ -134,7 +134,7 @@ def test_model(app, db, admin): # assert list(to_shape(model.multi).geoms[0].coords) == [(100.0, 0.0]) # assert list(to_shape(model.multi).geoms[1].coords) == [(101.0, 1.0]) - url = "/admin/geomodel/delete/?id=%s" % model.id + url = f"/admin/geomodel/delete/?id={model.id}" rv = client.post(url) assert rv.status_code == 302 assert db.session.query(GeoModel).count() == 0 @@ -163,7 +163,7 @@ def test_none(app, db, admin): model = db.session.query(GeoModel).first() - url = "/admin/geomodel/edit/?id=%s" % model.id + url = f"/admin/geomodel/edit/?id={model.id}" rv = client.get(url) assert rv.status_code == 200 data = rv.data.decode("utf-8") diff --git a/flask_admin/tests/peeweemodel/test_basic.py b/flask_admin/tests/peeweemodel/test_basic.py index 3ebd2e34f..f9c9bdb07 100644 --- a/flask_admin/tests/peeweemodel/test_basic.py +++ b/flask_admin/tests/peeweemodel/test_basic.py @@ -19,7 +19,7 @@ def __init__( for k, v in iteritems(kwargs): setattr(self, k, v) - super(CustomModelView, self).__init__(model, name, category, endpoint, url) + super().__init__(model, name, category, endpoint, url) def create_models(db): @@ -39,7 +39,7 @@ def __init__( datetime_field=None, **kwargs, ): - super(Model1, self).__init__(**kwargs) + super().__init__(**kwargs) self.test1 = test1 self.test2 = test2 @@ -71,7 +71,7 @@ def __init__( bool_field=0, **kwargs, ): - super(Model2, self).__init__(**kwargs) + super().__init__(**kwargs) self.char_field = char_field self.int_field = int_field @@ -163,7 +163,7 @@ def test_model(app, db, admin): assert rv.status_code == 200 assert b"test1large" in rv.data - url = "/admin/model1/edit/?id=%s" % model.id + url = f"/admin/model1/edit/?id={model.id}" rv = client.get(url) assert rv.status_code == 200 @@ -176,7 +176,7 @@ def test_model(app, db, admin): assert model.test3 is None or model.test3 == "" assert model.test4 is None or model.test4 == "" - url = "/admin/model1/delete/?id=%s" % model.id + url = f"/admin/model1/delete/?id={model.id}" rv = client.post(url) assert rv.status_code == 302 assert Model1.select().count() == 0 @@ -1017,10 +1017,11 @@ class Model2(BaseModel): assert 'value=""' not in form.model1() form.model1.data = model - assert 'data-json="[%s, "first"]"' % as_unicode( - model.id - ) in form.model1() or 'data-json="[%s, "first"]"' % as_unicode(model.id) - assert 'value="%s"' % as_unicode(model.id) in form.model1() + assert ( + f'data-json="[{as_unicode(model.id)}, "first"]"' in form.model1() + or f'data-json="[{as_unicode(model.id)}, "first"]"' + ) + assert f'value="{as_unicode(model.id)}"' in form.model1() # Check querying client = app.test_client() @@ -1141,7 +1142,7 @@ def test_export_csv(app, db, admin): ) admin.add_view(view2) - for x in range(5): + for _x in range(5): fill_db(Model1, Model2) client = app.test_client() diff --git a/flask_admin/tests/pymongo/test_basic.py b/flask_admin/tests/pymongo/test_basic.py index 53ea16715..db74d4330 100644 --- a/flask_admin/tests/pymongo/test_basic.py +++ b/flask_admin/tests/pymongo/test_basic.py @@ -59,7 +59,7 @@ def test_model(app, db, admin): assert rv.status_code == 200 assert "test1large" in rv.data.decode("utf-8") - url = "/admin/testview/edit/?id=%s" % model["_id"] + url = "/admin/testview/edit/?id={}".format(model["_id"]) rv = client.get(url) assert rv.status_code == 200 @@ -72,7 +72,7 @@ def test_model(app, db, admin): assert model["test1"] == "test1small" assert model["test2"] == "test2large" - url = "/admin/testview/delete/?id=%s" % model["_id"] + url = "/admin/testview/delete/?id={}".format(model["_id"]) rv = client.post(url) assert rv.status_code == 302 assert db.test.estimated_document_count() == 0 diff --git a/flask_admin/tests/sqla/test_basic.py b/flask_admin/tests/sqla/test_basic.py index 8aafa18a9..a7558876b 100644 --- a/flask_admin/tests/sqla/test_basic.py +++ b/flask_admin/tests/sqla/test_basic.py @@ -44,9 +44,7 @@ def __init__( for k, v in iteritems(kwargs): setattr(self, k, v) - super(CustomModelView, self).__init__( - model, session, name, category, endpoint, url - ) + super().__init__(model, session, name, category, endpoint, url) form_choices = {"choice_field": [("choice-1", "One"), ("choice-2", "Two")]} @@ -305,8 +303,8 @@ def test_model(app, db, admin): model = db.session.query(Model1).first() assert model.test1 == "test1large" assert model.test2 == "test2" - assert model.test3 == None - assert model.test4 == None + assert model.test3 is None + assert model.test4 is None assert model.email_field == "test@test.com" assert model.choice_field == "choice-1" assert model.enum_field == "model1_v1" @@ -325,7 +323,7 @@ def test_model(app, db, admin): assert "test1large" in rv.data.decode("utf-8") # check that we can retrieve an edit view - url = "/admin/model1/edit/?id=%s" % model.id + url = f"/admin/model1/edit/?id={model.id}" rv = client.get(url) assert rv.status_code == 200 @@ -358,8 +356,8 @@ def test_model(app, db, admin): model = db.session.query(Model1).first() assert model.test1 == "test1small" assert model.test2 == "test2large" - assert model.test3 == None - assert model.test4 == None + assert model.test3 is None + assert model.test4 is None assert model.email_field == "test2@test.com" assert model.choice_field is None assert model.enum_field is None @@ -373,7 +371,7 @@ def test_model(app, db, admin): assert model.sqla_utils_color is None # check that the model can be deleted - url = "/admin/model1/delete/?id=%s" % model.id + url = f"/admin/model1/delete/?id={model.id}" rv = client.post(url) assert rv.status_code == 302 assert db.session.query(Model1).count() == 0 @@ -2179,13 +2177,13 @@ def on_model_delete(self, model): model = db.session.query(Model1).first() assert model.test1 == "TEST1LARGE" - url = "/admin/model1/edit/?id=%s" % model.id + url = f"/admin/model1/edit/?id={model.id}" client.post(url, data=dict(test1="test1small", test2="test2large")) model = db.session.query(Model1).first() assert model.test1 == "TEST1SMALL" - url = "/admin/model1/delete/?id=%s" % model.id + url = f"/admin/model1/delete/?id={model.id}" client.post(url) assert view.deleted @@ -2582,8 +2580,8 @@ def test_ajax_fk(app, db, admin): form.model1.data = model assert ( - 'data-json="[%s, "first"]"' % model.id in form.model1() - or 'data-json="[%s, "first"]"' % model.id in form.model1() + f'data-json="[{model.id}, "first"]"' in form.model1() + or f'data-json="[{model.id}, "first"]"' in form.model1() ) assert 'value="1"' in form.model1() @@ -2591,7 +2589,7 @@ def test_ajax_fk(app, db, admin): client = app.test_client() req = client.get("/admin/view/ajax/lookup/?name=model1&query=foo") - assert req.data.decode("utf-8") == '[[%s, "foo"]]' % model2.id + assert req.data.decode("utf-8") == f'[[{model2.id}, "foo"]]' # Check submitting req = client.post("/admin/view/new/", data={"model1": as_unicode(model.id)}) @@ -2727,7 +2725,7 @@ class TestModelView(CustomModelView): simple_list_pager = True def get_count_query(self): - assert False + raise AssertionError() view = TestModelView(Model1, db.session) admin.add_view(view) @@ -3016,7 +3014,7 @@ def test_export_csv(app, db, admin): with app.app_context(): Model1, Model2 = create_models(db) - for x in range(5): + for _x in range(5): fill_db(db, Model1, Model2) view1 = CustomModelView( diff --git a/flask_admin/tests/test_base.py b/flask_admin/tests/test_base.py index b79fb3a72..7f6d60d0c 100644 --- a/flask_admin/tests/test_base.py +++ b/flask_admin/tests/test_base.py @@ -38,19 +38,19 @@ def test(self): def _handle_view(self, name, **kwargs): if self.allow_call: - return super(MockView, self)._handle_view(name, **kwargs) + return super()._handle_view(name, **kwargs) else: return "Failure!" def is_accessible(self): if self.allow_access: - return super(MockView, self).is_accessible() + return super().is_accessible() return False def is_visible(self): if self.visible: - return super(MockView, self).is_visible() + return super().is_visible() return False @@ -453,7 +453,7 @@ def check_class_name(): def check_endpoint(): class CustomView(MockView): def _get_endpoint(self, endpoint): - return "admin." + super(CustomView, self)._get_endpoint(endpoint) + return "admin." + super()._get_endpoint(endpoint) view = CustomView() assert view.endpoint == "admin.customview" diff --git a/flask_admin/tests/test_host_matching.py b/flask_admin/tests/test_host_matching.py index 6efe2e031..8a29334bf 100644 --- a/flask_admin/tests/test_host_matching.py +++ b/flask_admin/tests/test_host_matching.py @@ -44,19 +44,19 @@ def base(self): def _handle_view(self, name, **kwargs): if self.allow_call: - return super(MockView, self)._handle_view(name, **kwargs) + return super()._handle_view(name, **kwargs) else: return "Failure!" def is_accessible(self): if self.allow_access: - return super(MockView, self).is_accessible() + return super().is_accessible() return False def is_visible(self): if self.visible: - return super(MockView, self).is_visible() + return super().is_visible() return False diff --git a/flask_admin/tests/test_model.py b/flask_admin/tests/test_model.py index 7ce7e32cf..4078cf7bb 100644 --- a/flask_admin/tests/test_model.py +++ b/flask_admin/tests/test_model.py @@ -51,7 +51,7 @@ def __init__( for k, v in iteritems(kwargs): setattr(self, k, v) - super(MockModelView, self).__init__(model, name, category, endpoint, url) + super().__init__(model, name, category, endpoint, url) self.created_models = [] self.updated_models = [] From ba3a03e42ea68af30bedd3a28d56862efc3e0503 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Fri, 11 Oct 2024 21:27:59 +0100 Subject: [PATCH 143/156] Manually fix ruff linting errors other than line-too-long --- examples/peewee/app.py | 9 +++------ examples/sqla-custom-inline-forms/app.py | 2 +- examples/sqla/admin/__init__.py | 2 +- flask_admin/base.py | 4 ++-- flask_admin/contrib/fileadmin/__init__.py | 8 +++++--- flask_admin/contrib/fileadmin/s3.py | 12 ++++++------ flask_admin/contrib/peewee/form.py | 2 +- flask_admin/contrib/peeweemodel/__init__.py | 5 +++-- flask_admin/contrib/sqla/form.py | 3 ++- flask_admin/contrib/sqla/validators.py | 12 ++++++------ flask_admin/contrib/sqla/view.py | 6 ++++-- flask_admin/contrib/sqlamodel/__init__.py | 5 +++-- flask_admin/form/fields.py | 10 ++++++---- flask_admin/form/rules.py | 8 ++++---- flask_admin/form/upload.py | 2 +- flask_admin/model/base.py | 15 +++++++++------ flask_admin/model/form.py | 2 +- flask_admin/tests/__init__.py | 2 +- flask_admin/tests/test_form_upload.py | 2 +- flask_admin/tools.py | 6 +++--- 20 files changed, 63 insertions(+), 54 deletions(-) diff --git a/examples/peewee/app.py b/examples/peewee/app.py index e14264f56..64b235f07 100644 --- a/examples/peewee/app.py +++ b/examples/peewee/app.py @@ -83,11 +83,8 @@ def index(): admin.add_view(UserAdmin(User)) admin.add_view(PostAdmin(Post)) - try: - User.create_table() - UserInfo.create_table() - Post.create_table() - except: - pass + User.create_table() + UserInfo.create_table() + Post.create_table() app.run(debug=True) diff --git a/examples/sqla-custom-inline-forms/app.py b/examples/sqla-custom-inline-forms/app.py index adf185298..37095cc69 100644 --- a/examples/sqla-custom-inline-forms/app.py +++ b/examples/sqla-custom-inline-forms/app.py @@ -73,7 +73,7 @@ def _handle_image_delete(mapper, conn, target): try: if location_image.path: os.remove(op.join(base_path, location_image.path)) - except: + except: # noqa: E722 pass diff --git a/examples/sqla/admin/__init__.py b/examples/sqla/admin/__init__.py index 54e37e597..3b16d241e 100644 --- a/examples/sqla/admin/__init__.py +++ b/examples/sqla/admin/__init__.py @@ -26,4 +26,4 @@ def get_locale(): babel = Babel(app, locale_selector=get_locale) -import admin.main +import admin.main # noqa: F401, E402 diff --git a/flask_admin/base.py b/flask_admin/base.py index eebae9262..b3093d7d6 100644 --- a/flask_admin/base.py +++ b/flask_admin/base.py @@ -4,7 +4,6 @@ from functools import wraps from flask import abort -from flask import Blueprint from flask import current_app from flask import g from flask import render_template @@ -769,7 +768,8 @@ def add_menu_item(self, menu_item, target_category=None): def _add_menu_item(self, menu_item, target_category): warnings.warn( - "Admin._add_menu_item is obsolete - use Admin.add_menu_item instead." + "Admin._add_menu_item is obsolete - use Admin.add_menu_item instead.", + stacklevel=1, ) return self.add_menu_item(menu_item, target_category) diff --git a/flask_admin/contrib/fileadmin/__init__.py b/flask_admin/contrib/fileadmin/__init__.py index e23f2b5ba..2797363f7 100644 --- a/flask_admin/contrib/fileadmin/__init__.py +++ b/flask_admin/contrib/fileadmin/__init__.py @@ -846,7 +846,9 @@ def _get_breadcrumbs(self, path): @expose("/old_index") @expose("/old_b/<path:path>") def index(self, path=None): - warnings.warn("deprecated: use index_view instead.", DeprecationWarning) + warnings.warn( + "deprecated: use index_view instead.", DeprecationWarning, stacklevel=1 + ) return redirect(self.get_url(".index_view", path=path)) @expose("/") @@ -1259,7 +1261,7 @@ def edit(self): except OSError: flash(gettext("Error reading %(name)s.", name=path), "error") error = True - except: + except: # noqa: E722 flash( gettext("Unexpected error while reading from %(name)s", name=path), "error", @@ -1271,7 +1273,7 @@ def edit(self): except UnicodeDecodeError: flash(gettext("Cannot edit %(name)s.", name=path), "error") error = True - except: + except: # noqa: E722 flash( gettext( "Unexpected error while reading from %(name)s", name=path diff --git a/flask_admin/contrib/fileadmin/s3.py b/flask_admin/contrib/fileadmin/s3.py index 759ceb50b..8b989490c 100644 --- a/flask_admin/contrib/fileadmin/s3.py +++ b/flask_admin/contrib/fileadmin/s3.py @@ -2,6 +2,12 @@ from types import ModuleType from typing import Optional +from flask import redirect + +from flask_admin.babel import gettext + +from . import BaseFileAdmin + s3: Optional[ModuleType] try: @@ -11,12 +17,6 @@ except ImportError: s3 = None -from flask import redirect - -from flask_admin.babel import gettext - -from . import BaseFileAdmin - class S3Storage: """ diff --git a/flask_admin/contrib/peewee/form.py b/flask_admin/contrib/peewee/form.py index b3c6c7ecd..2140fa63d 100644 --- a/flask_admin/contrib/peewee/form.py +++ b/flask_admin/contrib/peewee/form.py @@ -32,7 +32,7 @@ from playhouse.postgres_ext import JSONField pg_ext = True -except: +except ImportError: pg_ext = False diff --git a/flask_admin/contrib/peeweemodel/__init__.py b/flask_admin/contrib/peeweemodel/__init__.py index 72bc13dbd..dcb2afcea 100644 --- a/flask_admin/contrib/peeweemodel/__init__.py +++ b/flask_admin/contrib/peeweemodel/__init__.py @@ -3,7 +3,8 @@ def setup(): warnings.warn( "Flask-Admin peewee integration module was renamed as " - "flask_admin.contrib.peewee, please use it instead." + "flask_admin.contrib.peewee, please use it instead.", + stacklevel=1, ) from flask_admin._backwards import import_redirect @@ -14,4 +15,4 @@ def setup(): setup() del setup -from ..peewee.view import ModelView # noqa: F401 +from ..peewee.view import ModelView # noqa: F401, E402 diff --git a/flask_admin/contrib/sqla/form.py b/flask_admin/contrib/sqla/form.py index 1f756e4bf..fc85b8f29 100644 --- a/flask_admin/contrib/sqla/form.py +++ b/flask_admin/contrib/sqla/form.py @@ -186,7 +186,8 @@ def convert(self, model, mapper, name, prop, field_args, hidden_pk): return None elif len(columns) > 1: warnings.warn( - f"Can not convert multiple-column properties ({model}.{prop.key})" + f"Can not convert multiple-column properties ({model}.{prop.key})", + stacklevel=1, ) return None diff --git a/flask_admin/contrib/sqla/validators.py b/flask_admin/contrib/sqla/validators.py index 16c65fe55..ce4c94a2b 100644 --- a/flask_admin/contrib/sqla/validators.py +++ b/flask_admin/contrib/sqla/validators.py @@ -75,10 +75,10 @@ def valid_currency(form, field): try: Currency(field.data) - except (TypeError, ValueError): + except (TypeError, ValueError) as err: raise ValidationError( field.gettext("Not a valid ISO currency code (e.g. USD, EUR, CNY).") - ) + ) from err def valid_color(form, field): @@ -86,10 +86,10 @@ def valid_color(form, field): try: Color(field.data) - except ValueError: + except ValueError as err: raise ValidationError( field.gettext('Not a valid color (e.g. "red", "#f00", "#ff0000").') - ) + ) from err class TimeZoneValidator: @@ -103,6 +103,6 @@ def __init__(self, coerce_function): def __call__(self, form, field): try: self.coerce_function(str(field.data)) - except Exception: + except Exception as err: msg = 'Not a valid timezone (e.g. "America/New_York", "Africa/Johannesburg", "Asia/Singapore").' - raise ValidationError(field.gettext(msg)) + raise ValidationError(field.gettext(msg)) from err diff --git a/flask_admin/contrib/sqla/view.py b/flask_admin/contrib/sqla/view.py index e178e6d82..84ec105b9 100644 --- a/flask_admin/contrib/sqla/view.py +++ b/flask_admin/contrib/sqla/view.py @@ -477,7 +477,8 @@ def scaffold_list_columns(self): continue elif len(filtered) > 1: warnings.warn( - f"Can not convert multiple-column properties ({self.model}.{p.key})" + f"Can not convert multiple-column properties ({self.model}.{p.key})", + stacklevel=1, ) continue @@ -1059,7 +1060,8 @@ def _apply_filters(self, query, count_query, joins, count_joins, filters): if len(spec.args) == 3: warnings.warn( f"Please update your custom filter {repr(flt)} to " - "include additional `alias` parameter." + "include additional `alias` parameter.", + stacklevel=1, ) else: raise diff --git a/flask_admin/contrib/sqlamodel/__init__.py b/flask_admin/contrib/sqlamodel/__init__.py index cdc7d7a54..37967e544 100644 --- a/flask_admin/contrib/sqlamodel/__init__.py +++ b/flask_admin/contrib/sqlamodel/__init__.py @@ -3,7 +3,8 @@ def setup(): warnings.warn( "Flask-Admin sqlalchemy integration module was renamed as " - "flask_admin.contrib.sqla, please use it instead." + "flask_admin.contrib.sqla, please use it instead.", + stacklevel=1, ) from flask_admin._backwards import import_redirect @@ -14,4 +15,4 @@ def setup(): setup() del setup -from ..sqla.view import ModelView # noqa: F401 +from ..sqla.view import ModelView # noqa: F401, E402 diff --git a/flask_admin/form/fields.py b/flask_admin/form/fields.py index 8b802648f..3add1f70d 100644 --- a/flask_admin/form/fields.py +++ b/flask_admin/form/fields.py @@ -174,8 +174,10 @@ def process_formdata(self, valuelist): else: try: self.data = self.coerce(valuelist[0]) - except ValueError: - raise ValueError(self.gettext("Invalid Choice: could not coerce")) + except ValueError as err: + raise ValueError( + self.gettext("Invalid Choice: could not coerce") + ) from err def pre_validate(self, form): if self.allow_blank and self.data is None: @@ -260,5 +262,5 @@ def process_formdata(self, valuelist): try: self.data = json.loads(valuelist[0]) - except ValueError: - raise ValueError(self.gettext("Invalid JSON")) + except ValueError as err: + raise ValueError(self.gettext("Invalid JSON")) from err diff --git a/flask_admin/form/rules.py b/flask_admin/form/rules.py index 881fafa65..3806435cb 100644 --- a/flask_admin/form/rules.py +++ b/flask_admin/form/rules.py @@ -186,10 +186,10 @@ def _resolve(self, context, name): try: field = context.resolve(parts[0]) - except AttributeError: + except AttributeError as err: raise Exception( "Your template is missing " '"{% set render_ctx = h.resolve_ctx() %}"' - ) + ) from err if not field: return None @@ -559,8 +559,8 @@ def configure_rules(self, rules, parent=None): else: try: result.append(r.configure(self, parent)) - except AttributeError: - raise TypeError(f'Could not convert "{repr(r)}" to rule') + except AttributeError as err: + raise TypeError(f'Could not convert "{repr(r)}" to rule') from err return result diff --git a/flask_admin/form/upload.py b/flask_admin/form/upload.py index 160244d09..32f356e17 100644 --- a/flask_admin/form/upload.py +++ b/flask_admin/form/upload.py @@ -452,7 +452,7 @@ def pre_validate(self, form): try: self.image = Image.open(self.data) except Exception as e: - raise ValidationError(f"Invalid image: {e}") + raise ValidationError(f"Invalid image: {e}") from e # Deletion def _delete_file(self, filename): diff --git a/flask_admin/model/base.py b/flask_admin/model/base.py index f81808667..84e881cef 100644 --- a/flask_admin/model/base.py +++ b/flask_admin/model/base.py @@ -883,7 +883,9 @@ def __init__( if self.can_set_page_size and self.page_size not in self.page_size_options: warnings.warn( - f"{self.page_size=} is not in {self.page_size_options=}", UserWarning + f"{self.page_size=} is not in {self.page_size_options=}", + UserWarning, + stacklevel=1, ) # Endpoint @@ -1117,8 +1119,8 @@ def get_details_columns(self): """ try: only_columns = self.column_details_list or self.scaffold_list_columns() - except NotImplementedError: - raise Exception("Please define column_details_list") + except NotImplementedError as err: + raise Exception("Please define column_details_list") from err return self.get_column_names( only_columns=only_columns, @@ -1488,7 +1490,7 @@ def _get_ruleset_missing_fields(self, ruleset, form): return missing_fields def _show_missing_fields_warning(self, text): - warnings.warn(text) + warnings.warn(text, stacklevel=1) def _validate_form_class(self, ruleset, form_class, remove_missing=True): form_fields = [] @@ -1662,7 +1664,7 @@ def _on_model_change(self, form, model, is_created): "%s.on_model_change() now accepts third " + "parameter is_created. Please update your code" ) % self.model - warnings.warn(msg) + warnings.warn(msg, stacklevel=1) self.on_model_change(form, model) else: @@ -1959,7 +1961,8 @@ def _get_list_value( if len(spec.args) == 2: warnings.warn( f"Please update your type formatter {type_fmt} to " - "include additional `name` parameter." + "include additional `name` parameter.", + stacklevel=1, ) else: raise diff --git a/flask_admin/model/form.py b/flask_admin/model/form.py index e8da071be..e2060029a 100644 --- a/flask_admin/model/form.py +++ b/flask_admin/model/form.py @@ -142,7 +142,7 @@ def _on_model_change(self, form, model, is_created): "%s.on_model_change() now accepts third " + "parameter is_created. Please update your code" ) % self.model - warnings.warn(msg) + warnings.warn(msg, stacklevel=1) self.on_model_change(form, model) diff --git a/flask_admin/tests/__init__.py b/flask_admin/tests/__init__.py index 4dbd5a41f..5b356bcff 100644 --- a/flask_admin/tests/__init__.py +++ b/flask_admin/tests/__init__.py @@ -11,7 +11,7 @@ def flask_babel_test_decorator(fn): fn = pytest.mark.flask_babel(fn) try: - import flask_babel + import flask_babel # noqa: F401 except ImportError: return pytest.mark.xfail( reason="flask-babel is not installed; translations unavailable" diff --git a/flask_admin/tests/test_form_upload.py b/flask_admin/tests/test_form_upload.py index bf31511a9..acb2e20f8 100644 --- a/flask_admin/tests/test_form_upload.py +++ b/flask_admin/tests/test_form_upload.py @@ -24,7 +24,7 @@ def _create_temp(): def safe_delete(path, name): try: os.remove(op.join(path, name)) - except: + except OSError: pass diff --git a/flask_admin/tools.py b/flask_admin/tools.py index 29f2670b1..03b614f02 100644 --- a/flask_admin/tools.py +++ b/flask_admin/tools.py @@ -95,9 +95,9 @@ def get_dict_attr(obj, attr, default=None): :param default: Default value if attribute was not found """ - for obj in [obj] + obj.__class__.mro(): - if attr in obj.__dict__: - return obj.__dict__[attr] + for o in [obj] + obj.__class__.mro(): + if attr in o.__dict__: + return o.__dict__[attr] return default From 12d31fcf90638cebfb3335e16e6f09cf780ffc12 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Fri, 11 Oct 2024 22:19:21 +0100 Subject: [PATCH 144/156] Manually tweak comments to clean up E501 linting errors --- flask_admin/_backwards.py | 5 +- flask_admin/actions.py | 3 +- flask_admin/base.py | 80 +++++++++++++---------- flask_admin/blueprints.py | 4 +- flask_admin/contrib/fileadmin/__init__.py | 6 +- flask_admin/contrib/geoa/typefmt.py | 8 +-- flask_admin/contrib/peewee/ajax.py | 3 +- flask_admin/contrib/peewee/view.py | 15 +++-- flask_admin/contrib/pymongo/view.py | 3 +- flask_admin/contrib/sqla/ajax.py | 3 +- flask_admin/contrib/sqla/form.py | 20 ++++-- flask_admin/contrib/sqla/tools.py | 17 +++-- flask_admin/contrib/sqla/validators.py | 5 +- flask_admin/contrib/sqla/view.py | 61 +++++++++++------ flask_admin/form/fields.py | 5 +- flask_admin/form/upload.py | 57 +++++++++------- flask_admin/helpers.py | 4 +- flask_admin/model/base.py | 80 +++++++++++++++-------- flask_admin/model/filters.py | 9 ++- flask_admin/model/form.py | 6 +- flask_admin/model/typefmt.py | 3 +- flask_admin/tests/geoa/test_basic.py | 14 +++- flask_admin/tests/sqla/test_basic.py | 21 ++++-- flask_admin/tests/sqla/test_form_rules.py | 6 +- flask_admin/tests/test_model.py | 6 +- 25 files changed, 283 insertions(+), 161 deletions(-) diff --git a/flask_admin/_backwards.py b/flask_admin/_backwards.py index db2d40c8d..72c9429ba 100644 --- a/flask_admin/_backwards.py +++ b/flask_admin/_backwards.py @@ -51,7 +51,10 @@ def __get__(self, obj, objtype=None): # Check if there's old attribute if hasattr(obj, self.old_name): warnings.warn( - f"Property {self.old_name} is obsolete, please use {self.new_name} instead", + ( + f"Property {self.old_name} is obsolete, please use {self.new_name} " + f"instead" + ), stacklevel=2, ) return getattr(obj, self.old_name) diff --git a/flask_admin/actions.py b/flask_admin/actions.py index f4e93c507..0fb478cc4 100644 --- a/flask_admin/actions.py +++ b/flask_admin/actions.py @@ -33,7 +33,8 @@ class ActionsMixin: Actions mixin. In some cases, you might work with more than one "entity" (model, file, etc) in - your admin view and will want to perform actions on a group of entities simultaneously. + your admin view and will want to perform actions on a group of entities + simultaneously. In this case, you can add this functionality by doing this: 1. Add this mixin to your administrative view class diff --git a/flask_admin/base.py b/flask_admin/base.py index b3093d7d6..760b73fe0 100644 --- a/flask_admin/base.py +++ b/flask_admin/base.py @@ -93,8 +93,8 @@ class AdminViewMeta(type): """ View metaclass. - Does some precalculations (like getting list of view methods from the class) to avoid - calculating them for each view class instance. + Does some precalculations (like getting list of view methods from the class) to + avoid calculating them for each view class instance. """ def __init__(cls, classname, bases, fields): @@ -127,7 +127,8 @@ class BaseView(BaseViewClass, metaclass=AdminViewMeta): """ Base administrative view. - Derive from this class to implement your administrative interface piece. For example:: + Derive from this class to implement your administrative interface piece. For + example:: from flask_admin import BaseView, expose class MyView(BaseView): @@ -135,9 +136,14 @@ class MyView(BaseView): def index(self): return 'Hello World!' - Icons can be added to the menu by using `menu_icon_type` and `menu_icon_value`. For example:: + Icons can be added to the menu by using `menu_icon_type` and `menu_icon_value`. For + example:: - admin.add_view(MyView(name='My View', menu_icon_type='glyph', menu_icon_value='glyphicon-home')) + admin.add_view( + MyView( + name='My View', menu_icon_type='glyph', menu_icon_value='glyphicon-home' + ) + ) """ @property @@ -189,19 +195,21 @@ def __init__( :param name: Name of this view. If not provided, will default to the class name. :param category: - View category. If not provided, this view will be shown as a top-level menu item. Otherwise, it will - be in a submenu. + View category. If not provided, this view will be shown as a top-level menu + item. Otherwise, it will be in a submenu. :param endpoint: - Base endpoint name for the view. For example, if there's a view method called "index" and - endpoint is set to "myadmin", you can use `url_for('myadmin.index')` to get the URL to the - view method. Defaults to the class name in lower case. + Base endpoint name for the view. For example, if there's a view method + called "index" and endpoint is set to "myadmin", you can use + `url_for('myadmin.index')` to get the URL to the view method. Defaults to + the class name in lower case. :param url: - Base URL. If provided, affects how URLs are generated. For example, if the url parameter - is "test", the resulting URL will look like "/admin/test/". If not provided, will - use endpoint as a base url. However, if URL starts with '/', absolute path is assumed - and '/admin/' prefix won't be applied. + Base URL. If provided, affects how URLs are generated. For example, if the + url parameter is "test", the resulting URL will look like "/admin/test/". + If not provided, will use endpoint as a base url. However, if URL starts + with '/', absolute path is assumed and '/admin/' prefix won't be applied. :param static_url_path: - Static URL Path. If provided, this specifies the path to the static url directory. + Static URL Path. If provided, this specifies the path to the static url + directory. :param menu_class_name: Optional class name for the menu item. :param menu_icon_type: @@ -209,7 +217,8 @@ def __init__( - `flask_admin.consts.ICON_TYPE_GLYPH` - Bootstrap glyph icon - `flask_admin.consts.ICON_TYPE_FONT_AWESOME` - Font Awesome icon - - `flask_admin.consts.ICON_TYPE_IMAGE` - Image relative to Flask static directory + - `flask_admin.consts.ICON_TYPE_IMAGE` - Image relative to Flask static + directory - `flask_admin.consts.ICON_TYPE_IMAGE_URL` - Image with full URL :param menu_icon_value: Icon glyph name or URL, depending on `menu_icon_type` setting @@ -233,13 +242,14 @@ def __init__( # Default view if self._default_view is None: raise Exception( - f"Attempted to instantiate admin view {self.__class__.__name__} without default view" + f"Attempted to instantiate admin view {self.__class__.__name__} " + "without default view" ) def _get_endpoint(self, endpoint): """ - Generate Flask endpoint name. By default converts class name to lower case if endpoint is - not explicitly provided. + Generate Flask endpoint name. By default converts class name to lower case if + endpoint is not explicitly provided. """ if endpoint: return endpoint @@ -361,7 +371,8 @@ def is_visible(self): By default, item is visible in menu. - Please note that item should be both visible and accessible to be displayed in menu. + Please note that item should be both visible and accessible to be displayed in + menu. """ return True @@ -369,8 +380,8 @@ def is_accessible(self): """ Override this method to add permission checks. - Flask-Admin does not make any assumptions about the authentication system used in your application, so it is - up to you to implement it. + Flask-Admin does not make any assumptions about the authentication system used + in your application, so it is up to you to implement it. By default, it will allow access for everyone. """ @@ -527,7 +538,8 @@ def __init__( :param app: Flask application object :param name: - Application name. Will be displayed in the main menu and as a page title. Defaults to "Admin" + Application name. Will be displayed in the main menu and as a page title. + Defaults to "Admin" :param url: Base URL :param subdomain: @@ -535,19 +547,20 @@ def __init__( :param index_view: Home page view to use. Defaults to `AdminIndexView`. :param translations_path: - Location of the translation message catalogs. By default will use the translations - shipped with Flask-Admin. + Location of the translation message catalogs. By default will use the + translations shipped with Flask-Admin. :param endpoint: - Base endpoint name for index view. If you use multiple instances of the `Admin` class with - a single Flask application, you have to set a unique endpoint name for each instance. + Base endpoint name for index view. If you use multiple instances of the + `Admin` class with a single Flask application, you have to set a unique + endpoint name for each instance. :param static_url_path: - Static URL Path. If provided, this specifies the default path to the static url directory for - all its views. Can be overridden in view configuration. + Static URL Path. If provided, this specifies the default path to the static + url directory for all its views. Can be overridden in view configuration. :param theme: Base theme. Defaults to `Bootstrap4Theme()`. :param category_icon_classes: - A dict of category names as keys and html classes as values to be added to menu category icons. - Example: {'Favorites': 'glyphicon glyphicon-star'} + A dict of category names as keys and html classes as values to be added to + menu category icons. Example: {'Favorites': 'glyphicon glyphicon-star'} :param host: The host to register all admin views on. Mutually exclusive with `subdomain` :param csp_nonce_generator: @@ -636,8 +649,9 @@ def _set_admin_index_view(self, index_view=None, endpoint=None, url=None): :param url: Base URL :param endpoint: - Base endpoint name for index view. If you use multiple instances of the `Admin` class with - a single Flask application, you have to set a unique endpoint name for each instance. + Base endpoint name for index view. If you use multiple instances of the + `Admin` class with a single Flask application, you have to set a unique + endpoint name for each instance. """ self.index_view = index_view or AdminIndexView(endpoint=endpoint, url=url) self.endpoint = endpoint or self.index_view.endpoint diff --git a/flask_admin/blueprints.py b/flask_admin/blueprints.py index 62b49818c..7bfb10a66 100644 --- a/flask_admin/blueprints.py +++ b/flask_admin/blueprints.py @@ -10,7 +10,9 @@ class _BlueprintSetupStateWithHostSupport(FlaskBlueprintSetupState): - """Adds the ability to set a hostname on all routes when registering the blueprint.""" + """Adds the ability to set a hostname on all routes when registering the + blueprint. + """ def __init__(self, blueprint, app, options, first_registration): super().__init__(blueprint, app, options, first_registration) diff --git a/flask_admin/contrib/fileadmin/__init__.py b/flask_admin/contrib/fileadmin/__init__.py index 2797363f7..8278e6d49 100644 --- a/flask_admin/contrib/fileadmin/__init__.py +++ b/flask_admin/contrib/fileadmin/__init__.py @@ -253,7 +253,8 @@ class MyAdmin(FileAdmin): form_base_class = form.BaseForm """ - Base form class. Will be used to create the upload, rename, edit, and delete form. + Base form class. Will be used to create the upload, rename, edit, and delete + form. Allows enabling CSRF validation and useful if you want to have custom constructor or override some fields. @@ -334,7 +335,8 @@ def __init__( Verify if path exists. If set to `True` and path does not exist will raise an exception. :param storage: - The storage backend that the `BaseFileAdmin` will use to operate on the files. + The storage backend that the `BaseFileAdmin` will use to operate on the + files. """ self.base_url = base_url self.storage = storage diff --git a/flask_admin/contrib/geoa/typefmt.py b/flask_admin/contrib/geoa/typefmt.py index 5828d25c8..a784039dc 100644 --- a/flask_admin/contrib/geoa/typefmt.py +++ b/flask_admin/contrib/geoa/typefmt.py @@ -16,10 +16,10 @@ def geom_formatter(view, value, name) -> str: "data-geometry-type": to_shape(value).geom_type, "data-zoom": 15, } - # html_params will serialize None as a string literal "None" so only put tile-layer-url - # and tile-layer-attribution in kwargs when they have a meaningful value. - # flask_admin/static/admin/js/form.js uses its default values when these are not passed - # as textarea attributes. + # html_params will serialize None as a string literal "None" so only put + # tile-layer-url and tile-layer-attribution in kwargs when they have a meaningful + # value. flask_admin/static/admin/js/form.js uses its default values when these + # are not passed as textarea attributes. if view.tile_layer_url: kwargs["data-tile-layer-url"] = view.tile_layer_url if view.tile_layer_attribution: diff --git a/flask_admin/contrib/peewee/ajax.py b/flask_admin/contrib/peewee/ajax.py index 87b587f9b..312c5869c 100644 --- a/flask_admin/contrib/peewee/ajax.py +++ b/flask_admin/contrib/peewee/ajax.py @@ -21,7 +21,8 @@ def __init__(self, name, model, **options): if not self.fields: raise ValueError( - f"AJAX loading requires `fields` to be specified for {model}.{self.name}" + f"AJAX loading requires `fields` to be specified for " + f"{model}.{self.name}" ) self._cached_fields = self._process_fields() diff --git a/flask_admin/contrib/peewee/view.py b/flask_admin/contrib/peewee/view.py index c77df2b21..31fc8a0d9 100644 --- a/flask_admin/contrib/peewee/view.py +++ b/flask_admin/contrib/peewee/view.py @@ -77,7 +77,8 @@ class MyModelView(BaseModelView): model_form_converter = CustomModelConverter """ - Model form conversion class. Use this to implement custom field conversion logic. + Model form conversion class. Use this to implement custom field conversion + logic. For example:: @@ -91,8 +92,8 @@ class MyAdminView(ModelView): inline_model_form_converter = InlineModelConverter """ - Inline model conversion class. If you need some kind of post-processing for inline - forms, you can customize behavior by doing something like this:: + Inline model conversion class. If you need some kind of post-processing for + inline forms, you can customize behavior by doing something like this:: class MyInlineModelConverter(AdminModelConverter): def post_process(self, form_class, info): @@ -246,7 +247,8 @@ def init_search(self): # Check type if not isinstance(p, (CharField, TextField)): raise Exception( - f'Can only search on text columns. Failed to setup search for "{p}"' + f"Can only search on text columns. " + f'Failed to setup search for "{p}"' ) self._search_fields.append(p) @@ -270,7 +272,10 @@ def scaffold_filters(self, name): model_class = attr.model if model_class != self.model: - visible_name = f"{self.get_column_name(model_class.__name__)} / {self.get_column_name(attr.name)}" + visible_name = ( + f"{self.get_column_name(model_class.__name__)}" + f" / {self.get_column_name(attr.name)}" + ) else: if not isinstance(name, string_types): visible_name = self.get_column_name(attr.name) diff --git a/flask_admin/contrib/pymongo/view.py b/flask_admin/contrib/pymongo/view.py index e37f05090..dd7d8b607 100644 --- a/flask_admin/contrib/pymongo/view.py +++ b/flask_admin/contrib/pymongo/view.py @@ -95,7 +95,8 @@ def __init__( - `flask_admin.consts.ICON_TYPE_GLYPH` - Bootstrap glyph icon - `flask_admin.consts.ICON_TYPE_FONT_AWESOME` - Font Awesome icon - - `flask_admin.consts.ICON_TYPE_IMAGE` - Image relative to Flask static directory + - `flask_admin.consts.ICON_TYPE_IMAGE` - Image relative to Flask static + directory - `flask_admin.consts.ICON_TYPE_IMAGE_URL` - Image with full URL :param menu_icon_value: Icon glyph name or URL, depending on `menu_icon_type` setting diff --git a/flask_admin/contrib/sqla/ajax.py b/flask_admin/contrib/sqla/ajax.py index 80bbe0cca..ba5c08eb0 100644 --- a/flask_admin/contrib/sqla/ajax.py +++ b/flask_admin/contrib/sqla/ajax.py @@ -35,7 +35,8 @@ def __init__(self, name, session, model, **options): if not self.fields: raise ValueError( - f"AJAX loading requires `fields` to be specified for {model}.{self.name}" + f"AJAX loading requires `fields` to be specified for" + f" {model}.{self.name}" ) self._cached_fields = self._process_fields() diff --git a/flask_admin/contrib/sqla/form.py b/flask_admin/contrib/sqla/form.py index fc85b8f29..a645653ae 100644 --- a/flask_admin/contrib/sqla/form.py +++ b/flask_admin/contrib/sqla/form.py @@ -171,7 +171,8 @@ def convert(self, model, mapper, name, prop, field_args, hidden_pk): if property_is_association_proxy: if not hasattr(prop.remote_attr, "prop"): raise Exception( - "Association proxy referencing another association proxy is not supported." + "Association proxy referencing another association proxy is " + "not supported." ) prop = prop.remote_attr.prop return self._convert_relation( @@ -186,7 +187,10 @@ def convert(self, model, mapper, name, prop, field_args, hidden_pk): return None elif len(columns) > 1: warnings.warn( - f"Can not convert multiple-column properties ({model}.{prop.key})", + ( + f"Can not convert multiple-column properties" + f" ({model}.{prop.key})" + ), stacklevel=1, ) return None @@ -198,7 +202,8 @@ def convert(self, model, mapper, name, prop, field_args, hidden_pk): form_columns = getattr(self.view, "form_columns", None) or () - # Do not display foreign keys - use relations, except when explicitly instructed + # Do not display foreign keys - use relations, except when explicitly + # instructed if column.foreign_keys and prop.key not in form_columns: return None @@ -691,9 +696,9 @@ def process_ajax_refs(self, info): loader = opts # If we're changing the name in self.view._form_ajax_refs, # we must also change loader.name property. Otherwise - # when the widget tries to set the 'data-url' property in the <input> tag, - # it won't be able to find the loader since it'll be using the "field.loader.name" - # of the previously-configured loader. + # when the widget tries to set the 'data-url' property in the + # <input> tag, it won't be able to find the loader since it'll be + # using the "field.loader.name" of the previously-configured loader. loader.name = new_name result[name] = loader @@ -745,7 +750,8 @@ def _calculate_mapping_key_pair(self, model, info): for prop in mapper.iterate_properties: if hasattr(prop, "direction") and prop.direction.name == candidate: # check if prop is not handled yet - # issubclass is more useful than equal comparator in the case of inheritance + # issubclass is more useful than equal comparator in the case + # of inheritance if prop.key not in forward_reverse_props_keys.keys() and issubclass( target_mapper.class_, prop.mapper.class_ ): diff --git a/flask_admin/contrib/sqla/tools.py b/flask_admin/contrib/sqla/tools.py index a08bffe4c..5cce8518f 100644 --- a/flask_admin/contrib/sqla/tools.py +++ b/flask_admin/contrib/sqla/tools.py @@ -51,8 +51,8 @@ def filter_foreign_columns(base_table, columns): def get_primary_key(model): """ - Return primary key name from a model. If the primary key consists of multiple columns, - return the corresponding tuple + Return primary key name from a model. If the primary key consists of multiple + columns, return the corresponding tuple :param model: Model class @@ -78,16 +78,20 @@ def has_multiple_pks(model): def tuple_operator_in(model_pk, ids): - """The tuple_ Operator only works on certain engines like MySQL or Postgresql. It does not work with sqlite. + """The tuple_ Operator only works on certain engines like MySQL or Postgresql. It + does not work with sqlite. - The function returns an or_ - operator, that containes and_ - operators for every single tuple in ids. + The function returns an or_ - operator, that containes and_ - operators for every + single tuple in ids. Example:: model_pk = [ColumnA, ColumnB] ids = ((1,2), (1,3)) - tuple_operator(model_pk, ids) -> or_( and_( ColumnA == 1, ColumnB == 2), and_( ColumnA == 1, ColumnB == 3) ) + tuple_operator(model_pk, ids) + -> + or_( and_( ColumnA == 1, ColumnB == 2), and_( ColumnA == 1, ColumnB == 3) ) The returning operator can be used within a filter(), as it is just an or_ operator """ @@ -194,7 +198,8 @@ def get_field_with_path(model, name, return_remote_proxy_attr=True): column = columns[0] - # TODO: Use SQLAlchemy "path-finder" to find exact join path to the target property + # TODO: Use SQLAlchemy "path-finder" to find exact join path to the + # target property if need_join(model, column.table): path.append(column.table) diff --git a/flask_admin/contrib/sqla/validators.py b/flask_admin/contrib/sqla/validators.py index ce4c94a2b..53080472c 100644 --- a/flask_admin/contrib/sqla/validators.py +++ b/flask_admin/contrib/sqla/validators.py @@ -104,5 +104,8 @@ def __call__(self, form, field): try: self.coerce_function(str(field.data)) except Exception as err: - msg = 'Not a valid timezone (e.g. "America/New_York", "Africa/Johannesburg", "Asia/Singapore").' + msg = ( + 'Not a valid timezone (e.g. "America/New_York", ' + '"Africa/Johannesburg", "Asia/Singapore").' + ) raise ValidationError(field.gettext(msg)) from err diff --git a/flask_admin/contrib/sqla/view.py b/flask_admin/contrib/sqla/view.py index 84ec105b9..e3388a89d 100644 --- a/flask_admin/contrib/sqla/view.py +++ b/flask_admin/contrib/sqla/view.py @@ -71,8 +71,8 @@ class ModelView(BaseModelView): "column_select_related", "list_select_related", None ) """ - List of parameters for SQLAlchemy `subqueryload`. Overrides `column_auto_select_related` - property. + List of parameters for SQLAlchemy `subqueryload`. Overrides + `column_auto_select_related` property. For example:: @@ -113,8 +113,8 @@ class MyModelView(ModelView): The following search rules apply: - - If you enter ``ZZZ`` in the UI search field, it will generate ``ILIKE '%ZZZ%'`` - statement against searchable columns. + - If you enter ``ZZZ`` in the UI search field, it will generate + ``ILIKE '%ZZZ%'`` statement against searchable columns. - If you enter multiple words, each word will be searched separately, but only rows that contain all words will be displayed. For example, searching @@ -122,10 +122,12 @@ class MyModelView(ModelView): more columns. - If you prefix your search term with ``^``, it will find all rows - that start with ``^``. So, if you entered ``^ZZZ`` then ``ILIKE 'ZZZ%'`` will be used. + that start with ``^``. So, if you entered ``^ZZZ`` then ``ILIKE 'ZZZ%'`` will + be used. - If you prefix your search term with ``=``, it will perform an exact match. - For example, if you entered ``=ZZZ``, the statement ``ILIKE 'ZZZ'`` will be used. + For example, if you entered ``=ZZZ``, the statement ``ILIKE 'ZZZ'`` will be + used. """ column_filters = None @@ -173,7 +175,8 @@ class MyModelView(BaseModelView): model_form_converter = form.AdminModelConverter """ - Model form conversion class. Use this to implement custom field conversion logic. + Model form conversion class. Use this to implement custom field conversion + logic. For example:: @@ -187,8 +190,8 @@ class MyAdminView(ModelView): inline_model_form_converter = form.InlineModelConverter """ - Inline model conversion class. If you need some kind of post-processing for inline - forms, you can customize behavior by doing something like this:: + Inline model conversion class. If you need some kind of post-processing for + inline forms, you can customize behavior by doing something like this:: class MyInlineModelConverter(InlineModelConverter): def post_process(self, form_class, info): @@ -349,7 +352,8 @@ def __init__( - `flask_admin.consts.ICON_TYPE_GLYPH` - Bootstrap glyph icon - `flask_admin.consts.ICON_TYPE_FONT_AWESOME` - Font Awesome icon - - `flask_admin.consts.ICON_TYPE_IMAGE` - Image relative to Flask static directory + - `flask_admin.consts.ICON_TYPE_IMAGE` - Image relative to Flask static + directory - `flask_admin.consts.ICON_TYPE_IMAGE_URL` - Image with full URL :param menu_icon_value: Icon glyph name or URL, depending on `menu_icon_type` setting @@ -408,7 +412,8 @@ def _apply_path_joins(self, query, joins, path, inner_join=True): :param query: Query to add joins to :param joins: - List of current joins. Used to avoid joining on same relationship more than once + List of current joins. Used to avoid joining on same relationship more + than once :param path: Path to be joined :param fn: @@ -477,7 +482,10 @@ def scaffold_list_columns(self): continue elif len(filtered) > 1: warnings.warn( - f"Can not convert multiple-column properties ({self.model}.{p.key})", + ( + f"Can not convert multiple-column " + f"properties ({self.model}.{p.key})" + ), stacklevel=1, ) continue @@ -607,8 +615,8 @@ def get_column_names(self, only_columns, excluded_columns): column_name = text_type(c) except AttributeError: # TODO: See ticket #1299 - allow virtual columns. Probably figure out - # better way to handle it. For now just assume if column was not found - it - # is virtual and there's column formatter for it. + # better way to handle it. For now just assume if column was not found + # - it is virtual and there's column formatter for it. column_name = text_type(c) visible_name = self.get_column_name(column_name) @@ -695,7 +703,10 @@ def scaffold_filters(self, name): if column.foreign_keys or column.primary_key: continue - visible_name = f"{self.get_column_name(attr.prop.target.name)} / {self.get_column_name(p.key)}" + visible_name = ( + f"{self.get_column_name(attr.prop.target.name)}" + f" / {self.get_column_name(p.key)}" + ) type_name = type(column.type).__name__ flt = self.filter_converter.convert(type_name, column, visible_name) @@ -740,9 +751,16 @@ def scaffold_filters(self, name): and name not in self.column_labels ): if joined_column_name: - visible_name = f"{joined_column_name} / {self.get_column_name(column.table.name)} / {self.get_column_name(column.name)}" + visible_name = ( + f"{joined_column_name}" + f" / {self.get_column_name(column.table.name)}" + f" / {self.get_column_name(column.name)}" + ) else: - visible_name = f"{self.get_column_name(column.table.name)} / {self.get_column_name(column.name)}" + visible_name = ( + f"{self.get_column_name(column.table.name)}" + f" / {self.get_column_name(column.name)}" + ) else: if not isinstance(name, string_types): visible_name = self.get_column_name(name.property.key) @@ -903,11 +921,14 @@ def get_query(self): class MyView(ModelView): def get_query(self): - return super(MyView, self).get_query().filter(User.username == current_user.username) + return super(MyView, self).get_query().filter( + User.username == current_user.username + ) - If you override this method, don't forget to also override `get_count_query`, for displaying the correct - item count in the list view, and `get_one`, which is used when retrieving records for the edit view. + If you override this method, don't forget to also override `get_count_query`, + for displaying the correct item count in the list view, and `get_one`, which is + used when retrieving records for the edit view. """ return self.session.query(self.model) diff --git a/flask_admin/form/fields.py b/flask_admin/form/fields.py index 3add1f70d..6533c05e4 100644 --- a/flask_admin/form/fields.py +++ b/flask_admin/form/fields.py @@ -222,8 +222,9 @@ def process_formdata(self, valuelist): if valuelist: entrylist = valuelist[0] if self.allow_duplicates and entrylist.endswith(" "): - # This means this is an allowed duplicate (see form.js, `createSearchChoice`), so its ID was modified. - # Hence, we need to restore the original IDs. + # This means this is an allowed duplicate (see form.js, + # `createSearchChoice`), so its ID was modified. Hence, we need to + # restore the original IDs. entrylist = re.sub(self._strip_regex, "\\1", entrylist) if self.save_as_list: self.data = [ diff --git a/flask_admin/form/upload.py b/flask_admin/form/upload.py index 32f356e17..2ab90ac2f 100644 --- a/flask_admin/form/upload.py +++ b/flask_admin/form/upload.py @@ -141,8 +141,8 @@ class FileUploadField(fields.StringField): """ Customizable file-upload field. - Saves file to configured path, handles updates and deletions. Inherits from `StringField`, - resulting filename will be stored as string. + Saves file to configured path, handles updates and deletions. Inherits from + `StringField`, resulting filename will be stored as string. """ widget = FileUploadInput() @@ -169,12 +169,13 @@ def __init__( :param base_path: Absolute path to the directory which will store files :param relative_path: - Relative path from the directory. Will be prepended to the file name for uploaded files. - Flask-Admin uses `urlparse.urljoin` to generate resulting filename, so make sure you have - trailing slash. + Relative path from the directory. Will be prepended to the file name for + uploaded files. Flask-Admin uses `urlparse.urljoin` to generate resulting + filename, so make sure you have trailing slash. :param namegen: - Function that will generate filename from the model and uploaded file object. - Please note, that model is "dirty" model object, before it was committed to database. + Function that will generate filename from the model and uploaded file + object. Please note, that model is "dirty" model object, before it was + committed to database. For example:: @@ -362,12 +363,13 @@ def __init__( :param base_path: Absolute path to the directory which will store files :param relative_path: - Relative path from the directory. Will be prepended to the file name for uploaded files. - Flask-Admin uses `urlparse.urljoin` to generate resulting filename, so make sure you have - trailing slash. + Relative path from the directory. Will be prepended to the file name for + uploaded files. Flask-Admin uses `urlparse.urljoin` to generate resulting + filename, so make sure you have trailing slash. :param namegen: - Function that will generate filename from the model and uploaded file object. - Please note, that model is "dirty" model object, before it was committed to database. + Function that will generate filename from the model and uploaded file + object. Please note, that model is "dirty" model object, before it was + committed to database. For example:: @@ -381,16 +383,18 @@ class MyForm(BaseForm): upload = FileUploadField('File', namegen=prefix_name) :param allowed_extensions: - List of allowed extensions. If not provided, then gif, jpg, jpeg, png and tiff will be allowed. + List of allowed extensions. If not provided, then gif, jpg, jpeg, png and + tiff will be allowed. :param max_size: Tuple of (width, height, force) or None. If provided, Flask-Admin will resize image to the desired size. - Width and height is in pixels. If `force` is set to `True`, will try to fit image into dimensions and - keep aspect ratio, otherwise will just resize to target size. + Width and height is in pixels. If `force` is set to `True`, will try to fit + image into dimensions and keep aspect ratio, otherwise will just resize to + target size. :param thumbgen: - Thumbnail filename generation function. All thumbnails will be saved as JPEG files, - so there's no need to keep original file extension. + Thumbnail filename generation function. All thumbnails will be saved as + JPEG files, so there's no need to keep original file extension. For example:: @@ -404,18 +408,21 @@ class MyForm(BaseForm): upload = ImageUploadField('File', thumbgen=thumb_name) :param thumbnail_size: - Tuple or (width, height, force) values. If not provided, thumbnail won't be created. + Tuple or (width, height, force) values. If not provided, thumbnail won't be + created. - Width and height is in pixels. If `force` is set to `True`, will try to fit image into dimensions and - keep aspect ratio, otherwise will just resize to target size. + Width and height is in pixels. If `force` is set to `True`, will try to fit + image into dimensions and keep aspect ratio, otherwise will just resize to + target size. :param url_relative_path: - Relative path from the root of the static directory URL. Only gets used when generating - preview image URLs. + Relative path from the root of the static directory URL. Only gets used + when generating preview image URLs. - For example, your model might store just file names (`relative_path` set to `None`), but - `base_path` is pointing to subdirectory. + For example, your model might store just file names (`relative_path` set + to `None`), but `base_path` is pointing to subdirectory. :param endpoint: - Static endpoint for images. Used by widget to display previews. Defaults to 'static'. + Static endpoint for images. Used by widget to display previews. Defaults + to 'static'. """ # Check if PIL is installed if Image is None: diff --git a/flask_admin/helpers.py b/flask_admin/helpers.py index 81965460a..0e77b79a3 100644 --- a/flask_admin/helpers.py +++ b/flask_admin/helpers.py @@ -34,8 +34,8 @@ def get_current_view(): def get_url(endpoint, **kwargs): """ Alternative to Flask `url_for`. - If there's current administrative view, will call its `get_url`. If there's none - will - use generic `url_for`. + If there's current administrative view, will call its `get_url`. If there's + none - will use generic `url_for`. :param endpoint: Endpoint name diff --git a/flask_admin/model/base.py b/flask_admin/model/base.py index 84e881cef..d94ca249b 100644 --- a/flask_admin/model/base.py +++ b/flask_admin/model/base.py @@ -139,19 +139,24 @@ class BaseModelView(BaseView, ActionsMixin): """ Base model view. - This view does not make any assumptions on how models are stored or managed, but expects the following: + This view does not make any assumptions on how models are stored or managed, but + expects the following: 1. The provided model is an object 2. The model contains properties - 3. Each model contains an attribute which uniquely identifies it (i.e. a primary key for a database model) - 4. It is possible to retrieve a list of sorted models with pagination applied from a data source + 3. Each model contains an attribute which uniquely identifies it (i.e. a + primary key for a database model) + 4. It is possible to retrieve a list of sorted models with pagination applied + from a data source 5. You can get one model by its identifier from the data source Essentially, if you want to support a new data store, all you have to do is: 1. Derive from the `BaseModelView` class - 2. Implement various data-related methods (`get_list`, `get_one`, `create_model`, etc) - 3. Implement automatic form generation from the model representation (`scaffold_form`) + 2. Implement various data-related methods (`get_list`, `get_one`, + `create_model`, etc) + 3. Implement automatic form generation from the model representation + (`scaffold_form`) """ # Permissions @@ -449,8 +454,8 @@ class MyModelView(BaseModelView): class MyModelView(BaseModelView): column_default_sort = 'user' - You can use tuple to control ascending descending order. In following example, items - will be sorted in descending order:: + You can use tuple to control ascending descending order. In following example, + items will be sorted in descending order:: class MyModelView(BaseModelView): column_default_sort = ('user', True) @@ -505,7 +510,8 @@ class MyModelView(BaseModelView): """ Collection of the column filters. - Can contain either field names or instances of :class:`~flask_admin.model.filters.BaseFilter` classes. + Can contain either field names or instances of + :class:`~flask_admin.model.filters.BaseFilter` classes. Example:: @@ -543,7 +549,8 @@ class MyModelView(BaseModelView): column_extra_row_actions = None """ - List of row actions (instances of :class:`~flask_admin.model.template.BaseListRowAction`). + List of row actions + (instances of :class:`~flask_admin.model.template.BaseListRowAction`). Flask-Admin will generate standard per-row actions (edit, delete, etc) and will append custom actions from this list right after them. @@ -554,15 +561,20 @@ class MyModelView(BaseModelView): class MyModelView(BaseModelView): column_extra_row_actions = [ - LinkRowAction('glyphicon glyphicon-off', 'http://direct.link/?id={row_id}'), - EndpointLinkRowAction('glyphicon glyphicon-test', 'my_view.index_view') + LinkRowAction( + 'glyphicon glyphicon-off', 'http://direct.link/?id={row_id}' + ), + EndpointLinkRowAction( + 'glyphicon glyphicon-test', 'my_view.index_view' + ) ] """ simple_list_pager = False """ Enable or disable simple list pager. - If enabled, model interface would not run count query and will only show prev/next pager buttons. + If enabled, model interface would not run count query and will only show + prev/next pager buttons. """ form: Optional[Type[Form]] = None @@ -581,7 +593,8 @@ class MyModelView(BaseModelView): form_base_class = BaseForm """ - Base form class. Will be used by form scaffolding function when creating model form. + Base form class. Will be used by form scaffolding function when creating model + form. Useful if you want to have custom constructor or override some fields. @@ -670,12 +683,14 @@ class MyModelView(BaseModelView): } } - Changing the format of a DateTimeField will require changes to both form_widget_args and form_args. + Changing the format of a DateTimeField will require changes to both + form_widget_args and form_args. Example:: form_args = dict( - start=dict(format='%Y-%m-%d %I:%M %p') # changes how the input is parsed by strptime (12 hour time) + # changes how the input is parsed by strptime (12 hour time) + start=dict(format='%Y-%m-%d %I:%M %p') ) form_widget_args = dict( start={ @@ -696,7 +711,8 @@ class MyModelView(BaseModelView): 'password': PasswordField('Password') } - You can control order of form fields using ``form_columns`` property. For example:: + You can control order of form fields using ``form_columns`` property. + For example:: class MyModelView(BaseModelView): form_columns = ('name', 'email', 'password', 'secret') @@ -705,15 +721,17 @@ class MyModelView(BaseModelView): 'password': PasswordField('Password') } - In this case, password field will be put between email and secret fields that are autogenerated. + In this case, password field will be put between email and secret fields that + are autogenerated. """ form_ajax_refs = None """ Use AJAX for foreign key model loading. - Should contain dictionary, where key is field name and value is either a dictionary which - configures AJAX lookups or backend-specific `AjaxModelLoader` class instance. + Should contain dictionary, where key is field name and value is either a + dictionary which configures AJAX lookups or backend-specific `AjaxModelLoader` + class instance. For example, it can look like:: @@ -731,20 +749,22 @@ class MyModelView(BaseModelView): class MyModelView(BaseModelView): form_ajax_refs = { - 'user': QueryAjaxModelLoader('user', db.session, User, fields=['email'], page_size=10) + 'user': QueryAjaxModelLoader( + 'user', db.session, User, fields=['email'], page_size=10 + ) } - If you need custom loading functionality, you can implement your custom loading behavior - in your `AjaxModelLoader` class. + If you need custom loading functionality, you can implement your custom loading + behavior in your `AjaxModelLoader` class. """ form_rules = None """ List of rendering rules for model creation form. - This property changed default form rendering behavior and makes possible to rearrange order - of rendered fields, add some text between fields, group them, etc. If not set, will use - default Flask-Admin form rendering logic. + This property changed default form rendering behavior and makes possible to + rearrange order of rendered fields, add some text between fields, group them, + etc. If not set, will use default Flask-Admin form rendering logic. Here's simple example which illustrates how to use:: @@ -753,7 +773,9 @@ class MyModelView(BaseModelView): class MyModelView(ModelView): form_rules = [ # Define field set with header text and four fields - rules.FieldSet(('first_name', 'last_name', 'email', 'phone'), 'User'), + rules.FieldSet( + ('first_name', 'last_name', 'email', 'phone'), 'User' + ), # ... and it is just shortcut for: rules.Header('User'), rules.Field('first_name'), @@ -853,7 +875,8 @@ def __init__( - `flask_admin.consts.ICON_TYPE_GLYPH` - Bootstrap glyph icon - `flask_admin.consts.ICON_TYPE_FONT_AWESOME` - Font Awesome icon - - `flask_admin.consts.ICON_TYPE_IMAGE` - Image relative to Flask static directory + - `flask_admin.consts.ICON_TYPE_IMAGE` - Image relative to Flask + static directory - `flask_admin.consts.ICON_TYPE_IMAGE_URL` - Image with full URL :param menu_icon_value: Icon glyph name or URL, depending on `menu_icon_type` setting @@ -1584,7 +1607,8 @@ def get_safe_page_size(self, page_size): # Database-related API def get_list(self, page, sort_field, sort_desc, search, filters, page_size=None): """ - Return a tuple of a count of results and a paginated and sorted list of models from the data source. + Return a tuple of a count of results and a paginated and sorted list of models + from the data source. Must be implemented in the child class. diff --git a/flask_admin/model/filters.py b/flask_admin/model/filters.py index cc485d74b..9daf2f375 100644 --- a/flask_admin/model/filters.py +++ b/flask_admin/model/filters.py @@ -56,7 +56,8 @@ def validate(self, value): :param value: Value to validate """ - # useful for filters with date conversions, see if conversion in clean() raises ValueError + # useful for filters with date conversions, see if conversion in clean() + # raises ValueError try: self.clean(value) return True @@ -204,7 +205,8 @@ def __init__(self, name, options=None, data_type=None): super().__init__(name, options, data_type="datetimepicker") def clean(self, value): - # datetime filters will not work in SQLite + SQLAlchemy if value not converted to datetime + # datetime filters will not work in SQLite + SQLAlchemy if value not converted + # to datetime return datetime.datetime.strptime(value, "%Y-%m-%d %H:%M:%S") @@ -246,7 +248,8 @@ def __init__(self, name, options=None, data_type=None): super().__init__(name, options, data_type="timepicker") def clean(self, value): - # time filters will not work in SQLite + SQLAlchemy if value not converted to time + # time filters will not work in SQLite + SQLAlchemy if value not converted + # to time timetuple = time.strptime(value, "%H:%M:%S") return datetime.time(timetuple.tm_hour, timetuple.tm_min, timetuple.tm_sec) diff --git a/flask_admin/model/form.py b/flask_admin/model/form.py index e2060029a..1625e2b93 100644 --- a/flask_admin/model/form.py +++ b/flask_admin/model/form.py @@ -98,7 +98,8 @@ def __init__(self, **kwargs): def get_form(self): """ If you want to use completely custom form for inline field, you can override - Flask-Admin form generation logic by overriding this method and returning your form. + Flask-Admin form generation logic by overriding this method and returning your + form. """ return None @@ -149,7 +150,8 @@ def _on_model_change(self, form, model, is_created): class InlineFormAdmin(InlineBaseFormAdmin): """ - Settings for inline form administration. Used by relational backends (SQLAlchemy, Peewee), where model + Settings for inline form administration. Used by relational backends (SQLAlchemy, + Peewee), where model class can not be inherited from the parent model definition. """ diff --git a/flask_admin/model/typefmt.py b/flask_admin/model/typefmt.py index e157ab729..032a2df23 100644 --- a/flask_admin/model/typefmt.py +++ b/flask_admin/model/typefmt.py @@ -38,7 +38,8 @@ def bool_formatter(view, value, name): fa = "fa-check-circle" if value else "fa-minus-circle" label = f'{name}: {"true" if value else "false"}' return Markup( - f'<span class="fa {fa} glyphicon glyphicon-{glyph} icon-{glyph}" title="{label}"></span>' + f'<span class="fa {fa} glyphicon glyphicon-{glyph} ' + f'icon-{glyph}" title="{label}"></span>' ) diff --git a/flask_admin/tests/geoa/test_basic.py b/flask_admin/tests/geoa/test_basic.py index cdeadc6f7..8d8976af8 100644 --- a/flask_admin/tests/geoa/test_basic.py +++ b/flask_admin/tests/geoa/test_basic.py @@ -60,12 +60,17 @@ def test_model(app, db, admin): data={ "name": "test1", "point": '{"type": "Point", "coordinates": [125.8, 10.0]}', - "line": '{"type": "LineString", "coordinates": [[50.2345, 94.2], [50.21, 94.87]]}', + "line": ( + '{"type": "LineString", ' + '"coordinates": [[50.2345, 94.2], [50.21, 94.87]]}' + ), "polygon": ( '{"type": "Polygon", "coordinates": [[[100.0, 0.0], [101.0, 0.0],' " [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]]]}" ), - "multi": '{"type": "MultiPoint", "coordinates": [[100.0, 0.0], [101.0, 1.0]]}', + "multi": ( + '{"type": "MultiPoint", "coordinates": [[100.0, 0.0], [101.0, 1.0]]}' + ), }, ) assert rv.status_code == 302 @@ -110,7 +115,10 @@ def test_model(app, db, admin): data = rv.data.decode("utf-8") assert ( r'{"type":"MultiPoint","coordinates":[[100,0],[101,1]]}</textarea>' in data - or r"{"type":"MultiPoint","coordinates":[[100,0],[101,1]]}" + or ( + r"{"type":"MultiPoint"" + r";,"coordinates":[[100,0],[101,1]]}" + ) in data ) diff --git a/flask_admin/tests/sqla/test_basic.py b/flask_admin/tests/sqla/test_basic.py index a7558876b..c7ec41ae9 100644 --- a/flask_admin/tests/sqla/test_basic.py +++ b/flask_admin/tests/sqla/test_basic.py @@ -214,7 +214,8 @@ def fill_db(db, Model1, Model2): @pytest.mark.filterwarnings( - "ignore:'iter_groups' is expected to return 4 items tuple since wtforms 3.1, this will be mandatory in wtforms 3.2:DeprecationWarning", + "ignore:'iter_groups' is expected to return 4 items tuple since wtforms 3.1, this " + "will be mandatory in wtforms 3.2:DeprecationWarning", ) def test_model(app, db, admin): with app.app_context(): @@ -550,7 +551,8 @@ def test_extra_args_search(app, db, admin): client = app.test_client() - # check that extra args in the url are propagated as hidden fields in the search form + # check that extra args in the url are propagated as hidden fields in the + # search form rv = client.get("/admin/model1/?search=model1&foo=bar") data = rv.data.decode("utf-8") assert '<input type="hidden" name="foo" value="bar">' in data @@ -1572,7 +1574,8 @@ def test_column_filters(app, db, admin): # datetime - between rv = client.get( - "/admin/_datetime/?flt0_11=2014-04-02+00%3A00%3A00+to+2014-11-20+23%3A59%3A59" + "/admin/_datetime" + "/?flt0_11=2014-04-02+00%3A00%3A00+to+2014-11-20+23%3A59%3A59" ) assert rv.status_code == 200 data = rv.data.decode("utf-8") @@ -1581,7 +1584,8 @@ def test_column_filters(app, db, admin): # datetime - not between rv = client.get( - "/admin/_datetime/?flt0_12=2014-04-02+00%3A00%3A00+to+2014-11-20+23%3A59%3A59" + "/admin/_datetime" + "/?flt0_12=2014-04-02+00%3A00%3A00+to+2014-11-20+23%3A59%3A59" ) assert rv.status_code == 200 data = rv.data.decode("utf-8") @@ -2389,7 +2393,8 @@ def test_default_complex_sort(app, db, admin): @pytest.mark.filterwarnings( - "ignore:'iter_groups' is expected to return 4 items tuple since wtforms 3.1, this will be mandatory in wtforms 3.2:DeprecationWarning", + "ignore:'iter_groups' is expected to return 4 items tuple since wtforms 3.1, this " + "will be mandatory in wtforms 3.2:DeprecationWarning", ) def test_extra_fields(app, db, admin): with app.app_context(): @@ -2456,7 +2461,8 @@ def test_extra_field_order(app, db, admin): ), ) @pytest.mark.filterwarnings( - "ignore:'iter_groups' is expected to return 4 items tuple since wtforms 3.1, this will be mandatory in wtforms 3.2:DeprecationWarning", + "ignore:'iter_groups' is expected to return 4 items tuple since wtforms 3.1, this " + "will be mandatory in wtforms 3.2:DeprecationWarning", ) @flask_babel_test_decorator def test_modelview_localization(request, app, locale, expect_text): @@ -2691,7 +2697,8 @@ def test_safe_redirect(app, db, admin): # werkzeug 2.1.0+ now returns *relative* redirect/location by default. expected = "/admin/model1/edit/" - # handle old werkzeug (or if relative location is disabled via `autocorrect_location_header=True`) + # handle old werkzeug (or if relative location is disabled via + # `autocorrect_location_header=True`) if ( not hasattr(rv, "autocorrect_location_header") or rv.autocorrect_location_header diff --git a/flask_admin/tests/sqla/test_form_rules.py b/flask_admin/tests/sqla/test_form_rules.py index 11a5c3de8..8f7807f76 100644 --- a/flask_admin/tests/sqla/test_form_rules.py +++ b/flask_admin/tests/sqla/test_form_rules.py @@ -140,7 +140,8 @@ def test_rule_field_set(app, db, admin): @pytest.mark.filterwarnings( - "ignore:'iter_groups' is expected to return 4 items tuple since wtforms 3.1, this will be mandatory in wtforms 3.2:DeprecationWarning", + "ignore:'iter_groups' is expected to return 4 items tuple since wtforms 3.1, this " + "will be mandatory in wtforms 3.2:DeprecationWarning", "ignore:Fields missing from ruleset.*:UserWarning", ) def test_rule_inlinefieldlist(app, db, admin): @@ -163,7 +164,8 @@ def test_rule_inlinefieldlist(app, db, admin): @pytest.mark.filterwarnings( - "ignore:'iter_groups' is expected to return 4 items tuple since wtforms 3.1, this will be mandatory in wtforms 3.2:DeprecationWarning", + "ignore:'iter_groups' is expected to return 4 items tuple since wtforms 3.1, this " + "will be mandatory in wtforms 3.2:DeprecationWarning", ) def test_inline_model_rules(app, db, admin): with app.app_context(): diff --git a/flask_admin/tests/test_model.py b/flask_admin/tests/test_model.py index 4078cf7bb..6df02affb 100644 --- a/flask_admin/tests/test_model.py +++ b/flask_admin/tests/test_model.py @@ -179,7 +179,8 @@ def test_mockview(app, admin): # Attempt to delete model rv = client.post("/admin/model/delete/?id=3") assert rv.status_code == 302 - # werkzeug 2.1.0+ returns *relative* location header by default, so just check the end + # werkzeug 2.1.0+ returns *relative* location header by default, so just check the + # end assert rv.headers["location"].endswith("/admin/model/") # Create a dispatched application to test that edit view's "save and @@ -195,7 +196,8 @@ def test_mockview(app, admin): ), ) - # werkzeug 2.1.0+ always returns a `TestResponse` instance (backward-compat as tuple is removed) + # werkzeug 2.1.0+ always returns a `TestResponse` instance (backward-compat as + # tuple is removed) if isinstance(rv, tuple): app_iter, status, headers = rv else: From aa5616debe852c9610731bb910d7dc69d7076d7b Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Fri, 11 Oct 2024 22:29:53 +0100 Subject: [PATCH 145/156] Enable style check in github actions --- .github/workflows/tests.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index c8dda4f1e..2766673af 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -86,7 +86,7 @@ jobs: strategy: fail-fast: false matrix: - tox: ['docs', 'typing'] + tox: ['docs', 'typing', 'style'] steps: - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 # v5.2.0 From 4056b4e7987ff47feac1a1f6760cdcba5ee9a4e6 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Fri, 11 Oct 2024 22:42:56 +0100 Subject: [PATCH 146/156] Exclude static folder from trivial file formatting --- .pre-commit-config.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0b0bdf927..b38126a81 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -13,4 +13,6 @@ repos: - id: debug-statements - id: fix-byte-order-marker - id: trailing-whitespace + exclude: ^flask_admin/static/ - id: end-of-file-fixer + exclude: ^flask_admin/static/ From 3cad0ca9e22e38867eeebbe5145edb220415cf5f Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Fri, 11 Oct 2024 22:51:45 +0100 Subject: [PATCH 147/156] Fixup strings in exmaples --- examples/auth/app.py | 3 +- examples/babel/app.py | 4 +- examples/bootstrap4/app.py | 66 ++++++++++++++---------- examples/custom-layout/app.py | 66 ++++++++++++++---------- examples/forms-files-images/app.py | 6 ++- examples/geo_alchemy/app.py | 5 +- examples/host-matching/app.py | 4 +- examples/multiple-admin-instances/app.py | 5 +- examples/sqla-association_proxy/app.py | 3 +- examples/sqla-custom-inline-forms/app.py | 4 +- examples/sqla/admin/data.py | 66 ++++++++++++++---------- examples/sqla/admin/main.py | 11 ++-- examples/sqla/admin/models.py | 8 ++- 13 files changed, 158 insertions(+), 93 deletions(-) diff --git a/examples/auth/app.py b/examples/auth/app.py index 97ddc189f..a682d1fcc 100644 --- a/examples/auth/app.py +++ b/examples/auth/app.py @@ -74,7 +74,8 @@ def is_accessible(self): def _handle_view(self, name, **kwargs): """ - Override builtin _handle_view in order to redirect users when a view is not accessible. + Override builtin _handle_view in order to redirect users when a view is not + accessible. """ if not self.is_accessible(): if current_user.is_authenticated: diff --git a/examples/babel/app.py b/examples/babel/app.py index 69f1a6472..c3ed60011 100644 --- a/examples/babel/app.py +++ b/examples/babel/app.py @@ -69,7 +69,9 @@ def index(): <p><a href="/admin/?lang=ru">Click me to get to Admin! (Russian)</a></p> <p><a href="/admin/?lang=pa">Click me to get to Admin! (Punjabi)</a></p> <p><a href="/admin/?lang=zh_CN">Click me to get to Admin! (Chinese - Simplified)</a></p> -<p><a href="/admin/?lang=zh_TW">Click me to get to Admin! (Chinese - Traditional)</a></p> +<p> +<a href="/admin/?lang=zh_TW">Click me to get to Admin! (Chinese - Traditional)</a> +</p> """ return tmp diff --git a/examples/bootstrap4/app.py b/examples/bootstrap4/app.py index 3b4ecd38d..f39fdd927 100644 --- a/examples/bootstrap4/app.py +++ b/examples/bootstrap4/app.py @@ -140,38 +140,52 @@ def build_sample_db(): sample_text = [ { "title": "de Finibus Bonorum et Malorum - Part I", - "content": "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor \ - incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud \ - exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \ - dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. \ - Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt \ - mollit anim id est laborum.", + "content": ( + "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do " + "eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim " + "ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut " + "aliquip ex ea commodo consequat. Duis aute irure dolor in " + "reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla " + "pariatur. Excepteur sint occaecat cupidatat non proident, sunt in " + "culpa qui officia deserunt mollit anim id est laborum." + ), }, { "title": "de Finibus Bonorum et Malorum - Part II", - "content": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque \ - laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto \ - beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur \ - aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi \ - nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, \ - adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam \ - aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam \ - corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum \ - iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum \ - qui dolorem eum fugiat quo voluptas nulla pariatur?", + "content": ( + "Sed ut perspiciatis unde omnis iste natus error sit voluptatem " + "accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae " + "ab illo inventore veritatis et quasi architecto beatae vitae dicta " + "sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit " + "aspernatur aut odit aut fugit, sed quia consequuntur magni dolores " + "eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, " + "qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, " + "sed quia non numquam eius modi tempora incidunt ut labore et dolore " + "magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis " + "nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut " + "aliquid ex ea commodi consequatur? Quis autem vel eum iure " + "reprehenderit qui in ea voluptate velit esse quam nihil molestiae " + "consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla " + "pariatur?" + ), }, { "title": "de Finibus Bonorum et Malorum - Part III", - "content": "At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium \ - voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati \ - cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id \ - est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam \ - libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod \ - maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. \ - Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet \ - ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur \ - a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis \ - doloribus asperiores repellat.", + "content": ( + "At vero eos et accusamus et iusto odio dignissimos ducimus qui " + "blanditiis praesentium voluptatum deleniti atque corrupti quos " + "dolores et quas molestias excepturi sint occaecati cupiditate non " + "provident, similique sunt in culpa qui officia deserunt mollitia " + "animi, id est laborum et dolorum fuga. Et harum quidem rerum " + "facilis est et expedita distinctio. Nam libero tempore, cum soluta " + "nobis est eligendi optio cumque nihil impedit quo minus id quod " + "maxime placeat facere possimus, omnis voluptas assumenda est, omnis " + "dolor repellendus. Temporibus autem quibusdam et aut officiis debitis " + "aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae " + "sint et molestiae non recusandae. Itaque earum rerum hic tenetur a " + "sapiente delectus, ut aut reiciendis voluptatibus maiores alias " + "consequatur aut perferendis doloribus asperiores repellat." + ), }, ] diff --git a/examples/custom-layout/app.py b/examples/custom-layout/app.py index 5753c1dba..8455fd078 100644 --- a/examples/custom-layout/app.py +++ b/examples/custom-layout/app.py @@ -139,38 +139,52 @@ def build_sample_db(): sample_text = [ { "title": "de Finibus Bonorum et Malorum - Part I", - "content": "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor \ - incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud \ - exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \ - dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. \ - Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt \ - mollit anim id est laborum.", + "content": ( + "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do " + "eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim " + "ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut " + "aliquip ex ea commodo consequat. Duis aute irure dolor in " + "reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla " + "pariatur. Excepteur sint occaecat cupidatat non proident, sunt in " + "culpa qui officia deserunt mollit anim id est laborum." + ), }, { "title": "de Finibus Bonorum et Malorum - Part II", - "content": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque \ - laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto \ - beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur \ - aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi \ - nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, \ - adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam \ - aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam \ - corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum \ - iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum \ - qui dolorem eum fugiat quo voluptas nulla pariatur?", + "content": ( + "Sed ut perspiciatis unde omnis iste natus error sit voluptatem " + "accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae " + "ab illo inventore veritatis et quasi architecto beatae vitae dicta " + "sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit " + "aspernatur aut odit aut fugit, sed quia consequuntur magni dolores " + "eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, " + "qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, " + "sed quia non numquam eius modi tempora incidunt ut labore et dolore " + "magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis " + "nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut " + "aliquid ex ea commodi consequatur? Quis autem vel eum iure " + "reprehenderit qui in ea voluptate velit esse quam nihil molestiae " + "consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla " + "pariatur?" + ), }, { "title": "de Finibus Bonorum et Malorum - Part III", - "content": "At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium \ - voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati \ - cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id \ - est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam \ - libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod \ - maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. \ - Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet \ - ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur \ - a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis \ - doloribus asperiores repellat.", + "content": ( + "At vero eos et accusamus et iusto odio dignissimos ducimus qui " + "blanditiis praesentium voluptatum deleniti atque corrupti quos " + "dolores et quas molestias excepturi sint occaecati cupiditate non " + "provident, similique sunt in culpa qui officia deserunt mollitia " + "animi, id est laborum et dolorum fuga. Et harum quidem rerum " + "facilis est et expedita distinctio. Nam libero tempore, cum soluta " + "nobis est eligendi optio cumque nihil impedit quo minus id quod " + "maxime placeat facere possimus, omnis voluptas assumenda est, omnis " + "dolor repellendus. Temporibus autem quibusdam et aut officiis debitis " + "aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae " + "sint et molestiae non recusandae. Itaque earum rerum hic tenetur a " + "sapiente delectus, ut aut reiciendis voluptatibus maiores alias " + "consequatur aut perferendis doloribus asperiores repellat." + ), }, ] diff --git a/examples/forms-files-images/app.py b/examples/forms-files-images/app.py index 699df5469..63eb7acac 100644 --- a/examples/forms-files-images/app.py +++ b/examples/forms-files-images/app.py @@ -169,7 +169,8 @@ class UserView(sqla.ModelView): # Separate header and few fields rules.Header("Location"), rules.Field("city"), - # String is resolved to form field, so there's no need to explicitly use `rules.Field` + # String is resolved to form field, so there's no need to explicitly use + # `rules.Field` "country", # Show macro that's included in the templates rules.Container("rule_demo.wrap", rules.Field("notes")), @@ -322,7 +323,8 @@ def build_sample_db(): sample_text = ( "<h2>This is a test</h2>" - + "<p>Create HTML content in a text area field with the help of <i>WTForms</i> and <i>CKEditor</i>.</p>" + "<p>Create HTML content in a text area field with the help of " + "<i>WTForms</i> and <i>CKEditor</i>.</p>" ) db.session.add(Page(name="Test Page", text=sample_text)) diff --git a/examples/geo_alchemy/app.py b/examples/geo_alchemy/app.py index c464f3e78..5c6d4f040 100644 --- a/examples/geo_alchemy/app.py +++ b/examples/geo_alchemy/app.py @@ -63,7 +63,10 @@ class LeafletModelView(ModelView): class OSMModelView(ModelView): tile_layer_url = "{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" - tile_layer_attribution = '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors' + tile_layer_attribution = ( + '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> ' + "contributors" + ) # Add views diff --git a/examples/host-matching/app.py b/examples/host-matching/app.py index 9739f85ce..c1b8c32f2 100644 --- a/examples/host-matching/app.py +++ b/examples/host-matching/app.py @@ -34,12 +34,14 @@ def index(self): # Flask views @app.route("/", host="<anyhost>") def index(anyhost): + admin_host = url_for("admin3.index", admin_routes_host="anything.localhost:5000") return ( f'<a href="{url_for("admin.index")}">Click me to get to Admin 1</a>' f'<br/>' f'<a href="{url_for("admin2.index")}">Click me to get to Admin 2</a>' f'<br/>' - f'<a href="{url_for("admin3.index", admin_routes_host="anything.localhost:5000")}">Click me to get to Admin 3 under `anything.localhost:5000`</a>' + f'<a href="{admin_host}">Click me to get to Admin 3 under ' + f'`anything.localhost:5000`</a>' ) diff --git a/examples/multiple-admin-instances/app.py b/examples/multiple-admin-instances/app.py index 49fbc937a..3ed03e1a8 100644 --- a/examples/multiple-admin-instances/app.py +++ b/examples/multiple-admin-instances/app.py @@ -22,7 +22,10 @@ def index(self): # Flask views @app.route("/") def index(): - return '<a href="/admin1">Click me to get to Admin 1</a><br/><a href="/admin2">Click me to get to Admin 2</a>' + return ( + '<a href="/admin1">Click me to get to Admin 1</a><br/><a href="/admin2">' + "Click me to get to Admin 2</a>" + ) if __name__ == "__main__": diff --git a/examples/sqla-association_proxy/app.py b/examples/sqla-association_proxy/app.py index 1fad1d819..8716f3e35 100644 --- a/examples/sqla-association_proxy/app.py +++ b/examples/sqla-association_proxy/app.py @@ -30,7 +30,8 @@ class User(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64)) - # Association proxy of "user_keywords" collection to "keyword" attribute - a list of keywords objects. + # Association proxy of "user_keywords" collection to "keyword" attribute - a list + # of keywords objects. keywords = association_proxy("user_keywords", "keyword") # Association proxy to association proxy - a list of keywords strings. keywords_values = association_proxy("user_keywords", "keyword_value") diff --git a/examples/sqla-custom-inline-forms/app.py b/examples/sqla-custom-inline-forms/app.py index 37095cc69..8d093b2f4 100644 --- a/examples/sqla-custom-inline-forms/app.py +++ b/examples/sqla-custom-inline-forms/app.py @@ -110,7 +110,9 @@ class LocationImageInlineModelForm(InlineFormAdmin): model=ImageType, fields=("name",), order_by="name", - placeholder="Please use an AJAX query to select an image type for the image", + placeholder=( + "Please use an AJAX query to select an image type for the image" + ), minimum_input_length=0, ) } diff --git a/examples/sqla/admin/data.py b/examples/sqla/admin/data.py index ced1a1b12..a38f551c3 100644 --- a/examples/sqla/admin/data.py +++ b/examples/sqla/admin/data.py @@ -127,38 +127,52 @@ def build_sample_db(): sample_text = [ { "title": "de Finibus Bonorum et Malorum - Part I", - "content": "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor \ -incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud \ -exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure \ -dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. \ -Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt \ -mollit anim id est laborum.", + "content": ( + "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do " + "eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim " + "ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut " + "aliquip ex ea commodo consequat. Duis aute irure dolor in " + "reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla " + "pariatur. Excepteur sint occaecat cupidatat non proident, sunt in " + "culpa qui officia deserunt mollit anim id est laborum." + ), }, { "title": "de Finibus Bonorum et Malorum - Part II", - "content": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque \ -laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto \ -beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur \ -aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi \ -nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, \ -adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam \ -aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam \ -corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum \ -iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum \ -qui dolorem eum fugiat quo voluptas nulla pariatur?", + "content": ( + "Sed ut perspiciatis unde omnis iste natus error sit voluptatem " + "accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae " + "ab illo inventore veritatis et quasi architecto beatae vitae dicta " + "sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit " + "aspernatur aut odit aut fugit, sed quia consequuntur magni dolores " + "eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, " + "qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, " + "sed quia non numquam eius modi tempora incidunt ut labore et dolore " + "magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis " + "nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut " + "aliquid ex ea commodi consequatur? Quis autem vel eum iure " + "reprehenderit qui in ea voluptate velit esse quam nihil molestiae " + "consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla " + "pariatur?" + ), }, { "title": "de Finibus Bonorum et Malorum - Part III", - "content": "At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium \ -voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati \ -cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id \ -est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam \ -libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod \ -maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. \ -Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet \ -ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur \ -a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis \ -doloribus asperiores repellat.", + "content": ( + "At vero eos et accusamus et iusto odio dignissimos ducimus qui " + "blanditiis praesentium voluptatum deleniti atque corrupti quos " + "dolores et quas molestias excepturi sint occaecati cupiditate non " + "provident, similique sunt in culpa qui officia deserunt mollitia " + "animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis " + "est et expedita distinctio. Nam libero tempore, cum soluta nobis est " + "eligendi optio cumque nihil impedit quo minus id quod maxime placeat " + "facere possimus, omnis voluptas assumenda est, omnis dolor " + "repellendus. Temporibus autem quibusdam et aut officiis debitis aut " + "rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint " + "et molestiae non recusandae. Itaque earum rerum hic tenetur a " + "sapiente delectus, ut aut reiciendis voluptatibus maiores alias " + "consequatur aut perferendis doloribus asperiores repellat." + ), }, ] diff --git a/examples/sqla/admin/main.py b/examples/sqla/admin/main.py index d2e3e8747..d8a6a6300 100644 --- a/examples/sqla/admin/main.py +++ b/examples/sqla/admin/main.py @@ -33,7 +33,9 @@ def index(): <p><a href="/admin/?lang=ru">Click me to get to Admin! (Russian)</a></p> <p><a href="/admin/?lang=pa">Click me to get to Admin! (Punjabi)</a></p> <p><a href="/admin/?lang=zh_CN">Click me to get to Admin! (Chinese - Simplified)</a></p> -<p><a href="/admin/?lang=zh_TW">Click me to get to Admin! (Chinese - Traditional)</a></p> +<p> + <a href="/admin/?lang=zh_TW">Click me to get to Admin! (Chinese - Traditional)</a> +</p> """ return tmp @@ -137,8 +139,8 @@ class UserAdmin(sqla.ModelView): ("first_name", False), ] # sort on multiple columns - # custom filter: each filter in the list is a filter operation (equals, not equals, etc) - # filters with the same name will appear as operations under the same filter + # custom filter: each filter in the list is a filter operation (equals, not equals, + # etc) filters with the same name will appear as operations under the same filter column_filters = [ "first_name", FilterEqual(column=User.last_name, name="Last Name"), @@ -153,7 +155,8 @@ class UserAdmin(sqla.ModelView): ] column_formatters = {"phone_number": phone_number_formatter} - # setup edit forms so that only posts created by this user can be selected as 'featured' + # setup edit forms so that only posts created by this user can be selected as + # 'featured' def edit_form(self, obj): return self._filtered_posts(super().edit_form(obj)) diff --git a/examples/sqla/admin/models.py b/examples/sqla/admin/models.py index 670d7cb6c..3f1f16119 100644 --- a/examples/sqla/admin/models.py +++ b/examples/sqla/admin/models.py @@ -34,7 +34,8 @@ class EnumChoices(enum.Enum): class User(db.Model): id = db.Column(UUIDType(binary=False), default=uuid.uuid4, primary_key=True) - # use a regular string field, for which we can specify a list of available choices later on + # use a regular string field, for which we can specify a list of available choices + # later on type = db.Column(db.String(100)) # fixed choices can be handled in a number of different ways: @@ -64,7 +65,10 @@ class User(db.Model): def phone_number(self): if self.dialling_code and self.local_phone_number: number = str(self.local_phone_number) - return f"+{self.dialling_code} ({number[0]}) {number[1:3]} {number[3:6]} {number[6::]}" + return ( + f"+{self.dialling_code} ({number[0]}) {number[1:3]} " + f"{number[3:6]} {number[6::]}" + ) return @phone_number.expression From bdc896b88dc35a7f82820587a164ae6e4b31eb62 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Fri, 11 Oct 2024 23:00:16 +0100 Subject: [PATCH 148/156] Shuffle type ignore for mypy --- flask_admin/contrib/sqla/tools.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flask_admin/contrib/sqla/tools.py b/flask_admin/contrib/sqla/tools.py index 5cce8518f..a190cb7db 100644 --- a/flask_admin/contrib/sqla/tools.py +++ b/flask_admin/contrib/sqla/tools.py @@ -9,8 +9,8 @@ try: # SQLAlchemy 2.0 - from sqlalchemy.ext.associationproxy import ( - AssociationProxyExtensionType, # type: ignore[attr-defined] + from sqlalchemy.ext.associationproxy import ( # type: ignore[attr-defined] + AssociationProxyExtensionType, ) ASSOCIATION_PROXY = AssociationProxyExtensionType.ASSOCIATION_PROXY From 823fff3bae02f8f84f7b3b85fdf9f0925132142e Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuelhwilliams@gmail.com> Date: Sat, 12 Oct 2024 14:51:53 +0100 Subject: [PATCH 149/156] Don't override date widget if already set --- doc/changelog.rst | 2 ++ flask_admin/contrib/sqla/form.py | 2 +- flask_admin/tests/sqla/test_form.py | 54 +++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 flask_admin/tests/sqla/test_form.py diff --git a/doc/changelog.rst b/doc/changelog.rst index 10f0fd54f..428f89632 100644 --- a/doc/changelog.rst +++ b/doc/changelog.rst @@ -8,6 +8,8 @@ Fixes: * The `Apply` button for filters will show/hide correctly again * Fix `translations_path` attribute when Flask-Admin is used with Flask-Babel +* Some translation updates. +* Date fields no longer override `widget` if set in `form_args` 2.0.0a0 ------- diff --git a/flask_admin/contrib/sqla/form.py b/flask_admin/contrib/sqla/form.py index a645653ae..9883fed3e 100644 --- a/flask_admin/contrib/sqla/form.py +++ b/flask_admin/contrib/sqla/form.py @@ -366,7 +366,7 @@ def conv_Boolean(self, field_args, **extra): @converts("Date") def convert_date(self, field_args, **extra): - field_args["widget"] = form.DatePickerWidget() + field_args.setdefault("widget", form.DatePickerWidget()) return fields.DateField(**field_args) @converts("DateTime") # includes TIMESTAMP diff --git a/flask_admin/tests/sqla/test_form.py b/flask_admin/tests/sqla/test_form.py new file mode 100644 index 000000000..735484def --- /dev/null +++ b/flask_admin/tests/sqla/test_form.py @@ -0,0 +1,54 @@ +import inspect +from unittest.mock import MagicMock + +import pytest +import wtforms +from wtforms.fields.simple import StringField + +from flask_admin.contrib.sqla.form import AdminModelConverter + +sqla_admin_model_converters = [ + method_name + for method_name, method in inspect.getmembers(AdminModelConverter) + if getattr(method, "_converter_for", None) +] + + +class TestAdminModelConverter: + @pytest.mark.parametrize("method_name", sqla_admin_model_converters) + def test_can_override_widget(self, method_name): + converter = AdminModelConverter(None, None) + + def fake_widget(*args, **kwargs): + return "<p>widget overridden</p>" + + class TestForm(wtforms.Form): + pass + + # Find out if field takes `name` or `_name` - depends on wtforms version. + # Required for python3.8 tests + argspec = inspect.signature(StringField.__init__).parameters + name_field = "name" if "name" in argspec else "_name" + + # Build args to pass to wtforms Field instance - mostly fake data, the only + # important thing is the fake widget. `_form` and name_field are required + # to get a 'bound' field instance that can be rendered. + field_args = { + "_form": TestForm(), + name_field: "field", + "widget": fake_widget, + "validators": [], + } + + field = getattr(converter, method_name)( + field_args=field_args, + column=MagicMock(), + ) + + # Some non-wtforms fields (eg `Select2TagsField` don't allow setting this field + try: + field.data = None + except AttributeError: + pass + + assert field() == "<p>widget overridden</p>" From f2cf3887f4460c236fb7b97b5bd5823592b6e9ed Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Sat, 12 Oct 2024 17:03:44 +0100 Subject: [PATCH 150/156] Publish constructor docstrings --- doc/api/mod_form_rules.rst | 15 --------------- doc/api/mod_form_upload.rst | 3 +++ doc/conf.py | 5 +++++ 3 files changed, 8 insertions(+), 15 deletions(-) diff --git a/doc/api/mod_form_rules.rst b/doc/api/mod_form_rules.rst index a869edf39..1489b11e7 100644 --- a/doc/api/mod_form_rules.rst +++ b/doc/api/mod_form_rules.rst @@ -4,34 +4,19 @@ .. automodule:: flask_admin.form.rules .. autoclass:: BaseRule - :members: __init__ .. autoclass:: NestedRule - :members: __init__ .. autoclass:: Text - :members: __init__ - .. autoclass:: HTML - :members: __init__ - .. autoclass:: Macro - :members: __init__ - .. autoclass:: Container - :members: __init__ - .. autoclass:: Field - :members: __init__ - .. autoclass:: Header - :members: __init__ - .. autoclass:: FieldSet - :members: __init__ diff --git a/doc/api/mod_form_upload.rst b/doc/api/mod_form_upload.rst index 6e1c07dd0..d9feaa5c4 100644 --- a/doc/api/mod_form_upload.rst +++ b/doc/api/mod_form_upload.rst @@ -4,10 +4,13 @@ .. automodule:: flask_admin.form.upload .. autoclass:: FileUploadField + :class-doc-from: class :members: __init__ .. autoclass:: ImageUploadField + :class-doc-from: class :members: __init__ .. autoclass:: FileUploadInput + .. autoclass:: ImageUploadInput diff --git a/doc/conf.py b/doc/conf.py index 461451a9b..d8bc323a7 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -95,6 +95,11 @@ # modindex_common_prefix = [] +# -- sphinx.ext.autodoc Configuration ------------------------------------------ + +autoclass_content = "both" + + # -- Options for HTML output --------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for From bb7b42eeb8060b203f436289fb592d52b88fcba6 Mon Sep 17 00:00:00 2001 From: LeXofLeviafan <lexofleviafan@gmail.com> Date: Sun, 29 Sep 2024 16:13:12 +0200 Subject: [PATCH 151/156] [pallets-eco#2311] fix 'Save and Continue Editing' URL in edit form --- flask_admin/model/base.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/flask_admin/model/base.py b/flask_admin/model/base.py index d94ca249b..69037cdbb 100644 --- a/flask_admin/model/base.py +++ b/flask_admin/model/base.py @@ -2298,7 +2298,9 @@ def edit_view(self): return redirect(self.get_url(".create_view", url=return_url)) elif "_continue_editing" in request.form: return redirect( - self.get_url(".edit_view", id=self.get_pk_value(model)) + self.get_url( + ".edit_view", id=self.get_pk_value(model), url=return_url + ) ) else: # save button From 01ab1da0fbe84fe468bb99235a88eb03413af1bd Mon Sep 17 00:00:00 2001 From: LeXofLeviafan <lexofleviafan@gmail.com> Date: Sun, 29 Sep 2024 16:33:19 +0200 Subject: [PATCH 152/156] [pallets-eco#2311] fix mockview test --- flask_admin/tests/test_model.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/flask_admin/tests/test_model.py b/flask_admin/tests/test_model.py index 6df02affb..badbf1d8f 100644 --- a/flask_admin/tests/test_model.py +++ b/flask_admin/tests/test_model.py @@ -190,7 +190,7 @@ def test_mockview(app, admin): dispatched_client = Client(dispatched_app) rv = dispatched_client.post( - "/dispatched/admin/model/edit/?id=3", + "/dispatched/admin/model/edit/?id=3&url=/dispatched/admin/model/?flt0_filter%3Dvalue", data=dict( col1="another test!", col2="test@", col3="test#", _continue_editing="True" ), @@ -205,7 +205,9 @@ def test_mockview(app, admin): headers = rv.headers assert status == "302 FOUND" - assert headers["Location"].endswith("/dispatched/admin/model/edit/?id=3") + assert headers["Location"].endswith( + "/dispatched/admin/model/edit/?id=3&url=/dispatched/admin/model/?flt0_filter%3Dvalue", + ) model = view.updated_models.pop() assert model.col1 == "another test!" From ef1714aee9860e53397ae90e994ee147e3023678 Mon Sep 17 00:00:00 2001 From: LeXofLeviafan <lexofleviafan@gmail.com> Date: Sat, 12 Oct 2024 22:26:34 +0200 Subject: [PATCH 153/156] [pallets-eco#2311] update changelog --- doc/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/changelog.rst b/doc/changelog.rst index 428f89632..f0fc616a3 100644 --- a/doc/changelog.rst +++ b/doc/changelog.rst @@ -10,6 +10,7 @@ Fixes: * Fix `translations_path` attribute when Flask-Admin is used with Flask-Babel * Some translation updates. * Date fields no longer override `widget` if set in `form_args` +* “Save and Continue Editing” button no longer discards the “return URL” (allowing to retain filters when switching back to the list) 2.0.0a0 ------- From 2fae681e641d4377f60e9c514110809b24a65ed0 Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Sun, 13 Oct 2024 19:28:56 +0100 Subject: [PATCH 154/156] Fixes for bootstrap4/admin/lib.html Bootstrap 4 renamed .control-label to .col-form-label. https://getbootstrap.com/docs/4.0/migration/#forms-1 --- flask_admin/templates/bootstrap4/admin/lib.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flask_admin/templates/bootstrap4/admin/lib.html b/flask_admin/templates/bootstrap4/admin/lib.html index 5dfe0b084..2358bbc28 100644 --- a/flask_admin/templates/bootstrap4/admin/lib.html +++ b/flask_admin/templates/bootstrap4/admin/lib.html @@ -120,9 +120,9 @@ {% set prepend = kwargs.pop('prepend', None) %} {% set append = kwargs.pop('append', None) %} <div class="form-group {{ kwargs.get('column_class', '') }}"> - <label for="{{ field.id }}" class="control-label {% if field.widget.input_type == 'checkbox' %}d-block mb-0{% endif %}">{{ field.label.text }} + <label for="{{ field.id }}" class="col-form-label {% if field.widget.input_type == 'checkbox' %}d-block mb-0{% endif %}">{{ field.label.text }} {% if h.is_required_form_field(field) %} - <strong class="text-danger"">*</strong> + <strong class="text-danger">*</strong> {%- else -%} {%- endif %} From e7023c10d32f15ef6059854fd3db9e1e9351dbc4 Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Sun, 13 Oct 2024 19:30:09 +0100 Subject: [PATCH 155/156] Fix SQLAlchemy 2 installed by sqlalchemy1 tox factor With use_frozen_constraints constraints are generated by calling "pip freeze" after the environment deps have been installed and before the package dependencies are installed, thus constraints-sqlalchemy1.txt is being ignored. --- requirements-skip/constraints-sqlalchemy1.txt | 1 - tox.ini | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) delete mode 100644 requirements-skip/constraints-sqlalchemy1.txt diff --git a/requirements-skip/constraints-sqlalchemy1.txt b/requirements-skip/constraints-sqlalchemy1.txt deleted file mode 100644 index 19c6d85dd..000000000 --- a/requirements-skip/constraints-sqlalchemy1.txt +++ /dev/null @@ -1 +0,0 @@ -sqlalchemy<2 diff --git a/tox.ini b/tox.ini index 2366c3fdc..d141b984c 100644 --- a/tox.ini +++ b/tox.ini @@ -21,7 +21,7 @@ setenv = SQLALCHEMY_SILENCE_UBER_WARNING = 1 AZURE_STORAGE_CONNECTION_STRING = DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1; deps = - sqlalchemy1: -c requirements-skip/constraints-sqlalchemy1.txt + sqlalchemy1: sqlalchemy<2 -r requirements/tests.txt commands_pre = noflaskbabel: pip uninstall -y flask-babel From e76b4e606f7454e6120f2dfdcfa4955af1c70e19 Mon Sep 17 00:00:00 2001 From: Chris Mayo <aklhfex@gmail.com> Date: Mon, 14 Oct 2024 19:22:11 +0100 Subject: [PATCH 156/156] More Bootstrap 4 fixes --- flask_admin/templates/bootstrap4/admin/actions.html | 2 +- .../templates/bootstrap4/admin/model/inline_field_list.html | 2 +- flask_admin/templates/bootstrap4/admin/model/layout.html | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/flask_admin/templates/bootstrap4/admin/actions.html b/flask_admin/templates/bootstrap4/admin/actions.html index 8e61c20ee..6884a095a 100644 --- a/flask_admin/templates/bootstrap4/admin/actions.html +++ b/flask_admin/templates/bootstrap4/admin/actions.html @@ -2,7 +2,7 @@ {% macro dropdown(actions, btn_class='nav-link dropdown-toggle') -%} <a class="{{ btn_class }}" data-toggle="dropdown" href="javascript:void(0)" role="button" aria-haspopup="true" - aria-expanded="false">{{ _gettext('With selected') }}<b class="caret"></b></a> + aria-expanded="false">{{ _gettext('With selected') }}</a> <div class="dropdown-menu"> {% for p in actions %} <a class="dropdown-item" href="javascript:void(0)" diff --git a/flask_admin/templates/bootstrap4/admin/model/inline_field_list.html b/flask_admin/templates/bootstrap4/admin/model/inline_field_list.html index b19dc2ee3..384b48c02 100644 --- a/flask_admin/templates/bootstrap4/admin/model/inline_field_list.html +++ b/flask_admin/templates/bootstrap4/admin/model/inline_field_list.html @@ -4,7 +4,7 @@ {{ field }} {% if h.is_field_error(field.errors) %} - <ul class="help-block input-errors"> + <ul class="form-text input-errors"> {% for e in field.errors if e is string %} <li>{{ e }}</li> {% endfor %} diff --git a/flask_admin/templates/bootstrap4/admin/model/layout.html b/flask_admin/templates/bootstrap4/admin/model/layout.html index 936bfd1d4..0a828ead5 100644 --- a/flask_admin/templates/bootstrap4/admin/model/layout.html +++ b/flask_admin/templates/bootstrap4/admin/model/layout.html @@ -1,5 +1,5 @@ {% macro filter_options(btn_class='dropdown-toggle') %} - <a class="nav-link {{ btn_class }}" data-toggle="dropdown" href="javascript:void(0)">{{ _gettext('Add Filter') }}<b class="caret"></b></a> + <a class="nav-link {{ btn_class }}" data-toggle="dropdown" href="javascript:void(0)">{{ _gettext('Add Filter') }}</a> <div class="dropdown-menu field-filters"> {% for k in filter_groups %} <a href="javascript:void(0)" class="dropdown-item filter" onclick="return false;">{{ k }}</a> @@ -11,7 +11,7 @@ {% if admin_view.export_types|length > 1 %} <li class="dropdown"> <a class="nav-link {{ btn_class }}" data-toggle="dropdown" href="javascript:void(0)" role="button" - aria-haspopup="true" aria-expanded="false">{{ _gettext('Export') }}<b class="caret"></b></a> + aria-haspopup="true" aria-expanded="false">{{ _gettext('Export') }}</a> <div class="dropdown-menu"> {% for export_type in admin_view.export_types %} <a class="dropdown-item" @@ -99,7 +99,7 @@ {% macro page_size_form(generator, page_size_options, btn_class='nav-link dropdown-toggle') %} <a class="{{ btn_class }}" data-toggle="dropdown" href="javascript:void(0)"> - {{ page_size }} {{ _gettext('items') }}<b class="caret"></b> + {{ page_size }} {{ _gettext('items') }} </a> <div class="dropdown-menu"> {% for option in page_size_options %}