From 9674696f829cf8a41555382c8333a12d47666569 Mon Sep 17 00:00:00 2001 From: Sergei Miami Date: Mon, 14 Jun 2021 15:50:36 +0300 Subject: [PATCH] Full TurboGears application --- MANIFEST.in | 4 + README.md | 27 ++- devdata.db | Bin 0 -> 57344 bytes development.ini | 164 +++++++++++++ migration/env.py | 76 ++++++ migration/script.py.mako | 22 ++ migration/versions/empty.txt | 0 requirements.txt | 3 +- setup.cfg | 49 ++++ setup.py | 112 ++++++--- test.ini | 28 +++ wiki/__init__.py | 2 + wiki/config/__init__.py | 1 + wiki/config/app_cfg.py | 148 +++++++++++ wiki/config/application.py | 28 +++ wiki/controllers/__init__.py | 2 + wiki/controllers/controller.py.template | 18 ++ wiki/controllers/error.py | 38 +++ wiki/controllers/root.py | 119 +++++++++ wiki/controllers/secure.py | 30 +++ wiki/i18n/ru/LC_MESSAGES/wiki.po | 24 ++ wiki/model/__init__.py | 63 +++++ wiki/model/auth.py | 186 ++++++++++++++ wiki/model/model.py.template | 23 ++ wiki/public/css/bootstrap.min.css | 7 + wiki/public/css/style.css | 42 ++++ wiki/public/favicon.ico | Bin 0 -> 1104 bytes .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20290 bytes .../fonts/glyphicons-halflings-regular.svg | 229 ++++++++++++++++++ .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 41236 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23292 bytes wiki/public/img/turbogears_logo.png | Bin 0 -> 1642 bytes wiki/public/img/turbogears_logo_big.png | Bin 0 -> 53462 bytes wiki/public/img/under_the_hood_blue.png | Bin 0 -> 2667 bytes wiki/public/javascript/bootstrap.min.js | 7 + wiki/templates/__init__.py | 2 + wiki/templates/about.xhtml | 139 +++++++++++ wiki/templates/data.xhtml | 43 ++++ wiki/templates/environ.xhtml | 35 +++ wiki/templates/error.xhtml | 17 ++ wiki/templates/index.xhtml | 53 ++++ wiki/templates/login.xhtml | 43 ++++ wiki/templates/master.xhtml | 70 ++++++ wiki/templates/template.xhtml.template | 16 ++ wiki/tests/__init__.py | 67 +++++ wiki/tests/functional/__init__.py | 2 + wiki/tests/functional/test_authentication.py | 91 +++++++ wiki/tests/functional/test_root.py | 71 ++++++ wiki/tests/models/__init__.py | 64 +++++ wiki/tests/models/test_auth.py | 54 +++++ wiki/websetup/__init__.py | 22 ++ wiki/websetup/bootstrap.py | 54 +++++ wiki/websetup/schema.py | 28 +++ 53 files changed, 2294 insertions(+), 29 deletions(-) create mode 100644 MANIFEST.in create mode 100644 devdata.db create mode 100644 development.ini create mode 100644 migration/env.py create mode 100644 migration/script.py.mako create mode 100644 migration/versions/empty.txt create mode 100644 setup.cfg create mode 100644 test.ini create mode 100644 wiki/__init__.py create mode 100644 wiki/config/__init__.py create mode 100644 wiki/config/app_cfg.py create mode 100644 wiki/config/application.py create mode 100644 wiki/controllers/__init__.py create mode 100644 wiki/controllers/controller.py.template create mode 100644 wiki/controllers/error.py create mode 100644 wiki/controllers/root.py create mode 100644 wiki/controllers/secure.py create mode 100644 wiki/i18n/ru/LC_MESSAGES/wiki.po create mode 100644 wiki/model/__init__.py create mode 100644 wiki/model/auth.py create mode 100644 wiki/model/model.py.template create mode 100644 wiki/public/css/bootstrap.min.css create mode 100644 wiki/public/css/style.css create mode 100644 wiki/public/favicon.ico create mode 100644 wiki/public/fonts/glyphicons-halflings-regular.eot create mode 100644 wiki/public/fonts/glyphicons-halflings-regular.svg create mode 100644 wiki/public/fonts/glyphicons-halflings-regular.ttf create mode 100644 wiki/public/fonts/glyphicons-halflings-regular.woff create mode 100644 wiki/public/img/turbogears_logo.png create mode 100644 wiki/public/img/turbogears_logo_big.png create mode 100644 wiki/public/img/under_the_hood_blue.png create mode 100644 wiki/public/javascript/bootstrap.min.js create mode 100644 wiki/templates/__init__.py create mode 100644 wiki/templates/about.xhtml create mode 100644 wiki/templates/data.xhtml create mode 100644 wiki/templates/environ.xhtml create mode 100644 wiki/templates/error.xhtml create mode 100644 wiki/templates/index.xhtml create mode 100644 wiki/templates/login.xhtml create mode 100644 wiki/templates/master.xhtml create mode 100644 wiki/templates/template.xhtml.template create mode 100644 wiki/tests/__init__.py create mode 100644 wiki/tests/functional/__init__.py create mode 100644 wiki/tests/functional/test_authentication.py create mode 100644 wiki/tests/functional/test_root.py create mode 100644 wiki/tests/models/__init__.py create mode 100644 wiki/tests/models/test_auth.py create mode 100644 wiki/websetup/__init__.py create mode 100644 wiki/websetup/bootstrap.py create mode 100644 wiki/websetup/schema.py diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..6cc590c --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,4 @@ +recursive-include wiki/public * +include wiki/public/favicon.ico +recursive-include wiki/i18n * +recursive-include wiki/templates * diff --git a/README.md b/README.md index ca3bf60..1c633c9 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Install requirements pip install -r requirements.txt ``` -Start server +Start "HelloWorld" server ```shell python server.py @@ -36,6 +36,31 @@ Now try to build something more incredible, like things we listed [here in the p GL & HF. +## Something more incredible + +Wiki folder contains application with TurboGears full framweork. + +To set it up, execute these commands + +```shell +cd wiki +python setup.py develop +gearbox setup-app +``` + +Then start server in development mode + +```shell +gearbox serve --reload --debug +``` + +Or in production mode + +```shell +gearbox serve +``` + + ## Useful links - [Virtualenv](https://docs.python-guide.org/dev/virtualenvs/#lower-level-virtualenv) diff --git a/devdata.db b/devdata.db new file mode 100644 index 0000000000000000000000000000000000000000..52321841b633a5856d55d07278f78f66deb0545e GIT binary patch literal 57344 zcmeI*&2QRf90zbaq!366y`dw3=z zUmx(-D=l_3>_zjfRCii(s$l7)S;&>IUl(7tqoEGlt)qe0Z?*fqqr=3^Vq%zys&J6e zQh`hO2&@NIBQdxrSZhjUVrb(iH%PolCB(VE+pxAC)WgxQjayVm!@6%Ztoo+4N5-8Y zlgiyXxo2%#JS&^Ez0KM^i|~^DFYkqU8keL4pRO?#IVvY>lj@I%U8vB-YWle>Tv=7c?{CE!8Lj)!>vw`dxB>F^>7sl(JLv{tj^Z(VFiDf}AC;*%)(w(a z@E`e#+ocm0mH$iDbjp%zPUUS}I3=>qRck=41)peln9wXK+##=58`KEj?#ibXmtcJ=ExG@=)V?1E(Jx4*7<3+D6f| zD07LO@k~Ij7UJ*Mw;t_V3D0m<{3t|o7i{lmf`v|#*@crzCRbir5nonfp>QAPZNkZX zS|u#J=y($yBN7I(o;2_}EI4Q}*X?_QK|&#M;Bte(;Q{-$m53Ev9kRjTn_k~NU0hbo zNXhAY{I`Wm!lO-dYsU)Z60lMKQlzJSPCzI6$(c8)Et<}ya}kwZcwiar5(&a|I?i>zkaM(xl;>ovobA?Jw!FD| z4%?{p=?Lz2R>{7SNRMoRxX8NAO8!*># zWJPnTuIU-3Z~DGbwKc8EDD@3j()c2VB2h!OKX|!ZmQ0Nv*Tn^4g|73_jL)FQlPTjF z*E)XHahT##&s5ZKg}UqNvgbNfaa6-*3Y8eGx;AB==}S~LRfQVV(M;LUbm}w3*Iiqe z6xFtE-fPpaZN+hP=4*z{Axur?Z4{q+RbQ%_woh%vVBz(BO;KEx`BMg@7;1R^f3EaK zD7`8D`Kc+!au9$31Rwwb2tWV=5P$##AOHaf%!)uEvn-C@UYRRoR^kr;jL!dG3#Hek z-)5z!=m!KK009U<00Izz00bZa0SG_<0@DSSGsgG~KlN#Zx#bLvPxw<+qrd<6N+`XW z9v3wbfB*y_009U<00Izz00bZa0SL^5fFaHc%k9y(4Vq7b!I}SALfXMIZ$Ma=Ft-zQ zgTavhs~=uO`a%2YaP;^8-U_9+GcgWy0s;_#00bZa0SG_<0uX=z1Rwx`OB2XvmdBq5 z7+wE=FO=S2T5tq{00bZa0SG_<0uX=z1Rwwb2tZ(V1TtbKpC4WS$NB&4qy;^J00bZa z0SG_<0uX=z1Rwwb2wbYb{Cqy2$Mye9HAOH8KmY;|fB*y_009U<00Izzz^n=2`v0tD z1pR>k1Rwwb2tWV=5P$##AOHafT)x2R^?%{o= 1.2.3', + 'nose', + 'coverage', + 'gearbox' +] + +install_requires = [ + "TurboGears2 >= 2.4.3", + "Beaker >= 1.8.0", + "Kajiki >= 0.6.3", + "zope.sqlalchemy >= 1.2", + "sqlalchemy", + "alembic", + "repoze.who", + "tw2.forms", + "tgext.admin >= 0.6.1", + "WebHelpers2" +] + +if py_version != (3, 2): + # Babel not available on 3.2 + install_requires.append("Babel") + +setup( + name='wiki', + version='0.1', + description='', + author='', + author_email='', + url='', + packages=find_packages(exclude=['ez_setup']), + install_requires=install_requires, + include_package_data=True, + test_suite='nose.collector', + tests_require=testpkgs, + extras_require={ + 'testing': testpkgs + }, + package_data={'wiki': [ + 'i18n/*/LC_MESSAGES/*.mo', + 'templates/*/*', + 'public/*/*' + ]}, + message_extractors={'wiki': [ + ('**.py', 'python', None), + ('templates/**.xhtml', 'kajiki', {'strip_text': False, 'extract_python': True}), + ('public/**', 'ignore', None) + ]}, + entry_points={ + 'paste.app_factory': [ + 'main = wiki.config.application:make_app' + ], + 'gearbox.plugins': [ + 'turbogears-devtools = tg.devtools' + ] }, - classifiers=[ - "Programming Language :: Python :: 3", - "License :: OSI Approved :: MIT License", - "Operating System :: OS Independent", - ], - package_dir={"": "src"}, - packages=setuptools.find_packages(where="src"), - python_requires=">=3.6", + zip_safe=False ) diff --git a/test.ini b/test.ini new file mode 100644 index 0000000..8542981 --- /dev/null +++ b/test.ini @@ -0,0 +1,28 @@ +# +# wiki - TurboGears 2 testing environment configuration +# +# The %(here)s variable will be replaced with the parent directory of this file +# +[DEFAULT] +# Uncomment and replace with the address which should receive any error reports +# email_to = you@yourdomain.com +smtp_server = localhost +error_email_from = turbogears@localhost + +[server:main] +use = egg:gearbox#wsgiref +host = 127.0.0.1 +port = 8080 + +[app:main] +sqlalchemy.url = sqlite:///:memory: +use = config:development.ini + +# Disable debugger when running test suite +set debug = false + +[app:main_without_authn] +use = main +skip_authentication = True + +# Add additional test specific configuration options as necessary. diff --git a/wiki/__init__.py b/wiki/__init__.py new file mode 100644 index 0000000..4e02a3a --- /dev/null +++ b/wiki/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +"""The wiki package""" diff --git a/wiki/config/__init__.py b/wiki/config/__init__.py new file mode 100644 index 0000000..40a96af --- /dev/null +++ b/wiki/config/__init__.py @@ -0,0 +1 @@ +# -*- coding: utf-8 -*- diff --git a/wiki/config/app_cfg.py b/wiki/config/app_cfg.py new file mode 100644 index 0000000..203e7e3 --- /dev/null +++ b/wiki/config/app_cfg.py @@ -0,0 +1,148 @@ +# -*- coding: utf-8 -*- +""" +Global configuration file for TG2-specific settings in wiki. + +This file complements development/deployment.ini. + +""" +from tg import FullStackApplicationConfigurator + +import wiki +from wiki import model, lib + +base_config = FullStackApplicationConfigurator() + +# General configuration +base_config.update_blueprint({ + # True to prevent dispatcher from striping extensions + # For example /socket.io would be served by "socket_io" + # method instead of "socket". + 'disable_request_extensions': False, + + # Set None to disable escaping punctuation characters to "_" + # when dispatching methods. + # Set to a function to provide custom escaping. + 'dispatch_path_translator': True, + + 'package': wiki, +}) + +# ToscaWidgets configuration +base_config.update_blueprint({ + 'tw2.enabled': True, +}) + +# Rendering Engines Configuration +rendering_config = { + 'renderers': ['json'], # Enable json in expose + 'default_renderer': 'kajiki', +} +rendering_config['renderers'].append('kajiki') +# Change this in setup.py too for i18n to work. +rendering_config['templating.kajiki.strip_text'] = False +base_config.update_blueprint(rendering_config) + +# Configure Sessions, store data as JSON to avoid pickle security issues +base_config.update_blueprint({ + 'session.enabled': True, + 'session.data_serializer': 'json', +}) + +# Configure the base SQLALchemy Setup +base_config.update_blueprint({ + 'use_sqlalchemy': True, + 'model': wiki.model, + 'DBSession': wiki.model.DBSession, +}) +# This tells to TurboGears how to retrieve the data for your user +from tg.configuration.auth import TGAuthMetadata +class ApplicationAuthMetadata(TGAuthMetadata): + def __init__(self, dbsession, user_class): + self.dbsession = dbsession + self.user_class = user_class + + def authenticate(self, environ, identity): + login = identity['login'] + user = self.dbsession.query(self.user_class).filter_by( + user_name=login + ).first() + + if not user: + login = None + elif not user.validate_password(identity['password']): + login = None + + if login is None: + try: + from urllib.parse import parse_qs, urlencode + except ImportError: + from urlparse import parse_qs + from urllib import urlencode + from tg.exceptions import HTTPFound + + params = parse_qs(environ['QUERY_STRING']) + params.pop('password', None) # Remove password in case it was there + if user is None: + params['failure'] = 'user-not-found' + else: + params['login'] = identity['login'] + params['failure'] = 'invalid-password' + + # When authentication fails send user to login page. + environ['repoze.who.application'] = HTTPFound( + location=environ['SCRIPT_NAME'] + '?'.join(('/login', urlencode(params, True))) + ) + + return login + + def get_user(self, identity, userid): + return self.dbsession.query(self.user_class).filter_by( + user_name=userid + ).first() + + def get_groups(self, identity, userid): + return [g.group_name for g in identity['user'].groups] + + def get_permissions(self, identity, userid): + return [p.permission_name for p in identity['user'].permissions] + +# Configure the authentication backend +base_config.update_blueprint({ + 'auth_backend': 'sqlalchemy', + + # YOU MUST CHANGE THIS VALUE IN PRODUCTION TO SECURE YOUR APP + 'sa_auth.cookie_secret': "188e9296-a834-4027-9c8a-304f32836f45", + 'sa_auth.authmetadata': ApplicationAuthMetadata(model.DBSession, model.User), + + # You may optionally define a page where you want users + # to be redirected to on login: + 'sa_auth.post_login_url': '/post_login', + + # You may optionally define a page where you want users + # to be redirected to on logout: + 'sa_auth.post_logout_url': '/post_logout', + + # In case ApplicationAuthMetadata didn't find the user discard the whole identity. + # This might happen if logged-in users are deleted. + 'identity.allow_missing_user': False, + + # override this if you would like to provide a different who plugin for + # managing login and logout of your application + 'sa_auth.form_plugin': None, + + # You can use a different repoze.who Authenticator if you want to + # change the way users can login + # 'sa_auth.authenticators': [('myauth', SomeAuthenticator()], + + # You can add more repoze.who metadata providers to fetch + # user metadata. + # Remember to set 'sa_auth.authmetadata' to None + # to disable authmetadata and use only your own metadata providers + # 'sa_auth.mdproviders': [('myprovider', SomeMDProvider()], +}) +try: + # Enable DebugBar if available, install tgext.debugbar to turn it on + from tgext.debugbar import enable_debugbar + enable_debugbar(base_config) +except ImportError: + pass diff --git a/wiki/config/application.py b/wiki/config/application.py new file mode 100644 index 0000000..1c76b05 --- /dev/null +++ b/wiki/config/application.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +"""WSGI application initialization for wiki.""" +from wiki.config.app_cfg import base_config + +__all__ = ['make_app'] + + +def make_app(global_conf, **app_conf): + """ + Set wiki up with the settings found in the PasteDeploy configuration + file used. + + :param dict global_conf: The global settings for wiki + (those defined under the ``[DEFAULT]`` section). + + :return: The wiki application with all the relevant middleware + loaded. + + This is the PasteDeploy factory for the wiki application. + + ``app_conf`` contains all the application-specific settings (those defined + under ``[app:main]``. + """ + app = base_config.make_wsgi_app(global_conf, app_conf, wrap_app=None) + + # Wrap your final TurboGears 2 application with custom middleware here + + return app diff --git a/wiki/controllers/__init__.py b/wiki/controllers/__init__.py new file mode 100644 index 0000000..a78a7ca --- /dev/null +++ b/wiki/controllers/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +"""Controllers for the wiki application.""" diff --git a/wiki/controllers/controller.py.template b/wiki/controllers/controller.py.template new file mode 100644 index 0000000..bc47aee --- /dev/null +++ b/wiki/controllers/controller.py.template @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +"""{{target.capitalize()}} controller module""" + +from tg import expose, redirect, validate, flash, url +# from tg.i18n import ugettext as _ +# from tg import predicates + +from wiki.lib.base import BaseController +# from wiki.model import DBSession + + +class {{target.capitalize()}}Controller(BaseController): + # Uncomment this line if your controller requires an authenticated user + # allow_only = predicates.not_anonymous() + + @expose('wiki.templates.{{target.lower()}}') + def index(self, **kw): + return dict(page='{{target.lower()}}-index') diff --git a/wiki/controllers/error.py b/wiki/controllers/error.py new file mode 100644 index 0000000..e98f46e --- /dev/null +++ b/wiki/controllers/error.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +"""Error controller""" +from tg import request, expose +from wiki.lib.base import BaseController + +__all__ = ['ErrorController'] + + +class ErrorController(BaseController): + """ + Generates error documents as and when they are required. + + The ErrorDocuments middleware forwards to ErrorController when error + related status codes are returned from the application. + + This behaviour can be altered by changing the parameters to the + ErrorDocuments middleware in your config/middleware.py file. + + """ + + @expose('wiki.templates.error') + def document(self, *args, **kwargs): + """Render the error document""" + resp = request.environ.get('tg.original_response') + try: + # tg.abort exposes the message as .detail in response + message = resp.detail + except: + message = None + + if not message: + message = ("We're sorry but we weren't able to process " + " this request.") + + values = dict(prefix=request.environ.get('SCRIPT_NAME', ''), + code=request.params.get('code', resp.status_int if resp else 400), + message=request.params.get('message', message)) + return values diff --git a/wiki/controllers/root.py b/wiki/controllers/root.py new file mode 100644 index 0000000..3b89c85 --- /dev/null +++ b/wiki/controllers/root.py @@ -0,0 +1,119 @@ +# -*- coding: utf-8 -*- +"""Main Controller""" + +from tg import expose, flash, require, url, lurl +from tg import request, redirect, tmpl_context +from tg.i18n import ugettext as _, lazy_ugettext as l_ +from tg.exceptions import HTTPFound +from tg import predicates +from wiki import model +from wiki.controllers.secure import SecureController +from wiki.model import DBSession +from tgext.admin.tgadminconfig import BootstrapTGAdminConfig as TGAdminConfig +from tgext.admin.controller import AdminController + +from wiki.lib.base import BaseController +from wiki.controllers.error import ErrorController + +__all__ = ['RootController'] + + +class RootController(BaseController): + """ + The root controller for the wiki application. + + All the other controllers and WSGI applications should be mounted on this + controller. For example:: + + panel = ControlPanelController() + another_app = AnotherWSGIApplication() + + Keep in mind that WSGI applications shouldn't be mounted directly: They + must be wrapped around with :class:`tg.controllers.WSGIAppController`. + + """ + secc = SecureController() + admin = AdminController(model, DBSession, config_type=TGAdminConfig) + + error = ErrorController() + + def _before(self, *args, **kw): + tmpl_context.project_name = "wiki" + + @expose('wiki.templates.index') + def index(self): + """Handle the front-page.""" + return dict(page='index') + @expose('wiki.templates.about') + def about(self): + """Handle the 'about' page.""" + return dict(page='about') + + @expose('wiki.templates.environ') + def environ(self): + """This method showcases TG's access to the wsgi environment.""" + return dict(page='environ', environment=request.environ) + + @expose('wiki.templates.data') + @expose('json') + def data(self, **kw): + """ + This method showcases how you can use the same controller + for a data page and a display page. + """ + return dict(page='data', params=kw) + @expose('wiki.templates.index') + @require(predicates.has_permission('manage', msg=l_('Only for managers'))) + def manage_permission_only(self, **kw): + """Illustrate how a page for managers only works.""" + return dict(page='managers stuff') + + @expose('wiki.templates.index') + @require(predicates.is_user('editor', msg=l_('Only for the editor'))) + def editor_user_only(self, **kw): + """Illustrate how a page exclusive for the editor works.""" + return dict(page='editor stuff') + + @expose('wiki.templates.login') + def login(self, came_from=lurl('/'), failure=None, login=''): + """Start the user login.""" + if failure is not None: + if failure == 'user-not-found': + flash(_('User not found'), 'error') + elif failure == 'invalid-password': + flash(_('Invalid Password'), 'error') + + login_counter = request.environ.get('repoze.who.logins', 0) + if failure is None and login_counter > 0: + flash(_('Wrong credentials'), 'warning') + + return dict(page='login', login_counter=str(login_counter), + came_from=came_from, login=login) + + @expose() + def post_login(self, came_from=lurl('/')): + """ + Redirect the user to the initially requested page on successful + authentication or redirect her back to the login page if login failed. + + """ + if not request.identity: + login_counter = request.environ.get('repoze.who.logins', 0) + 1 + redirect('/login', + params=dict(came_from=came_from, __logins=login_counter)) + userid = request.identity['repoze.who.userid'] + flash(_('Welcome back, %s!') % userid) + + # Do not use tg.redirect with tg.url as it will add the mountpoint + # of the application twice. + return HTTPFound(location=came_from) + + @expose() + def post_logout(self, came_from=lurl('/')): + """ + Redirect the user to the initially requested page on logout and say + goodbye as well. + + """ + flash(_('We hope to see you soon!')) + return HTTPFound(location=came_from) diff --git a/wiki/controllers/secure.py b/wiki/controllers/secure.py new file mode 100644 index 0000000..1fc1ebe --- /dev/null +++ b/wiki/controllers/secure.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +"""Sample controller with all its actions protected.""" +from tg import expose, flash +from tg.i18n import ugettext as _, lazy_ugettext as l_ +from tg.predicates import has_permission + +from wiki.lib.base import BaseController + +__all__ = ['SecureController'] + + +class SecureController(BaseController): + """Sample controller-wide authorization""" + + # The predicate that must be met for all the actions in this controller: + allow_only = has_permission( + 'manage', + msg=l_('Only for people with the "manage" permission') + ) + + @expose('wiki.templates.index') + def index(self): + """Let the user know that's visiting a protected controller.""" + flash(_("Secure Controller here")) + return dict(page='index') + + @expose('wiki.templates.index') + def some_where(self): + """Let the user know that this action is protected too.""" + return dict(page='some_where') diff --git a/wiki/i18n/ru/LC_MESSAGES/wiki.po b/wiki/i18n/ru/LC_MESSAGES/wiki.po new file mode 100644 index 0000000..36532d4 --- /dev/null +++ b/wiki/i18n/ru/LC_MESSAGES/wiki.po @@ -0,0 +1,24 @@ +# Russian translations for ${package}. +# Copyright (C) 2008 ORGANIZATION +# This file is distributed under the same license as the ${package} project. +# FIRST AUTHOR , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: ${package} 0.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2008-01-13 14:00+0200\n" +"PO-Revision-Date: 2008-01-13 14:00+0200\n" +"Last-Translator: FULL NAME \n" +"Language-Team: ru \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-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.1\n" + +#: ${package}/controllers/root.py:13 +msgid "Your application is now running" +msgstr "Ваши приложение успешно запущено" + diff --git a/wiki/model/__init__.py b/wiki/model/__init__.py new file mode 100644 index 0000000..8340e84 --- /dev/null +++ b/wiki/model/__init__.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +"""The application's model objects""" + +import zope.sqlalchemy +from sqlalchemy.orm import scoped_session, sessionmaker +from sqlalchemy.ext.declarative import declarative_base + +# Global session manager: DBSession() returns the Thread-local +# session object appropriate for the current web request. +maker = sessionmaker(autoflush=True, autocommit=False) +DBSession = scoped_session(maker) +zope.sqlalchemy.register(DBSession) + +# Base class for all of our model classes: By default, the data model is +# defined with SQLAlchemy's declarative extension, but if you need more +# control, you can switch to the traditional method. +DeclarativeBase = declarative_base() + +# There are two convenient ways for you to spare some typing. +# You can have a query property on all your model classes by doing this: +# DeclarativeBase.query = DBSession.query_property() +# Or you can use a session-aware mapper as it was used in TurboGears 1: +# DeclarativeBase = declarative_base(mapper=DBSession.mapper) + +# Global metadata. +# The default metadata is the one from the declarative base. +metadata = DeclarativeBase.metadata + +# If you have multiple databases with overlapping table names, you'll need a +# metadata for each database. Feel free to rename 'metadata2'. +# from sqlalchemy import MetaData +# metadata2 = MetaData() + +##### +# Generally you will not want to define your table's mappers, and data objects +# here in __init__ but will want to create modules them in the model directory +# and import them at the bottom of this file. +###### + + +def init_model(engine): + """Call me before using any of the tables or classes in the model.""" + DBSession.configure(bind=engine) + + # If you are using reflection to introspect your database and create + # table objects for you, your tables must be defined and mapped inside + # the init_model function, so that the engine is available if you + # use the model outside tg2, you need to make sure this is called before + # you use the model. + + # + # See the following example: + # + # global t_reflected + # t_reflected = Table("Reflected", metadata, + # autoload=True, autoload_with=engine) + # mapper(Reflected, t_reflected) + return DBSession + +# Import your model modules here. +from wiki.model.auth import User, Group, Permission + +__all__ = ('User', 'Group', 'Permission') diff --git a/wiki/model/auth.py b/wiki/model/auth.py new file mode 100644 index 0000000..84fb1dd --- /dev/null +++ b/wiki/model/auth.py @@ -0,0 +1,186 @@ +# -*- coding: utf-8 -*- +""" +Auth* related model. + +This is where the models used by the authentication stack are defined. + +It's perfectly fine to re-use this definition in the wiki application, +though. + +""" +import os +from datetime import datetime +from hashlib import sha256 +__all__ = ['User', 'Group', 'Permission'] + +from sqlalchemy import Table, ForeignKey, Column +from sqlalchemy.types import Unicode, Integer, DateTime +from sqlalchemy.orm import relation, synonym + +from wiki.model import DeclarativeBase, metadata, DBSession + + +# This is the association table for the many-to-many relationship between +# groups and permissions. +group_permission_table = Table('tg_group_permission', metadata, + Column('group_id', Integer, + ForeignKey('tg_group.group_id', + onupdate="CASCADE", + ondelete="CASCADE"), + primary_key=True), + Column('permission_id', Integer, + ForeignKey('tg_permission.permission_id', + onupdate="CASCADE", + ondelete="CASCADE"), + primary_key=True)) + + +# This is the association table for the many-to-many relationship between +# groups and members - this is, the memberships. +user_group_table = Table('tg_user_group', metadata, + Column('user_id', Integer, + ForeignKey('tg_user.user_id', + onupdate="CASCADE", + ondelete="CASCADE"), + primary_key=True), + Column('group_id', Integer, + ForeignKey('tg_group.group_id', + onupdate="CASCADE", + ondelete="CASCADE"), + primary_key=True)) + + +class Group(DeclarativeBase): + """ + Group definition + + Only the ``group_name`` column is required. + + """ + + __tablename__ = 'tg_group' + + group_id = Column(Integer, autoincrement=True, primary_key=True) + group_name = Column(Unicode(16), unique=True, nullable=False) + display_name = Column(Unicode(255)) + created = Column(DateTime, default=datetime.now) + users = relation('User', secondary=user_group_table, backref='groups') + + def __repr__(self): + return '' % repr(self.group_name) + + def __unicode__(self): + return self.group_name + + +class User(DeclarativeBase): + """ + User definition. + + This is the user definition used by :mod:`repoze.who`, which requires at + least the ``user_name`` column. + + """ + __tablename__ = 'tg_user' + + user_id = Column(Integer, autoincrement=True, primary_key=True) + user_name = Column(Unicode(16), unique=True, nullable=False) + email_address = Column(Unicode(255), unique=True, nullable=False) + display_name = Column(Unicode(255)) + _password = Column('password', Unicode(128)) + created = Column(DateTime, default=datetime.now) + + def __repr__(self): + return '' % ( + repr(self.user_name), + repr(self.email_address), + repr(self.display_name) + ) + + def __unicode__(self): + return self.display_name or self.user_name + + @property + def permissions(self): + """Return a set with all permissions granted to the user.""" + perms = set() + for g in self.groups: + perms = perms | set(g.permissions) + return perms + + @classmethod + def by_email_address(cls, email): + """Return the user object whose email address is ``email``.""" + return DBSession.query(cls).filter_by(email_address=email).first() + + @classmethod + def by_user_name(cls, username): + """Return the user object whose user name is ``username``.""" + return DBSession.query(cls).filter_by(user_name=username).first() + + @classmethod + def _hash_password(cls, password): + salt = sha256() + salt.update(os.urandom(60)) + salt = salt.hexdigest() + + hash = sha256() + # Make sure password is a str because we cannot hash unicode objects + hash.update((password + salt).encode('utf-8')) + hash = hash.hexdigest() + + password = salt + hash + + + return password + + def _set_password(self, password): + """Hash ``password`` on the fly and store its hashed version.""" + self._password = self._hash_password(password) + + def _get_password(self): + """Return the hashed version of the password.""" + return self._password + + password = synonym('_password', descriptor=property(_get_password, + _set_password)) + + def validate_password(self, password): + """ + Check the password against existing credentials. + + :param password: the password that was provided by the user to + try and authenticate. This is the clear text version that we will + need to match against the hashed one in the database. + :type password: unicode object. + :return: Whether the password is valid. + :rtype: bool + + """ + hash = sha256() + hash.update((password + self.password[:64]).encode('utf-8')) + return self.password[64:] == hash.hexdigest() + + +class Permission(DeclarativeBase): + """ + Permission definition. + + Only the ``permission_name`` column is required. + + """ + + __tablename__ = 'tg_permission' + + permission_id = Column(Integer, autoincrement=True, primary_key=True) + permission_name = Column(Unicode(63), unique=True, nullable=False) + description = Column(Unicode(255)) + + groups = relation(Group, secondary=group_permission_table, + backref='permissions') + + def __repr__(self): + return '' % repr(self.permission_name) + + def __unicode__(self): + return self.permission_name diff --git a/wiki/model/model.py.template b/wiki/model/model.py.template new file mode 100644 index 0000000..b75459c --- /dev/null +++ b/wiki/model/model.py.template @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +"""{{target.capitalize()}} model module.""" +from sqlalchemy import * +from sqlalchemy import Table, ForeignKey, Column +from sqlalchemy.types import Integer, Unicode, DateTime, LargeBinary +from sqlalchemy.orm import relationship, backref + +from wiki.model import DeclarativeBase, metadata, DBSession + + +class {{target.capitalize()}}(DeclarativeBase): + __tablename__ = '{{target.lower()}}s' + + uid = Column(Integer, primary_key=True) + data = Column(Unicode(255), nullable=False) + + user_id = Column(Integer, ForeignKey('tg_user.user_id'), index=True) + user = relationship('User', uselist=False, + backref=backref('{{target.lower()}}s', + cascade='all, delete-orphan')) + + +__all__ = ['{{target.capitalize()}}'] diff --git a/wiki/public/css/bootstrap.min.css b/wiki/public/css/bootstrap.min.css new file mode 100644 index 0000000..c547283 --- /dev/null +++ b/wiki/public/css/bootstrap.min.css @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.0.3 (http://getbootstrap.com) + * Copyright 2013 Twitter, Inc. + * Licensed under http://www.apache.org/licenses/LICENSE-2.0 + */ + +/*! normalize.css v2.1.3 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden],template{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a{background:transparent}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{margin:.67em 0;font-size:2em}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}mark{color:#000;background:#ff0}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid #c0c0c0}legend{padding:0;border:0}button,input,select,textarea{margin:0;font-family:inherit;font-size:100%}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{padding:0;box-sizing:border-box}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}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}@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) ")"}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:2cm .5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*,*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}img{vertical-align:middle}.img-responsive{display:block;height:auto;max-width:100%}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;height:auto;max-width:100%;padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.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}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:#999}h1,h2,h3{margin-top:20px;margin-bottom:10px}h1 small,h2 small,h3 small,h1 .small,h2 .small,h3 .small{font-size:65%}h4,h5,h6{margin-top:10px;margin-bottom:10px}h4 small,h5 small,h6 small,h4 .small,h5 .small,h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media(min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}.text-muted{color:#999}.text-primary{color:#428bca}.text-primary:hover{color:#3071a9}.text-warning{color:#8a6d3b}.text-warning:hover{color:#66512c}.text-danger{color:#a94442}.text-danger:hover{color:#843534}.text-success{color:#3c763d}.text-success:hover{color:#2b542c}.text-info{color:#31708f}.text-info:hover{color:#245269}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}.list-inline>li:first-child{padding-left:0}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.428571429}dt{font-weight: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}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{font-size:17.5px;font-weight:300;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small,blockquote .small{display:block;line-height:1.428571429;color:#999}blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small,blockquote.pull-right .small{text-align:right}blockquote.pull-right small:before,blockquote.pull-right .small:before{content:''}blockquote.pull-right small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.428571429}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;white-space:nowrap;background-color:#f9f2f4;border-radius:4px}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;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}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}@media(min-width:768px){.container{width:750px}}@media(min-width:992px){.container{width:970px}}@media(min-width:1200px){.container{width:1170px}}.row{margin-right:-15px;margin-left:-15px}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-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.66666666666666%}.col-xs-10{width:83.33333333333334%}.col-xs-9{width:75%}.col-xs-8{width:66.66666666666666%}.col-xs-7{width:58.333333333333336%}.col-xs-6{width:50%}.col-xs-5{width:41.66666666666667%}.col-xs-4{width:33.33333333333333%}.col-xs-3{width:25%}.col-xs-2{width:16.666666666666664%}.col-xs-1{width:8.333333333333332%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666666666666%}.col-xs-pull-10{right:83.33333333333334%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666666666666%}.col-xs-pull-7{right:58.333333333333336%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666666666667%}.col-xs-pull-4{right:33.33333333333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.666666666666664%}.col-xs-pull-1{right:8.333333333333332%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666666666666%}.col-xs-push-10{left:83.33333333333334%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666666666666%}.col-xs-push-7{left:58.333333333333336%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666666666667%}.col-xs-push-4{left:33.33333333333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.666666666666664%}.col-xs-push-1{left:8.333333333333332%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666666666666%}.col-xs-offset-10{margin-left:83.33333333333334%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666666666666%}.col-xs-offset-7{margin-left:58.333333333333336%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666666666667%}.col-xs-offset-4{margin-left:33.33333333333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.666666666666664%}.col-xs-offset-1{margin-left:8.333333333333332%}.col-xs-offset-0{margin-left:0}@media(min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666666666666%}.col-sm-10{width:83.33333333333334%}.col-sm-9{width:75%}.col-sm-8{width:66.66666666666666%}.col-sm-7{width:58.333333333333336%}.col-sm-6{width:50%}.col-sm-5{width:41.66666666666667%}.col-sm-4{width:33.33333333333333%}.col-sm-3{width:25%}.col-sm-2{width:16.666666666666664%}.col-sm-1{width:8.333333333333332%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666666666666%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666666666667%}.col-sm-push-4{left:33.33333333333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666666666666%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-0{margin-left:0}}@media(min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666666666666%}.col-md-10{width:83.33333333333334%}.col-md-9{width:75%}.col-md-8{width:66.66666666666666%}.col-md-7{width:58.333333333333336%}.col-md-6{width:50%}.col-md-5{width:41.66666666666667%}.col-md-4{width:33.33333333333333%}.col-md-3{width:25%}.col-md-2{width:16.666666666666664%}.col-md-1{width:8.333333333333332%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666666666666%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666666666666%}.col-md-push-10{left:83.33333333333334%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666666666666%}.col-md-push-7{left:58.333333333333336%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666666666667%}.col-md-push-4{left:33.33333333333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.666666666666664%}.col-md-push-1{left:8.333333333333332%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666666666666%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-0{margin-left:0}}@media(min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666666666666%}.col-lg-10{width:83.33333333333334%}.col-lg-9{width:75%}.col-lg-8{width:66.66666666666666%}.col-lg-7{width:58.333333333333336%}.col-lg-6{width:50%}.col-lg-5{width:41.66666666666667%}.col-lg-4{width:33.33333333333333%}.col-lg-3{width:25%}.col-lg-2{width:16.666666666666664%}.col-lg-1{width:8.333333333333332%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666666666666%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.666666666666664%}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666666666666%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-0{margin-left:0}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*="col-"]{position:static;display:table-column;float:none}table td[class*="col-"],table th[class*="col-"]{display:table-cell;float:none}.table>thead>tr>.active,.table>tbody>tr>.active,.table>tfoot>tr>.active,.table>thead>.active>td,.table>tbody>.active>td,.table>tfoot>.active>td,.table>thead>.active>th,.table>tbody>.active>th,.table>tfoot>.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>.active:hover,.table-hover>tbody>.active:hover>td,.table-hover>tbody>.active:hover>th{background-color:#e8e8e8}.table>thead>tr>.success,.table>tbody>tr>.success,.table>tfoot>tr>.success,.table>thead>.success>td,.table>tbody>.success>td,.table>tfoot>.success>td,.table>thead>.success>th,.table>tbody>.success>th,.table>tfoot>.success>th{background-color:#dff0d8}.table-hover>tbody>tr>.success:hover,.table-hover>tbody>.success:hover>td,.table-hover>tbody>.success:hover>th{background-color:#d0e9c6}.table>thead>tr>.danger,.table>tbody>tr>.danger,.table>tfoot>tr>.danger,.table>thead>.danger>td,.table>tbody>.danger>td,.table>tfoot>.danger>td,.table>thead>.danger>th,.table>tbody>.danger>th,.table>tfoot>.danger>th{background-color:#f2dede}.table-hover>tbody>tr>.danger:hover,.table-hover>tbody>.danger:hover>td,.table-hover>tbody>.danger:hover>th{background-color:#ebcccc}.table>thead>tr>.warning,.table>tbody>tr>.warning,.table>tfoot>tr>.warning,.table>thead>.warning>td,.table>tbody>.warning>td,.table>tfoot>.warning>td,.table>thead>.warning>th,.table>tbody>.warning>th,.table>tfoot>.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>.warning:hover,.table-hover>tbody>.warning:hover>td,.table-hover>tbody>.warning:hover>th{background-color:#faf2cc}@media(max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:scroll;overflow-y:hidden;border:1px solid #ddd;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight: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}select[multiple],select[size]{height:auto}select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}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}input[type="number"]::-webkit-outer-spin-button,input[type="number"]::-webkit-inner-spin-button{height:auto}output{display:block;padding-top:7px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .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:#999}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee}textarea.form-control{height:auto}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;padding-left:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.radio label,.checkbox label{display:inline;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"]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;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],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm{height:auto}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg{height:auto}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media(min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block}.form-inline select.form-control{width:auto}.form-inline .radio,.form-inline .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:none;margin-left:0}}.form-horizontal .control-label,.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}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-control-static{padding-top:7px}@media(min-width:768px){.form-horizontal .control-label{text-align:right}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:normal;line-height:1.428571429;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-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{pointer-events:none;cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#fff}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-link{font-weight:normal;color:#428bca;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';-webkit-font-smoothing:antialiased;font-style:normal;font-weight:normal;line-height:1;-moz-osx-font-smoothing:grayscale}.glyphicon:empty{width:1em}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.428571429;color:#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:#428bca;outline: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: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-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999}.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;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media(min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar .btn-group{float:left}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group,.btn-toolbar>.btn-group+.btn-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-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-group>.btn+.dropdown-toggle{padding-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,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:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-bottom-left-radius:4px;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>.btn:last-child,.btn-group-vertical>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;border-collapse:separate;table-layout:fixed}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-right:0;padding-left:0}.input-group .form-control{width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{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{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>.dropdown-toggle,.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:last-child>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;white-space:nowrap}.input-group-btn:first-child>.btn{margin-right:-1px}.input-group-btn:last-child>.btn{margin-left:-1px}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-4px}.input-group-btn>.btn:hover,.input-group-btn>.btn:active{z-index:2}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;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:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;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:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{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-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}@media(min-width:768px){.navbar{border-radius:4px}}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}@media(min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse.in{overflow-y:auto}@media(min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-right:0;padding-left:0}}.container>.navbar-header,.container>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media(min-width:768px){.container>.navbar-header,.container>.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}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media(min-width:768px){.navbar>.container .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 .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media(min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media(max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media(min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media(min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{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,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)}@media(min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block}.navbar-form select.form-control{width:auto}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{float:none;margin-left:0}}@media(max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@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-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-nav.pull-right>li>.dropdown-menu,.navbar-nav>li>.dropdown-menu.pull-right{right:0;left:auto}.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}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#ccc}.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-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{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:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#999}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.428571429;text-decoration:none;background-color:#fff;border:1px solid #ddd}.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-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{background-color:#eee}.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:#428bca;border-color:#428bca}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager:before,.pager:after{display:table;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;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;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}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:#808080}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#999;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;font-size:21px;font-weight:200;line-height:2.1428571435;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{line-height:1;color:inherit}.jumbotron p{line-height:1.4}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{display:block;height:auto;max-width:100%;margin-right:auto;margin-left:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{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}}@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,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{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:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 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:linear-gradient(45deg,rgba(255,255,255,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:linear-gradient(45deg,rgba(255,255,255,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:linear-gradient(45deg,rgba(255,255,255,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,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{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-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0}.panel>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel>.list-group .list-group-item:last-child{border-bottom:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child th,.panel>.table>tbody: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:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:last-child>th,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:last-child>td,.panel>.table-responsive>.table-bordered>thead>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-group .panel{margin-bottom:0;overflow:hidden;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:auto;overflow-y:scroll}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;z-index:1050;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1030;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{min-height:16.428571429px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.428571429}.modal-body{position:relative;padding:20px}.modal-footer{padding:19px 20px 20px;margin-top:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer:before,.modal-footer:after{display:table;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}@media screen and (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)}}.tooltip{position:absolute;z-index:1030;display:block;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.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;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;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}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-right .tooltip-arrow{top:0;right: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);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);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;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{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;content:" "}.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;content:" "}.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;content:" "}.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;content:" "}.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;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;height:auto;max-width:100%;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6);opacity:.5;filter:alpha(opacity=50)}.carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.5) 0),color-stop(rgba(0,0,0,0.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,0.5) 0,rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',endColorstr='#00000000',GradientType=1)}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.0001) 0),color-stop(rgba(0,0,0,0.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,0.0001) 0,rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',endColorstr='#80000000',GradientType=1)}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;outline:0;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;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,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicons-chevron-left,.carousel-control .glyphicons-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after{display:table;content:" "}.clearfix: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;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,tr.visible-xs,th.visible-xs,td.visible-xs{display:none!important}@media(max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-xs.visible-sm{display:block!important}table.visible-xs.visible-sm{display:table}tr.visible-xs.visible-sm{display:table-row!important}th.visible-xs.visible-sm,td.visible-xs.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-xs.visible-md{display:block!important}table.visible-xs.visible-md{display:table}tr.visible-xs.visible-md{display:table-row!important}th.visible-xs.visible-md,td.visible-xs.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-xs.visible-lg{display:block!important}table.visible-xs.visible-lg{display:table}tr.visible-xs.visible-lg{display:table-row!important}th.visible-xs.visible-lg,td.visible-xs.visible-lg{display:table-cell!important}}.visible-sm,tr.visible-sm,th.visible-sm,td.visible-sm{display:none!important}@media(max-width:767px){.visible-sm.visible-xs{display:block!important}table.visible-sm.visible-xs{display:table}tr.visible-sm.visible-xs{display:table-row!important}th.visible-sm.visible-xs,td.visible-sm.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-sm.visible-md{display:block!important}table.visible-sm.visible-md{display:table}tr.visible-sm.visible-md{display:table-row!important}th.visible-sm.visible-md,td.visible-sm.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-sm.visible-lg{display:block!important}table.visible-sm.visible-lg{display:table}tr.visible-sm.visible-lg{display:table-row!important}th.visible-sm.visible-lg,td.visible-sm.visible-lg{display:table-cell!important}}.visible-md,tr.visible-md,th.visible-md,td.visible-md{display:none!important}@media(max-width:767px){.visible-md.visible-xs{display:block!important}table.visible-md.visible-xs{display:table}tr.visible-md.visible-xs{display:table-row!important}th.visible-md.visible-xs,td.visible-md.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-md.visible-sm{display:block!important}table.visible-md.visible-sm{display:table}tr.visible-md.visible-sm{display:table-row!important}th.visible-md.visible-sm,td.visible-md.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-md.visible-lg{display:block!important}table.visible-md.visible-lg{display:table}tr.visible-md.visible-lg{display:table-row!important}th.visible-md.visible-lg,td.visible-md.visible-lg{display:table-cell!important}}.visible-lg,tr.visible-lg,th.visible-lg,td.visible-lg{display:none!important}@media(max-width:767px){.visible-lg.visible-xs{display:block!important}table.visible-lg.visible-xs{display:table}tr.visible-lg.visible-xs{display:table-row!important}th.visible-lg.visible-xs,td.visible-lg.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-lg.visible-sm{display:block!important}table.visible-lg.visible-sm{display:table}tr.visible-lg.visible-sm{display:table-row!important}th.visible-lg.visible-sm,td.visible-lg.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-lg.visible-md{display:block!important}table.visible-lg.visible-md{display:table}tr.visible-lg.visible-md{display:table-row!important}th.visible-lg.visible-md,td.visible-lg.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}.hidden-xs{display:block!important}table.hidden-xs{display:table}tr.hidden-xs{display:table-row!important}th.hidden-xs,td.hidden-xs{display:table-cell!important}@media(max-width:767px){.hidden-xs,tr.hidden-xs,th.hidden-xs,td.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-xs.hidden-sm,tr.hidden-xs.hidden-sm,th.hidden-xs.hidden-sm,td.hidden-xs.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-xs.hidden-md,tr.hidden-xs.hidden-md,th.hidden-xs.hidden-md,td.hidden-xs.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-xs.hidden-lg,tr.hidden-xs.hidden-lg,th.hidden-xs.hidden-lg,td.hidden-xs.hidden-lg{display:none!important}}.hidden-sm{display:block!important}table.hidden-sm{display:table}tr.hidden-sm{display:table-row!important}th.hidden-sm,td.hidden-sm{display:table-cell!important}@media(max-width:767px){.hidden-sm.hidden-xs,tr.hidden-sm.hidden-xs,th.hidden-sm.hidden-xs,td.hidden-sm.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-sm,tr.hidden-sm,th.hidden-sm,td.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-sm.hidden-md,tr.hidden-sm.hidden-md,th.hidden-sm.hidden-md,td.hidden-sm.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-sm.hidden-lg,tr.hidden-sm.hidden-lg,th.hidden-sm.hidden-lg,td.hidden-sm.hidden-lg{display:none!important}}.hidden-md{display:block!important}table.hidden-md{display:table}tr.hidden-md{display:table-row!important}th.hidden-md,td.hidden-md{display:table-cell!important}@media(max-width:767px){.hidden-md.hidden-xs,tr.hidden-md.hidden-xs,th.hidden-md.hidden-xs,td.hidden-md.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-md.hidden-sm,tr.hidden-md.hidden-sm,th.hidden-md.hidden-sm,td.hidden-md.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-md,tr.hidden-md,th.hidden-md,td.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-md.hidden-lg,tr.hidden-md.hidden-lg,th.hidden-md.hidden-lg,td.hidden-md.hidden-lg{display:none!important}}.hidden-lg{display:block!important}table.hidden-lg{display:table}tr.hidden-lg{display:table-row!important}th.hidden-lg,td.hidden-lg{display:table-cell!important}@media(max-width:767px){.hidden-lg.hidden-xs,tr.hidden-lg.hidden-xs,th.hidden-lg.hidden-xs,td.hidden-lg.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-lg.hidden-sm,tr.hidden-lg.hidden-sm,th.hidden-lg.hidden-sm,td.hidden-lg.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-lg.hidden-md,tr.hidden-lg.hidden-md,th.hidden-lg.hidden-md,td.hidden-lg.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-lg,tr.hidden-lg,th.hidden-lg,td.hidden-lg{display:none!important}}.visible-print,tr.visible-print,th.visible-print,td.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}.hidden-print,tr.hidden-print,th.hidden-print,td.hidden-print{display:none!important}} \ No newline at end of file diff --git a/wiki/public/css/style.css b/wiki/public/css/style.css new file mode 100644 index 0000000..badd8b9 --- /dev/null +++ b/wiki/public/css/style.css @@ -0,0 +1,42 @@ +/* TurboGears flash bootstrap look */ +#flash > div { + 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; + color: #c09853; +} + +#flash > .ok { + color: #468847; + background-color: #dff0d8; + border-color: #d6e9c6; +} + +#flash > .error { + color: #b94a48; + background-color: #f2dede; + border-color: #eed3d7; +} + +#flash > .info { + color: #3a87ad; + background-color: #d9edf7; + border-color: #bce8f1; +} + +/* Footer styling */ +.footer { + margin-top: 45px; + padding: 35px 30px 36px; + border-top: 1px solid #e5e5e5; +} + +.footer p { + margin-bottom: 0; + color: #555; +} \ No newline at end of file diff --git a/wiki/public/favicon.ico b/wiki/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..840986e4705befe9beb4275e2807fd358a362497 GIT binary patch literal 1104 zcmV-W1h4xaiwFP!000000|7Y%#`{M}MmRZP5C9MW=S=`zU0s?(6{e=9adB~piHWPL ztMKsf)U_xHB8w!DmPpP!#EEiT>N-OZzotgNilw50s}{OQ-t z^78VNlas>2!U6&U#KgqR%*?*NzOJsW&d$!SbyBdfu%Muz$;rva#>TX?w3(Ti+uPgs z&04auvZ$!2y1Kf(y}gex2j}PK(9qCSktL!dMnZf@o5 z^=WBo?eqTG!L-)a*6Ql&*x1;RX;!tCefaqJQBhIy=HN$1M}|Wt-{0TEn}yfO!GVE+ zq*N-`-RJ-R|LpASW@ct!U|@4WF3Wo@$oPbyO(IuUSF(ar`tX0OWF<|!XSIN1gF@gA;^d5tjqK&(Vr6Ob_W0=R?)?A%)7RUD!9CjD-;a-v=jA}IlqoboyQ&+&&w#&=Qrjm-vP)P6Z@9ysI`}_OK z%F4jN!2bUJ`uh6f;^M)^&t_Rs z^3l@O)Y8(|)Y8MYtj4>w=-kzvNgU77)ZyXb;o{@<_4W4l_V@Pn&CShIQ&aBl?dj?1 z>+9>x$HQV{Wy{OVfpc@~>*{A`XINNRT3TDkzqtPX{d|9grlg}C92_JgBg@duy1Tij zr=`o!%gmD1y~4r3mYSg<{uM)VWnpw>WFU8GbZ8({Xk{QrNlj1yEC2ui z01yBW000R70Gl*n*5r*DAr*v}c{5O;!(~W<1i@wwn?xk>911*^&58pDNEBGHl1-Y! zV+_iHa4-fQI!I$2baBGqn6V%Zf~2u`ViBH2C-SAi8N`^CG-*}uEuuy4%&c&K2(ToAH z@#V*fF*aN?4%eiatvSoO&s7n+hMhu}Fm8LSRK7Cxk>S9DHBxp6v z^#Ky)%NHQGqX60GqJ}YJ6~YCHVxu;3Bfr8`Fy^oVBqLu=oJjP=2&4)cn?$>?=$ot> WvS0=+x)9A_Kma>NIMN(B1ONa82$stL literal 0 HcmV?d00001 diff --git a/wiki/public/fonts/glyphicons-halflings-regular.eot b/wiki/public/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..423bd5d3a20b804f596e04e5cd02fb4f16cfcbc1 GIT binary patch literal 20290 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/wiki/public/fonts/glyphicons-halflings-regular.ttf b/wiki/public/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a498ef4e7c8b556fc36f580c5ff524025bb11c84 GIT binary patch literal 41236 zcmc${34B}Cl|TOOdr!M8>1nlW%aSZh@-ADltvHKgvhN959SD$s!WNdWGz16%Qr5Hq zLm`wxhZF|Lu$1?dP}&a6w6rkl;x0@`ftk{z3q#8?Eo6ReL;Ujlp8MoA3AF$DeLjCD zlHMl0d(S=h+;hHXc>)szLBX3Wc;?Jmx%k3A|K_)Xz-n-`X6~%nbC?xp1U3o#v85|A z*$bXrcnkLXvA_PjOE+x(^}IzP?0-`b#EZ|{a&=5-kZ#A1)#JSN{LL3!x?+FkN$j`a z{KgA5T(ud;J%V7qkIr9k$+hP<{q(UrvH!3j+*x_y#tj7~Z^HK7`*FVeLL9JXWjFTU z$A0~VmtMW~yZ@@(EeHen4e`h&m!G#Gd;iMo1mR26#&2G_Ve4j5W_twTz87(Q?6M7) zZanZW4}OgO{}cpi+vdx!y86eb4XhS~FQfg|TQ*<0akKhSvtJPQ;Jnaw&Bk-j-=Htg z3&Pi&*f--v)DeC>?a`mo=TFXRd%*bg-oVeeuvbY(1QGj8cndGI1beuhd@~ymOoA*q z#h+pS4C9miqmUIrEdi%a{ep`JtY53N14 z{?J8-u03?;p$87z4u=mn9_~3j=kWZ)YY$&^_}asF9=`wZgTEGzAIGm5zt@D{6DItg zaL9DXb0~JG{ZQYbW%#{w4{bhl)1iUG?6Bu>>~Q!asH*G5-F7f0ttPmA`|67~Nd|1t2u@Q*SYReFv6!$}$f<4-=-kPct) z|MMp?^teB8{@?g_x6mN|MHO09!M9Ldw5(rUuw|_(B&JuY=H~usYx%Jo*2WH~%-2@g zsMRu8VN#&!Ke z)gP>_PQ+DHbH6%g%UXV7?OObvsik7w8Lg_hMXO_X;O?xckEv2}ej=vIsRgRAtbgamof~4bF{wHpUt7JC?=3g>=!SNq zb)ITZ95->a#9rgwakj)Vs-<~de=IgPF=xZYvHn=$T;nI`x(d28ZXMeho4a$)hQ!X; z&IG?*LKT+xt9`f<{iEBeeH&>9-*NFfO*>c_k5|VI?gSa|rTJ*vs&d=VK3wK*NyHA8 zZ=Q(tFI-U_SJ~SBo#@c~#Lh%)=lq?C4b&3q4!u)*JTwem41+=)pbhVY4xpilIf)Gy zuOHhJ`l_!5o!EIhk!?XCvD2c)mi14q{tnLgTlNWktZ&8)w(y%C;XHxA)5WXM^4QMh z{fTqY`oxTCe6Yj}P`+<@e^H1DGtZk*WHE*hHFlmF-dMw1ieC)0s5lC`;H{My60#JM z#*Nw5fSn7a7$%uTXw#UGnOd~S;s;sHZ2HfsMM=b_phUL-FPLPEWu3K_K`r?NrSk!5OSM)e(3Ohp!Upus`hn3ceKQ;2eKyHol)oqyLDikr zdRVhomsh;1rAKX5ijG*er>BRgn9p_Q6Zu?szB`u<1w)C>HZf7>5-o8{+#JALt(?pD zid{Lg#hj>1x3P4gaE0lu!tKe0pWFY@=BeiAbBh+#R`$%A?qk;%^aEzL8}GLEo|(Bo zWWl1`*P|OYJvn$y{R}5NQpj`_o;+jMOBY<6?{5$LTh8b$v~?F2Ts@=NUDdv(>zRu` z_YZAPZ{>VeVgvFb@kQ{Lm-B)&$W%F_nT(MKSxeF_$F>nUY53Ujk64TRvV58l6rzGE zWmNZ|YR6YX8Lbju(d?4q)tug*p7svOAI!zG-CdojM4hFLCF;xpf5^pLS1c7j-1^j0 zTiaS%p1hbYJ@cvJ@8+p&HNT`ZJmNyTPT z*gy%b{$v?z(GQ6IVn0T^r9cPu%_Y8fWax46Ox?*^hW4V(((#Xve=NTwzl7OjCf&=D z1Uoal^4*;oma4N-i8Z1gy;vC5Y#{3@Sg5?$nX;H%EP!KXx&Dr& zr-2xK3zn|&Dt9iOv%+N`^4MM2|H5UBRe|+Q;@J-k{n-<$y0Sap7!IADm#(lor0+^T z`_NLQGE6Ib==l5c_vHr#pHMBV6^c-tnpJN`4GpT*8T5v!H5rv1R0D%*z(cY@HDL~b z-NOOJyH655-uh6FYEr=Yg64H$3fOwokfM5e)N1cOCRj{3-`?T%phE$_g$4a?X0A&! zu)F99#=1SJScuht)oPZo7K`OltKX_0xaO|X=U-;t?|xVRkbOYs^xu~5x<)^Mlb2d7 ztYwLKiT=lzzl$qqSV*?@%g@QPgs>10m|B%lg@dYV5dXDmgQYur#ab4^n;7uBBukrI zm~_T9*Ie7ue*M@#__LjZ9y-(h9?M%tjw`E1EJb%{gd2;KDEqy)L-gIMe)vDr+ zH(d)_9si~{s`S_p&$i9rx%r={xSdPn2R@DE&d7 z&V2d@>|gPTwo2oEBM3cOt$_IDVn_xPm8TRY(%4`3g)I3{I-f{ePQ1^|@6Z3v_ZEEj zy~RsTa!2v%yMFz}UBCO{zyCX@6W%btpv{1nyI5CUY8vb8&ITjQZ%zbQfDI(4tAA0a zC)vQ=j1}(BmA0wswo>l?f_@z42h9ii{vy6EIj~asu$ojuCM1M3H0=y#genwqQL`!! zYLzhvN=rtq%c<5uwLYslGHNQPItSH;tm@9FO*z#wsJ3KPUq)@qss2H=Jxl$s&E|+4 zOzq_3C=c$lIz9gSP*#;aB%=1&DwF{2Rt~B)csIB*l2v1a`|2B7+UZoxqs4J$vaz*; zcBMhBiv*R^0YOz&-P5DG6|E*h0;_|smtBdj-1wIdQV_E=&L$kE>tywl{e_V~h@YXo z{Pp6N@q7Da4?`?OyhN_Fh+RnKKqRG5pY2u5((&= z>3wut>>s-~b~`(IQAE6S%+AnDV|K=!5gQ6z;}a&8eVGy#$N^ zM(Qkpks=vw(KhV+2enyOW4|?{t@|SO>j$-!w`4(`0iurPA*Qo|`5NfcqqRd)^)178 z&!9H1pFTa>dK}w)6SglJ)VAJ{&1&~>%F$ey!i?F_%<57~*Qf8Z&p1Ev`+x8CkwA%t z;1q9c;FPEMiO)Kp9r<1M_{lbp{m;pcj=AMR;nbsdeVx)LM0e%y$LPBEg|hLew;KZwEX#-OG!nC8I5(WTL#dBJ5L<_V3~r|o|> zwZ#`{xQ1rY`^mS*(tLDiN9g?76s5H;BGkzr$xQ^LVChM-bc8)7We*H}?I-M2eVx>a zExFCBU(ly=4lFAMo|nxWcR2^MfLWmVQ3v8Pt_Q$BjknF;px#L&_4DFra&c~ zt5%BsFvHhAUH6b6&vSuXAQ4D(eX1TZr%);sN}r*P=xgbsLSdA4U*URHR5)uK?aGvi zjiF3gv%;#yHLK@Iv#N=V>E%S->Uq+wYHB}IyOOYso!GOjyGAsuIi#ns56f!Su50zz zEkWpER@S_jt648I&&%i-*A<13{2=s)YOMCN1u`7T3~1r&l4Y<6r5&Safib6AJem_@ z?HepQeRR+XJBmyu&1u0Pg(_2o!)!^+N>X{AdH4|SI`R$O{{AZnK6N}o*5H3 z^xBgbY&*)%J-Y3JCto}Bq1WGk{h>42FC&2h%_O{u{V%YF-Y4>gQV4?6QBZ&LDgY&$33Vi zT-xMeVKW%V!~Y5}PFhMB`Vu1pg&onIWO+kTSVnZK5~}6h@@`?SaJq1=Kk?J)6#Ud$s1%h~a(ys2GegOE8oV1+kgSP8YkUvruYV9zk8tSSuDRW!Kblar%Wm2V^ zec5FCGV_F_Wi3;0GqtvxjVnyq7SpX$+LlS-3h@CmyI^~9JN}DnGaIx+f11@bE-YuzkPfE z+U?t+K3Igp@#C^;@)?Cn=eC2St6RCAO;o}h)=XB2SH>r+jiH(R z9}@?}TT1!?`X{axZyDM)w3psFqQzKfa_sLng@$!Mg%ik zArXAWY~niU2t}B}3N8ox4>sU(9Q(S%CHAwHu)N*j(w#$Rp?i{-`c5)d7G(Ju`5CNn zKJdT}foyPK6MiyZiy=SVCKSN9z`~F*&M*wof(ne9NAqKxMlTBEqL7CsH|9MVjhep# za>_2be3)6962gv6c9X3uXnr^LEJB5cPWkARnJG@}&{E^AkI7z-D97r(W%JfYQX(Ml zVO}Eu{^ZG&rB#CEB>ZD>DIxiCQlh|~`+49||IgTS zL+>8zfbQ0{O~OG1y#;a7wfYSY=m&{Xu`50ki_90E{FptSH|76|y(P zb%Pp3t?f|*-u+IKFGy>wpoM&j_jzWu303746^KE$R^&?&8y-oCi+hQkv*+z2Z|^zB z_*nN5TlvvP`ZLRRmv$dzV@}|_DC*CAMCWxrUBR^DdA3T}FwC=M7KLUo!lI-Sz{Z7v zTjt9e>IwLAKk+3j;vTh9Q3E|Hju3MOc~5-c&gYrgB5*zE>aGLN9dMg=@XFsCDChI52^RiK{Y1aV}WT?!H-7*m-OD;UE5cw+g=I!O$(+jJ^Yeat4a#)%V{ z?Z>D;^E9USPIgZT(l%7qn`(p=0zu6XK}tpqqn$ADG2W0_ZjWX+__Y@8w9_D(WS>72 zreU@zS|CX4zCxqV1e+fK2vlK3<&E~&iUcAj{N`B7LqM}7u2`_D12ZfuO1qEh{{XG% zj?3<41NVIORcJ-xPe_5n=`B!~pjDktXRbT*AAjXvRJdY3;t`mw1&3nwT;9xNr zrFkB#!aN6VWg0A2nCL(SCO%W^xGDos$74*xszEJ*&Ui?bQ2-C4!7o@$4m?EAc#fV-844+yZ5$yDNuz3Amhkx8>EZ-lK2+ z(&pQ>qx0DS|J-dH7W+y0yN=E-JF3z0M4$YafRztomGdq6SSDgw%LLV$Q7dzVw7?+% z#{`@M7&L%PP!3}`6{052*}FbR$Y>Ix5N3|`U=c_aDID-0xV%AZkt(fKFUu<~)+U)P==Rjxw{E-g;zDD?^|uV% ze)SoC!rj=w)b@&awQ1?;?8xb}?F|j~*{2&a1Me8~2f)=G!fC<CLIBLA9HY za|C3XQMPAjC94B%ng`WpkCw&OltFchNAqASG^ou4YiFB5Bc~%$0~!fhDudZ+@%a1_ zakmre9hY^=h$Yj@Vzof-NA}x9_<{mHPFjPY1Uw}t?7JLL>URB>nSZ;BZ=Uzq+wZ>p z*m)(Vb&u7_-^BjWZRUfZbg-5ie}3haKfh5wVC-FuFW`Gu553NQOkdJF>3z&L9|u7w z$^Fv1z!os&mAFYU#Tje{m=UlH(g5BK$uFwAcFi6B45L3(;zW&j3EV%Ad54o|kFESB_FidiRrMSVp9Gk5!h=JoBWVd|tzg z#n(*>Y%b_~7LuSa?MUf@?geEAQyiK%oPj`kih|j}F*uTOxwwr9{!lOr7i=0HSOzQi zE%8NIb#Fv!SJX!64MXrBb~n^Lr}UeZk=oh_z2UwRt!$=Wg1&U$Fyyy!=MZKP-CXr! zIvDmH?oVDne*gWre~?rtC=(}XK{7`Ost9puwBr}X{cuy!0UpquS@tru$l;pMB9-=W z61v^69$|<7#_)Z?=S5mC%xSnG?QoTkGpFqkLq*X7y$3S}Lc&{QvWe3Ou@=zVpyR}q z!gJDB3q#(5_@T_6J5~wyD;(n?cT4~fhqY3J1|y*LK*!+aF$YTQW%hC;aO_YZ!d}#8 z%iI06wG`*X!?gH#Ik2*($-|qZ5rc&U%MmuCoqMP$v;wgoMTy5;j98G+Y0w35CW0~m zfe{!6Yy=iEL9mEdiv$-o0qao~S^XLSi%Z(Ye6)GA$s~CtZ??rU580Gk6G=siIJz5&QX&%&a z=t>mBpoV+2<}|t#uTRFPOIm9q_M&wOvIy09pS1Byo{t2m7^UvM%gA~ z@pg%B9`qm(ga!mn^ar!uovAuf{H8QY?-EM0TXyI2E1F7;%O|%voV%eV6$VNJ10{2B ze{XL;19j*sQkbmOv%8wH6Yx)Igei<`23U+P>OC7`M-;mFTzn2TaUEU;_aUyQcCaWq zNwPCFkwKuCp@DYQwXx|e9>Opn03n576RdLySc)#@X3Q7zb+Jnud+UAc*zLZu!I8t!oeo)#Ph)RY>m~^R`zztKgUaH}-=s z>fZy;VNOWjgS{Sugy;}93dI=lTzt^@MA#9=r)f~_;FeH@2OP#n38-s)kQS;qmMn}8 zEQw_7paN#)qm*pJC`o0RSXw-Jc!X0$;#zq4Asb~wO)?M*kF{m2&87s9(&Vm2a?GBxmllEpt}hv$(Wj1&Z{d=2OWtw}(>F<&%0WI6yr5?xU& z_7v;kR8$${Ph-u=hZ0K80=z4Z9gIXXQ$k?1yaH2H3M^c>@P-@kI=WkYad*}eXp7gC z3i{?ksV<)JD^MbzeDc_#C#Cafd5xq4Hu2ckvxP!dS}xiG=?Lb!D8!F{L%tibkNOLg z*Gl~r2f1lFw!3z;+ii3g0cC%8CnL~l_K8*-!yMN`_ zg%5c+`4aH=?neUhBC^0f*-!6MjNWPe!1lX*yOQ3;etI9;3zdbI6z**)ed^ZV(pH#2 zSQEH+mbV>P%eeiC=f}5owB4msx>`q?$c~I`>YGP4#~eLLdsAhE5qbqY(r^p_ra^ql zvfYC z{q%krJu-UtS^fGf-}uDyWBc{DY-dNB&-y-N6JkKXwCC&I=v)|%9a&x;H^dWQ=nzkU zULu|VL${L07F@z(3kq2p$!$6E-&_qbaTDnWMNh1qY#|#2VZ$V{c5deD=ES&xiBTP& zwLc1(7(6kNR-d&$>frqJEy7twdFF4~{yV6CY~VA7Wz4uCgXB0+L@uk$&{C^}CSfv= zs2I1_5demzu?~g$re=0CSM!uVxM3MgpuZxYRTojiv|cfefUYgTCz@6GPBowX{UV52GzD(IIcN zMY;uMx=-B6_qX7k!7`;F-eKE?=6MJaa`X#2>6#w{c71pir1sT=P$Tl|TtPV|=9;G~dNqfMVf{@AZfZp53zSVgy`d@bV0 z5jNi@<`Ku6Zxhog1T?tV=Vo1c)m62D`AgR{-fZqa62 zmuI`r{^r-d`pWvbcW=4os?Xgvd+mdTDYE(O7j9gBN!7XL;DUzvyE=21?Z!Md`0W+> zLgbRgg_N*HC{~e%2_y#I02;6~A27qKMAQflY7ImUc$M~d^E@s$!kF(37-`0OX#vnTa^!&ZY z^#hN;$M%1XJ$$9UiT(A8D+22XV1N8Qv-R6B5S?`84W+}6zxUq7S@!T1xaKccT(PQ# zWR&5jyB{*D2HxX&<(^^Mz-N;lRBaqXkv(wFGm44;TLPwPC;43G0Sg8q^Rcvt#w6al>Yj<6d9wC`3(l#HunYAE zEtT_TuAbRr^k`YEf4D~vcA-Noo!70S)LbhKYjqF)jCJFxz98wma4 zJ>u9J@5`vmpW|lSyKkwD5_Un+>T!&h4ISMVguPG4WJQa`$x&GrUZ)r>n}`5B^sQy; z%%c9-#Llf|)nfM@`tmOseF|yAU7B6`C+gEK{kLNNPW|*RQA`G2STi+9y4ga}OMHj9 z2kQ~`jSb5sVy*lKk!L`n&dQT?G>;#X(9C68km7+VLXc>pq6wIf0N7aoYXl-T@L^*> zTY(ng09HYYRbuJyaTK)lJ^fAKnkDf}*6^xvC*{lKe;?ZB0<5{(V}_7>3C2Pzxh zKnLPQAR-LfqCJH8VQm}nTp)%6&Rz0mU=fD$KrSr4ku{79eIffVfUfWA3$PmVd*F@h z3?%7`a0?;T$4${#=s4~I31sw|BTYtNZUFZ%{uy^F--vE?;?4AM`G%DvH)X;dBYKLz zoXbIRFqRAoEk8Kw*OTVZyAx;$xyuEIGHm;eA`zFtNJ0fL$o zl#yVziNS3k(r_5)*uY)xAv;m4E8iQ=LjL>o>tsFAuXAe(zc%`%-L%{ryZn22lN&IW zW~@jCVq_ZIXYh@J1)3cZJBNNOFQN`pb_#pf;L$N-gdYL`4Wwb1Ipr(~4MZ(~bo4V6 zYEA*w5Dc6Xy6D&uc4SnMB~^>=fYqlW@}i-) zjvAUVTF=~KC+5nx1dH@n`JZ@vE<@OD`di|%KkARL4Sy8Z45@!)8?Z%v^BjLoUM^ov z)=bjI@+@Qt;2_(eKk_GWYJd%?FY`->UI{Wbq@nX@FHms#S@~Iku-q9u;sIGMNLQm) zW1e889vAU|q2Lh@`zYc8QcchT6e3H(A$%bk8?EF+6f9RN;g*s1FdyWs53x!gAXe#v zJ4^hJhdB%%e1Fd#wwxax*Dg17h|!oNY8M>lBkiKNAfU$-7gRxO=19Ao6d7U>u*Aq% zH8lp0M*Fy6Dsq&c&@4*2I7y>Uq*a!;sjROWgdz}(GplA{xTDiUOSVkSsDNfT;pT9F z!VQXONlR#ABUZe=YuD>{-G%o9yH03Ju23XPQ zZX-pzQ_;-8FDK9yQ3Oz5drgy}*HXZ##U+Pwy>b_@LnstJELRgdSQ?Ps7PDv)ZL&-D zNxq;pWOAn?m8@j)w${}oI%aiLUvwK7b{qx3tYVdDcG@i_34z6)pwq+TP;^>KvNvY? zv$;hLmFCSue}npK zOC4|P z=168Z{tw?r@Ljn&NDh1>s5}KGs5VNu+DO%92tHTE5&2I{N(W$w2{C# z9uF{{6GtNa#zZ@uD&%Ya?YCb#{GW5#NKEJ0(9QoCz696uIXAWs;S>5WHZ--|2Z}-+ z?Sm1oHrfZnsX106jP?QIik+(Un|7`F@m=~8r);>M*tKTxE*;fNFcZeMxw_nDFh8aM zF~5-*YOFXEs|eY^6GMk%?A#Qhh?q5S7LT!WRiC)(_(P0ByL>#Xt22Ex&!Ht5-zV)J$o&+(kF^?Y_%U>>1@H%% zNtZ>U4p1OCg%Nv&kZP!wnoR9r<&bJ>$dB2}aN8ayKr;#w3#TV$#$qq)mEUWnnJ4=*Jix|yZ!(%-uIy}MZI zW_>fNz?2V2Hadb`$gesfA>Sq61-hUmFm&SzY+Z%_N*znnMf#g;@69ZIm;UC>Dvs!z zcj#}5UG!t=UHY3lz>`KS<%7`KDDQMB*VsQt}vqh(IkUS|SV! z?|GB6LXMM-2bq_EthUi|6+x_)u{@2%Ets#Ck=joFI+!wiK^l&zGy*Hx>dA7#-|bJx zljX|5PyLnckl?>AM^+ji;vD@oe1pggRWxTI{pX5Z&Th-7URdQ4yNXyZBXc|*2%dk&;?irzR_M&-Y>dj)Jd>(2lL%Y z@M|waxQOAWmMw4CtWsc7TjrvTU%B($3tJXkc*W=jI3hFAipJWKvBU?mAeug&LL?Ce2xwudV~3osm0XM=qvcSA|TV&X@7 zekf=(ww3{*gDz8x#JYU1obMLX!B8*_pRbsQhEprKWQ&=$+2tnNoH@}MlP5K}V=n*F z)ru(^wAQTAce%szMO@qY{k(sSM3r7KLiilz$|w7Es6Y-P;hsq&^Khb*qn z>FirGYA4;;8n7pOr`68*AiZpFAwIvw=a0EVRtJ;K{+eksFPr%cTXAX2sz*#HKXKce z_gkaqU;5+<=alNs>V{C*Biq{+ua31{29b08d%_L!2XYQ5*mT6K%@ioI21&-y4=Idv z9+Hv|s`)`}K8TQ?s(AbCws4iTv7xJ%$9DlrfgbpRpwzc@_0E{fg+2z+oUJt>DamE7 zYcr+uwWcg60}zw+zPeObXWoqZ7Wah44xduBE_wDPa zojs|!A-8VIg)TNfIeT(=!CFdpUp0TtRoiA>RJp#so~9{iA%GStutimvLbFsg=)QayQu6v)u?esP8^YHgDf3M>2 z_53|a??s%YGBOD>3^c?^BQ_e@UPyWDQ5`+P3l3+6CtOvZY%Bk-OY)b3Dr(^yI4ai*qW(p_hs0I=Jd>)+bXK6EXgxAerc54%3Yr$a z8}xU&cX^+@%%EsyP0jM^s-Y+Eai_AW>6LxrjqUe#-`(eLXmECJI+qL+>G(fDIC|x$ zVc&WoCxjG-HPUFZg)C{P&;g|yP}b$uNs}vC9T?i~pX49f{y*#`_LBZ2Iecc#nj4d2 zadYgGg9Y*5hguQjh71~L(D-@G>4FfzI;dhC=Lr-vO5EI(QIlNGLa}jVi$NY88LUJU zL^4QG5R{*)HG|WG2n*06wPcgoYOxtil08E{-aMfXgmbW3M)}0)q{8!xGb~{-Q;mhZ zVlt-+K?KnBZ|i59+`&pkf3Q&HJNxakeN_ehL8X$J8~q(FHk+;J?eFi^pVj}_)!}dS zS2+Kw|Mkoum7!U(#O4X~1W;XUK(~CEL^*dkPxHw&DhF%IiS?n(zy&|?Q z>~Q#N5)CbFm5TLfscHH4i?3Lg%PqU&;_b`XYN9N?h{f6QUkl%qFO=RUtw}-(d!E() zhOK8Cem(Rr?4jQfT=pArCeeD1@Rs~znQK>Y6hN<>BhC_M{91oR-y=naUJ_^ihCn#_ zP4W0-pI+2QQY`DNA63>1NL50GLfOX|n*34Rd z#BTlts`%XZ3w8tTH{Hk?9CeQwf;b))C2@#)J~xM4L4Rv169Uklt~*$iY)KT zNH!uu{}n{y8KEZ5 z9F#T^PR89eagsm?Y9ILt{1pFD{THvig7$&A@kZ;H8&Z$*3gEAG5*Jl*00_npQjQfO1iM@}OM!^E&mI#$^@ zCHjo1-Y@R)B~8!hcXP2_Foq0LimeiV6HK>;hU$6vJen*a9>j>#b-!E|_IgPzWrU@C6ajSx1hgv`EYDa3WG& zYGXDWmR)sK!4i|5wvzbR&{;@sw>#Y?X@x%`Pm+Eg2@uCqseo){wxZ&wXbA-4tB#6N zg~M$=dhF{Z{e7o{)dbk-`md$s+#&IGe1pg?BBDc(&j;<($mZx0ip@m#4B{s zX$a}!JeE3%%nGKqXDCZt(2~dr(i&R1szC0LJaU-w@Ltn|MSv=q&%@ZKSjTNRQ!SaC z=DG#der3ya_jN10X0QKjKi*ed=bpYr@mE)QgUg4G{%P`LZxwseIcd%$NBbr0>_FsM zHh1xMf6P}E@FjgWF4n*GEPC8vvDLISBFm=nKRc#P>i~+tke3pWAC?~`9gCNiq6{D4 z+xQ2F8~>2*6Zrj-L#+=z)Ou*iANKG6!|?X+_pz67==b~f@zW2t9A5JK{ri8v2J&f%&H}@`}N_2KT{pHBzhvB?yod zHJ#-GC_N}8(&Vr#OuOE5v@Q8zWLjGPX3ey8wz}Q5{vLl}H;MzXmyaI211s^+#|sNR ztUuaZXgPh0Wp~Tz4K=TRzbdKU$*wu@`g4bG(C_4WAhpw2myLEJKLb8;9t{hWSIANF zKUPYh@hnTlEvUwY;SRhzMr zw2|0u!b%c`?0~Cu3L`EEAqAQ0Z^iisF*YhP3Elvuq2=!eOBM0bq0UQK^9qPnTE)lcG~rr-B53M)u{T(Fh{y(t!m`BjfOxQTsl zMUN3R+{#0RTc<*zP(oZQI=|nkRQoAANYJY5(d9&s+Nh|NJ(?f*MKLt>G>$6g0bP*4 zcsfgB5+gf+(yt(Kj8%+LEJQvO$7}(OD0({)ZxSiyr3=<>+GH&iYLE|nvCE-2FLgOq zv9?v4E?v24ho#!BKW%vedVlis=4$tkJYKIy&ohT?lPt0Z*8Q#rs4%$gz#UF;*jzXA-i{ zKs)%7KsyLttkIJwpF*9SEl%QMU{Vi>foU8!pxgsq^dQ;-tqhAfi98V6@1a5w>eNB4 z7qm-38t=C_Yve{wy9m)PMUlpUEH!BoXvfmTRqY*OXLl%WkOH&|nNZfQoJyUB;{@UE zklXRRlC)4#o5f{n0y!yeY~v+FD2MCP3Xj9ZF17gLPh0h;+|}mKU%b-(Hhr?>#rjig z?y;Mg2?Vpr4yM;j@0P@w1B=+T9#5d+3a9xUxgxC$eN^$ah5%bpX!PsPu4Vt{gB9O& zxE(eS44NOD<)AQ4GYJ{)&{It=SSjRdnky9ZG}k6!PQkYn0FFTQ%ZiNwvb7o~gFHDL z@Q^M__4~-#)JV=1FK`yk1!0O$q^%{%nB5Yt{N`z=u2RQdpwtO@t( zriwXG=qQ3X&r3y8N6~X$EwZtj7=!nmDv-dBK8box;pTRfdC@9hd=eA@Mcf?4vN4^Z z(k2B^CwbNbW(VPYk}n=oP#ls3N~%kl3d=d2ax>E1nLD_-BIUl8Ego3HR`?qqtr+?k z{BM8g1NP^&`ZIo1*ODye%HTKeMaSnygO^n>2le)n%T``YGl{LXJW=Cv>pL*y`dd59 zHSQkKlRN=i>yn=cylAew=;AzzU2w=Po{R9zIkgVl+GDLF#^rNI+%?($9 zW>X+25uGO(ncte#XDpVK`&}-jAtvJ}T@{F%&e`+J>mD6(OuxSe*;_3lyH~$VKPaxc z?w5Pc*`vQt9&30!eW$(5QmhGzli@de8g24m#hX;N#1P|#02^u(CNV;5P_KeQ7c?Ib z7^*WBR8XxJP2<_1p24gb)hYscOgxGHM{j?Y`en`^Y@as92A zfAGo}`cPYXN7^zR=Ym#I)*o2FXpiP2!_`G3@*~oYB7E#{Q5zbPksm+OB9#5bKgNl4 zEvE%}?}A(4KY;KATT14w$^fYqnl@vM&0}L5n|VL7XP6`L&>5wTov;999EaPq1xoGILnfj7&1k4YFn(eM8f7s^r zNj66)9f(;Pr3%R;*C&EbNpgD4cH~!?&1ttIWU0II3TM({cPg^CBP}y4Y$sTkh^cu_ zz7^3>!c?FOpnP}86v_uNCMZ;!K~ztFe98KMyh|Ut=aY(myne^fGwx>h<##uG#5Eg# z(7kTs&Ud#zw{A{m=oya(*g4c|VLjyEGu%H#6;TO~Lp=%9kbolxf*PuD@Mqlf1q@EVrIE^e`Pk;O)}Ey)jrMPQ=2_E}j3z)s^7LPNm^ zV-2}eZNu_J#2febAXoGIqsHC0PPPdw6W||mrb*V~jpI@h&(bn-w90N&WSk<=*|4Pr zO~B&D1OI7xLZJbqz9P@{*aGPm{n3)V2q+>|02- zI3!q($Tjde7^7seMMy;rP#$_f0WD>9N+TJ>1Yb;PMBXN$7$6+~K*27$pg<{{ z&`XbS8$>4Mh}%l!3-v=o7>>sC!mm)1Ax}ESxkG_AV+jF{gl$HsWL`mLEdWX-ZMnI0 zSBX5W#)tT3d9OrnRIEb$xD?|b#~w6JitiZTF!)rE_sV+(2iEB*FvOX{V&S!N{T{5> zK*ty6P@+bigJNhIwTIUr=*$)yIL#VP1I-Y5La^BquHqVD09e(_N$PQ=tD~w$%A+;m zSnr_P>(ORmYyRNA{QOx~csjYYfvBVTBNcjZ?yyZQ{jt!-wVzRfb5UF-LSs#9)H{m?Hv=jYF`ncVI5sY*Xv*Ewxd zcQ|y;7OUmVV?&nNqG{$N#dH4B*()}k(J)sR*uj5U($iPt>1b+hph!BE zGuh{Yo=|<7esRY1L~mbxeSm&1-z6&#oxAbOzaAGXQ`zyE`_Ec)TYWrVi65gs5j5+T zzbE$tjq4`QCgR*sd>V$E1^76`Gn5@8g#=J8>0qRWM@V@H_o&UNwPw^7*ziE}1*$Uq2rT zO}=@~X_LFonYJudz52A?;2D>%yWH73r@vs%OmD<+NOMK)?Ra z=Xl#9`56ah?DAc7fZa;F(MTe1T&MqT2HS8pwrAiQ-^N!=^p(Gy<87UkpTXp_X6#b< zm)3jRx*~~-n{i;q4E=X~)K-b-PgA`>s+ba?_;>DMh46u8jgULo4wRPwk%ZB~zSpSo z!YgKQag*WYUaAq4STviU88@7y5TOsZ(XXBTqp8xPuUnxvBTq-C?Ftqpk z(^gNLwz?pFE0Argt!>K&j?IPC{*(CPu{Y_&G_;d+1w&?6jz+_TGa3quk*Ef&7sm*9 z=DV{Yl)1N%^1vXcS>~s&LA!M%+-_Hsi&gWFdj0nYe#W-_>;MbZOGAFh{vn?!1s*8{}eDfuvx~V1LaTx0znB;*1efx1S!eg=dYE(Td3INBNPYe z5??T_Sy0_JV@W37zhh}3HGBEgX6X@Y_kzBrtBgH5Pf={69R^ zznp1{&vUb-78k0Y_UG5#KGU*fsqAZ+e$kA13oGi&RfJ>;C*P3t47Atv`!%C`HY~i?h)iJO1;;H+i!$(8;_leq$qO9+V{yT16f4oNd)xytFdM|PPj9Ev@E_gqX15&s1F>zKo&&miiJ{1Ox^ zMtq1keGo`9K$foK$}R$pvZkEC3bK5lY9TD$eH0uIkru@g}i$BeO^=4jAt(d zfxy)XPn2uGm{A3jiVp);Lh(`zB5K47G8i54{D_a|=v*{&F=Gh0?=N_PAAz!)inSJqhsbC z)v91cKv)?mws`(Ug#xS!gKL=O2-6CnQW11rqwo=m+3_Msd8m=%t0nRs4WQN#O!D&z z=MmstVEB*h$Ya}hp;tN!ofwh?nmK$frExTIL4PEg>@o6KG>e@o4RKr&eFa(IFN5Sn zNL)3F*>RDIc!!Auu%I*U06Gg^R;Zek%ftO%5h4JH;sbH^RoNXN0F@#_^{Md$uowiW z1CY57Rc$ECK&wH}9l&28JXk_UsZs7dRdyOjl`+&H8la=BGPJ=vhHing$=WJ&H}NvY%otPZ5sfRf zbPOeG`=G=h9u7gE;i>z8Hlg+KQKP1|m)F$xQdtjl%7wKNeQ*$lwa>>#hk~K`Q#bU2uW-_XUKtxwGX5> zvR8%)PT=OqD;F3RCrC7+mKo)`xFuUAI(d^uU;p3Q>p*+myuA=G5I%OkX4t*dUVHE} z+KUQjBkhfkwwKxjs#1%O@GXN!Mw?2_Ci)t9<|6pSDF(J_G-nsM0vTj51)wK^zTjRm z$PoRCczCEN<0DPrUm1=ID(8(+BIBbUe()HjnUY5yNvB4}B0+GEzh|6y?=(7UoFm;0 ze>?|{+EPb|CPI6;d@Q#H0(N3+NM?p07I=!Kpw%FASc@TN_On~)Yh@okN^PNB*vCE? z*T@oEtnZ_iKK6l;DLb~My7TB!YU=;8y*#nkXm9*)X>X{S(s)N&G_Jh`)LrGR{qRvD z_}JDK(2>Re+qR;Ce;;k*618=BoX5A79pQ~N2oD~aKFS2(*Tn`;qCPd{6;{DFHnJRZ z=!Y@}yx>f%7*Gcg#e!fKBuG<;jj3n20)(n4s>FGK2SNZ98cu2C1)a#jg~bok1CWrx zm~4RBLqsg;j{-EpDT6c1snQs4CcGgq>7e{oa3}erF*i`^9SQ_UlulXV-QIjR!uRT+W(gMa8}=Y;d&p$6*=!XRVwKxwt;9_IiYQvGHjhnyN&lZk zifHla3;Y3xm3hQ1;AlLO^*N_vx4KQQ>;K;GLtFT~*CG z*B`RG~6whaY`|$;2D!Sajn9&Cm z3kOE^0^;lum8+bXNjaQ{11Bvn0e3=9OS$rU=*m4;Ub$ytPRmH~cil^;uN)(@C@#qZ zJrC92dCh+0L<52Yo=gvMgpG_uJu7qr?oad*U`$1~2}3N0S}8UWHn2hgJuZh_>F^w@ zMC9zt6uwB6FsX2?+pd2g#i-&iu?ebB;r1hPX!!ok6Yl@F-5eP+_{Ve5NA3=v4@>Ja z8LHV0-yKyK!HMk1C-02A_l@W~J#TEd?}qk3-aC*0+8b(SqVEdtyFz_864J-^9j52F zu6KwlzoO6CE#5lj=HJzSDz1D;pYy=bx$q$N~#B-mvP?Kd3QuvvWZ==}%oXFnNjg7lx~zP{nuVey~;8z=M% zB7%Vxk8Q^=6(+U=(XXJwXEX&7KLC{#s460~-#o_t3uk zJ`i7|;h<*);&~hLbI|at@Luv~rZB3sfXpWIAk{AiyCG?wa(Yn1LVi$B>OWj6?ipIo z9+5ns{D67%YuKJa>8YVf#8)H_k;4x9Ql{l%fmR7T9zrpbYOc`pG+f!DS)o0%j6EyZ z9Ek{q?18`p3`BM}BqXKExe+>6v<2ZIB@5FKC*ZhTh-aUZR$iAP@<#$k!R@75|L&n# zh*yT;Ti7kV>#yYk@YvT;ssNlHkuE54zVGGFT%d}h5ur~Yy%jBV^A@^cJQU4bQ5|WX z0a1ZDK@No637Q$=ujmLF1zg57DuC==-lQaQ^+JpWquen4{jJ;e+o)x;uiwfxT(2h& zk8R;w`UhKYL<2RPTz@@+GoIo)A?Y<{lMA$@XYwUL(c#(`Mq{X=_jsyU(wLEDn)u*d z;Eo3HXt@~|JcV?$7s>=GJoVI#!~aK#rGLyX;>7yob$&$YnuZl{L_#lj( za5rm2V2vNLV`&^iXL{Hs^%5!egf)=4IZWrxx|4Sg(guokX$%*@-UfxA=7I<+In^OW zmrm%@nJ4Mf$$EosQ+a=*{bL)Cv@^8=U7)0oqQe;m>(T-_u?yvaGTi%E*+;ri!Vq1? z`@kLih_@UwIG54ckzOF-YorfU^I#EV8ga_R+yGubf*f*2-L_Ab$*NHy5SI2)9vhsZ z;C)mC^zt7he5%v{s6gtgyED?M08A|y*#Hr2o)AC;tjh4q;PC;l!R$BzK!w6VAs+ESWr}<& zzgb3VV{GV3{;e`MlcD`L-rN19eBHDZaHaOPIk@w9% z(odryV*gr*bj2&pCjBbfm6u0-%I7?@ktbkap@d~Gf`=LrF*t&{(>YWOFNzKq+2IYD zVr5N|vdQ6Gs>0mt%oxwmY{+50nPX)A;L%2;eDWt51+d*F(af7p);M>P(h5l1wGx5w zZq)S}SQutU!VB^EVG7hmz^=Y|VOV#D7wVgbk4$o=*iL;*$~kEgGuZ+zX=^ad#7Q`; zZ(%z}4j;RN4uk9PSGGSZ;nRu19&UrjqljwBynrlpR+L!x@>CwLpD^7_#wcv$rFuWI z6sFq!!|L>C4Hd-C<&sp3dBj$ahXQz5O&lP9R}!^+$}* zV?2;ynZAf0BW23C+Av&D)A(HdAg(N%_5-DJ&n*>(<~(-mW3X2|f=B)b`4M=z1uvlU zS}BLX56b8S0pW^E1MsCxPdD?hXz#t}U-0t>u8&3^^O$|#@pXExxqI98jawA6>kF<{ z@1xRhoA12)!1)*4J1x#0RWhzST(Yv|f^FOH+M;y$U-p@mM@Mvhs-M&c&Nk{NK`g`P zOEG$3`y;ZIY$xM+=YDwfv9h5QEuqFhva~>Y9K%bPyK%YaiXeyZKIZ?a~q%BAJb9qtii(@i|&P+BB zf=)&-8LBn_gb3lhnnL-}{y;3z(8Ogc@KEem#ZnCvk&1}?5tSCUIK}5ep+|Oc0tv`a zv;qkeD##F~?Sp_TsN2LBDW7s^);5(_M&b-lwWdHfA|&?N5xPQm;+?WF_8LNrq;d$RK@I6ql2;|7#+%;q|Z~13P~sm52th_R^n$p6e(UCgIxQtSs_vQtEpsEI?{HVC1(VrLml~vWK#+dr_9^n}o zxd5d$eOiAC8%b21qBE%4gII48SG+UeyYc;@9IYf!gNH`@gJ-zZHA1UG!T{Khn+pVC zpe`X{sR)jI)N`kRE97!C zQc@v>!XcWzOfm?0V+WB%U(*5h&-3joMAqlbjabZ{5KL34Bo8? zEWG(0RXh*F(Sg}isD+HjJ`HA-E1 zvK;X5RKQ)NEPfz@PW|LYz92welFUS$o$-vy7<7U?!@WhFEq{)J6ahzK?8}S}aCKaV zQQD+BTa58^oLDWaX5-QJYB)=oCwR6!o>@wxTLxicAP2(dI8aGNxbS?0dOY>W?Ugw} z>QLQ@6NEq00?$YeRU*lkg2G0LGB#pv7|Vn&FvOK2tnx6Xa)DDs!i8xCC#9%xYSMg# z3>M=LcGdBZjz28FET0B+J}z9rquIEYq`D{~1r9^X;)V+wvdl2EXaX1+vG7(C_=9*( zO-6)PF<42DiPoY>v(kL^8K{%>p78eG*?h0nUV2}uYc2_b|8k_#lfbGhrjZxSGZ5NSvO z(L#bW6vQ$B*8dowfGsJ8Pf&o!35luWkDK3!JwP1!jDi{q|uroCv&}nP=91!E>Q) zNDA(l?V(}=%y0%tz=~u!EC(9e?=%BPoOz5eb{y_&$?IC(ey<_sn>dQ|oTQ^MwV1 z55kQu=DbS)9kLQI4`$MU$FjbgC(IwLH}b7RB_)T<7R;Nq_77c|x67J3?|FMTqp{?TJ??u-OilWBtqmEIF|osSGH z|EE=mr*V8PKAiPLT=tjtcO|}$88^mDy#2lf8tNtH_V2d;m-fA#_`Z!~s>DA>q{o_Q z&;|s|WOU-L4pS3Ur4&3ZOEs$gk>MEP<~X10NRx-UrapRFFbdDc>HoV~xRRKrpKb&K z%Jla*;Z|O}jFF=e*0ZcB&pK8fbb~LHZeVmlH+4)J;zp7b_6V{zzn=k?~-;&)el!J0!%I-UU|7jD*CF zr`(tto!U|Iqms+s2Jb%a&1rsLhVPV))g9XFcll2SmIn3(vx8m1zR>bePdFpIID9JN zjx3G55V;<$h#rq6$L7ZN#Lkx{m)4fHm7XulD_dFCTkb7iTz+A?fBM1ceKW!{PR#i8 z%z~MFXMR{Qzv5_RM&-83%doZ&^96xDCIue6DA=Z{O}++uXi+UDK*f8(Y1r zHnm`c_9kmHxVi=YF4w{zUYq5yUPAC&KKQ^4KwF7i4`%1Dur@-@L-}pcP5BMz3G`s> zY%{)|0SK*jY>m~5m8rI%^coxuUd&9b#R>xpaTb37TU}tyhwmH@Vk=O)5upkAYf)zr z%CCio`eu78ikd##mNM%hY<&spmE9NXUZj${u>M~QJa^SwY`3Eo7H+cl!9bf9+O2Rb zylv?^lx)K~+NS(Aw9={J#atyHtZzZfHUQI+gDnmO1<6K|AijUR;Ci zo7AxVKZJJxA$aa9wP$$U<|FSpuriljb!coP^=C za7QC0=p3GgGqz%V_J9N>Bw&7OZ&sXKhN}rK_ zBv9J<@cz)vf ziRUMtpLl-a`HANzo}YLD;suBoAYOoY0pbOS7a(4Mcmd)Ch!-SYka$7j1&J3VUXXY} z;suEpBwmnsA>xII7b0GWcp>72h!-MWhUYIyx;)ID4CQg_*Vd8{|6DCfC zI1$+xG2+FD7b9Mb zcroI|h!-PX%)wLgUdekU@73qjQ}SQQetO8zVPujD`GfID`O|4RNV`LA)_$DHFxW6p7et51*gKh-TyTl2b;7uKB? r*3W+&`;C+07ClD7NGtg|F8f5H!(3~86Y5F{~s0SKbSx7ABc;Hiv4KWKOFA| z1i(;0U~)?IOg~!J4;TJ{zFC=cu#t^{JrEGc4+X~fv6g!he=v+(oe6+|Krw$rsQ(28 zXqc(Jnaz*(qXYl_@iS3sqAxQuaQcY_Tl{~1KtPCQ)*hxm+9nW?%smiL1SZu?QG~gP zfiVz};_Qzf%MaLq!K|{)e?%Z4C9og<-_7H@-~JSD z;ml7TXj+FZ?f)#YkNdijzOlak4yYkC1fss7KG=Ykz!b<4BM=Z=IWQa$(0|uWEsV4K z`X>4YrUsn@0s;tOgqZ0J7!22e4?s)mgXFL6`5_=7{)zvZg8YI7T9RZ~1PZ}QNTy(5 z00DwEfL{K&2Oxo08dMN5)GSH+K*R_N1}~gh9kVdRVj(AnECji}gG!JDvmQ#dR62_; z28`R!zr>GB&HX-eU_#2qdYKgxT}?y%Wx$)3d8UsB>5#ISmT5Yv-9ANQ5q!bJ$X05Q&V-WBXr%h%L(^Hf}DXuSYAAwZ2iR0ABilT&V9spwLQj0E-lgH zE?t}Na6d-F;z*hxOECeB66Th?_a3|V4mQZ{C9|$=ROiZm$jp0S)O&2#HT&N#y-DN) zC@bf&<67tgtRfoE+X|H_{<0tQBe)B(iNt?X5C=p7^5VX(qtGd?t(&}=IEn)`qWegD9}=f-SeS$J6Ff<7e#JIZp94!XtybW9?=1upFx zGB6aUm+sN=mnwd>vK(7Z);A~2bpASIcHyPQf+CCj6d%^a|B?!LUFv2?Y;?W`u^v*^w7-fR>!zBqgzzQdq|dv&V>Ki4AsyevyiH`{;f4nXhfZ z9N7B))|JjA19)9~ZNKZ{#~!b9#CnT`+k=ohoFeZs1(`@5Y)_^}hx*~t!17o-k^&=O z-`Hy~!H7dng2f#llxL5P-?A}@`@PTjp%aO3TkrdgAk~hc4V&yS$sTHQ#!Q+&Ws6m2 zvP!e~iQVJO|Iz^HEEQW*3UIY!@#cE7sK_5?Ys;6EBde4oOr|C=Tx(hOR`llBfE*enVzK#>^b2(n7z#AJ06+pGUq4 z60d<@A7OpoJ4%_4H*7Z2Vzcuqba%Ma#^BJI-VKw>ZoTe-W1ub1K)H9y;?kAAM@rXb zZk+y_R!{SLE1dCV{ajRqA1xLV8#4I--l1nd1TTM)`Q2 z3SJ6dh(?{nriUFAK~^*Rs%BTR2*=Zn$tS-r7ll7w!tqMmn+Hus_i1?*dWc)3R$IVNH1tuEwg{F~y^|g@!v&)F-Yg3cf z;*c`^Df3oFX9asY$r8}Cd3c;#i4x_D=)KCaFnS-@d=V6Ki2a?=k|RsC_Bt*kImi$((qu~+)~BLFnTU~Zj4Z-!ZH%p zB*@gC6X*g@-uRg>z^z?t$rnHXdhA5n3R>#luBT)ISgK=fe@2pJ>U+iFwZ$MPb|>At z=ZauVCF;BCn#4GDA|fKav473?56MNV2N#_xKoodD1yJ-hW*^~(Jlbb7m{cGIcB z4^B#xKt9#%*Q@@1Ex8^*OXfGot;5JeId%e;-3>>dGT$TwD1>~Mkd4fD4|=DU-;7Y} zh7ptu?@cMy^}J=)Vy)PGUcB{qtZX*8xxYkc)n<^l9a(EE(9-4h?uh*L0;F<&u57vs zza}e9uy4A<&7Q5Yw~Ow5GCZMAL(rf<9`GpaF`~rDb0mChbboXou=GS zZ)@Fcxuw>nAH{yCxP3msa(~~1_+x2wN2g9%v{WvqE@flY5SO)AYO1N;8#g)2-m5laX$wvlo8b`qSpRta(mvX zm8U&akYB4NC=ZnR{LECMV-1tnf1G_}!k>}zEI_5Q}k+kVbC z8_p5E#VVH1t-BdVd~TA1-gwTi&d65Z7MvApiIBz39?pEhqSh1FE{?NTf=&hK4G9@WG>JSqY|95*{)U*AC@ zK{=d<$`~Qm_mcbo?bEpcqs2FJMQ2Edgbo!WFni=2#zlp40U9CMhKv&KJL zgm*j1MErI_#&pU& zpjrbWmTR`Y-x0)KRWN5tu}1!tcxD$1x}(hOgn>G1+6_d530KiI1NZwkzVv;tjQ*nA zDVVC??GX4zY`jyfb>~imUUtj-lAGR^&+k_k3Cg_-ian4=5DRSIF8MW0F2~}gW<_^z zb-&9HT6;9@Ki2zJ=+&K~vHsdrF{g~oZ4KenvE!+eNPv_%ks-(gAS!>xat$o5X-mn{ z`BETsHsJlXFEz0J;wlhfJwo&R_`wc1T041ERl==6?W8v8&0*R-*}duAcxY9X<`S$L zg!0x*#p|I;*TSkMoGW11_22mm5jf>k%Y^#xhj)BsiRa>~<}PUJw%-dPJNmz;!rNzp~ zZ2OGlcFu{(3W}t}*1zQ`mAgjNnasWY-Cjaewt`xJcX<68Z&6nwv-o57s}+#_SL%j) zJndH~JyIG~_1W((z%1|JSS^Eb=dV`yVl`-B?r;AD?fUL6+^>7=!b?dbxwPGufCot- zL|Lp~2scmp_KGXBHlek6AC69L^Xcadn{3ohiHP>~d2V3ANlcBl%*OL02hn|Rmm4c~ zt39~J1w&|YxG1ba7!O|#a7}$%{V7EpE1Lc5d2?AIB}6HdZpQD9`E)EQg2N&u19RY` z%vkCgiH=T346- zQJ%c^3U#oLe-I;25c6eGwM9l$6GIP&KrP8PgjDbPV3%a%Y&uVx5N8CqPc88Y@S+wB zK2K8SGXI1pTdn3HHzapNUkyV-zr}&>rL!dz636WQ244unj_y+fu z6ygu@`-1vSp0vz$Q;5Gjj$Km#Z9{PG?ikaJr1Yzwk&HbOTt+W7BoOpRlf^^fv1OIZ za)}`kB^3@zeT77GREy^|bGayf6DVEO0nh;1s2L}pX)(elALt%CB@2MJ?u zYAkh87*AGW*cDMR(Ba`YT4I8Lxni=ajl)94>Y@5aDPzdmrazmrq;|Q+E1~!A24tut zs;n|b$u_yPC$2zyA)C4FQX=FsA+M>T3|%dUpSa!{7BA_b^x-8VMz)2ujeGC?YZUj> zl97x2 z&85tzDY_CkICVX^;_U1?L#n+N`E2Y4iV|!*Dr%yUe6vh6D$SNzkRKxi&bjdFkkv^UV_8%LnP(co$` z6XLYMX$=T;LkLo}){;p}LNLSHH3fAQWSB8fx{{{zc|){S$|cBD1NPY}(yJG+a~pD! zUWupf6fr&pZbfZ*&5#Fo?@USbn1EVdk1?j<^^fCYB)4&O^b|iniT_2w&vU7EqL#RL z7tH&n>+1p1UAJrjE!~x92BJO2CAa3Uxe{m;5t;t}+vrOJ79()aW}Nq_=%0^<(g!Ph zu#5$9##;^~l%gR8UUSb>)J%P%(Zl`Qg9&1BSKK`6M<-0WWXTuCyug@y$4gd(x^7LT zF#+y;?A=z-%;4ywAL|5+WSSeEJj)s(& zqByXz-u#n!6o&h8t@>%a5iPcPh24+Mfzb9i=U?(%Aa&~_b@{ zLw6NQ;fEEcBuMF7q5BDE!c0+3a%5<02t{8HO7>r}j&k5_t+ni|PF5Vwtb;ETShPU) zp%mFbtqUp*48Cxn+33NO1fE@%Kw)b%X{h+M?@Y0LyHmR02$04xAeV6WCnB+4F$u-6 zxBx}vRDBgU#O6|pORhpcw5Gxt9Z!0!_G9Wgf7PMy1D(>}Hoz{>O_fPEQ_W?UN9nnv z3hp}E$(^axlN_ZCquxsmb>PSC^icPku}*c?>^s2RVYYXePV&mE7)Jl}n^7T+waX{Q zu6)5>z{mBQ{e6)|UxKa@*MiMoHT5GR6p;)@&VQXqnAvjol@f@H$c^~5W-1}tN(c^0T5j#1ib4}Nao7ir4cU?+ArjvV-jB}{JL$mVc&Y`zL zE6ZTYk|DD2j&PQte$w8&ck zMTAvh)4f77uqndPBhb7FlT?!2T?~JS4bX~jS93?o!^if{-Uruul!DZM7kNb)b;2=W zyAZ{%QN`*6pK{hP7>4O9PlOV{X9AbF%!W+n90B=f-QC@>;VV20*%}%Yh^l{D> z7AS3J^@31qz?>~@taRy+(pddnZV6hO7*z>h;?cLhCYzrC_-$D_Pm&R^M%m7z3*5c| zagLkfa+glZ{D;V(F#5XeH9bg;hsjBXKyZ#VA-(CkK2Wjs{(0!-J;(WeQ+(U~Jw|+{ zX7!KPAGWuVI{a-iJj7(xd6&VNy0*Pz_7ljpe=0ZNFaK1E>JstyLpJXF+E*S^M%{kl{OW#RIh#P316`{h9+sJGS+m4R5v6V2f z!W7#Fngn2eyb3_v!cqb0xbK&suymc~|1_VfK3_NT-rs6`(*Aka`F!-y<`RFfe*zHM zC5+TgDB)Lpu|I|J$lNvcoq0?#ans~XqFG``lGw&2f<+ z;M&s$97~n+7@chqDve528fiA|iV1E+GEj{$P>1~>1T2Xyp)ihX4iPr`w zCj?}H0+}VRlQy<{=zr55sv-|?bg>xmVUk=~ws)HWPekjNW}j(~L?=5IdU4`KnMidZ z#SRHl&VXc+jz-jD)TDZ16wNrH{iY)o#{4W=O7u?{N4$?;o9h}^Y3BL)uduKxTNd1+ zb80wbd2B8=I+|ws%XLc!tyTfFo#97hji4+&PWp06MGGo54X~uHI{YdKp_r5nj4}<@ zH@Tzw61cWj_Jf69)3LS6i`bo3tcIqzxScL;vDBuEYJ`}zLvfv9#P$y88Q7W4_DFu= zRp87OPm`v@7Y*Y=i3QUIff5B)8Q>`oTci%c_*+B(RM<9Ii!Pvzj9PF*6gKxnMm$_- zTa=0Zd!K@*GhJo+9@r2y{OZ@&@;i(htZlLRY!EPgTJkJEJjh z&z)H}7(}xTJowuCXp%iH=6&(en7Pq^qOcW993z>SG#M~&r0iu=5+HnJBCuvSS!fx> zMVL;hn#^jR^&d6T`>Bb*SQ7qF+715oIRA?wlT1-Y69l4}k68Tx`P3aI|fuQW_$ z5wBt-N13b|4wp`)hEqw9Qz4o>e=f@R0%!?k5Sb(?exWR4X@Ie3Je-*+zU^5Hw14VXDe6)KZh0IN?SSFsP7cdy zfG|ep3g&)ykF}m1Q)uM2K<5n`l~|{US#5o3(R`1m>bm6yxTc~*F%y#_BYYh`p01of zmpdBOpVCtBSJ_pCF3?MTm_b%zl0Xc&JV}>s9^8%NKC;;UD2F`WvXCm1f1!yv=C^+; zno9$Y`V(_x3aNetAp^*jEI`h+aiZ}d9gz1Fcs(2?-|ef8ogLpT)y#6eX_t@Sv18ug z%udqYvuto>$=8%+^;lO{RvydPJ5~TW(p)?iVLI;T}1E-ZOZJ|MyFSvZMki|;U}ANC}IMPEp6m19kdod+EI6_o_|4*@;P z=y#Jf+p0y3Rd7&S8|{a;DJgX}ZMSdC_+K9lQO{TZ2oBeS158Kebl2SPD%jELw0b;=vyui(l#gQ<#R6s#X~Tga#kv$&mK2c?rvl3m#u5B0 z;rk`QisV$NChJ&ujV!c`S+K`eUQepk`}Eu9n2Z#9S?GzgSsIsw!REK^BFm83Hs<`! za9N(5KK>qC@ewlLe7n|e4qY@c+1>048G**OD#W@0k81g2Cn^gt0nlq?(kbho!pids zF3JRP{1AgUe18vF1lGN-Wgb-Tc~fc#l&1b#G_|rYyoJiDju7}lo%#s;o#vD%J}qhh zDOQ*?MpdsV2%)4bpGv3W`T2Om)eyyBPkpX9Kc`+&ZbzqTI2Wx3;c^{89^3O8Y)?m5 zSCDLY6vvlEi{3b3`LDWI$oVn??>*F=eT;AD86JL-wlA$taiIxG2e$9h_(T)l$CE@j zf8kQ)ZkgC-TML;n{;0k(FkoOI2uy#!T*>prf zj=Fa9F`8*WZd4wBE3o|DZCRo25Qb$$u|4yqABtQDgzwT<0x7Kk{AteD8-wU2_8ii> zSEluo#j`zEjQ%-rB2XG8rbU_0_1rE%CAaDNHTWLI0C&3V)Nn z%nDCzmb!x(6BEjW0osV7=uwpsp(xdgQG{$HocC3(bvs=0Z^A{&$Zh!_Ofd8-ke%14 zQMSj{GVZrqcgAQ;*Sz4gj|!v1g}CM0meB+vCq4rd1tys+HUDj@Jw8s4*-P~cUc<~ht#x4u+k6MOYNHoU-nEi?I;O2lVXKKu@ zCBTe?q?9t!&(m#^k$B>`hK%EnHHDkT$v)B^QaD zBd1E~Rf+X`K<8R`Ie3(glD6t0lyT4Ubn38JCi=tJ^v0vy4N)}-YgLv})Q+hw*|d_~ zb7Gm1ZU~_&tp@w;E3KwBS>9P9-3C78jNnJUwGDDzJeKGl66#S4V#2;?%1-nA$Up}u zNZ)aSSD6D>g#FZK6Quw`9RJKDO5?GuYy&bjNfQ@b5lO1{crPOZ0LVg7Z^sneWTFr{ zh97eU`tIj+-RfVqi;bWqySx_tZX*HIs@7M?@SQ<|&kERGz0WaO_(X$mSqJrBC_Jqo zCr`sh_>q9UsB8?Dhl1Y_gb-e^AvuSB`6$anfhsaE@zZof)r7$+dmmGwSK!iA*krnu zf6IoIkv$?ZF-GWh@9(YZ-q%>8Fur~KdP!Zcu+&_qeNO|T*m!UH3Uog3TR-ngFYCTm zKGi-}HrtO@ODCUbK0oL@kAO{QR*bA*THSdXj!Y6*^@NQ9gW;8hW-_$_;RVp3Vvka~ z2ozG7f>~_7sYymCgQk=G^G)M(OpRYl!~>fCr;XVZA6fn5uL3jsKsE)4Y=vUN77mZb*9VX_mm~Jx zr?NPKVW$s;|b!uazlLgBtD8 zlpqN>GqfUL4t+{4eVWSP#TylA8woh<5r1I=7Hrl$ZOaHk!9SQ}szNl2gcI*Xf87g@ zJi%;HR4f7umEP*wZAsh&Sk-lxu3Erdx412qN8llcPrJ%p6I0@4%|R2M1G!IAmJa$5ty#AKEENSz zdS-%-8OSF->^en~b%L%~W=&H*QAK~Pm7T7JuM^{g zoVV-O0o*sq=f9iQsY%6-ux$<4e{U4dkuI>AspoI;=7VYWObbQ1NYgOL3KAw*@Q*;( zRMO+RwD+u8&IC}^iKj^5@l6xM5SWjcs87Jb1G3)m9s^Z-%D!R#QGZwzU!uAGY*w>= z?ogwhiTIdI9g}Q=usi{!Xt2y?7G3d)Y59v|NgwDZz=HVw0j^|tJgB!V!qzA~Jd+;p z^=r!Os-dqqW?eSnm3nIk{Br0-Y5e=~K<9{SRf`u{xoz?x+l)Oo6+p?p0NRZGHfk%? zHWPD7`A?G;@~B?|>%rNe2loAO=C=DK%R5mn_FF25-WJP|P(BSEu%nVpPpz%c7E+r= zi=&pFJjKS@Uc=pA!wKW*cZT~RkM8_s+a z^9z=RbLu(vOIxe<=L zSTlc8OnpdOd+eu>Hmz>R@}Ge}Fd`|a91?722;U+2%46kE$lcBlCisL!q-5t{u^4$s zc?CV2?JWEK3d4@9!R!32`-Jk7?yF%~2#bCN`jIq8+3j;wtqX7&cU@jf8hY*W7yIMfYA z$dAG?-^qh80ODo-A)*)yK&&aM8Zb&SdXI6O{g@#nflF3&s6|A925P07+O*{%%7mmP zBrZ&dR=Qj5_e-5ufzLtQWqtFy{Givr$O<5mc#z24K>y@2rsM20aF+FfWs{bW2{%T# zk6#`CnZ4qUy(8RzJ-cG(Ot>q(jTf9$c2O=8=Pj2~R(-685 z+swB8Dns7{j;m$b_7tw~H+kmVNK3*<1=&9=dGJ-wV^FYcvLWxX455)|9NXzuXa}Bc zu9q(l;f=4eT0?SIymP-o`$DjJ9r3ckK+1iZ>=Lb&Hz3zR31B)H$$W^-y^^dVZv zOdsn1P^>O2ej$hTJf`}_j2%jdlQ(l8c*C>Yc*{cHQxWVCBqGn0Nm4;pa^PH258ZRF zh6LGDm319lsMlLKl-Ny@J;(W?x*G@|!sfx|UG`dA9De=7R|Ywzuchf;{C09|V`?*y z>DR4rSKI2!cl`QyGD*+QYyY_?{lWh_9$lxJYOUz^LHu2cLY?H)%~O9zlby_rVKJ6b zCCSI~!Jrm-lvG~AZ?K9!jKyXTjC^`-4C z{`zFpLtD-ZN*(HvTTtnI0QP}DHD&m~JUT^AFB4l#`n3p4GPg8M@H#~(c?rPXm=p$#QkDyEC8`tR5ZS3W`kEsCb-AZ&LKi507377`=?c(iv(c(@{ z*={h>GJOK7LzscCYkwPmplW*l%U1j_RV}Z*PbB*nY>&&A8TMfeQV-?IeFIKLVq@uk z1=ttQO=8iR42ehD*PG1srf4GjX_g%kaWiNjR$L$5hi-IKlv{+`-1dIoY|MoId4pa= z0;+EDcjQHPMDf+UpGy*i_yd6ZLGRY%k;I zbq&MKjpLZ8Mv>k-r8++diJR@%yf6gcf-hJ*iUU#$cYGhLgEoWcTFKg=tp3LVs-*o1 z%H$(n&R@}m2Y6HFyiL@?^p_J1U^mZC{zEOEca7>pI@6R2nJA$8aEZpD`rX|qroXNC ziXD+5Z>gFRmrw@Z5HgLGpo~CXpy(*mZoQ|tk|Tq^29KX8uEm8b2&J=+>8TCT-4(*y zx5B=_*{;6|`jH&&g@V_@L=A5M^LUBx&}}`| zmV0XR)=oyhNchChLmT#AeK=>?7#^D!rQ0RPG3L`Z*sUqtJ;KtD_7(H$X45c7zyg(- zM)np9A2QcSD3}*AU}xU%aP9m`t;WshdOglv%IX|)&t(DB@fon}wp=w^5_Qq$HC9I))GD^pup**?oL*`__Bjx7+O~0h8e^>5hwml`VauX!)c!zqNrbn5*JSH`}_Yszdo8tkZ$2 z^CyF$_lVKoUXtY=OA;$s^nl>VX*fj2!#56?f;@HyQrjC%TR4f~uP2%t3Wm)XxxxDn zpqk#^kL@zqM>D)HuDzu!6BfE1V+hTz+w>*Z$2UY!2vyZ)bFxdMV*jljXgLis+nuP= zMC=yaY(6ViJ)svxb@KcRS7OzOFn?e}0CYP4TQCNY>Xh+V@06U_^mc47I)0JLRsV%! zd1Py@08TTPq}Rii)Qe<2+upCm*hX>EPR;_*?j1R_@iZ%aA}&bCO_>LU3Fy(#LJ*-s zm^|Y|aU!xbw;qOB_+qFr1>wDbkhhlJ4?1Be6d*V=nhu7d6GSnlvK7M^2%}RZp(|C- zQfzB6RPr_ZOF|0^8r=`1sM)sL9rVzu)oQO=|B~ga*UDV+Ss!2d=l*yGr$eqONyt*g zzghGdm&*6OoC{0;hvwe>_0cA^#f3btn<7cW`Dy%oodMQ)ujlZhfZ5Eo!uOLnJcBqhg1+SwMOQJ}eJr#0+r zpWhcinS&0^2gk zpZ{nT;7hw&*ZgD^;R{%w>DF&v(+SYGBGP#mKT_X`ALQKC=c)lfBgfADUMO`Ui3Ou; zOQ>cAnIU7j1g)hYF+g<3L3D`TA%}+}>nZQO8y-3vt!ra2S^JE_K+d`<6#87-f_e&~5X{OUId-F~QzotWr^E%MVlxyRm_06>-uPs@DrLoq- zMaljl!Yg~++OfqC-fuA4>-{Qs-^Qx((U$AjdmVeXiU4P8PbuH7jS-Spa_cuGkcN=- zZ)I~)TcXz&6B+0r;<@5z+vn+rSle&8J0cGSKM+v9`(ygZ@Pu;4ySW0Q@0p@4QB;#v z%Hn_ILIsYkxTdURF+}Wc#!X-;jeHlON>6ha5_#L38nQ2Ej};}dJI;C_rCt=#Y#E%t zvU_R#D0;J(rAx}o>jn|n0K#zL){t}}tNZ6Wej z1*f*}ncM222pI}eO=i?yy7}97OZ|a2j?|O}0fO1TZ+3Ld%ZTl*Y}2$SKJF=MQfPwi zPx@v_a3ubF+(_=r^EpOna*^~|#d-bShm6*g96e@BUV-HGsLTS$;3ENN~8BSo;0T~Ok`mp1uB1D_E02&5KoEBY(*3Y>NvXQ^O z@{t%|P!wl_Bg*vXwC=bNh=-4=fAq_KA1W!n4heWgS%WiUKYdml9{U_}>v7t7OxO)A z|0#~r)8lmXIC$`1IG&wTtQyx$?TbS5UG+L?-DDr0 zfwIeACMiFmfc=immSOvHeZU{P+Aiq4aQomXeiXWLxg8}^tBYb!3i~bx6ZLxVI_+hQMr5)fJ9na*a!znXVCPf0FDNud!nAE zN0?K5E`Cs|hv$>zeVcaRxp`fE11XX81-YIIWwp+B?nfX~J`Eaei`htSFx3EL!x_4d zHfEtC;FXqYtkI9@jZ`&8Mv)~TYB@Y5`bW*$bPiTNRmzgte^Ex9R0HTAa1N+X-pMN} zjyHJ$H5D%58`kI{8hzAAB4um;DHIet8Jx^r1_#!=Z(r8HRjRzW1V5CWMy6QNG-fyN zybWURT_P;@>;^Y6I`@+>%cY#PS7?bXu`574o=WGMQLaK zOH%U9gqmDe;l*SDF~F>wEH3(b3P>%3tI_q1BR6o@?Cl&wzBrBV$L0+A&Y@qbiEUAg zL)TexTe)+tA*gZGe_Zr>$E?asU=5L2fafhKM*7Uo{fJb~+4B|N} zyeC|4G`Fnyk|u=UCMZPiCY7Rm7)Sl@;$L^?I{?jZz4u%0@sj_Fn0`La=ixzEr&r^4 z^z;3@ZI4|C;jc@(dR0KUgN6FNIZgW|;>h@4is2QAi=!Gf3dC!mehN(W6`C~@n$h9$ zAYGyvGEUJ*Dj}W_;K{vNms;Y}q4$D<COQ*RYN#L#iH^g| zux~?8N#m-^Ji3M2ilhyo&YM4d_L@Kq-}|wBTf1&s!MYk$OEt)eS4<82poS?e9Mmw+>;jV(>`Y7z_7 z4ctYq2HC+!;Wq z9*(RzQT0b?aFOmX!=GSRzu~vaYMMwTxdCHOMC*rmni$){lU&ELQC{rQ<(H)zO4=HFbu; zEn@OTcpXi1#h2!gah&uX^{z?~N+qio_VH0Ts%x$hgPt&wc@3wDN$i*Lnb~hj^ZWVF zVoPGz6ojRTY>Y|MV5kz+No2{yTp{^I26B~!Y!yl=0Eo-|j+_f5P4MKh+X`aOv zpc+L@A!v5th`J0=Y)OM(1DS4Cju$+)oDQ@YN2ZQJ65M{g+^EYZ8R~KcfQeKyMMj23 zd<%AwG=ys2d>I7I4)sf5CV0g4^8qoWb^T_R=;(#O!=M(^zd7@Ci&9B6P3Ri?Z_)#Q zs!=6f6xMIMeJqm`Kqh_Q40>|glacrSD#IVTHW84M&{!tngu(|#n#l598G1&izOs(mP`di_aa|MmI`3xPZsMvj1qP)NX(bF<)7}X8tn3F?g&E02cQ^!@ zZqA@-DaM(HS?#UftR?VRHv{%?wC@Y)pm@3#)|2LjP}}tR{3I0*J#q{HvLG_(!Mm3w zy-Nov8LKFslZ;+{C}yz69J2K1%U0%FB9K<7#@LV$JidGqUq}7SKqH>4bs)pZ@+qtF z=*Q5HH){-EgxIp)Te;_7x@Py(#7i5~6f2Zw&nf)gGsga_ch*?jy<%g=f@~eEJR9&N ztd`^u_QkbIm7=*BXpg?j8=2b>09Ltyo73%?=$C*sR?!#nTYHughVx6RLiXROa2yMM6Z^tQJ;mgK5KPkYjG zJy2%I8q~c1F6_^^^~WAp+%U6p_#fK0_!R$2(Ix4-ZBOdy7VrlCQf}cJ=G0HgP+5@6 zR&H3n8|OHC7%cpkxDX1j-kxWA>`;BzX?*t(x8%Dr0On0Zl_4m|l-+#1vcflyh(}C0 zn>yD0R`N#pm2BnLeO%4^*4Z3hb{w20k?7o|y&{(flCE992dLIC%%uV`Dqn8IprLUo zIOyk-ww>Ci(&A{(Qzn;C6c`xTeEa)om;;Uovkea;TzHdm zBNJS7)|_?mMAIzLan5F1`-WwFAh3&~SZ73kXV$=^@p;9se_;%}QAS0cl{}-n4DN-u z%eyA$wcVFbGyMLsKvD1DUe&bR&Tk=F6(_tE(yqNblhZhS4&xng?)@@%IE^9qxt>dx zS=Sq)S&r?KYIfbOT&TQac?XY@8qSba20c5>1D$6sh{;mkz@{W0qv(BNvmlJo>uF?d zIw#b9E(Y@;nH<@azhFa*f%o@An&Qu-cay`Yl}3_5k0_slQg+1Pv%kUh(EoMW53=xw zH2ATyVi^q`-Dh>3`wV^(DrweJI>aSlPH(IuTcF`!Wf>J%<3$$hXrxI*UlQ5DfT_fd zS~_BGWJb5Jg$)u%LeJ?ZeDD=bF7BxUQlDO|vzF!+>osCdmt^BM*06BcIKy!Ntp)B7 z3Lzi`=j$ib*p8E;>~B6%?n|)^wXkGiKvd(+Av2l`6na&tSy&>+;6=ss@@#T#8j>X* zG$8-8jH&VtZOsDHo5zI-&K#s8CM5eQ?%1HC(3%(aPHrHkY~%D>Dk({cnqgi030g*c z*aYj_W6+5(V@8q}Dy9BX)3uV4M9H9U@lqzFTTh7(4rcmNA0M^}DiR31@-5|~doz#? zVNN2F_wse@UG#QJ<98nuzi;cb8a-H;mEAXVa_f9_-22YDy?MCxbbq!lV3>;Kxwg|C zn$HY228id?9tJY|ZBoH|!9J)e++drZcVVe$!zNRmr7>5vp^{ay93}B9pPk}g8)!@` zMbXBgW4j6sam;=f3I*vqQLgJ-781I3+0^qOoU^Ht>r{CAZMMBHJ7>KGoqX&gppJTR z=EM1`XjY3=p^KT|CT7qAQaF?V>Z6C_KyMKw7$L23bV#;y_!Z%kk?K=5_&Dd!imkM> zY;yKyN_B7rD%AxzmM~wKstt{iGsa?0c=Lu$lljb{U|>sNefcq+`_+(y=t094jF_&t z2aW1)!znoEnO_1rfl@|ci+>y7&nk*)&DWt@WVz>AXLT*`1-3yDW50?<7_cnx^@9hH zWi_3qW$F(Z(a*r)3UXtPrwxp8iBD;UBG;gTkMIlBki80^z<*^+v8!BF>KCW@-1Jsn zsxU-r_G9265!(Q0$EBanR4TYh@!cf*@Cm2lF^FQJ?M z{neKDL~sH~-Jk%h%QCnvYh6~GOMv>TbgLHQHM<(B#S~X90*{7Pt=Ctv;J2WwJ)@z| zu)A3DF0NB3HxCne7?}k~ozow88pf*; zrh8(q`VBU%jmFtEwdqVCtocd*QYS*If&*!d zT7fuAN^>DA_)PAiMZ7E~acS0)nzrmW1Qje~jwPf@bbwEbO1yFa0&UHX{kG9!iix*l zA23@`!Un^*Q@y+kmbGo0=>wm4$NsLg0pD))aZ?Kp4&a0-qt$T4llfrTNTR(9>DNKj zCJ*ogt$k{W{Ihd`$YNL!SK2JGj{S{P&yb*vj#1JB(vN8cQ#67M>|6C%l~$iXf>Wy# z2yh>$zw$3!6S~1J*BvoJ_AaC3Anq~Qy~vp3ysTi$*u;9~&XRr1T(~!UW3vEmA30aZ zN|aSQKdJM=z>sCd&Sut3@}=kOb~9Jf6X3OqlH|HPDR1&;pUR@_oYrgC2b3yppr7J! zJ|IxP9kX6OY9=R0?*sGqu5#x;)7F*8pxGkYknHF@{Cndp^ap!O8 z9-b0rm2<}@=-BWFrvM`sD_sq8Oz2Zyy};iGb-|m8b}#UkY7Gp;6@%RSE;nU!G__v4 z$3Zsi)%vZX_g0rEeI9KmSDiYCo2su2(Z}NK4bCJm`;KDQ-FK(3qm%&HNx~hxV(Nfw2g0GVm%69bgS`@YC;GqFxI}(-%f9O8C-vd>%2~< zD=aerp^Verr#yunp}J2x)|9!cw-tu%$M{>rIex-?rZ^oG+e_I79; z<_-0?Q);J|sR13*OnRqMsUFux&UDxwhD&Zh+L>Saps`oUGCd-9X)wcgj+i>=VuP#F zM*mnxSKmorPnL?_Y%G@Yrm=Zv8W}r9u2@hUuV(>4qjGGAiFWvef?Lh+UMBZ1VL9J+ zj;IjjNb_o6Kl97k+4aI3TGA}|umz376QcNazg+~JPqbXj%vt^|{#-beF?}OO)FrTe zu?l0m0{SZCJT;-i0RL>VjJz+9CM~PYQ)g!m36xLsrEm8eGvkdJc;sd@*BseTT5{i^ z$L~diuf4Kt0mW?Wi|cKFc*ee*zO6xv9ITp{Wmb68$s8i7-D&vvf&VGxEQ8|k)isW5 zad&rHtgyH)?ykk%DN@|s3Y6j$r)9AgD5bc&yR#H6zPRn>{Lh)W=kvXpNuIounKv`} zkVz(ae$VgW-|LOmhKTK@J9AU4(wUw~P0}{nGAV9SuB zSg0l2S?J@X7N@E&DPB82UkVAE(DHiUArTACiaj5|P@;8EK$Eu-H}T8iCFH2#wAF?_ z?tPTfoL;y7y$I)7$F$TdTc64#+zo%0v5EW1Gq;8ej#znhA9bs5Tk3440~@;aqMI*I zA)nP9F^_$QsW$ACD2<;gSr+S<%XjxhhLwl$hOX*(@Q)uK%1cBDA>JghuluOnR_*i2^e}<*Hw(EQ9Y4!T`f_GfZK^;FuUj%cZ~!>^QnB3b zi{)A9Yw|Cl3kz};?#!pcYsNU5g0rZJ#=fM)Z0g+C^)WT~ujl3i#a+d=&k{gcKK6}z zJRR=fdM>OCQ<@1&qQD|1$G56ZOJVoS{e#cuiAF>3-GiPgXe5MRU3L%~_ut(PLLb!F zVcnz5@{UDBk_z!bbj>b+)egS-;urcn94jMLC{D*7s{n1AG zI9+-5=1Q5|8oENB;n*n})|C+zBXI}M7YuKCUWXqW3?fOs)h=vn?QtU%_22vLogY+H z+V?9XFN>QJkl2m7R~A*RljU~4=M4H44yd#L*;rvoewo(BAV&eVsUa8gny3K-lxR-PjwR@yHk{%K!rM;-Bnt!fN9f3ju)Z!`zIkNdj=OA>Mj5T_jm5N3 zE-;JcF?LG*&@iRkqfO9E>leO4K4f?M%Pb*207r~9ul_ek97}_LxSrmFsV;s&%E{L# z!_y(9qM`I7eN8Lyr$4tyTOyLl6)l}Zse#z2F*(&h zjNGRYq+DT#V9TV{-b*BvbYxL1txm=*r;-c4w0!QP1J?@rd7)2m__RB^a7J6UWawKS z(=7(9J#i3t$T6ldn7LxtwtiZl0iF>QW{9az7KZ}nV-@_pl}{rsRv(q3QyS9_$YIBt zlOiV^RP;I(79>T!L)_5?wqmJxvf^-8U&K+g*yyy|J67zS!pmq@u&z=yy3!G4Ie{{G zO+1PQneq;HOc@{i8F9vG`mj~?6U2iTuzcH>CodvC`o?-#e5#f%^KRK&`4Wdtx|KG) z^37A|k}rvjVpb$FG7CEn%{{U>5+}CGgC;gouGo)(*;eS}>&ZYfwIL&jroYr^I<{$2 zR$);6B9j%HI3`lnC>yes6Bp^uhmDRQZat;TfZcfFaj^!XOd#}sDm9H)VcZ?fb+v|{ zkmJ<%7DNJHuizTEe$!qmh#g6vk5s`2ur=qD6}SWw^LIot+Ig6$u^J;YRGWV#$iIQF z?(|YN%byYftV|GR5L3jdoA{)*zxbUS!<(~2FNUYeu$vs@T6!|H5pS||<>^GBWDjoD z0BD`D{8MpG4O12L-8Xp6f2@i%F&a~GMD0}&TWQo%^vVn;kNOy11B)ed!#6fgb#C&A#5*poy>lc~-zB2G<8& zwWCYv4|xUC$UGbbf?vMlX|MbK8S+0q3&nDGq1-swd^M3o*|u5Zs)haZ|AQ8J^Q^!u zYl0+~1%s)tR)y6s41S;o|2fASK#D^vaYHd=(;#natOX2Vd0CJ0`aE0ohvoSQ zH5c=fWf)0iD$hlIvv+m)4o2tvNlic}cF((Y=~K15v(E0*GKAI>>7jR}aHVjrWkG=9 z@pa;bTp>ypVh|QVnwm1De`c;v2f>=jCDBz3BeeM4bnZZ3p03?EX?8FghL7Sz%tH3= z$DLxp&u)vic_+RS2LgFd0LjiVD09ZLE%Ce8=kc5|73$!4gNEF=#7zX2T*yt9|8OBk8{ZV~r8n6v=n=-$ zrKMUmFkEX|+OfFeN*~5r=M4V{u=ZNg0`4RYZglI#VUW`1Lrs$OH}RPYLt_UJNQo#e zUt~=={JgN#Sd*N~lf+pIz;WoS?s;&kr=r*% znNe_*sVfQcP;eY^l>u0Ir8y9t`0e|fuD>0|HgmE`++g4HFZ)XZgF0UrDPFvZ-`)0$ z@SFdJ6bz2poIJOlggkGvU2{|}IJ@N@$O?-k>v4iFQC2}=^JJt@#d(_dHxUla!uf7E z)%v=5TWGw>Z-1-orI^I_F6Jsw*5NC(TTK!f90Nn>QYbXuP1F9Ex;;b?=P~=c%(K`k zFcmAz-l#c=)C!->(mHKR2 zv#7MR$(ZIca?5@6Q*VWB`g&(EI~01{a&yWp?tkPTJe#2TqV=_xrd@D*L#V60q0)}Z zubG^}a8_w*!^NnrUDcgu=j0PxOXMMNdr$mn_|*V@3UPOBx%ay+x@0+9AdvuwaERUn zaraRKH@@(WePSQze*>OuNwqpH{du!p6PdwlfXPP3Zhh^*07rr2wl+p1>;>z79M&MO zg4OM}wO$;!-*v)pgo{^yU`?V^#4-d^3X3gw!V{*le?`_K9*|!4J}#p8DJ8o15f_?oMOeZ}YI%l0E8*E3 zWYSNcYS^8(X5car(o-WcSuO4}0NB|trwbXi|amBv>VA2*;3AZr}OUXeHn?@4u+Q!MJ+EtR3jdy0JL1bT+yzsn*COOXM+PDWWg3dxhwzl#8-bq~l5%EHH)S&q+t=|c=`^Nl{@BzA z&Sg`YoN5jTAuoGw4U4c>nMa z=DmWx_r`anr^pW_B6z3R7W$I2431~}AC37PTG3;cIG%nwUSUJsaN1?8KUj+&<(vsc ze&8}^f3%yU){37Xm`@m;k@%q^X!*`QX*Bz*om+$Uz6B0Js@KWakz+OTzXl)Atpq3h z-TiMe7p>l!JZexxOo77mG1uL&j?Pfs&%vofGGkq(+EAUd%_q|7l@d}VY`2iAI{~cJrZl@d zs7dWr*~n=J>q#<|0O1R&1EK*s6eXAhCPS<4Z#?`FFuJQS;y@YX2?sI4;NQz zYf|Bve}I|6X1nX-2NRpp9cYT%EkneuhKz zQ1+$=mfY~I>v85@o46}^-TuV&BI#9)#EWd%_xSzN+}pv!^LYj=!BJ@{l*&sgc`^Z^ z2UsVJy`qOPyoPHx4>z+kFc(kX&&&DZ2jf6RW{wpG`2N*7mj;{bB2h1M7r#Nta-_a0 zQk~Q5$1^>vdNNJ+iY|2V6XnJlE~loX@pohQSV{dW!+jHNT1F8F3In`ta=;Q(q&_LwACzAfPqJiG@2W&^Y`WK}cPvOyD~TDGsGFfA@3k!wTB3Z+o`y$>nWk%++)2Uk zDbdY76vRWs07e%jB%s$nT5zjHiwhIoRCq4w!GwJ|pAjF+&!SLUf=da8}6Bk6_O zkWg%^K$_8Y0HPq8dFnNod z*Zg&x3#4hE;7>8D#+i+8iTd{A z=p+XQ9)4N(=mqLI`%NQ(-+=B1k?9SboQlmg#uEj}W-}C`8*2M^!sN8b8@ke_8W}}? z`kzWp1C4U%VeIe0p5bLO=`jh+x1Z20sgR+g(N(AdQnDF>B2g^j-|={4+;8uY{(s71T^wyes?>V3>V8ePc|U z_=&}dxX6e-Rn(HfJXb=2>eEuxXe>_hy1j3!ymFdhBPh+|glza*CvuH?c{pn_nYXnZ zeBl=iJc$fcgTb9N<}fIQPYL8g32G}~xFiYgf8JV>g{VN#O>y@|b_Md1os@DB`L$KS z38D)YcH2l6L=E`fFBWvAag$mX_ZPg=vZT;aLu&}2ixU-V%u*hnmq4{U z7Y#)v9gbD?PxYS;{<<7A6mN4);f`OJWw!*rZG~bspD%7*F z4i{U3CXjxp!nTy2aNhMyj+~yJuFnP5n{FD^*|(#FRMMWt2*yJFgW2KYmDu>6zL+{g zD-f@=?MZ|5vhxyXB-nKt7FH#}xkV~##05GiV zcb-iz3HQZMxd|GPYrCD8QJQw;_vla2YcRyL%J`~(n24{;L<<{_ITIpYrozoVj!3al zlrLz#zYL3wNuM{5V3Z5L!T3_#sE7oLgmB7In4|yUEPlG%L}0FYF|%tQg(H-Phr-8; zqNu!%t#yCt{vI9XA4HzFS*OLJEH!lFN76s{-lE6&637et?R=p5#QoMvl zWJ6*6J0va3K~kL9TF_8bq|zm<-tSWR$a)+pQ@ymv3-V0D(lx9IOAwLyE%FFYe+ji+2x?|9!n`_&s;WRV+y$O?JPEP) zX*lAKJFWy`ADLnhlY?;A-M!Q;bqwU*um_n?C^f8+BCQ!=MkWqmH75)GL4un|f4Cc# zz#{WJi9uv9-}8o3f%XOv)(xY0^YSL^4NKUe0u}2(6awBBO16zOKAyc4GMfbfGA$V9 ztx2c257U52!tb)fTT;~q{%gG~rXqR-Vwmn|OW{jVt+96K2dtC!NnyM>yyF%ky;mtl zvCFadm@0VA7!)*l_<5MC48AlsSjRlV6&~as%pU675Qx|I(N@49)qr^XBXTO@B(phi z17kxl=xvZvka*DTojdv+`g?R!fKklYYw`UeJQ z+TR)}3bnGQpV|_i#O{MHaR?0w1qe+Ey$Bx&C0OlPskOZ{MJh~7+d%S)wh0XZXOyQTphU0wpWr= zE|%XaZ4OCwSrinfTSjk_F))`34rmRSG1D`9tG?tgXP*KH0GRwH_7hgrwjEUQ(Gwrqo_NXf`mI5AsDBq zC;DOxKrc-^uw-`{RQS%y5w^cCXqi z%)CWAjJ#KuqA+oSO}k^FnOgzpT_5Er(aRL|PRW5cy81~bF&s^Pm0KyTkGF~jv+a}}Ev`Bg$j z^>Isl5+(3PJpPHs9eA&zc7t*$m~(Q@5eQz@*L%FeaDthrM(gPt{W|xJ6<;%jJnp&cRD?R|2?i1l;otJa7c=&IR|cfO}iPgAXoU zF)n=rEJ;yXtU+y_2o$M z<;3>o*x=>VXJ8m2FfI}pB@0aI1x7Fc6H0+G*1(hO#Xh^FK7+#3T;kC{(Tgt0ilE5vE{Wbju{JNMHlc`;mjsef%+5=SPAF<ZZjR&nzhtKRioIRA?tjIp-MDh$tB+H`e*{!{VV-PWx_BTM z@E@r$uU$lnG z!53>-18gbu^eF|AZPf_W!@UFwWzSx>*{LQW!N1fq9mn z2@b9W9u{2>pA4r`kEUtZ01uyH)Br-^Fr=%;HBzZ3)PC)R8Bx`vaF`kz)f003iw~Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iyZ3 z4-F&e(yRdh00rtvL_t(Y$Guj6Y*pnMe!lNJzt6cpdwbi`ODne`Z4;s(I+d8#X1MAs zDGM=kWCkJ1z`03cG&WI*M$L#uGpAGc$Fh*1NVXXRn29TqDNGBfla(S+5$LtIKkn`Q zea}7TeBb`ybZM~NpL>&&oaE$tp7;Hp=Y8M9uy7Cn5&#u|X&O?*^F(yp-Bw#`gVEUD zg4mOrL+wYt66I$$Yk_l9+{t7)zY;`R0Gt7k0T=+Z=D6Pc*XN=Sd^%D)zv0L3gA?D$ zMMDu6O$|MJb{NmD>fmcAk~@C=%J_#s-nlZ%`M`Amp_@9b)=hVYdnXI7^5A+rCS<#! zL<@>KqcczTAV37OnFByR`>lDnZAr;IFu3@h{vH25yHEv^4_;RnWG(RsUEY5ydqOo` zsPzRwNmVDR2cmF55}+OkV?rSUXipZqQfUJ!q;>%F5>NmdfV!rrvGo0C8(z%ws;ycT zXt9ETEy!fXKrSO^N;x&J%ACa_UNjzcOvVHRC(u+NU35>*rvU+=00;wEl&g@0sgWhg zWfe=8JdwVrk&|DB$A(7m>d?vB$anc#wdQbZQ9W;7->u#JvtH-!QdPpp>ChXQoSmCb z0~tV&5VXGhK;q~9tF?!9!x3h%im9SY{_$~a|E5>I`BlxSl>s<&s*M0JpW0a8(Y>s0 z%@ez_+ddvn=K*+Ek{AGzvP63y>aTlgY)@;Yd?+UJ??=U-AHU{ceZaa3KqElo8~dz8 zOCl5ipb~;GA!q;)_07TNv*~O$*3K;rYwo&<{xlLRDY|Tn<0HYs!6EkiWTEH+X#D$| za^LDs=SOZ?n%Mbnbo}-TT>^1AOI79jrjV`R-gjRT-WU`vnpC!qAKVAtAZ8J~?vA0+CXp2jf0;q3vOa2{<&p(vf7$+0t2GdP{jl2fUS z7&as?ePWc4O0!)nYntA*T>YW0I0gjZxdb(bUIO3(sQvMP{b}FL(%Sy6^6eK=8onM? z2Sb)82MpS5sx)rO^eUr{tXUKyxUPkuTvbsQRy!mB0swKUCGUlI=-%ILr(1|1h=gm< z6*K}U1DHJWmHp+$=j1KD*GHD0ONr542h$fQ<v02StIpaWiLY9?qWn^+>_?!nwJ0FMxO>7dRQj~J$IOjqMSYFhX9S~QB z+%zrhtcmKhg;GW)7YpR|-hoqFeQd#ek^f6pa!a{;d$pcIUY2x~GR`T1;(;>`xYUw@ z6`faAXbm~xRAeGb262ii|L6<)PRYS1V=49BeaF)0=FWcjBpv`hQ-I?-+Vs${I^MIA zURTJ=@M;WhjlrwR0D+($Bf^nMW?HFT7?VB^26-Yi!49l{=FIke$I@q4B!gr;Yk!Y` z18^J{_CJR!sa(~WxZxVBZE#3E-xOq4ts-kv8F@-2l6fvgPV0=RGX*;F$QzSebQ(Fd z|5*7?!{6p@02t5OVxf)304M~o#N`p7ceLm&zyD>^wtQZ)j-DxfaBq(}@cf?Q)?2QX z>Y|z+d+9F|uO2;}o%9pr^DXv;mc8QJQSrIe#c`(IaeX|n_mj+6Heb#IsLUC1Vxd2W og@XFu*_?MVM=$Zefd6mtALA}_IGin1>Hq)$07*qoM6N<$g4PxcEC2ui literal 0 HcmV?d00001 diff --git a/wiki/public/img/turbogears_logo_big.png b/wiki/public/img/turbogears_logo_big.png new file mode 100644 index 0000000000000000000000000000000000000000..b2bb40a509c83a2bec24732d0b44be3ca5ffb926 GIT binary patch literal 53462 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 z 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 literal 0 HcmV?d00001 diff --git a/wiki/public/img/under_the_hood_blue.png b/wiki/public/img/under_the_hood_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..90e84b72ae112ffe055a5812402c64337177b70e GIT binary patch literal 2667 zcmV-x3Y7JUP)+AH*9RL6R=eIrb z^78S{IqdB0)z#JD;Na!u<>=_>@9*!Yr>A9@%zdKC{{R1=p`r2d@z%YD;^N}>?!>gT zw9=0d?(m28-6iAWgukpuKoM&`1}9<{{QONq|ngN^Y-}J+1cgE1JFLta(ulL()6>)M(F6Vc`pe79(Za6&|Nhg=q1)Tr-sbG- z?D6>a@~y?&^Vkvp{{Pq4+1t>@%*@QCzu4*GzRu3h$;rvPySw_~1INe5^7Hn;zrVA) z$f3E<QvD#l5|~#?IF3>fFGb4P0m`8QXc9DXE#60i7qz0t6f; z?y@jRfB+gGXUX#N@(P=osi~=PaIkW4uz&%t1za8=fCk7}7J|n7z<{!2)y$|>P&N_d zU;(Bs1!j2K0tg_uv)I}hTY-R)iA|3aNHT+1?La0_D2J`RU5^_m&6vdoR%+AQYQqE3 zX2aOZm;e-I;{oZGW&$xSq#@D}Js{ofdf7mAFg*eS?&iE4s%mQG#R^=8x)wZ!t_u7t ztR|9(oCpv=aA)yw%YY2AVPIlnXl-Q>YHej^Y6mf;TNyd^U@Tpr$xJq_jEt=|ATyW> zfuf9lx@=&18JPqitDT7(Xbv|>AzU{bCnHduv@X= zk5)zo91`39^ zGDh=(MYtFQJtZkK@5~)WW>4K-L1fB z2gm}3OKW@x(A7ZOB7ts^k?~_@YX@oqf-E45M~JaCx|LCg2dW38n_D6rm_j_b!I4;| z1S}8uSyUWBj#4!fR+Ytc7C-kht%@*b@mC2mrZX%R2-ZhK7)|rO&|v z3M@m*c0JzU8Wt9POlJWE5K;jFasx1gz&0R-R!XZ3A17EatN|1V42r-6717EFb~TV` z1QcWftMnC<2Zokm1js9`h0I_*(XBGTB)}x3ZtK9@uL7D8mkPmO79L z%xjX&U}wq5cyQ|R2uZg_E623T7_x!%1c7z)a5I9`SuulCmZ~r?4q1Kd1=^K>MLVQ~ zXAu?~#lK|5e*DFP$W$zPCzRnx%7S-}M2DisxRCy*L|077yWvxt}&NF$SwxRI!>3n)7S zgHuP8)zh#s0&atsEn5d=0tu^Rv(a^P8E)hS^}o&oQ8s6S7|D^gWUoU zKuFGFVvv*sl`L$W3?dQ|A`DERvRhI_Qc@nsWMU8zXBQU{;sgs?S%Fo8nG$?L%pgG# zad9mnW*#O6c}XD#AxU{|9)xZlW_c|Mux3!>PYu+J;ZOjlA^|5$aPa7ZU1gG=ZvieY z00IcfS!_(4oS-@l$YAE?W(HSpOq|R>K_C+-#=yV;7HsF?WM<}s}?1(pBxIejUBs69W@q+yUZaC3MF2CVPioBR?SL< zD5w&E03y#>a(sMp%-TV68hlc6ZG1s;qRdjt8tv^;ZEfsr+RE)*+ESo^YSRWP(3TQy z7nRcH1F3{LOPG}d)PQFZ=1o;iRTbtp=2aEu0H!Q^3ted44G=)&IjfBw==C-(_BJUX zR@RVjV{YSugaCVBzA@d3dSl?_DB{01keC=F$C=WSv3_nKt&ZR zu>Midb&h97mInx+f$Ap;nAW)gOLiYY6+u@)R%b6+Q&VJVfB+gWX9)YF%Q zxEY0_O9KSZKn{%vm^ukq7;+29Vz!zA0%)KIlCU@l1ONhPkd6id1kfOL7C-this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}this.sliding=!0,f&&this.pause();var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});if(!e.hasClass("active")){if(this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid.bs.carousel",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(j),j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid.bs.carousel")},0)}).emulateTransitionEnd(600)}else{if(this.$element.trigger(j),j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid.bs.carousel")}return f&&this.cycle(),this}};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data()),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.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").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?(this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350),void 0):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(jQuery),+function(a){"use strict";function b(){a(d).remove(),a(e).each(function(b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(''}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.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")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.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)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(c).is("body")?a(window):a(c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.offsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#\w/.test(e)&&a(e);return f&&f.length&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parents(".active").removeClass("active");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")};var c=a.fn.scrollspy;a.fn.scrollspy=function(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]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.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")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).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(c),this.affixed=this.unpin=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top()),"function"==typeof h&&(h=f.bottom());var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;this.affixed!==i&&(this.unpin&&this.$element.css("top",""),this.affixed=i,this.unpin="bottom"==i?e.top-d:null,this.$element.removeClass(b.RESET).addClass("affix"+(i?"-"+i:"")),"bottom"==i&&this.$element.offset({top:document.body.offsetHeight-h-this.$element.height()}))}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(jQuery); \ No newline at end of file diff --git a/wiki/templates/__init__.py b/wiki/templates/__init__.py new file mode 100644 index 0000000..a2daccf --- /dev/null +++ b/wiki/templates/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +"""Templates package for the application.""" diff --git a/wiki/templates/about.xhtml b/wiki/templates/about.xhtml new file mode 100644 index 0000000..5fae7d5 --- /dev/null +++ b/wiki/templates/about.xhtml @@ -0,0 +1,139 @@ + + + Learning TurboGears 2.4: Quick guide to the Quickstart pages. + + + + +
+
+ + +

The TG2 quickstart command produces this basic TG site. Here's how it works.

+
+
+ +
+ +
+
+

The Master Template

+ +

The master.html template + controls the overall design of the page we're looking at. It draws the headers, + the footer, the notices flash and embeds the content of each page of your web applications. + Thus the "master.html" template provides the overall architecture for + each page in this site.

+ +

There's more to the "master.html" template... study it to see how the + <title> tags and static JS and CSS files are brought into the page. + Templating with Genshi is a powerful tool and we've only scratched the surface. + There are also a few little CSS tricks hidden in these pages, like the use of a + "clearingdiv" to make sure that your footer stays below the sidebars and always + looks right. That's not TG2 at work, just CSS. You'll need all your skills to + build a fine web app, but TG2 will make the hard parts easier so that you can + concentrate more on good design and content rather than struggling with + mechanics.

+
+
+ +
+
+

Authentication & Authorization in a TG2 site.

+ +

If you have access to this page, this means you have enabled authentication + and authorization in the quickstart to create your project.

+ +

The gearbox command will have created a few specific controllers for you. But + before you go to play with those controllers you'll need to make sure your + application has been properly bootstapped. This is dead easy, here is how to do + this:

+
gearbox setup-app
+ +

inside your application's folder and you'll get a database setup (using the + preferences you have set in your development.ini file). This database will also + have been prepopulated with some default logins/passwords so that you can test + the secured controllers and methods.

+ +

To change the comportement of this setup-app command you just need to edit + the websetup.py file.

+ +

Now try to visiting the manage_permission_only URL. You will + be challenged with a login/password form.

+ +

Only managers are authorized to visit this method. You will need to log-in + using:

+
login: manager
+password: managepass
+ +

Another protected resource is editor_user_only. This one is protected by + a different set of permissions. You will need to be editor with a + password of editpass to be able to access it.

+ +

The last kind of protected resource in this quickstarted app is a full so + called secure controller. This controller is + protected globally. Instead of having a @require decorator on each method, we + have set an allow_only attribute at the class level. All the methods in this + controller will require the same level of access. You need to be manager to + access secc or secc/some_where.

+
+
+ + diff --git a/wiki/templates/data.xhtml b/wiki/templates/data.xhtml new file mode 100644 index 0000000..67da385 --- /dev/null +++ b/wiki/templates/data.xhtml @@ -0,0 +1,43 @@ + + + Learning TurboGears 2.4: Quick guide to the Quickstart pages. + + + +
+
+

Content Type Dispatch

+

+ This page shows how you can provide multiple pages + directly from the same controller method. This page is generated + from the expose decorator with the template defintion provided. + You can provide a url with parameters and this page will display + the parameters as html, and the json version will express + the entries as JSON. +

+ +

Click here for the JSON Version of this page.

+
+
+

The data provided in the template call is: + + + + + + + + + + + + + + + +
KeyValue
${key}${value}
+

+
+
+ + diff --git a/wiki/templates/environ.xhtml b/wiki/templates/environ.xhtml new file mode 100644 index 0000000..39e969c --- /dev/null +++ b/wiki/templates/environ.xhtml @@ -0,0 +1,35 @@ + + + Learning TurboGears 2.4: Information about TG and WSGI + + + + + +
+
+

The WSGI nature of the framework

+ +

In this page you can see all the WSGI variables your request object has, + the ones in capital letters are required by the spec, then a sorted by + component list of variables provided by the Components, and at last + the "wsgi." namespace with very useful information about your WSGI Server

+

The keys in the environment are:

+ +
+ + + + + +
${key}
${str(environment[key])}
+
+
+
+ + diff --git a/wiki/templates/error.xhtml b/wiki/templates/error.xhtml new file mode 100644 index 0000000..e85ce92 --- /dev/null +++ b/wiki/templates/error.xhtml @@ -0,0 +1,17 @@ + + + A ${code} error has Occurred + + + +

Error ${code}

+ + +

${literal(fixmessage(message))}

+ + diff --git a/wiki/templates/index.xhtml b/wiki/templates/index.xhtml new file mode 100644 index 0000000..4651f3e --- /dev/null +++ b/wiki/templates/index.xhtml @@ -0,0 +1,53 @@ + + + Welcome to TurboGears 2.4, standing on the shoulders of giants, since 2007 + + + +
+
+
+

Welcome to TurboGears 2.4

+

If you see this page it means your installation was successful!

+

TurboGears 2 is rapid web application development toolkit designed to make your life easier.

+

+ + ${h.icon('book')} Learn more + +

+
+
+ +
+ +
+
+

Code your data model

+

Design your data model, Create the database, and Add some bootstrap data.

+
+ +
+

Design your URL architecture

+

Decide your URLs, Program your controller methods, Design your + templates, and place some static files (CSS and/or Javascript).

+
+ +
+

Distribute your app

+

Test your source, Generate project documents, Build a distribution.

+
+
+ + Thank you for choosing TurboGears. + + diff --git a/wiki/templates/login.xhtml b/wiki/templates/login.xhtml new file mode 100644 index 0000000..42b12af --- /dev/null +++ b/wiki/templates/login.xhtml @@ -0,0 +1,43 @@ + + + Login + + + +

Login

+ +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+ + diff --git a/wiki/templates/master.xhtml b/wiki/templates/master.xhtml new file mode 100644 index 0000000..08ff86c --- /dev/null +++ b/wiki/templates/master.xhtml @@ -0,0 +1,70 @@ + + + + + + + + Your generic title goes here + + + + + + + + + + + +
+ + +
+
+
+
+
+ + + + +
+ + +
+ TurboGears 2 +

Copyright © ${getattr(tmpl_context, 'project_name', 'TurboGears2')} ${h.current_year()}

+
+ + + + + diff --git a/wiki/templates/template.xhtml.template b/wiki/templates/template.xhtml.template new file mode 100644 index 0000000..9f80227 --- /dev/null +++ b/wiki/templates/template.xhtml.template @@ -0,0 +1,16 @@ + + + {{target.capitalize()}} + + + +
+
+

{{target.capitalize()}}

+

+ Template page for {{target.capitalize()}} +

+
+
+ + diff --git a/wiki/tests/__init__.py b/wiki/tests/__init__.py new file mode 100644 index 0000000..98b9806 --- /dev/null +++ b/wiki/tests/__init__.py @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- +"""Unit and functional test suite for wiki.""" + +from os import getcwd +from paste.deploy import loadapp +from webtest import TestApp +from gearbox.commands.setup_app import SetupAppCommand +from tg import config +from tg.util import Bunch + +from wiki import model + +__all__ = ['setup_app', 'setup_db', 'teardown_db', 'TestController'] + +application_name = 'main_without_authn' + + +def load_app(name=application_name): + """Load the test application.""" + return TestApp(loadapp('config:test.ini#%s' % name, relative_to=getcwd())) + + +def setup_app(): + """Setup the application.""" + cmd = SetupAppCommand(Bunch(options=Bunch(verbose_level=1)), Bunch()) + cmd.run(Bunch(config_file='config:test.ini', section_name=None)) + + +def setup_db(): + """Create the database schema (not needed when you run setup_app).""" + engine = config['tg.app_globals'].sa_engine + model.init_model(engine) + model.metadata.create_all(engine) + + +def teardown_db(): + """Destroy the database schema.""" + engine = config['tg.app_globals'].sa_engine + model.metadata.drop_all(engine) + + +class TestController(object): + """Base functional test case for the controllers. + + The wiki application instance (``self.app``) set up in this test + case (and descendants) has authentication disabled, so that developers can + test the protected areas independently of the :mod:`repoze.who` plugins + used initially. This way, authentication can be tested once and separately. + + Check wiki.tests.functional.test_authentication for the repoze.who + integration tests. + + This is the officially supported way to test protected areas with + repoze.who-testutil (http://code.gustavonarea.net/repoze.who-testutil/). + + """ + application_under_test = application_name + + def setUp(self): + """Setup test fixture for each functional test method.""" + self.app = load_app(self.application_under_test) + setup_app() + + def tearDown(self): + """Tear down test fixture for each functional test method.""" + model.DBSession.remove() + teardown_db() diff --git a/wiki/tests/functional/__init__.py b/wiki/tests/functional/__init__.py new file mode 100644 index 0000000..70b6e02 --- /dev/null +++ b/wiki/tests/functional/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +"""Functional test suite for the controllers of the application.""" diff --git a/wiki/tests/functional/test_authentication.py b/wiki/tests/functional/test_authentication.py new file mode 100644 index 0000000..2c0033b --- /dev/null +++ b/wiki/tests/functional/test_authentication.py @@ -0,0 +1,91 @@ +# -*- coding: utf-8 -*- +""" +Integration tests for the :mod:`repoze.who`-powered authentication sub-system. + +As wiki grows and the authentication method changes, only these tests +should be updated. + +""" +from __future__ import unicode_literals + +from nose.tools import eq_, ok_ + +from wiki.tests import TestController + + +class TestAuthentication(TestController): + """ + Tests for the default authentication setup. + + If your application changes how the authentication layer is configured + those tests should be updated accordingly + """ + + application_under_test = 'main' + def test_forced_login(self): + """Anonymous users are forced to login + + Test that anonymous users are automatically redirected to the login + form when authorization is denied. Next, upon successful login they + should be redirected to the initially requested page. + + """ + # Requesting a protected area + resp = self.app.get('/admin/', status=302) + ok_(resp.location.startswith('http://localhost/login')) + # Getting the login form: + resp = resp.follow(status=200) + form = resp.form + # Submitting the login form: + form['login'] = 'manager' + form['password'] = 'managepass' + post_login = form.submit(status=302) + # Being redirected to the initially requested page: + ok_(post_login.location.startswith('http://localhost/post_login')) + initial_page = post_login.follow(status=302) + ok_('authtkt' in initial_page.request.cookies, + "Session cookie wasn't defined: %s" % initial_page.request.cookies) + ok_(initial_page.location.startswith('http://localhost/admin/'), + initial_page.location) + + def test_voluntary_login(self): + """Voluntary logins must work correctly""" + # Going to the login form voluntarily: + resp = self.app.get('/login', status=200) + form = resp.form + # Submitting the login form: + form['login'] = 'manager' + form['password'] = 'managepass' + post_login = form.submit(status=302) + # Being redirected to the home page: + ok_(post_login.location.startswith('http://localhost/post_login')) + home_page = post_login.follow(status=302) + ok_('authtkt' in home_page.request.cookies, + 'Session cookie was not defined: %s' % home_page.request.cookies) + eq_(home_page.location, 'http://localhost/') + + def test_logout(self): + """Logouts must work correctly""" + # Logging in voluntarily the quick way: + resp = self.app.get('/login_handler?login=manager&password=managepass', + status=302) + resp = resp.follow(status=302) + ok_('authtkt' in resp.request.cookies, + 'Session cookie was not defined: %s' % resp.request.cookies) + # Logging out: + resp = self.app.get('/logout_handler', status=302) + ok_(resp.location.startswith('http://localhost/post_logout')) + # Finally, redirected to the home page: + home_page = resp.follow(status=302) + authtkt = home_page.request.cookies.get('authtkt') + ok_(not authtkt or authtkt == 'INVALID', + 'Session cookie was not deleted: %s' % home_page.request.cookies) + eq_(home_page.location, 'http://localhost/') + + def test_failed_login_keeps_username(self): + """Wrong password keeps user_name in login form""" + resp = self.app.get('/login_handler?login=manager&password=badpassword', + status=302) + resp = resp.follow(status=200) + ok_('Invalid Password' in resp, resp) + eq_(resp.form['login'].value, 'manager') diff --git a/wiki/tests/functional/test_root.py b/wiki/tests/functional/test_root.py new file mode 100644 index 0000000..15c23f9 --- /dev/null +++ b/wiki/tests/functional/test_root.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- +""" +Functional test suite for the root controller. + +This is an example of how functional tests can be written for controllers. + +As opposed to a unit-test, which test a small unit of functionality, +functional tests exercise the whole application and its WSGI stack. + +Please read https://webtest.readthedocs.io/ for more information. + +""" + +from nose.tools import ok_ + +from wiki.tests import TestController + + +class TestRootController(TestController): + """Tests for the method in the root controller.""" + + def test_index(self): + """The front page is working properly""" + response = self.app.get('/') + msg = 'TurboGears 2 is rapid web application development toolkit '\ + 'designed to make your life easier.' + # You can look for specific strings: + ok_(msg in response) + + # You can also access a BeautifulSoup'ed response in your tests + # (First run $ easy_install BeautifulSoup + # and then uncomment the next two lines) + + # links = response.html.findAll('a') + # print(links) + # ok_(links, "Mummy, there are no links here!") + def test_environ(self): + """Displaying the wsgi environ works""" + response = self.app.get('/environ.html') + ok_('The keys in the environment are:' in response) + + def test_data(self): + """The data display demo works with HTML""" + response = self.app.get('/data.html?a=1&b=2') + response.mustcontain("a", "1", + "b", "2") + + def test_data_json(self): + """The data display demo works with JSON""" + resp = self.app.get('/data.json?a=1&b=2') + ok_( + dict(page='data', params={'a': '1', 'b': '2'}) == resp.json, + resp.json + ) + def test_secc_with_manager(self): + """The manager can access the secure controller""" + # Note how authentication is forged: + environ = {'REMOTE_USER': 'manager'} + resp = self.app.get('/secc', extra_environ=environ, status=200) + ok_('Secure Controller here' in resp.text, resp.text) + + def test_secc_with_editor(self): + """The editor cannot access the secure controller""" + environ = {'REMOTE_USER': 'editor'} + self.app.get('/secc', extra_environ=environ, status=403) + # It's enough to know that authorization was denied with a 403 status + + def test_secc_with_anonymous(self): + """Anonymous users must not access the secure controller""" + self.app.get('/secc', status=401) + # It's enough to know that authorization was denied with a 401 status diff --git a/wiki/tests/models/__init__.py b/wiki/tests/models/__init__.py new file mode 100644 index 0000000..5da11e8 --- /dev/null +++ b/wiki/tests/models/__init__.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +"""Unit test suite for the models of the application.""" + +from nose.tools import eq_ +from wiki.model import DBSession +from wiki.tests import load_app +from wiki.tests import setup_db, teardown_db + +__all__ = ['ModelTest'] + + +def setup(): + """Setup test fixture for all model tests.""" + load_app() + setup_db() + + +def teardown(): + """Tear down test fixture for all model tests.""" + teardown_db() + + +class ModelTest(object): + """Base unit test case for the models.""" + + klass = None + attrs = {} + + def setUp(self): + """Setup test fixture for each model test method.""" + try: + new_attrs = {} + new_attrs.update(self.attrs) + new_attrs.update(self.do_get_dependencies()) + self.obj = self.klass(**new_attrs) + DBSession.add(self.obj) + DBSession.flush() + return self.obj + except: + DBSession.rollback() + raise + + def tearDown(self): + """Tear down test fixture for each model test method.""" + DBSession.rollback() + + def do_get_dependencies(self): + """Get model test dependencies. + + Use this method to pull in other objects that need to be created + for this object to be build properly. + + """ + return {} + + def test_create_obj(self): + """Model objects can be created""" + pass + + def test_query_obj(self): + """Model objects can be queried""" + obj = DBSession.query(self.klass).one() + for key, value in self.attrs.items(): + eq_(getattr(obj, key), value) diff --git a/wiki/tests/models/test_auth.py b/wiki/tests/models/test_auth.py new file mode 100644 index 0000000..c7914ba --- /dev/null +++ b/wiki/tests/models/test_auth.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +"""Test suite for the TG app's models""" +from __future__ import unicode_literals +from nose.tools import eq_ + +from wiki import model +from wiki.tests.models import ModelTest + + +class TestGroup(ModelTest): + """Unit test case for the ``Group`` model.""" + + klass = model.Group + attrs = dict( + group_name="test_group", + display_name="Test Group" + ) + + +class TestUser(ModelTest): + """Unit test case for the ``User`` model.""" + + klass = model.User + attrs = dict( + user_name="ignucius", + email_address="ignucius@example.org" + ) + + def test_obj_creation_username(self): + """The obj constructor must set the user name right""" + eq_(self.obj.user_name, "ignucius") + + def test_obj_creation_email(self): + """The obj constructor must set the email right""" + eq_(self.obj.email_address, "ignucius@example.org") + + def test_no_permissions_by_default(self): + """User objects should have no permission by default.""" + eq_(len(self.obj.permissions), 0) + + def test_getting_by_email(self): + """Users should be fetcheable by their email addresses""" + him = model.User.by_email_address("ignucius@example.org") + eq_(him, self.obj) + + +class TestPermission(ModelTest): + """Unit test case for the ``Permission`` model.""" + + klass = model.Permission + attrs = dict( + permission_name="test_permission", + description="This is a test Description" + ) diff --git a/wiki/websetup/__init__.py b/wiki/websetup/__init__.py new file mode 100644 index 0000000..c588454 --- /dev/null +++ b/wiki/websetup/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +"""Setup the wiki application""" + +import logging + +from wiki.config.app_cfg import base_config + +__all__ = ['setup_app'] + +log = logging.getLogger(__name__) + +from .schema import setup_schema +from .bootstrap import bootstrap + + +def setup_app(command, conf, vars): + """Place any commands to setup wiki here""" + conf = base_config.configure(conf.global_conf, conf.local_conf) + base_config.setup(conf) + + setup_schema(command, conf, vars) + bootstrap(command, conf, vars) diff --git a/wiki/websetup/bootstrap.py b/wiki/websetup/bootstrap.py new file mode 100644 index 0000000..5e5c230 --- /dev/null +++ b/wiki/websetup/bootstrap.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +"""Setup the wiki application""" +from __future__ import print_function, unicode_literals +import transaction +from wiki import model + + +def bootstrap(command, conf, vars): + """Place any commands to setup wiki here""" + + # diff --git a/wiki/websetup/schema.py b/wiki/websetup/schema.py new file mode 100644 index 0000000..0c9ddf3 --- /dev/null +++ b/wiki/websetup/schema.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +"""Setup the wiki application""" +from __future__ import print_function + +from tg import config +import transaction + + +def setup_schema(command, conf, vars): + """Place any commands to setup wiki here""" + # Load the models + + # + from wiki import model + # + + # + print("Creating tables") + model.metadata.create_all(bind=config['tg.app_globals'].sa_engine) + # + transaction.commit() + print('Initializing Migrations') + import alembic.config + alembic_cfg = alembic.config.Config() + alembic_cfg.set_main_option("script_location", "migration") + alembic_cfg.set_main_option("sqlalchemy.url", config['sqlalchemy.url']) + import alembic.command + alembic.command.stamp(alembic_cfg, "head")
+
+ + +
+

Code my data model

+ +

When you want a model for storing favorite links or wiki content, the + /model folder in your site is ready to go.

+ +

You can build a dynamic site without any data model at all. There still be a + default data-model template for you if you didn't enable authentication and + authorization in quickstart. If you have enabled authorization, the auth + data-model is ready-made.

+
+ +
+

Design my URL structure

+ +

The "root.py" file under the /controllers folder has + your URLs. When you called this url (about), the command went through the + RootController class to the about() method.

+ +

Those Python methods are responsible to create the dictionary of variables + that will be used in your web views (template).

+
+ +
+

Reuse the web page elements

+ +

A web page viewed by user could be constructed by single or several reusable + templates under /templates. + Each projects gets quickstarted with a master.html + template and a bunch of templates for the pages provided by the RootController. +

+
+
+ +
+ TurboGears2 quickstarted project +
+