Changeset - fdc2503fcfc3
[Not reviewed]
Merge
90 11 109
Christopher Neugebauer - 7 years ago 2017-08-09 02:16:40
chrisjrn@gmail.com
Merge remote-tracking branch 'rd/all-python'
198 files changed with 13289 insertions and 2977 deletions:
LICENSE
54
0 comments (0 inline, 0 general)
.gitignore
Show inline comments
 
*.pyc
 
node_modules/
 
_build/
 
.DS_Store
 
dev.db
 
.coverage
 
staticfiles
LICENSE
Show inline comments
 
registrasion-demo
 
-----------------
 

	
 
# Copyright (c) 2016-2017 Christopher Neugebauer and contributors
 
#
 
# Permission is hereby granted, free of charge, to any person obtaining a copy
 
# of this software and associated documentation files (the "Software"), to deal
 
# in the Software without restriction, including without limitation the rights
 
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 
# copies of the Software, and to permit persons to whom the Software is
 
# furnished to do so, subject to the following conditions:
 
#
 
# The above copyright notice and this permission notice shall be included in
 
# all copies or substantial portions of the Software.
 
#
 
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 
# THE SOFTWARE.
 

	
 

	
 
pinaxcon
 
--------
 

	
 
# Copyright (c) 2009-2015 James Tauber and contributors
 
#
 
# Permission is hereby granted, free of charge, to any person obtaining a copy
 
# of this software and associated documentation files (the "Software"), to deal
 
# in the Software without restriction, including without limitation the rights
 
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 
# copies of the Software, and to permit persons to whom the Software is
 
# furnished to do so, subject to the following conditions:
 
#
 
# The above copyright notice and this permission notice shall be included in
 
# all copies or substantial portions of the Software.
 
#
 
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 
# THE SOFTWARE.
 

	
 

	
 
bootstrap-sass
 
--------------
 

	
 
The MIT License (MIT)
 

	
 
Copyright (c) 2011-2016 Twitter, Inc
 
Copyright (c) 2011-2016 The Bootstrap Authors
 

	
 
Permission is hereby granted, free of charge, to any person obtaining a copy
 
of this software and associated documentation files (the "Software"), to deal
 
in the Software without restriction, including without limitation the rights
 
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 
copies of the Software, and to permit persons to whom the Software is
 
furnished to do so, subject to the following conditions:
 

	
 
The above copyright notice and this permission notice shall be included in
 
all copies or substantial portions of the Software.
 

	
 
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 
THE SOFTWARE.
fixtures/sitetree.json
Show inline comments
...
 
@@ -4,56 +4,56 @@
 
        "model": "sitetree.tree",
 
        "fields": {
 
            "alias": "main",
 
            "title": "main"
 
        }
 
    },
 
    {
 
        "pk": 1,
 
        "model": "sitetree.treeitem",
 
        "fields": {
 
            "parent": null,
 
            "access_restricted": false,
 
            "access_permissions": [],
 
            "description": "",
 
            "insitetree": true,
 
            "hint": "",
 
            "url": "pages_page \"about/\"",
 
            "url": "page_about",
 
            "inbreadcrumbs": true,
 
            "title": "About",
 
            "tree": 1,
 
            "access_perm_type": 1,
 
            "alias": null,
 
            "sort_order": 2,
 
            "inmenu": true,
 
            "access_loggedin": false,
 
            "hidden": false,
 
            "urlaspattern": true
 
        }
 
    },
 
    {
 
        "pk": 2,
 
        "model": "sitetree.treeitem",
 
        "fields": {
 
            "parent": null,
 
            "access_restricted": false,
 
            "access_permissions": [],
 
            "description": "",
 
            "insitetree": true,
 
            "hint": "",
 
            "url": "pages_page \"venue/\"",
 
            "url": "page_venue",
 
            "inbreadcrumbs": true,
 
            "title": "Venue",
 
            "tree": 1,
 
            "access_perm_type": 1,
 
            "alias": null,
 
            "sort_order": 3,
 
            "inmenu": true,
 
            "access_loggedin": false,
 
            "hidden": false,
 
            "urlaspattern": true
 
        }
 
    },
 
    {
 
        "pk": 3,
 
        "model": "sitetree.treeitem",
 
        "fields": {
...
 
@@ -96,35 +96,35 @@
 
            "inmenu": true,
 
            "access_loggedin": false,
 
            "hidden": false,
 
            "urlaspattern": true
 
        }
 
    },
 
    {
 
        "pk": 5,
 
        "model": "sitetree.treeitem",
 
        "fields": {
 
            "parent": 3,
 
            "access_restricted": false,
 
            "access_permissions": [],
 
            "description": "",
 
            "insitetree": true,
 
            "hint": "",
 
            "url": "sponsor_apply",
 
            "url": "page_sponsor_info",
 
            "inbreadcrumbs": true,
 
            "title": "Apply to be a Sponsor",
 
            "title": "Prospectus",
 
            "tree": 1,
 
            "access_perm_type": 1,
 
            "alias": null,
 
            "sort_order": 6,
 
            "inmenu": true,
 
            "access_loggedin": false,
 
            "hidden": false,
 
            "urlaspattern": true
 
        }
 
    },
 
    {
 
        "pk": 6,
 
        "model": "sitetree.treeitem",
 
        "fields": {
 
            "parent": 3,
 
            "access_restricted": false,
gondor.yml
Show inline comments
 
deleted file
gulpfile.js
Show inline comments
 
deleted file
pinaxcon/settings.py
Show inline comments
...
 
@@ -43,48 +43,49 @@ USE_L10N = True
 
# If you set this to False, Django will not use timezone-aware datetimes.
 
USE_TZ = True
 

	
 
# Absolute filesystem path to the directory that will hold user-uploaded files.
 
# Example: "/home/media/media.lawrence.com/media/"
 
MEDIA_ROOT = os.path.join(PACKAGE_ROOT, "site_media", "media")
 

	
 
# URL that handles the media served from MEDIA_ROOT. Make sure to use a
 
# trailing slash.
 
# Examples: "http://media.lawrence.com/media/", "http://example.com/media/"
 
MEDIA_URL = "/site_media/media/"
 

	
 
# Absolute path to the directory static files should be collected to.
 
# Don"t put anything in this directory yourself; store your static files
 
# in apps" "static/" subdirectories and in STATICFILES_DIRS.
 
# Example: "/home/media/media.lawrence.com/static/"
 
STATIC_ROOT = os.path.join(PACKAGE_ROOT, "site_media", "static")
 
STATIC_ROOT = os.path.join(PROJECT_ROOT, 'staticfiles')
 

	
 
# URL prefix for static files.
 
# Example: "http://media.lawrence.com/static/"
 
STATIC_URL = "/site_media/static/"
 
STATIC_URL = '/static/'
 

	
 
# Additional locations of static files
 
STATICFILES_DIRS = [
 
    os.path.join(PROJECT_ROOT, "static", "dist"),
 
]
 
STATICFILES_DIRS = (
 
    os.path.join(PROJECT_ROOT, 'static'),
 
)
 

	
 
# List of finder classes that know how to find static files in
 
# various locations.
 
STATICFILES_FINDERS = [
 
    "django.contrib.staticfiles.finders.FileSystemFinder",
 
    "django.contrib.staticfiles.finders.AppDirectoriesFinder",
 
    "compressor.finders.CompressorFinder",
 
]
 

	
 
# Make this unique, and don't share it with anybody.
 
SECRET_KEY = "6r&z0i#!k-thu4nv^zzx!f$fbp(&#2i5mq_^%%@ihu_qxxotl_"
 

	
 
TEMPLATES = [
 
    {
 
        "BACKEND": "django.template.backends.django.DjangoTemplates",
 
        "DIRS": [
 
            os.path.join(PACKAGE_ROOT, "templates"),
 
        ],
 
        "APP_DIRS": True,
 
        "OPTIONS": {
 
            "debug": DEBUG,
 
            "context_processors": [
 
                "django.contrib.auth.context_processors.auth",
...
 
@@ -142,79 +143,87 @@ INSTALLED_APPS = [
 
    "pinax.boxes",
 
    "pinax.eventlog",
 
    "pinax.pages",
 

	
 
    # symposion
 
    "symposion",
 
    "symposion.conference",
 
    "symposion.proposals",
 
    "symposion.reviews",
 
    "symposion.schedule",
 
    "symposion.speakers",
 
    "symposion.sponsorship",
 
    "symposion.teams",
 

	
 
    # Registrasion
 
    "registrasion",
 
    "symposion_templates",
 

	
 
    # Registrasion-stipe
 
    "pinax.stripe",
 
    "django_countries",
 
    "registripe",
 

	
 
    #admin - required by registrasion ??
 
    "nested_admin",
 

	
 
    # project
 
    "pinaxcon",
 
    "pinaxcon.proposals",
 
    "pinaxcon.registrasion",
 

	
 
    #testing
 
    "django_nose",
 

	
 
    # stylesheets and js
 
    'compressor',
 
]
 

	
 
# A sample logging configuration. The only tangible logging
 
# performed by this configuration is to send an email to
 
# the site admins on every HTTP 500 error when DEBUG=False.
 
# See http://docs.djangoproject.com/en/dev/topics/logging for
 
# more details on how to customize your logging configuration.
 
LOGGING = {
 
    "version": 1,
 
    "disable_existing_loggers": False,
 
    "filters": {
 
        "require_debug_false": {
 
            "()": "django.utils.log.RequireDebugFalse"
 
        }
 
    },
 
    "handlers": {
 
        "mail_admins": {
 
            "level": "ERROR",
 
            "filters": ["require_debug_false"],
 
            "class": "django.utils.log.AdminEmailHandler"
 
        }
 
    },
 
    "loggers": {
 
        "django.request": {
 
            "handlers": ["mail_admins"],
 
            "level": "ERROR",
 
            "propagate": True,
 
        },
 
    }
 
}
 

	
 
COMPRESS_PRECOMPILERS = (
 
    ('text/x-scss', 'django_libsass.SassCompiler'),
 
)
 

	
 
FIXTURE_DIRS = [
 
    os.path.join(PROJECT_ROOT, "fixtures"),
 
]
 

	
 
EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"
 

	
 
ACCOUNT_OPEN_SIGNUP = True
 
ACCOUNT_EMAIL_UNIQUE = True
 
ACCOUNT_EMAIL_CONFIRMATION_REQUIRED = False
 
ACCOUNT_LOGIN_REDIRECT_URL = "home"
 
ACCOUNT_LOGOUT_REDIRECT_URL = "home"
 
ACCOUNT_EMAIL_CONFIRMATION_EXPIRE_DAYS = 2
 
ACCOUNT_USE_AUTH_AUTHENTICATE = True
 

	
 
AUTHENTICATION_BACKENDS = [
 
    "symposion.teams.backends.TeamPermissionsBackend",
pinaxcon/templates/_footer.html
Show inline comments
 
<div class="pull-left">
 
    &copy;2016
 
    &copy; 2017
 
</div>
 

	
 
<div class="pull-right">
 
    Site powered by <a href="http://eldarion.com/symposion/"><b>Symposion</b></a>.
 
    Site powered by <a href="http://eldarion.com/symposion/"><b>Symposion</b></a>
 
    and <a href="http://github.com/chrisjrn/registrasion/"><b>Registrasion</b></a>.
 
</div>
pinaxcon/templates/_scripts.html
Show inline comments
 
<script src='/site_media/static/js/site-92ae8d0d6c.js'></script>
 
{% load compress %}
 
{% load staticfiles %}
 

	
 
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.js"></script>
 
<script src="//cdnjs.cloudflare.com/ajax/libs/ace/1.2.0/ace.js"></script>
 

	
 
{% compress js %}
 
  <script src='{% static "bootstrap/javascripts/bootstrap.min.js" %}'></script>
 
  <script src='{% static "js/site.js" %}'></script>
 
{% endcompress %}
pinaxcon/templates/_styles.html
Show inline comments
 
<link href='/site_media/static/css/site-0a247b924d.css' rel='stylesheet' />
 
{% load compress %}
 
{% load staticfiles %}
 

	
 
<link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" />
 
{% compress css %}
 
    <link rel="stylesheet" type="text/x-scss" href="{% static "scss/site.scss" %}" />
 
{% endcompress %}
pinaxcon/templates/homepage.html
Show inline comments
 
{% extends "site_base.html" %}
 

	
 
{% load i18n %}
 
{% load pinax_boxes_tags %}
 

	
 
{% block head_title %}{% trans "Welcome" %}{% endblock %}
 

	
 
{% block body_class %}home{% endblock %}
 

	
 
{% block body %}
 
    {% box "homepage" %}
 
  <h1>{{ SITE_NAME }}</h1>
 
  <p class="lead">Welcome to the demo site.</p>
 
{% endblock %}
pinaxcon/templates/page_with_title_and_lede.html
Show inline comments
 
new file 100644
 
{% extends "site_base.html" %}
 

	
 
{% block head_title %}{% block title %}{% endblock %}{% endblock %}
 

	
 
{% block body %}
 

	
 
  {% block heading_base %}
 
    <h1>{% block heading %}{% endblock %}</h1>
 
  {% endblock %}
 

	
 
  {% block lede_base %}
 
    <p class="lead">{% block lede %}{% endblock %}</p>
 
  {% endblock %}
 

	
 
  {% block content %}
 
  {% endblock %}
 

	
 
{% endblock %}
pinaxcon/templates/pages/about.html
Show inline comments
 
new file 100644
 
{% extends "page_with_title_and_lede.html" %}
 

	
 
{% block title %}About {{ SITE_NAME }}{% endblock %}
 
{% block heading %}About {{ SITE_NAME }}{% endblock %}
 
{% block lede %}{{ SITE_NAME }} is the premier demo conference site for Symposion and Registrasion{% endblock %}
 

	
 
{% block content %}
 
  <p>I am the body content</p>
 
{% endblock %}
pinaxcon/templates/pages/sponsors/info.html
Show inline comments
 
new file 100644
 
{% extends "page_with_title_and_lede.html" %}
 

	
 
{% block title %}Sponsorship Prospectus{% endblock %}
 
{% block heading %}Sponsorship Prospectus{% endblock %}
 
{% block lede %}{{ SITE_NAME }} wants sponsors.{% endblock %}
 

	
 
{% block content %}
 
  <p>I am the body content</p>
 
{% endblock %}
pinaxcon/templates/pages/venue.html
Show inline comments
 
new file 100644
 
{% extends "page_with_title_and_lede.html" %}
 

	
 
{% block title %}Venue{% endblock %}
 
{% block heading %}Venue{% endblock %}
 
{% block lede %}{{ SITE_NAME }} is being held on a Django Hosting facility, somewhere.{% endblock %}
 

	
 
{% block content %}
 
  <p>I am the body content</p>
 
{% endblock %}
pinaxcon/templates/site_base.html
Show inline comments
 
{% extends "theme_bootstrap/base.html" %}
 

	
 
{% load staticfiles %}
 
{% load metron_tags %}
 
{% load i18n %}
 
{% load sitetree %}
 

	
 

	
 
{% block styles %}
 
    {% include "_styles.html" %}
 
{% endblock %}
 

	
 

	
 
{% block extra_head_base %}
 
    {% block extra_head %}{% endblock %}
 
{% endblock %}
 

	
 
{% block nav %}
 
    {% sitetree_menu from "main" include "trunk" template "sitetree/menu_bootstrap3.html" %}
 
{% endblock %}
 

	
 
{% block body_base %}
 
    <section id="content_body">
 
        <div class="container">
 
            {% include "_messages.html" %}
 
            <div class="row">
 
                <div class="col-md-9">
 
                    {% block body %}
 
                    {% endblock %}
...
 
@@ -33,23 +31,22 @@
 
                        {% include "_default_sidebar.html" %}
 
                    {% endblock %}
 
                </div>
 
            </div>
 
        </div>
 
    </section>
 
{% endblock %}
 

	
 

	
 
{% block footer %}
 
    {% include "_footer.html" %}
 
{% endblock %}
 

	
 

	
 
{% block scripts %}
 
    {% include "_scripts.html" %}
 
    <script src="//cdnjs.cloudflare.com/ajax/libs/ace/1.2.0/ace.js"></script>
 
{% endblock %}
 

	
 
{% block extra_body_base %}
 
    {% analytics %}
 
    {% block extra_body %}{% endblock %}
 
{% endblock %}
pinaxcon/templates/symposion/conference/user_list.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/emails/proposal_new_message/message.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/emails/proposal_new_message/subject.txt
Show inline comments
 
deleted file
pinaxcon/templates/symposion/emails/proposal_updated/message.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/emails/proposal_updated/subject.txt
Show inline comments
 
deleted file
pinaxcon/templates/symposion/emails/speaker_addition/message.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/emails/speaker_addition/subject.txt
Show inline comments
 
deleted file
pinaxcon/templates/symposion/emails/speaker_invite/message.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/emails/speaker_invite/subject.txt
Show inline comments
 
deleted file
pinaxcon/templates/symposion/emails/speaker_no_profile/message.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/emails/speaker_no_profile/subject.txt
Show inline comments
 
deleted file
pinaxcon/templates/symposion/emails/sponsor_signup/message.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/emails/sponsor_signup/subject.txt
Show inline comments
 
deleted file
pinaxcon/templates/symposion/emails/teams_user_applied/message.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/emails/teams_user_applied/subject.txt
Show inline comments
 
deleted file
pinaxcon/templates/symposion/emails/teams_user_invited/message.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/emails/teams_user_invited/subject.txt
Show inline comments
 
deleted file
pinaxcon/templates/symposion/proposals/_pending_proposal_row.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/proposals/_proposal_fields.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/proposals/_proposal_row.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/proposals/base.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/proposals/document_create.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/proposals/proposal_cancel.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/proposals/proposal_detail.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/proposals/proposal_edit.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/proposals/proposal_leave.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/proposals/proposal_speaker_manage.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/proposals/proposal_submit.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/proposals/proposal_submit_kind.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/reviews/_result_notification_prepare_help.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/reviews/_review_table.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/reviews/access_not_permitted.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/reviews/base.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/reviews/result_notification.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/reviews/result_notification_prepare.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/reviews/review_admin.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/reviews/review_assignment.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/reviews/review_bulk_accept.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/reviews/review_comment.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/reviews/review_detail.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/reviews/review_list.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/reviews/review_review.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/reviews/review_stats.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/schedule/_edit_grid.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/schedule/_grid.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/schedule/_slot_edit.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/schedule/presentation_detail.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/schedule/schedule_conference.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/schedule/schedule_detail.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/schedule/schedule_edit.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/schedule/schedule_list.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/speakers/base.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/speakers/speaker_create.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/speakers/speaker_edit.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/speakers/speaker_profile.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/sponsorship/_horizontal_by_level.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/sponsorship/_sponsor_link.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/sponsorship/_vertical_by_level.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/sponsorship/_wall.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/sponsorship/add.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/sponsorship/apply.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/sponsorship/detail.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/sponsorship/list.html
Show inline comments
 
deleted file
pinaxcon/templates/symposion/teams/team_detail.html
Show inline comments
 
deleted file
pinaxcon/urls.py
Show inline comments
 
from django.conf import settings
 
from django.conf.urls import patterns, include, url
 
from django.conf.urls.static import static
 
from django.views.generic import TemplateView
 

	
 
from django.contrib import admin
 

	
 
import symposion.views
 

	
 

	
 
urlpatterns = [
 
    url(r"^$", TemplateView.as_view(template_name="homepage.html"), name="home"),
 

	
 
    url(r"^about$", TemplateView.as_view(template_name="pages/about.html"), name="page_about"),
 
    url(r"^venue$", TemplateView.as_view(template_name="pages/venue.html"), name="page_venue"),
 
    url(
 
        r"^sponsors/info$",
 
        TemplateView.as_view(template_name="pages/sponsors/info.html"),
 
        name="page_sponsor_info",
 
    ),
 

	
 
    url(r"^admin/", include(admin.site.urls)),
 

	
 
    url(r"^account/", include("account.urls")),
 

	
 
    url(r"^dashboard/", symposion.views.dashboard, name="dashboard"),
 

	
 
    url(r"^speaker/", include("symposion.speakers.urls")),
 
    url(r"^proposals/", include("symposion.proposals.urls")),
 
    url(r"^sponsors/", include("symposion.sponsorship.urls")),
 
    url(r"^reviews/", include("symposion.reviews.urls")),
 
    url(r"^schedule/", include("symposion.schedule.urls")),
 

	
 
    url(r"^teams/", include("symposion.teams.urls")),
 

	
 
    # Demo payment gateway and related features
 
    url(r"^register/pinaxcon/", include("pinaxcon.registrasion.urls")),
requirements.txt
Show inline comments
 
Django==1.9.2
 
pinax-theme-bootstrap==7.3.0
 
django-user-accounts==1.3.1
 
metron==1.3.7
 
pinax-eventlog==1.1.1
 
dj-static==0.0.6
 
dj-database-url==0.4.0
 
pinax-pages==0.4.2
 
pinax-boxes==2.1.2
 
django-libsass==0.7
 

	
 
# For testing
 
django-nose==1.4.3
 
coverage==4.0.3
 

	
 
# Registrasion
 
https://github.com/chrisjrn/registrasion/tarball/master#egg=registrasion
 
https://github.com/pinax/symposion/tarball/ad81810#egg=symposion
 
https://github.com/chrisjrn/registrasion-stripe/tarball/master#egg=registrasion-stripe
 
https://github.com/chrisjrn/symposion-bootstrap-templates/tarball/master#egg=symposion-bootstrap-templates
static/STATIC_README.md
Show inline comments
 
deleted file
static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.eot
Show inline comments
 
file renamed from static/dist/fonts/glyphicons-halflings-regular.eot to static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.eot
static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.svg
Show inline comments
 
file renamed from static/dist/fonts/glyphicons-halflings-regular.svg to static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.svg
static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.ttf
Show inline comments
 
file renamed from static/dist/fonts/glyphicons-halflings-regular.ttf to static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.ttf
static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.woff
Show inline comments
 
file renamed from static/dist/fonts/glyphicons-halflings-regular.woff to static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.woff
static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.woff2
Show inline comments
 
file renamed from static/dist/fonts/glyphicons-halflings-regular.woff2 to static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.woff2
static/bootstrap/images/.keep
Show inline comments
 
new file 100644
static/bootstrap/javascripts/bootstrap-sprockets.js
Show inline comments
 
new file 100644
 
//= require ./bootstrap/transition
 
//= require ./bootstrap/alert
 
//= require ./bootstrap/button
 
//= require ./bootstrap/carousel
 
//= require ./bootstrap/collapse
 
//= require ./bootstrap/dropdown
 
//= require ./bootstrap/modal
 
//= require ./bootstrap/tab
 
//= require ./bootstrap/affix
 
//= require ./bootstrap/scrollspy
 
//= require ./bootstrap/tooltip
 
//= require ./bootstrap/popover
static/bootstrap/javascripts/bootstrap.js
Show inline comments
 
new file 100644
 
/*!
 
 * Bootstrap v3.3.7 (http://getbootstrap.com)
 
 * Copyright 2011-2016 Twitter, Inc.
 
 * Licensed under the MIT license
 
 */
 

	
 
if (typeof jQuery === 'undefined') {
 
  throw new Error('Bootstrap\'s JavaScript requires jQuery')
 
}
 

	
 
+function ($) {
 
  'use strict';
 
  var version = $.fn.jquery.split(' ')[0].split('.')
 
  if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 3)) {
 
    throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4')
 
  }
 
}(jQuery);
 

	
 
/* ========================================================================
 
 * Bootstrap: transition.js v3.3.7
 
 * http://getbootstrap.com/javascript/#transitions
 
 * ========================================================================
 
 * Copyright 2011-2016 Twitter, Inc.
 
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 
 * ======================================================================== */
 

	
 

	
 
+function ($) {
 
  'use strict';
 

	
 
  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
 
  // ============================================================
 

	
 
  function transitionEnd() {
 
    var el = document.createElement('bootstrap')
 

	
 
    var transEndEventNames = {
 
      WebkitTransition : 'webkitTransitionEnd',
 
      MozTransition    : 'transitionend',
 
      OTransition      : 'oTransitionEnd otransitionend',
 
      transition       : 'transitionend'
 
    }
 

	
 
    for (var name in transEndEventNames) {
 
      if (el.style[name] !== undefined) {
 
        return { end: transEndEventNames[name] }
 
      }
 
    }
 

	
 
    return false // explicit for ie8 (  ._.)
 
  }
 

	
 
  // http://blog.alexmaccaw.com/css-transitions
 
  $.fn.emulateTransitionEnd = function (duration) {
 
    var called = false
 
    var $el = this
 
    $(this).one('bsTransitionEnd', function () { called = true })
 
    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
 
    setTimeout(callback, duration)
 
    return this
 
  }
 

	
 
  $(function () {
 
    $.support.transition = transitionEnd()
 

	
 
    if (!$.support.transition) return
 

	
 
    $.event.special.bsTransitionEnd = {
 
      bindType: $.support.transition.end,
 
      delegateType: $.support.transition.end,
 
      handle: function (e) {
 
        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
 
      }
 
    }
 
  })
 

	
 
}(jQuery);
 

	
 
/* ========================================================================
 
 * Bootstrap: alert.js v3.3.7
 
 * http://getbootstrap.com/javascript/#alerts
 
 * ========================================================================
 
 * Copyright 2011-2016 Twitter, Inc.
 
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 
 * ======================================================================== */
 

	
 

	
 
+function ($) {
 
  'use strict';
 

	
 
  // ALERT CLASS DEFINITION
 
  // ======================
 

	
 
  var dismiss = '[data-dismiss="alert"]'
 
  var Alert   = function (el) {
 
    $(el).on('click', dismiss, this.close)
 
  }
 

	
 
  Alert.VERSION = '3.3.7'
 

	
 
  Alert.TRANSITION_DURATION = 150
 

	
 
  Alert.prototype.close = function (e) {
 
    var $this    = $(this)
 
    var selector = $this.attr('data-target')
 

	
 
    if (!selector) {
 
      selector = $this.attr('href')
 
      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
 
    }
 

	
 
    var $parent = $(selector === '#' ? [] : selector)
 

	
 
    if (e) e.preventDefault()
 

	
 
    if (!$parent.length) {
 
      $parent = $this.closest('.alert')
 
    }
 

	
 
    $parent.trigger(e = $.Event('close.bs.alert'))
 

	
 
    if (e.isDefaultPrevented()) return
 

	
 
    $parent.removeClass('in')
 

	
 
    function removeElement() {
 
      // detach from parent, fire event then clean up data
 
      $parent.detach().trigger('closed.bs.alert').remove()
 
    }
 

	
 
    $.support.transition && $parent.hasClass('fade') ?
 
      $parent
 
        .one('bsTransitionEnd', removeElement)
 
        .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
 
      removeElement()
 
  }
 

	
 

	
 
  // ALERT PLUGIN DEFINITION
 
  // =======================
 

	
 
  function Plugin(option) {
 
    return this.each(function () {
 
      var $this = $(this)
 
      var data  = $this.data('bs.alert')
 

	
 
      if (!data) $this.data('bs.alert', (data = new Alert(this)))
 
      if (typeof option == 'string') data[option].call($this)
 
    })
 
  }
 

	
 
  var old = $.fn.alert
 

	
 
  $.fn.alert             = Plugin
 
  $.fn.alert.Constructor = Alert
 

	
 

	
 
  // ALERT NO CONFLICT
 
  // =================
 

	
 
  $.fn.alert.noConflict = function () {
 
    $.fn.alert = old
 
    return this
 
  }
 

	
 

	
 
  // ALERT DATA-API
 
  // ==============
 

	
 
  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
 

	
 
}(jQuery);
 

	
 
/* ========================================================================
 
 * Bootstrap: button.js v3.3.7
 
 * http://getbootstrap.com/javascript/#buttons
 
 * ========================================================================
 
 * Copyright 2011-2016 Twitter, Inc.
 
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 
 * ======================================================================== */
 

	
 

	
 
+function ($) {
 
  'use strict';
 

	
 
  // BUTTON PUBLIC CLASS DEFINITION
 
  // ==============================
 

	
 
  var Button = function (element, options) {
 
    this.$element  = $(element)
 
    this.options   = $.extend({}, Button.DEFAULTS, options)
 
    this.isLoading = false
 
  }
 

	
 
  Button.VERSION  = '3.3.7'
 

	
 
  Button.DEFAULTS = {
 
    loadingText: 'loading...'
 
  }
 

	
 
  Button.prototype.setState = function (state) {
 
    var d    = 'disabled'
 
    var $el  = this.$element
 
    var val  = $el.is('input') ? 'val' : 'html'
 
    var data = $el.data()
 

	
 
    state += 'Text'
 

	
 
    if (data.resetText == null) $el.data('resetText', $el[val]())
 

	
 
    // push to event loop to allow forms to submit
 
    setTimeout($.proxy(function () {
 
      $el[val](data[state] == null ? this.options[state] : data[state])
 

	
 
      if (state == 'loadingText') {
 
        this.isLoading = true
 
        $el.addClass(d).attr(d, d).prop(d, true)
 
      } else if (this.isLoading) {
 
        this.isLoading = false
 
        $el.removeClass(d).removeAttr(d).prop(d, false)
 
      }
 
    }, this), 0)
 
  }
 

	
 
  Button.prototype.toggle = function () {
 
    var changed = true
 
    var $parent = this.$element.closest('[data-toggle="buttons"]')
 

	
 
    if ($parent.length) {
 
      var $input = this.$element.find('input')
 
      if ($input.prop('type') == 'radio') {
 
        if ($input.prop('checked')) changed = false
 
        $parent.find('.active').removeClass('active')
 
        this.$element.addClass('active')
 
      } else if ($input.prop('type') == 'checkbox') {
 
        if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false
 
        this.$element.toggleClass('active')
 
      }
 
      $input.prop('checked', this.$element.hasClass('active'))
 
      if (changed) $input.trigger('change')
 
    } else {
 
      this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
 
      this.$element.toggleClass('active')
 
    }
 
  }
 

	
 

	
 
  // BUTTON PLUGIN DEFINITION
 
  // ========================
 

	
 
  function Plugin(option) {
 
    return this.each(function () {
 
      var $this   = $(this)
 
      var data    = $this.data('bs.button')
 
      var options = typeof option == 'object' && option
 

	
 
      if (!data) $this.data('bs.button', (data = new Button(this, options)))
 

	
 
      if (option == 'toggle') data.toggle()
 
      else if (option) data.setState(option)
 
    })
 
  }
 

	
 
  var old = $.fn.button
 

	
 
  $.fn.button             = Plugin
 
  $.fn.button.Constructor = Button
 

	
 

	
 
  // BUTTON NO CONFLICT
 
  // ==================
 

	
 
  $.fn.button.noConflict = function () {
 
    $.fn.button = old
 
    return this
 
  }
 

	
 

	
 
  // BUTTON DATA-API
 
  // ===============
 

	
 
  $(document)
 
    .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
 
      var $btn = $(e.target).closest('.btn')
 
      Plugin.call($btn, 'toggle')
 
      if (!($(e.target).is('input[type="radio"], input[type="checkbox"]'))) {
 
        // Prevent double click on radios, and the double selections (so cancellation) on checkboxes
 
        e.preventDefault()
 
        // The target component still receive the focus
 
        if ($btn.is('input,button')) $btn.trigger('focus')
 
        else $btn.find('input:visible,button:visible').first().trigger('focus')
 
      }
 
    })
 
    .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
 
      $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
 
    })
 

	
 
}(jQuery);
 

	
 
/* ========================================================================
 
 * Bootstrap: carousel.js v3.3.7
 
 * http://getbootstrap.com/javascript/#carousel
 
 * ========================================================================
 
 * Copyright 2011-2016 Twitter, Inc.
 
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 
 * ======================================================================== */
 

	
 

	
 
+function ($) {
 
  'use strict';
 

	
 
  // CAROUSEL CLASS DEFINITION
 
  // =========================
 

	
 
  var Carousel = function (element, options) {
 
    this.$element    = $(element)
 
    this.$indicators = this.$element.find('.carousel-indicators')
 
    this.options     = options
 
    this.paused      = null
 
    this.sliding     = null
 
    this.interval    = null
 
    this.$active     = null
 
    this.$items      = null
 

	
 
    this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))
 

	
 
    this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
 
      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
 
      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
 
  }
 

	
 
  Carousel.VERSION  = '3.3.7'
 

	
 
  Carousel.TRANSITION_DURATION = 600
 

	
 
  Carousel.DEFAULTS = {
 
    interval: 5000,
 
    pause: 'hover',
 
    wrap: true,
 
    keyboard: true
 
  }
 

	
 
  Carousel.prototype.keydown = function (e) {
 
    if (/input|textarea/i.test(e.target.tagName)) return
 
    switch (e.which) {
 
      case 37: this.prev(); break
 
      case 39: this.next(); break
 
      default: return
 
    }
 

	
 
    e.preventDefault()
 
  }
 

	
 
  Carousel.prototype.cycle = function (e) {
 
    e || (this.paused = false)
 

	
 
    this.interval && clearInterval(this.interval)
 

	
 
    this.options.interval
 
      && !this.paused
 
      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
 

	
 
    return this
 
  }
 

	
 
  Carousel.prototype.getItemIndex = function (item) {
 
    this.$items = item.parent().children('.item')
 
    return this.$items.index(item || this.$active)
 
  }
 

	
 
  Carousel.prototype.getItemForDirection = function (direction, active) {
 
    var activeIndex = this.getItemIndex(active)
 
    var willWrap = (direction == 'prev' && activeIndex === 0)
 
                || (direction == 'next' && activeIndex == (this.$items.length - 1))
 
    if (willWrap && !this.options.wrap) return active
 
    var delta = direction == 'prev' ? -1 : 1
 
    var itemIndex = (activeIndex + delta) % this.$items.length
 
    return this.$items.eq(itemIndex)
 
  }
 

	
 
  Carousel.prototype.to = function (pos) {
 
    var that        = this
 
    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
 

	
 
    if (pos > (this.$items.length - 1) || pos < 0) return
 

	
 
    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
 
    if (activeIndex == pos) return this.pause().cycle()
 

	
 
    return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))
 
  }
 

	
 
  Carousel.prototype.pause = function (e) {
 
    e || (this.paused = true)
 

	
 
    if (this.$element.find('.next, .prev').length && $.support.transition) {
 
      this.$element.trigger($.support.transition.end)
 
      this.cycle(true)
 
    }
 

	
 
    this.interval = clearInterval(this.interval)
 

	
 
    return this
 
  }
 

	
 
  Carousel.prototype.next = function () {
 
    if (this.sliding) return
 
    return this.slide('next')
 
  }
 

	
 
  Carousel.prototype.prev = function () {
 
    if (this.sliding) return
 
    return this.slide('prev')
 
  }
 

	
 
  Carousel.prototype.slide = function (type, next) {
 
    var $active   = this.$element.find('.item.active')
 
    var $next     = next || this.getItemForDirection(type, $active)
 
    var isCycling = this.interval
 
    var direction = type == 'next' ? 'left' : 'right'
 
    var that      = this
 

	
 
    if ($next.hasClass('active')) return (this.sliding = false)
 

	
 
    var relatedTarget = $next[0]
 
    var slideEvent = $.Event('slide.bs.carousel', {
 
      relatedTarget: relatedTarget,
 
      direction: direction
 
    })
 
    this.$element.trigger(slideEvent)
 
    if (slideEvent.isDefaultPrevented()) return
 

	
 
    this.sliding = true
 

	
 
    isCycling && this.pause()
 

	
 
    if (this.$indicators.length) {
 
      this.$indicators.find('.active').removeClass('active')
 
      var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
 
      $nextIndicator && $nextIndicator.addClass('active')
 
    }
 

	
 
    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
 
    if ($.support.transition && this.$element.hasClass('slide')) {
 
      $next.addClass(type)
 
      $next[0].offsetWidth // force reflow
 
      $active.addClass(direction)
 
      $next.addClass(direction)
 
      $active
 
        .one('bsTransitionEnd', function () {
 
          $next.removeClass([type, direction].join(' ')).addClass('active')
 
          $active.removeClass(['active', direction].join(' '))
 
          that.sliding = false
 
          setTimeout(function () {
 
            that.$element.trigger(slidEvent)
 
          }, 0)
 
        })
 
        .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
 
    } else {
 
      $active.removeClass('active')
 
      $next.addClass('active')
 
      this.sliding = false
 
      this.$element.trigger(slidEvent)
 
    }
 

	
 
    isCycling && this.cycle()
 

	
 
    return this
 
  }
 

	
 

	
 
  // CAROUSEL PLUGIN DEFINITION
 
  // ==========================
 

	
 
  function Plugin(option) {
 
    return this.each(function () {
 
      var $this   = $(this)
 
      var data    = $this.data('bs.carousel')
 
      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
 
      var action  = typeof option == 'string' ? option : options.slide
 

	
 
      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
 
      if (typeof option == 'number') data.to(option)
 
      else if (action) data[action]()
 
      else if (options.interval) data.pause().cycle()
 
    })
 
  }
 

	
 
  var old = $.fn.carousel
 

	
 
  $.fn.carousel             = Plugin
 
  $.fn.carousel.Constructor = Carousel
 

	
 

	
 
  // CAROUSEL NO CONFLICT
 
  // ====================
 

	
 
  $.fn.carousel.noConflict = function () {
 
    $.fn.carousel = old
 
    return this
 
  }
 

	
 

	
 
  // CAROUSEL DATA-API
 
  // =================
 

	
 
  var clickHandler = function (e) {
 
    var href
 
    var $this   = $(this)
 
    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
 
    if (!$target.hasClass('carousel')) return
 
    var options = $.extend({}, $target.data(), $this.data())
 
    var slideIndex = $this.attr('data-slide-to')
 
    if (slideIndex) options.interval = false
 

	
 
    Plugin.call($target, options)
 

	
 
    if (slideIndex) {
 
      $target.data('bs.carousel').to(slideIndex)
 
    }
 

	
 
    e.preventDefault()
 
  }
 

	
 
  $(document)
 
    .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
 
    .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)
 

	
 
  $(window).on('load', function () {
 
    $('[data-ride="carousel"]').each(function () {
 
      var $carousel = $(this)
 
      Plugin.call($carousel, $carousel.data())
 
    })
 
  })
 

	
 
}(jQuery);
 

	
 
/* ========================================================================
 
 * Bootstrap: collapse.js v3.3.7
 
 * http://getbootstrap.com/javascript/#collapse
 
 * ========================================================================
 
 * Copyright 2011-2016 Twitter, Inc.
 
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 
 * ======================================================================== */
 

	
 
/* jshint latedef: false */
 

	
 
+function ($) {
 
  'use strict';
 

	
 
  // COLLAPSE PUBLIC CLASS DEFINITION
 
  // ================================
 

	
 
  var Collapse = function (element, options) {
 
    this.$element      = $(element)
 
    this.options       = $.extend({}, Collapse.DEFAULTS, options)
 
    this.$trigger      = $('[data-toggle="collapse"][href="#' + element.id + '"],' +
 
                           '[data-toggle="collapse"][data-target="#' + element.id + '"]')
 
    this.transitioning = null
 

	
 
    if (this.options.parent) {
 
      this.$parent = this.getParent()
 
    } else {
 
      this.addAriaAndCollapsedClass(this.$element, this.$trigger)
 
    }
 

	
 
    if (this.options.toggle) this.toggle()
 
  }
 

	
 
  Collapse.VERSION  = '3.3.7'
 

	
 
  Collapse.TRANSITION_DURATION = 350
 

	
 
  Collapse.DEFAULTS = {
 
    toggle: true
 
  }
 

	
 
  Collapse.prototype.dimension = function () {
 
    var hasWidth = this.$element.hasClass('width')
 
    return hasWidth ? 'width' : 'height'
 
  }
 

	
 
  Collapse.prototype.show = function () {
 
    if (this.transitioning || this.$element.hasClass('in')) return
 

	
 
    var activesData
 
    var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')
 

	
 
    if (actives && actives.length) {
 
      activesData = actives.data('bs.collapse')
 
      if (activesData && activesData.transitioning) return
 
    }
 

	
 
    var startEvent = $.Event('show.bs.collapse')
 
    this.$element.trigger(startEvent)
 
    if (startEvent.isDefaultPrevented()) return
 

	
 
    if (actives && actives.length) {
 
      Plugin.call(actives, 'hide')
 
      activesData || actives.data('bs.collapse', null)
 
    }
 

	
 
    var dimension = this.dimension()
 

	
 
    this.$element
 
      .removeClass('collapse')
 
      .addClass('collapsing')[dimension](0)
 
      .attr('aria-expanded', true)
 

	
 
    this.$trigger
 
      .removeClass('collapsed')
 
      .attr('aria-expanded', true)
 

	
 
    this.transitioning = 1
 

	
 
    var complete = function () {
 
      this.$element
 
        .removeClass('collapsing')
 
        .addClass('collapse in')[dimension]('')
 
      this.transitioning = 0
 
      this.$element
 
        .trigger('shown.bs.collapse')
 
    }
 

	
 
    if (!$.support.transition) return complete.call(this)
 

	
 
    var scrollSize = $.camelCase(['scroll', dimension].join('-'))
 

	
 
    this.$element
 
      .one('bsTransitionEnd', $.proxy(complete, this))
 
      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
 
  }
 

	
 
  Collapse.prototype.hide = function () {
 
    if (this.transitioning || !this.$element.hasClass('in')) return
 

	
 
    var startEvent = $.Event('hide.bs.collapse')
 
    this.$element.trigger(startEvent)
 
    if (startEvent.isDefaultPrevented()) return
 

	
 
    var dimension = this.dimension()
 

	
 
    this.$element[dimension](this.$element[dimension]())[0].offsetHeight
 

	
 
    this.$element
 
      .addClass('collapsing')
 
      .removeClass('collapse in')
 
      .attr('aria-expanded', false)
 

	
 
    this.$trigger
 
      .addClass('collapsed')
 
      .attr('aria-expanded', false)
 

	
 
    this.transitioning = 1
 

	
 
    var complete = function () {
 
      this.transitioning = 0
 
      this.$element
 
        .removeClass('collapsing')
 
        .addClass('collapse')
 
        .trigger('hidden.bs.collapse')
 
    }
 

	
 
    if (!$.support.transition) return complete.call(this)
 

	
 
    this.$element
 
      [dimension](0)
 
      .one('bsTransitionEnd', $.proxy(complete, this))
 
      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
 
  }
 

	
 
  Collapse.prototype.toggle = function () {
 
    this[this.$element.hasClass('in') ? 'hide' : 'show']()
 
  }
 

	
 
  Collapse.prototype.getParent = function () {
 
    return $(this.options.parent)
 
      .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
 
      .each($.proxy(function (i, element) {
 
        var $element = $(element)
 
        this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
 
      }, this))
 
      .end()
 
  }
 

	
 
  Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
 
    var isOpen = $element.hasClass('in')
 

	
 
    $element.attr('aria-expanded', isOpen)
 
    $trigger
 
      .toggleClass('collapsed', !isOpen)
 
      .attr('aria-expanded', isOpen)
 
  }
 

	
 
  function getTargetFromTrigger($trigger) {
 
    var href
 
    var target = $trigger.attr('data-target')
 
      || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
 

	
 
    return $(target)
 
  }
 

	
 

	
 
  // COLLAPSE PLUGIN DEFINITION
 
  // ==========================
 

	
 
  function Plugin(option) {
 
    return this.each(function () {
 
      var $this   = $(this)
 
      var data    = $this.data('bs.collapse')
 
      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
 

	
 
      if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false
 
      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
 
      if (typeof option == 'string') data[option]()
 
    })
 
  }
 

	
 
  var old = $.fn.collapse
 

	
 
  $.fn.collapse             = Plugin
 
  $.fn.collapse.Constructor = Collapse
 

	
 

	
 
  // COLLAPSE NO CONFLICT
 
  // ====================
 

	
 
  $.fn.collapse.noConflict = function () {
 
    $.fn.collapse = old
 
    return this
 
  }
 

	
 

	
 
  // COLLAPSE DATA-API
 
  // =================
 

	
 
  $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
 
    var $this   = $(this)
 

	
 
    if (!$this.attr('data-target')) e.preventDefault()
 

	
 
    var $target = getTargetFromTrigger($this)
 
    var data    = $target.data('bs.collapse')
 
    var option  = data ? 'toggle' : $this.data()
 

	
 
    Plugin.call($target, option)
 
  })
 

	
 
}(jQuery);
 

	
 
/* ========================================================================
 
 * Bootstrap: dropdown.js v3.3.7
 
 * http://getbootstrap.com/javascript/#dropdowns
 
 * ========================================================================
 
 * Copyright 2011-2016 Twitter, Inc.
 
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 
 * ======================================================================== */
 

	
 

	
 
+function ($) {
 
  'use strict';
 

	
 
  // DROPDOWN CLASS DEFINITION
 
  // =========================
 

	
 
  var backdrop = '.dropdown-backdrop'
 
  var toggle   = '[data-toggle="dropdown"]'
 
  var Dropdown = function (element) {
 
    $(element).on('click.bs.dropdown', this.toggle)
 
  }
 

	
 
  Dropdown.VERSION = '3.3.7'
 

	
 
  function getParent($this) {
 
    var selector = $this.attr('data-target')
 

	
 
    if (!selector) {
 
      selector = $this.attr('href')
 
      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
 
    }
 

	
 
    var $parent = selector && $(selector)
 

	
 
    return $parent && $parent.length ? $parent : $this.parent()
 
  }
 

	
 
  function clearMenus(e) {
 
    if (e && e.which === 3) return
 
    $(backdrop).remove()
 
    $(toggle).each(function () {
 
      var $this         = $(this)
 
      var $parent       = getParent($this)
 
      var relatedTarget = { relatedTarget: this }
 

	
 
      if (!$parent.hasClass('open')) return
 

	
 
      if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return
 

	
 
      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
 

	
 
      if (e.isDefaultPrevented()) return
 

	
 
      $this.attr('aria-expanded', 'false')
 
      $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))
 
    })
 
  }
 

	
 
  Dropdown.prototype.toggle = function (e) {
 
    var $this = $(this)
 

	
 
    if ($this.is('.disabled, :disabled')) return
 

	
 
    var $parent  = getParent($this)
 
    var isActive = $parent.hasClass('open')
 

	
 
    clearMenus()
 

	
 
    if (!isActive) {
 
      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
 
        // if mobile we use a backdrop because click events don't delegate
 
        $(document.createElement('div'))
 
          .addClass('dropdown-backdrop')
 
          .insertAfter($(this))
 
          .on('click', clearMenus)
 
      }
 

	
 
      var relatedTarget = { relatedTarget: this }
 
      $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
 

	
 
      if (e.isDefaultPrevented()) return
 

	
 
      $this
 
        .trigger('focus')
 
        .attr('aria-expanded', 'true')
 

	
 
      $parent
 
        .toggleClass('open')
 
        .trigger($.Event('shown.bs.dropdown', relatedTarget))
 
    }
 

	
 
    return false
 
  }
 

	
 
  Dropdown.prototype.keydown = function (e) {
 
    if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return
 

	
 
    var $this = $(this)
 

	
 
    e.preventDefault()
 
    e.stopPropagation()
 

	
 
    if ($this.is('.disabled, :disabled')) return
 

	
 
    var $parent  = getParent($this)
 
    var isActive = $parent.hasClass('open')
 

	
 
    if (!isActive && e.which != 27 || isActive && e.which == 27) {
 
      if (e.which == 27) $parent.find(toggle).trigger('focus')
 
      return $this.trigger('click')
 
    }
 

	
 
    var desc = ' li:not(.disabled):visible a'
 
    var $items = $parent.find('.dropdown-menu' + desc)
 

	
 
    if (!$items.length) return
 

	
 
    var index = $items.index(e.target)
 

	
 
    if (e.which == 38 && index > 0)                 index--         // up
 
    if (e.which == 40 && index < $items.length - 1) index++         // down
 
    if (!~index)                                    index = 0
 

	
 
    $items.eq(index).trigger('focus')
 
  }
 

	
 

	
 
  // DROPDOWN PLUGIN DEFINITION
 
  // ==========================
 

	
 
  function Plugin(option) {
 
    return this.each(function () {
 
      var $this = $(this)
 
      var data  = $this.data('bs.dropdown')
 

	
 
      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
 
      if (typeof option == 'string') data[option].call($this)
 
    })
 
  }
 

	
 
  var old = $.fn.dropdown
 

	
 
  $.fn.dropdown             = Plugin
 
  $.fn.dropdown.Constructor = Dropdown
 

	
 

	
 
  // DROPDOWN NO CONFLICT
 
  // ====================
 

	
 
  $.fn.dropdown.noConflict = function () {
 
    $.fn.dropdown = old
 
    return this
 
  }
 

	
 

	
 
  // APPLY TO STANDARD DROPDOWN ELEMENTS
 
  // ===================================
 

	
 
  $(document)
 
    .on('click.bs.dropdown.data-api', clearMenus)
 
    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
 
    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
 
    .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
 
    .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)
 

	
 
}(jQuery);
 

	
 
/* ========================================================================
 
 * Bootstrap: modal.js v3.3.7
 
 * http://getbootstrap.com/javascript/#modals
 
 * ========================================================================
 
 * Copyright 2011-2016 Twitter, Inc.
 
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 
 * ======================================================================== */
 

	
 

	
 
+function ($) {
 
  'use strict';
 

	
 
  // MODAL CLASS DEFINITION
 
  // ======================
 

	
 
  var Modal = function (element, options) {
 
    this.options             = options
 
    this.$body               = $(document.body)
 
    this.$element            = $(element)
 
    this.$dialog             = this.$element.find('.modal-dialog')
 
    this.$backdrop           = null
 
    this.isShown             = null
 
    this.originalBodyPad     = null
 
    this.scrollbarWidth      = 0
 
    this.ignoreBackdropClick = false
 

	
 
    if (this.options.remote) {
 
      this.$element
 
        .find('.modal-content')
 
        .load(this.options.remote, $.proxy(function () {
 
          this.$element.trigger('loaded.bs.modal')
 
        }, this))
 
    }
 
  }
 

	
 
  Modal.VERSION  = '3.3.7'
 

	
 
  Modal.TRANSITION_DURATION = 300
 
  Modal.BACKDROP_TRANSITION_DURATION = 150
 

	
 
  Modal.DEFAULTS = {
 
    backdrop: true,
 
    keyboard: true,
 
    show: true
 
  }
 

	
 
  Modal.prototype.toggle = function (_relatedTarget) {
 
    return this.isShown ? this.hide() : this.show(_relatedTarget)
 
  }
 

	
 
  Modal.prototype.show = function (_relatedTarget) {
 
    var that = this
 
    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
 

	
 
    this.$element.trigger(e)
 

	
 
    if (this.isShown || e.isDefaultPrevented()) return
 

	
 
    this.isShown = true
 

	
 
    this.checkScrollbar()
 
    this.setScrollbar()
 
    this.$body.addClass('modal-open')
 

	
 
    this.escape()
 
    this.resize()
 

	
 
    this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
 

	
 
    this.$dialog.on('mousedown.dismiss.bs.modal', function () {
 
      that.$element.one('mouseup.dismiss.bs.modal', function (e) {
 
        if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
 
      })
 
    })
 

	
 
    this.backdrop(function () {
 
      var transition = $.support.transition && that.$element.hasClass('fade')
 

	
 
      if (!that.$element.parent().length) {
 
        that.$element.appendTo(that.$body) // don't move modals dom position
 
      }
 

	
 
      that.$element
 
        .show()
 
        .scrollTop(0)
 

	
 
      that.adjustDialog()
 

	
 
      if (transition) {
 
        that.$element[0].offsetWidth // force reflow
 
      }
 

	
 
      that.$element.addClass('in')
 

	
 
      that.enforceFocus()
 

	
 
      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
 

	
 
      transition ?
 
        that.$dialog // wait for modal to slide in
 
          .one('bsTransitionEnd', function () {
 
            that.$element.trigger('focus').trigger(e)
 
          })
 
          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
 
        that.$element.trigger('focus').trigger(e)
 
    })
 
  }
 

	
 
  Modal.prototype.hide = function (e) {
 
    if (e) e.preventDefault()
 

	
 
    e = $.Event('hide.bs.modal')
 

	
 
    this.$element.trigger(e)
 

	
 
    if (!this.isShown || e.isDefaultPrevented()) return
 

	
 
    this.isShown = false
 

	
 
    this.escape()
 
    this.resize()
 

	
 
    $(document).off('focusin.bs.modal')
 

	
 
    this.$element
 
      .removeClass('in')
 
      .off('click.dismiss.bs.modal')
 
      .off('mouseup.dismiss.bs.modal')
 

	
 
    this.$dialog.off('mousedown.dismiss.bs.modal')
 

	
 
    $.support.transition && this.$element.hasClass('fade') ?
 
      this.$element
 
        .one('bsTransitionEnd', $.proxy(this.hideModal, this))
 
        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
 
      this.hideModal()
 
  }
 

	
 
  Modal.prototype.enforceFocus = function () {
 
    $(document)
 
      .off('focusin.bs.modal') // guard against infinite focus loop
 
      .on('focusin.bs.modal', $.proxy(function (e) {
 
        if (document !== e.target &&
 
            this.$element[0] !== e.target &&
 
            !this.$element.has(e.target).length) {
 
          this.$element.trigger('focus')
 
        }
 
      }, this))
 
  }
 

	
 
  Modal.prototype.escape = function () {
 
    if (this.isShown && this.options.keyboard) {
 
      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
 
        e.which == 27 && this.hide()
 
      }, this))
 
    } else if (!this.isShown) {
 
      this.$element.off('keydown.dismiss.bs.modal')
 
    }
 
  }
 

	
 
  Modal.prototype.resize = function () {
 
    if (this.isShown) {
 
      $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
 
    } else {
 
      $(window).off('resize.bs.modal')
 
    }
 
  }
 

	
 
  Modal.prototype.hideModal = function () {
 
    var that = this
 
    this.$element.hide()
 
    this.backdrop(function () {
 
      that.$body.removeClass('modal-open')
 
      that.resetAdjustments()
 
      that.resetScrollbar()
 
      that.$element.trigger('hidden.bs.modal')
 
    })
 
  }
 

	
 
  Modal.prototype.removeBackdrop = function () {
 
    this.$backdrop && this.$backdrop.remove()
 
    this.$backdrop = null
 
  }
 

	
 
  Modal.prototype.backdrop = function (callback) {
 
    var that = this
 
    var animate = this.$element.hasClass('fade') ? 'fade' : ''
 

	
 
    if (this.isShown && this.options.backdrop) {
 
      var doAnimate = $.support.transition && animate
 

	
 
      this.$backdrop = $(document.createElement('div'))
 
        .addClass('modal-backdrop ' + animate)
 
        .appendTo(this.$body)
 

	
 
      this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
 
        if (this.ignoreBackdropClick) {
 
          this.ignoreBackdropClick = false
 
          return
 
        }
 
        if (e.target !== e.currentTarget) return
 
        this.options.backdrop == 'static'
 
          ? this.$element[0].focus()
 
          : this.hide()
 
      }, this))
 

	
 
      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
 

	
 
      this.$backdrop.addClass('in')
 

	
 
      if (!callback) return
 

	
 
      doAnimate ?
 
        this.$backdrop
 
          .one('bsTransitionEnd', callback)
 
          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
 
        callback()
 

	
 
    } else if (!this.isShown && this.$backdrop) {
 
      this.$backdrop.removeClass('in')
 

	
 
      var callbackRemove = function () {
 
        that.removeBackdrop()
 
        callback && callback()
 
      }
 
      $.support.transition && this.$element.hasClass('fade') ?
 
        this.$backdrop
 
          .one('bsTransitionEnd', callbackRemove)
 
          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
 
        callbackRemove()
 

	
 
    } else if (callback) {
 
      callback()
 
    }
 
  }
 

	
 
  // these following methods are used to handle overflowing modals
 

	
 
  Modal.prototype.handleUpdate = function () {
 
    this.adjustDialog()
 
  }
 

	
 
  Modal.prototype.adjustDialog = function () {
 
    var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
 

	
 
    this.$element.css({
 
      paddingLeft:  !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
 
      paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
 
    })
 
  }
 

	
 
  Modal.prototype.resetAdjustments = function () {
 
    this.$element.css({
 
      paddingLeft: '',
 
      paddingRight: ''
 
    })
 
  }
 

	
 
  Modal.prototype.checkScrollbar = function () {
 
    var fullWindowWidth = window.innerWidth
 
    if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
 
      var documentElementRect = document.documentElement.getBoundingClientRect()
 
      fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
 
    }
 
    this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
 
    this.scrollbarWidth = this.measureScrollbar()
 
  }
 

	
 
  Modal.prototype.setScrollbar = function () {
 
    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
 
    this.originalBodyPad = document.body.style.paddingRight || ''
 
    if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
 
  }
 

	
 
  Modal.prototype.resetScrollbar = function () {
 
    this.$body.css('padding-right', this.originalBodyPad)
 
  }
 

	
 
  Modal.prototype.measureScrollbar = function () { // thx walsh
 
    var scrollDiv = document.createElement('div')
 
    scrollDiv.className = 'modal-scrollbar-measure'
 
    this.$body.append(scrollDiv)
 
    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
 
    this.$body[0].removeChild(scrollDiv)
 
    return scrollbarWidth
 
  }
 

	
 

	
 
  // MODAL PLUGIN DEFINITION
 
  // =======================
 

	
 
  function Plugin(option, _relatedTarget) {
 
    return this.each(function () {
 
      var $this   = $(this)
 
      var data    = $this.data('bs.modal')
 
      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
 

	
 
      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
 
      if (typeof option == 'string') data[option](_relatedTarget)
 
      else if (options.show) data.show(_relatedTarget)
 
    })
 
  }
 

	
 
  var old = $.fn.modal
 

	
 
  $.fn.modal             = Plugin
 
  $.fn.modal.Constructor = Modal
 

	
 

	
 
  // MODAL NO CONFLICT
 
  // =================
 

	
 
  $.fn.modal.noConflict = function () {
 
    $.fn.modal = old
 
    return this
 
  }
 

	
 

	
 
  // MODAL DATA-API
 
  // ==============
 

	
 
  $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
 
    var $this   = $(this)
 
    var href    = $this.attr('href')
 
    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
 
    var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
 

	
 
    if ($this.is('a')) e.preventDefault()
 

	
 
    $target.one('show.bs.modal', function (showEvent) {
 
      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
 
      $target.one('hidden.bs.modal', function () {
 
        $this.is(':visible') && $this.trigger('focus')
 
      })
 
    })
 
    Plugin.call($target, option, this)
 
  })
 

	
 
}(jQuery);
 

	
 
/* ========================================================================
 
 * Bootstrap: tooltip.js v3.3.7
 
 * http://getbootstrap.com/javascript/#tooltip
 
 * Inspired by the original jQuery.tipsy by Jason Frame
 
 * ========================================================================
 
 * Copyright 2011-2016 Twitter, Inc.
 
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 
 * ======================================================================== */
 

	
 

	
 
+function ($) {
 
  'use strict';
 

	
 
  // TOOLTIP PUBLIC CLASS DEFINITION
 
  // ===============================
 

	
 
  var Tooltip = function (element, options) {
 
    this.type       = null
 
    this.options    = null
 
    this.enabled    = null
 
    this.timeout    = null
 
    this.hoverState = null
 
    this.$element   = null
 
    this.inState    = null
 

	
 
    this.init('tooltip', element, options)
 
  }
 

	
 
  Tooltip.VERSION  = '3.3.7'
 

	
 
  Tooltip.TRANSITION_DURATION = 150
 

	
 
  Tooltip.DEFAULTS = {
 
    animation: true,
 
    placement: 'top',
 
    selector: false,
 
    template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
 
    trigger: 'hover focus',
 
    title: '',
 
    delay: 0,
 
    html: false,
 
    container: false,
 
    viewport: {
 
      selector: 'body',
 
      padding: 0
 
    }
 
  }
 

	
 
  Tooltip.prototype.init = function (type, element, options) {
 
    this.enabled   = true
 
    this.type      = type
 
    this.$element  = $(element)
 
    this.options   = this.getOptions(options)
 
    this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))
 
    this.inState   = { click: false, hover: false, focus: false }
 

	
 
    if (this.$element[0] instanceof document.constructor && !this.options.selector) {
 
      throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')
 
    }
 

	
 
    var triggers = this.options.trigger.split(' ')
 

	
 
    for (var i = triggers.length; i--;) {
 
      var trigger = triggers[i]
 

	
 
      if (trigger == 'click') {
 
        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
 
      } else if (trigger != 'manual') {
 
        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'
 
        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
 

	
 
        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
 
        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
 
      }
 
    }
 

	
 
    this.options.selector ?
 
      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
 
      this.fixTitle()
 
  }
 

	
 
  Tooltip.prototype.getDefaults = function () {
 
    return Tooltip.DEFAULTS
 
  }
 

	
 
  Tooltip.prototype.getOptions = function (options) {
 
    options = $.extend({}, this.getDefaults(), this.$element.data(), options)
 

	
 
    if (options.delay && typeof options.delay == 'number') {
 
      options.delay = {
 
        show: options.delay,
 
        hide: options.delay
 
      }
 
    }
 

	
 
    return options
 
  }
 

	
 
  Tooltip.prototype.getDelegateOptions = function () {
 
    var options  = {}
 
    var defaults = this.getDefaults()
 

	
 
    this._options && $.each(this._options, function (key, value) {
 
      if (defaults[key] != value) options[key] = value
 
    })
 

	
 
    return options
 
  }
 

	
 
  Tooltip.prototype.enter = function (obj) {
 
    var self = obj instanceof this.constructor ?
 
      obj : $(obj.currentTarget).data('bs.' + this.type)
 

	
 
    if (!self) {
 
      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
 
      $(obj.currentTarget).data('bs.' + this.type, self)
 
    }
 

	
 
    if (obj instanceof $.Event) {
 
      self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true
 
    }
 

	
 
    if (self.tip().hasClass('in') || self.hoverState == 'in') {
 
      self.hoverState = 'in'
 
      return
 
    }
 

	
 
    clearTimeout(self.timeout)
 

	
 
    self.hoverState = 'in'
 

	
 
    if (!self.options.delay || !self.options.delay.show) return self.show()
 

	
 
    self.timeout = setTimeout(function () {
 
      if (self.hoverState == 'in') self.show()
 
    }, self.options.delay.show)
 
  }
 

	
 
  Tooltip.prototype.isInStateTrue = function () {
 
    for (var key in this.inState) {
 
      if (this.inState[key]) return true
 
    }
 

	
 
    return false
 
  }
 

	
 
  Tooltip.prototype.leave = function (obj) {
 
    var self = obj instanceof this.constructor ?
 
      obj : $(obj.currentTarget).data('bs.' + this.type)
 

	
 
    if (!self) {
 
      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
 
      $(obj.currentTarget).data('bs.' + this.type, self)
 
    }
 

	
 
    if (obj instanceof $.Event) {
 
      self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false
 
    }
 

	
 
    if (self.isInStateTrue()) return
 

	
 
    clearTimeout(self.timeout)
 

	
 
    self.hoverState = 'out'
 

	
 
    if (!self.options.delay || !self.options.delay.hide) return self.hide()
 

	
 
    self.timeout = setTimeout(function () {
 
      if (self.hoverState == 'out') self.hide()
 
    }, self.options.delay.hide)
 
  }
 

	
 
  Tooltip.prototype.show = function () {
 
    var e = $.Event('show.bs.' + this.type)
 

	
 
    if (this.hasContent() && this.enabled) {
 
      this.$element.trigger(e)
 

	
 
      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
 
      if (e.isDefaultPrevented() || !inDom) return
 
      var that = this
 

	
 
      var $tip = this.tip()
 

	
 
      var tipId = this.getUID(this.type)
 

	
 
      this.setContent()
 
      $tip.attr('id', tipId)
 
      this.$element.attr('aria-describedby', tipId)
 

	
 
      if (this.options.animation) $tip.addClass('fade')
 

	
 
      var placement = typeof this.options.placement == 'function' ?
 
        this.options.placement.call(this, $tip[0], this.$element[0]) :
 
        this.options.placement
 

	
 
      var autoToken = /\s?auto?\s?/i
 
      var autoPlace = autoToken.test(placement)
 
      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
 

	
 
      $tip
 
        .detach()
 
        .css({ top: 0, left: 0, display: 'block' })
 
        .addClass(placement)
 
        .data('bs.' + this.type, this)
 

	
 
      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
 
      this.$element.trigger('inserted.bs.' + this.type)
 

	
 
      var pos          = this.getPosition()
 
      var actualWidth  = $tip[0].offsetWidth
 
      var actualHeight = $tip[0].offsetHeight
 

	
 
      if (autoPlace) {
 
        var orgPlacement = placement
 
        var viewportDim = this.getPosition(this.$viewport)
 

	
 
        placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top'    :
 
                    placement == 'top'    && pos.top    - actualHeight < viewportDim.top    ? 'bottom' :
 
                    placement == 'right'  && pos.right  + actualWidth  > viewportDim.width  ? 'left'   :
 
                    placement == 'left'   && pos.left   - actualWidth  < viewportDim.left   ? 'right'  :
 
                    placement
 

	
 
        $tip
 
          .removeClass(orgPlacement)
 
          .addClass(placement)
 
      }
 

	
 
      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
 

	
 
      this.applyPlacement(calculatedOffset, placement)
 

	
 
      var complete = function () {
 
        var prevHoverState = that.hoverState
 
        that.$element.trigger('shown.bs.' + that.type)
 
        that.hoverState = null
 

	
 
        if (prevHoverState == 'out') that.leave(that)
 
      }
 

	
 
      $.support.transition && this.$tip.hasClass('fade') ?
 
        $tip
 
          .one('bsTransitionEnd', complete)
 
          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
 
        complete()
 
    }
 
  }
 

	
 
  Tooltip.prototype.applyPlacement = function (offset, placement) {
 
    var $tip   = this.tip()
 
    var width  = $tip[0].offsetWidth
 
    var height = $tip[0].offsetHeight
 

	
 
    // manually read margins because getBoundingClientRect includes difference
 
    var marginTop = parseInt($tip.css('margin-top'), 10)
 
    var marginLeft = parseInt($tip.css('margin-left'), 10)
 

	
 
    // we must check for NaN for ie 8/9
 
    if (isNaN(marginTop))  marginTop  = 0
 
    if (isNaN(marginLeft)) marginLeft = 0
 

	
 
    offset.top  += marginTop
 
    offset.left += marginLeft
 

	
 
    // $.fn.offset doesn't round pixel values
 
    // so we use setOffset directly with our own function B-0
 
    $.offset.setOffset($tip[0], $.extend({
 
      using: function (props) {
 
        $tip.css({
 
          top: Math.round(props.top),
 
          left: Math.round(props.left)
 
        })
 
      }
 
    }, offset), 0)
 

	
 
    $tip.addClass('in')
 

	
 
    // check to see if placing tip in new offset caused the tip to resize itself
 
    var actualWidth  = $tip[0].offsetWidth
 
    var actualHeight = $tip[0].offsetHeight
 

	
 
    if (placement == 'top' && actualHeight != height) {
 
      offset.top = offset.top + height - actualHeight
 
    }
 

	
 
    var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
 

	
 
    if (delta.left) offset.left += delta.left
 
    else offset.top += delta.top
 

	
 
    var isVertical          = /top|bottom/.test(placement)
 
    var arrowDelta          = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
 
    var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'
 

	
 
    $tip.offset(offset)
 
    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
 
  }
 

	
 
  Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
 
    this.arrow()
 
      .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
 
      .css(isVertical ? 'top' : 'left', '')
 
  }
 

	
 
  Tooltip.prototype.setContent = function () {
 
    var $tip  = this.tip()
 
    var title = this.getTitle()
 

	
 
    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
 
    $tip.removeClass('fade in top bottom left right')
 
  }
 

	
 
  Tooltip.prototype.hide = function (callback) {
 
    var that = this
 
    var $tip = $(this.$tip)
 
    var e    = $.Event('hide.bs.' + this.type)
 

	
 
    function complete() {
 
      if (that.hoverState != 'in') $tip.detach()
 
      if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary.
 
        that.$element
 
          .removeAttr('aria-describedby')
 
          .trigger('hidden.bs.' + that.type)
 
      }
 
      callback && callback()
 
    }
 

	
 
    this.$element.trigger(e)
 

	
 
    if (e.isDefaultPrevented()) return
 

	
 
    $tip.removeClass('in')
 

	
 
    $.support.transition && $tip.hasClass('fade') ?
 
      $tip
 
        .one('bsTransitionEnd', complete)
 
        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
 
      complete()
 

	
 
    this.hoverState = null
 

	
 
    return this
 
  }
 

	
 
  Tooltip.prototype.fixTitle = function () {
 
    var $e = this.$element
 
    if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {
 
      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
 
    }
 
  }
 

	
 
  Tooltip.prototype.hasContent = function () {
 
    return this.getTitle()
 
  }
 

	
 
  Tooltip.prototype.getPosition = function ($element) {
 
    $element   = $element || this.$element
 

	
 
    var el     = $element[0]
 
    var isBody = el.tagName == 'BODY'
 

	
 
    var elRect    = el.getBoundingClientRect()
 
    if (elRect.width == null) {
 
      // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
 
      elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
 
    }
 
    var isSvg = window.SVGElement && el instanceof window.SVGElement
 
    // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3.
 
    // See https://github.com/twbs/bootstrap/issues/20280
 
    var elOffset  = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset())
 
    var scroll    = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
 
    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
 

	
 
    return $.extend({}, elRect, scroll, outerDims, elOffset)
 
  }
 

	
 
  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
 
    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2 } :
 
           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
 
           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
 
        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
 

	
 
  }
 

	
 
  Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
 
    var delta = { top: 0, left: 0 }
 
    if (!this.$viewport) return delta
 

	
 
    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
 
    var viewportDimensions = this.getPosition(this.$viewport)
 

	
 
    if (/right|left/.test(placement)) {
 
      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll
 
      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
 
      if (topEdgeOffset < viewportDimensions.top) { // top overflow
 
        delta.top = viewportDimensions.top - topEdgeOffset
 
      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
 
        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
 
      }
 
    } else {
 
      var leftEdgeOffset  = pos.left - viewportPadding
 
      var rightEdgeOffset = pos.left + viewportPadding + actualWidth
 
      if (leftEdgeOffset < viewportDimensions.left) { // left overflow
 
        delta.left = viewportDimensions.left - leftEdgeOffset
 
      } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow
 
        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
 
      }
 
    }
 

	
 
    return delta
 
  }
 

	
 
  Tooltip.prototype.getTitle = function () {
 
    var title
 
    var $e = this.$element
 
    var o  = this.options
 

	
 
    title = $e.attr('data-original-title')
 
      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
 

	
 
    return title
 
  }
 

	
 
  Tooltip.prototype.getUID = function (prefix) {
 
    do prefix += ~~(Math.random() * 1000000)
 
    while (document.getElementById(prefix))
 
    return prefix
 
  }
 

	
 
  Tooltip.prototype.tip = function () {
 
    if (!this.$tip) {
 
      this.$tip = $(this.options.template)
 
      if (this.$tip.length != 1) {
 
        throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')
 
      }
 
    }
 
    return this.$tip
 
  }
 

	
 
  Tooltip.prototype.arrow = function () {
 
    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
 
  }
 

	
 
  Tooltip.prototype.enable = function () {
 
    this.enabled = true
 
  }
 

	
 
  Tooltip.prototype.disable = function () {
 
    this.enabled = false
 
  }
 

	
 
  Tooltip.prototype.toggleEnabled = function () {
 
    this.enabled = !this.enabled
 
  }
 

	
 
  Tooltip.prototype.toggle = function (e) {
 
    var self = this
 
    if (e) {
 
      self = $(e.currentTarget).data('bs.' + this.type)
 
      if (!self) {
 
        self = new this.constructor(e.currentTarget, this.getDelegateOptions())
 
        $(e.currentTarget).data('bs.' + this.type, self)
 
      }
 
    }
 

	
 
    if (e) {
 
      self.inState.click = !self.inState.click
 
      if (self.isInStateTrue()) self.enter(self)
 
      else self.leave(self)
 
    } else {
 
      self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
 
    }
 
  }
 

	
 
  Tooltip.prototype.destroy = function () {
 
    var that = this
 
    clearTimeout(this.timeout)
 
    this.hide(function () {
 
      that.$element.off('.' + that.type).removeData('bs.' + that.type)
 
      if (that.$tip) {
 
        that.$tip.detach()
 
      }
 
      that.$tip = null
 
      that.$arrow = null
 
      that.$viewport = null
 
      that.$element = null
 
    })
 
  }
 

	
 

	
 
  // TOOLTIP PLUGIN DEFINITION
 
  // =========================
 

	
 
  function Plugin(option) {
 
    return this.each(function () {
 
      var $this   = $(this)
 
      var data    = $this.data('bs.tooltip')
 
      var options = typeof option == 'object' && option
 

	
 
      if (!data && /destroy|hide/.test(option)) return
 
      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
 
      if (typeof option == 'string') data[option]()
 
    })
 
  }
 

	
 
  var old = $.fn.tooltip
 

	
 
  $.fn.tooltip             = Plugin
 
  $.fn.tooltip.Constructor = Tooltip
 

	
 

	
 
  // TOOLTIP NO CONFLICT
 
  // ===================
 

	
 
  $.fn.tooltip.noConflict = function () {
 
    $.fn.tooltip = old
 
    return this
 
  }
 

	
 
}(jQuery);
 

	
 
/* ========================================================================
 
 * Bootstrap: popover.js v3.3.7
 
 * http://getbootstrap.com/javascript/#popovers
 
 * ========================================================================
 
 * Copyright 2011-2016 Twitter, Inc.
 
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 
 * ======================================================================== */
 

	
 

	
 
+function ($) {
 
  'use strict';
 

	
 
  // POPOVER PUBLIC CLASS DEFINITION
 
  // ===============================
 

	
 
  var Popover = function (element, options) {
 
    this.init('popover', element, options)
 
  }
 

	
 
  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
 

	
 
  Popover.VERSION  = '3.3.7'
 

	
 
  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
 
    placement: 'right',
 
    trigger: 'click',
 
    content: '',
 
    template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
 
  })
 

	
 

	
 
  // NOTE: POPOVER EXTENDS tooltip.js
 
  // ================================
 

	
 
  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
 

	
 
  Popover.prototype.constructor = Popover
 

	
 
  Popover.prototype.getDefaults = function () {
 
    return Popover.DEFAULTS
 
  }
 

	
 
  Popover.prototype.setContent = function () {
 
    var $tip    = this.tip()
 
    var title   = this.getTitle()
 
    var content = this.getContent()
 

	
 
    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
 
    $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events
 
      this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
 
    ](content)
 

	
 
    $tip.removeClass('fade top bottom left right in')
 

	
 
    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
 
    // this manually by checking the contents.
 
    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
 
  }
 

	
 
  Popover.prototype.hasContent = function () {
 
    return this.getTitle() || this.getContent()
 
  }
 

	
 
  Popover.prototype.getContent = function () {
 
    var $e = this.$element
 
    var o  = this.options
 

	
 
    return $e.attr('data-content')
 
      || (typeof o.content == 'function' ?
 
            o.content.call($e[0]) :
 
            o.content)
 
  }
 

	
 
  Popover.prototype.arrow = function () {
 
    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
 
  }
 

	
 

	
 
  // POPOVER PLUGIN DEFINITION
 
  // =========================
 

	
 
  function Plugin(option) {
 
    return this.each(function () {
 
      var $this   = $(this)
 
      var data    = $this.data('bs.popover')
 
      var options = typeof option == 'object' && option
 

	
 
      if (!data && /destroy|hide/.test(option)) return
 
      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
 
      if (typeof option == 'string') data[option]()
 
    })
 
  }
 

	
 
  var old = $.fn.popover
 

	
 
  $.fn.popover             = Plugin
 
  $.fn.popover.Constructor = Popover
 

	
 

	
 
  // POPOVER NO CONFLICT
 
  // ===================
 

	
 
  $.fn.popover.noConflict = function () {
 
    $.fn.popover = old
 
    return this
 
  }
 

	
 
}(jQuery);
 

	
 
/* ========================================================================
 
 * Bootstrap: scrollspy.js v3.3.7
 
 * http://getbootstrap.com/javascript/#scrollspy
 
 * ========================================================================
 
 * Copyright 2011-2016 Twitter, Inc.
 
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 
 * ======================================================================== */
 

	
 

	
 
+function ($) {
 
  'use strict';
 

	
 
  // SCROLLSPY CLASS DEFINITION
 
  // ==========================
 

	
 
  function ScrollSpy(element, options) {
 
    this.$body          = $(document.body)
 
    this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
 
    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)
 
    this.selector       = (this.options.target || '') + ' .nav li > a'
 
    this.offsets        = []
 
    this.targets        = []
 
    this.activeTarget   = null
 
    this.scrollHeight   = 0
 

	
 
    this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
 
    this.refresh()
 
    this.process()
 
  }
 

	
 
  ScrollSpy.VERSION  = '3.3.7'
 

	
 
  ScrollSpy.DEFAULTS = {
 
    offset: 10
 
  }
 

	
 
  ScrollSpy.prototype.getScrollHeight = function () {
 
    return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
 
  }
 

	
 
  ScrollSpy.prototype.refresh = function () {
 
    var that          = this
 
    var offsetMethod  = 'offset'
 
    var offsetBase    = 0
 

	
 
    this.offsets      = []
 
    this.targets      = []
 
    this.scrollHeight = this.getScrollHeight()
 

	
 
    if (!$.isWindow(this.$scrollElement[0])) {
 
      offsetMethod = 'position'
 
      offsetBase   = this.$scrollElement.scrollTop()
 
    }
 

	
 
    this.$body
 
      .find(this.selector)
 
      .map(function () {
 
        var $el   = $(this)
 
        var href  = $el.data('target') || $el.attr('href')
 
        var $href = /^#./.test(href) && $(href)
 

	
 
        return ($href
 
          && $href.length
 
          && $href.is(':visible')
 
          && [[$href[offsetMethod]().top + offsetBase, href]]) || null
 
      })
 
      .sort(function (a, b) { return a[0] - b[0] })
 
      .each(function () {
 
        that.offsets.push(this[0])
 
        that.targets.push(this[1])
 
      })
 
  }
 

	
 
  ScrollSpy.prototype.process = function () {
 
    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset
 
    var scrollHeight = this.getScrollHeight()
 
    var maxScroll    = this.options.offset + scrollHeight - this.$scrollElement.height()
 
    var offsets      = this.offsets
 
    var targets      = this.targets
 
    var activeTarget = this.activeTarget
 
    var i
 

	
 
    if (this.scrollHeight != scrollHeight) {
 
      this.refresh()
 
    }
 

	
 
    if (scrollTop >= maxScroll) {
 
      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
 
    }
 

	
 
    if (activeTarget && scrollTop < offsets[0]) {
 
      this.activeTarget = null
 
      return this.clear()
 
    }
 

	
 
    for (i = offsets.length; i--;) {
 
      activeTarget != targets[i]
 
        && scrollTop >= offsets[i]
 
        && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])
 
        && this.activate(targets[i])
 
    }
 
  }
 

	
 
  ScrollSpy.prototype.activate = function (target) {
 
    this.activeTarget = target
 

	
 
    this.clear()
 

	
 
    var selector = this.selector +
 
      '[data-target="' + target + '"],' +
 
      this.selector + '[href="' + target + '"]'
 

	
 
    var active = $(selector)
 
      .parents('li')
 
      .addClass('active')
 

	
 
    if (active.parent('.dropdown-menu').length) {
 
      active = active
 
        .closest('li.dropdown')
 
        .addClass('active')
 
    }
 

	
 
    active.trigger('activate.bs.scrollspy')
 
  }
 

	
 
  ScrollSpy.prototype.clear = function () {
 
    $(this.selector)
 
      .parentsUntil(this.options.target, '.active')
 
      .removeClass('active')
 
  }
 

	
 

	
 
  // SCROLLSPY PLUGIN DEFINITION
 
  // ===========================
 

	
 
  function Plugin(option) {
 
    return this.each(function () {
 
      var $this   = $(this)
 
      var data    = $this.data('bs.scrollspy')
 
      var options = typeof option == 'object' && option
 

	
 
      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
 
      if (typeof option == 'string') data[option]()
 
    })
 
  }
 

	
 
  var old = $.fn.scrollspy
 

	
 
  $.fn.scrollspy             = Plugin
 
  $.fn.scrollspy.Constructor = ScrollSpy
 

	
 

	
 
  // SCROLLSPY NO CONFLICT
 
  // =====================
 

	
 
  $.fn.scrollspy.noConflict = function () {
 
    $.fn.scrollspy = old
 
    return this
 
  }
 

	
 

	
 
  // SCROLLSPY DATA-API
 
  // ==================
 

	
 
  $(window).on('load.bs.scrollspy.data-api', function () {
 
    $('[data-spy="scroll"]').each(function () {
 
      var $spy = $(this)
 
      Plugin.call($spy, $spy.data())
 
    })
 
  })
 

	
 
}(jQuery);
 

	
 
/* ========================================================================
 
 * Bootstrap: tab.js v3.3.7
 
 * http://getbootstrap.com/javascript/#tabs
 
 * ========================================================================
 
 * Copyright 2011-2016 Twitter, Inc.
 
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 
 * ======================================================================== */
 

	
 

	
 
+function ($) {
 
  'use strict';
 

	
 
  // TAB CLASS DEFINITION
 
  // ====================
 

	
 
  var Tab = function (element) {
 
    // jscs:disable requireDollarBeforejQueryAssignment
 
    this.element = $(element)
 
    // jscs:enable requireDollarBeforejQueryAssignment
 
  }
 

	
 
  Tab.VERSION = '3.3.7'
 

	
 
  Tab.TRANSITION_DURATION = 150
 

	
 
  Tab.prototype.show = function () {
 
    var $this    = this.element
 
    var $ul      = $this.closest('ul:not(.dropdown-menu)')
 
    var selector = $this.data('target')
 

	
 
    if (!selector) {
 
      selector = $this.attr('href')
 
      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
 
    }
 

	
 
    if ($this.parent('li').hasClass('active')) return
 

	
 
    var $previous = $ul.find('.active:last a')
 
    var hideEvent = $.Event('hide.bs.tab', {
 
      relatedTarget: $this[0]
 
    })
 
    var showEvent = $.Event('show.bs.tab', {
 
      relatedTarget: $previous[0]
 
    })
 

	
 
    $previous.trigger(hideEvent)
 
    $this.trigger(showEvent)
 

	
 
    if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
 

	
 
    var $target = $(selector)
 

	
 
    this.activate($this.closest('li'), $ul)
 
    this.activate($target, $target.parent(), function () {
 
      $previous.trigger({
 
        type: 'hidden.bs.tab',
 
        relatedTarget: $this[0]
 
      })
 
      $this.trigger({
 
        type: 'shown.bs.tab',
 
        relatedTarget: $previous[0]
 
      })
 
    })
 
  }
 

	
 
  Tab.prototype.activate = function (element, container, callback) {
 
    var $active    = container.find('> .active')
 
    var transition = callback
 
      && $.support.transition
 
      && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)
 

	
 
    function next() {
 
      $active
 
        .removeClass('active')
 
        .find('> .dropdown-menu > .active')
 
          .removeClass('active')
 
        .end()
 
        .find('[data-toggle="tab"]')
 
          .attr('aria-expanded', false)
 

	
 
      element
 
        .addClass('active')
 
        .find('[data-toggle="tab"]')
 
          .attr('aria-expanded', true)
 

	
 
      if (transition) {
 
        element[0].offsetWidth // reflow for transition
 
        element.addClass('in')
 
      } else {
 
        element.removeClass('fade')
 
      }
 

	
 
      if (element.parent('.dropdown-menu').length) {
 
        element
 
          .closest('li.dropdown')
 
            .addClass('active')
 
          .end()
 
          .find('[data-toggle="tab"]')
 
            .attr('aria-expanded', true)
 
      }
 

	
 
      callback && callback()
 
    }
 

	
 
    $active.length && transition ?
 
      $active
 
        .one('bsTransitionEnd', next)
 
        .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
 
      next()
 

	
 
    $active.removeClass('in')
 
  }
 

	
 

	
 
  // TAB PLUGIN DEFINITION
 
  // =====================
 

	
 
  function Plugin(option) {
 
    return this.each(function () {
 
      var $this = $(this)
 
      var data  = $this.data('bs.tab')
 

	
 
      if (!data) $this.data('bs.tab', (data = new Tab(this)))
 
      if (typeof option == 'string') data[option]()
 
    })
 
  }
 

	
 
  var old = $.fn.tab
 

	
 
  $.fn.tab             = Plugin
 
  $.fn.tab.Constructor = Tab
 

	
 

	
 
  // TAB NO CONFLICT
 
  // ===============
 

	
 
  $.fn.tab.noConflict = function () {
 
    $.fn.tab = old
 
    return this
 
  }
 

	
 

	
 
  // TAB DATA-API
 
  // ============
 

	
 
  var clickHandler = function (e) {
 
    e.preventDefault()
 
    Plugin.call($(this), 'show')
 
  }
 

	
 
  $(document)
 
    .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
 
    .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)
 

	
 
}(jQuery);
 

	
 
/* ========================================================================
 
 * Bootstrap: affix.js v3.3.7
 
 * http://getbootstrap.com/javascript/#affix
 
 * ========================================================================
 
 * Copyright 2011-2016 Twitter, Inc.
 
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 
 * ======================================================================== */
 

	
 

	
 
+function ($) {
 
  'use strict';
 

	
 
  // AFFIX CLASS DEFINITION
 
  // ======================
 

	
 
  var Affix = function (element, options) {
 
    this.options = $.extend({}, Affix.DEFAULTS, options)
 

	
 
    this.$target = $(this.options.target)
 
      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
 
      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))
 

	
 
    this.$element     = $(element)
 
    this.affixed      = null
 
    this.unpin        = null
 
    this.pinnedOffset = null
 

	
 
    this.checkPosition()
 
  }
 

	
 
  Affix.VERSION  = '3.3.7'
 

	
 
  Affix.RESET    = 'affix affix-top affix-bottom'
 

	
 
  Affix.DEFAULTS = {
 
    offset: 0,
 
    target: window
 
  }
 

	
 
  Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
 
    var scrollTop    = this.$target.scrollTop()
 
    var position     = this.$element.offset()
 
    var targetHeight = this.$target.height()
 

	
 
    if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false
 

	
 
    if (this.affixed == 'bottom') {
 
      if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
 
      return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
 
    }
 

	
 
    var initializing   = this.affixed == null
 
    var colliderTop    = initializing ? scrollTop : position.top
 
    var colliderHeight = initializing ? targetHeight : height
 

	
 
    if (offsetTop != null && scrollTop <= offsetTop) return 'top'
 
    if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'
 

	
 
    return false
 
  }
 

	
 
  Affix.prototype.getPinnedOffset = function () {
 
    if (this.pinnedOffset) return this.pinnedOffset
 
    this.$element.removeClass(Affix.RESET).addClass('affix')
 
    var scrollTop = this.$target.scrollTop()
 
    var position  = this.$element.offset()
 
    return (this.pinnedOffset = position.top - scrollTop)
 
  }
 

	
 
  Affix.prototype.checkPositionWithEventLoop = function () {
 
    setTimeout($.proxy(this.checkPosition, this), 1)
 
  }
 

	
 
  Affix.prototype.checkPosition = function () {
 
    if (!this.$element.is(':visible')) return
 

	
 
    var height       = this.$element.height()
 
    var offset       = this.options.offset
 
    var offsetTop    = offset.top
 
    var offsetBottom = offset.bottom
 
    var scrollHeight = Math.max($(document).height(), $(document.body).height())
 

	
 
    if (typeof offset != 'object')         offsetBottom = offsetTop = offset
 
    if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)
 
    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
 

	
 
    var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
 

	
 
    if (this.affixed != affix) {
 
      if (this.unpin != null) this.$element.css('top', '')
 

	
 
      var affixType = 'affix' + (affix ? '-' + affix : '')
 
      var e         = $.Event(affixType + '.bs.affix')
 

	
 
      this.$element.trigger(e)
 

	
 
      if (e.isDefaultPrevented()) return
 

	
 
      this.affixed = affix
 
      this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
 

	
 
      this.$element
 
        .removeClass(Affix.RESET)
 
        .addClass(affixType)
 
        .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
 
    }
 

	
 
    if (affix == 'bottom') {
 
      this.$element.offset({
 
        top: scrollHeight - height - offsetBottom
 
      })
 
    }
 
  }
 

	
 

	
 
  // AFFIX PLUGIN DEFINITION
 
  // =======================
 

	
 
  function Plugin(option) {
 
    return this.each(function () {
 
      var $this   = $(this)
 
      var data    = $this.data('bs.affix')
 
      var options = typeof option == 'object' && option
 

	
 
      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
 
      if (typeof option == 'string') data[option]()
 
    })
 
  }
 

	
 
  var old = $.fn.affix
 

	
 
  $.fn.affix             = Plugin
 
  $.fn.affix.Constructor = Affix
 

	
 

	
 
  // AFFIX NO CONFLICT
 
  // =================
 

	
 
  $.fn.affix.noConflict = function () {
 
    $.fn.affix = old
 
    return this
 
  }
 

	
 

	
 
  // AFFIX DATA-API
 
  // ==============
 

	
 
  $(window).on('load', function () {
 
    $('[data-spy="affix"]').each(function () {
 
      var $spy = $(this)
 
      var data = $spy.data()
 

	
 
      data.offset = data.offset || {}
 

	
 
      if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
 
      if (data.offsetTop    != null) data.offset.top    = data.offsetTop
 

	
 
      Plugin.call($spy, data)
 
    })
 
  })
 

	
 
}(jQuery);
static/bootstrap/javascripts/bootstrap.min.js
Show inline comments
 
new file 100644
 
/*!
 
 * Bootstrap v3.3.7 (http://getbootstrap.com)
 
 * Copyright 2011-2016 Twitter, Inc.
 
 * Licensed under the MIT license
 
 */
 
if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>3)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){if(a(b.target).is(this))return b.handleObj.handler.apply(this,arguments)}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.7",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a("#"===f?[]:f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.7",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c).prop(c,!0)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c).prop(c,!1))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target).closest(".btn");b.call(d,"toggle"),a(c.target).is('input[type="radio"], input[type="checkbox"]')||(c.preventDefault(),d.is("input,button")?d.trigger("focus"):d.find("input:visible,button:visible").first().trigger("focus"))}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.7",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(!(a>this.$items.length-1||a<0))return this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){if(!this.sliding)return this.slide("next")},c.prototype.prev=function(){if(!this.sliding)return this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.7",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.7",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",c).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",".dropdown-menu",g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.3.7",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){d.$element.one("mouseup.dismiss.bs.modal",function(b){a(b.target).is(d.$element)&&(d.ignoreBackdropClick=!0)})}),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass("fade");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass("in"),d.enforceFocus();var f=a.Event("shown.bs.modal",{relatedTarget:b});e?d.$dialog.one("bsTransitionEnd",function(){d.$element.trigger("focus").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger("focus").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){document===a.target||this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},c.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass("modal-open"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a(document.createElement("div")).addClass("modal-backdrop "+e).appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.adjustDialog()},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth<a,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;!e&&/destroy|hide/.test(b)||(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.inState=null,this.init("tooltip",a,b)};c.VERSION="3.3.7",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);if(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),!c.isInStateTrue())return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-m<o.top?"bottom":"right"==h&&k.right+l>o.width?"left":"left"==h&&k.left-l<o.left?"right":h,f.removeClass(n).addClass(h)}var p=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(p,h);var q=function(){var a=e.hoverState;e.$element.trigger("shown.bs."+e.type),e.hoverState=null,"out"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",q).emulateTransitionEnd(c.TRANSITION_DURATION):q()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top+=g,b.left+=h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?"left":"top",50*(1-a/b)+"%").css(c?"top":"left","")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(b){function d(){"in"!=e.hoverState&&f.detach(),e.$element&&e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),b&&b()}var e=this,f=a(this.$tip),g=a.Event("hide.bs."+this.type);if(this.$element.trigger(g),!g.isDefaultPrevented())return f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=window.SVGElement&&c instanceof window.SVGElement,g=d?{top:0,left:0}:f?null:b.offset(),h={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},i=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,h,i,g)},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null,a.$element=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;!e&&/destroy|hide/.test(b)||(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.7",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.7",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<e[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(void 0===e[a+1]||b<e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){
 
this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.7",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.7",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return e<c&&"top";if("bottom"==this.affixed)return null!=c?!(e+this.unpin<=f.top)&&"bottom":!(e+g<=a-d)&&"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&e<=c?"top":null!=d&&i+j>=a-d&&"bottom"},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);
...
 
\ No newline at end of file
static/bootstrap/javascripts/bootstrap/affix.js
Show inline comments
 
new file 100644
 
/* ========================================================================
 
 * Bootstrap: affix.js v3.3.7
 
 * http://getbootstrap.com/javascript/#affix
 
 * ========================================================================
 
 * Copyright 2011-2016 Twitter, Inc.
 
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 
 * ======================================================================== */
 

	
 

	
 
+function ($) {
 
  'use strict';
 

	
 
  // AFFIX CLASS DEFINITION
 
  // ======================
 

	
 
  var Affix = function (element, options) {
 
    this.options = $.extend({}, Affix.DEFAULTS, options)
 

	
 
    this.$target = $(this.options.target)
 
      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
 
      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))
 

	
 
    this.$element     = $(element)
 
    this.affixed      = null
 
    this.unpin        = null
 
    this.pinnedOffset = null
 

	
 
    this.checkPosition()
 
  }
 

	
 
  Affix.VERSION  = '3.3.7'
 

	
 
  Affix.RESET    = 'affix affix-top affix-bottom'
 

	
 
  Affix.DEFAULTS = {
 
    offset: 0,
 
    target: window
 
  }
 

	
 
  Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
 
    var scrollTop    = this.$target.scrollTop()
 
    var position     = this.$element.offset()
 
    var targetHeight = this.$target.height()
 

	
 
    if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false
 

	
 
    if (this.affixed == 'bottom') {
 
      if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
 
      return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
 
    }
 

	
 
    var initializing   = this.affixed == null
 
    var colliderTop    = initializing ? scrollTop : position.top
 
    var colliderHeight = initializing ? targetHeight : height
 

	
 
    if (offsetTop != null && scrollTop <= offsetTop) return 'top'
 
    if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'
 

	
 
    return false
 
  }
 

	
 
  Affix.prototype.getPinnedOffset = function () {
 
    if (this.pinnedOffset) return this.pinnedOffset
 
    this.$element.removeClass(Affix.RESET).addClass('affix')
 
    var scrollTop = this.$target.scrollTop()
 
    var position  = this.$element.offset()
 
    return (this.pinnedOffset = position.top - scrollTop)
 
  }
 

	
 
  Affix.prototype.checkPositionWithEventLoop = function () {
 
    setTimeout($.proxy(this.checkPosition, this), 1)
 
  }
 

	
 
  Affix.prototype.checkPosition = function () {
 
    if (!this.$element.is(':visible')) return
 

	
 
    var height       = this.$element.height()
 
    var offset       = this.options.offset
 
    var offsetTop    = offset.top
 
    var offsetBottom = offset.bottom
 
    var scrollHeight = Math.max($(document).height(), $(document.body).height())
 

	
 
    if (typeof offset != 'object')         offsetBottom = offsetTop = offset
 
    if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)
 
    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
 

	
 
    var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
 

	
 
    if (this.affixed != affix) {
 
      if (this.unpin != null) this.$element.css('top', '')
 

	
 
      var affixType = 'affix' + (affix ? '-' + affix : '')
 
      var e         = $.Event(affixType + '.bs.affix')
 

	
 
      this.$element.trigger(e)
 

	
 
      if (e.isDefaultPrevented()) return
 

	
 
      this.affixed = affix
 
      this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
 

	
 
      this.$element
 
        .removeClass(Affix.RESET)
 
        .addClass(affixType)
 
        .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
 
    }
 

	
 
    if (affix == 'bottom') {
 
      this.$element.offset({
 
        top: scrollHeight - height - offsetBottom
 
      })
 
    }
 
  }
 

	
 

	
 
  // AFFIX PLUGIN DEFINITION
 
  // =======================
 

	
 
  function Plugin(option) {
 
    return this.each(function () {
 
      var $this   = $(this)
 
      var data    = $this.data('bs.affix')
 
      var options = typeof option == 'object' && option
 

	
 
      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
 
      if (typeof option == 'string') data[option]()
 
    })
 
  }
 

	
 
  var old = $.fn.affix
 

	
 
  $.fn.affix             = Plugin
 
  $.fn.affix.Constructor = Affix
 

	
 

	
 
  // AFFIX NO CONFLICT
 
  // =================
 

	
 
  $.fn.affix.noConflict = function () {
 
    $.fn.affix = old
 
    return this
 
  }
 

	
 

	
 
  // AFFIX DATA-API
 
  // ==============
 

	
 
  $(window).on('load', function () {
 
    $('[data-spy="affix"]').each(function () {
 
      var $spy = $(this)
 
      var data = $spy.data()
 

	
 
      data.offset = data.offset || {}
 

	
 
      if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
 
      if (data.offsetTop    != null) data.offset.top    = data.offsetTop
 

	
 
      Plugin.call($spy, data)
 
    })
 
  })
 

	
 
}(jQuery);
static/bootstrap/javascripts/bootstrap/alert.js
Show inline comments
 
new file 100644
 
/* ========================================================================
 
 * Bootstrap: alert.js v3.3.7
 
 * http://getbootstrap.com/javascript/#alerts
 
 * ========================================================================
 
 * Copyright 2011-2016 Twitter, Inc.
 
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 
 * ======================================================================== */
 

	
 

	
 
+function ($) {
 
  'use strict';
 

	
 
  // ALERT CLASS DEFINITION
 
  // ======================
 

	
 
  var dismiss = '[data-dismiss="alert"]'
 
  var Alert   = function (el) {
 
    $(el).on('click', dismiss, this.close)
 
  }
 

	
 
  Alert.VERSION = '3.3.7'
 

	
 
  Alert.TRANSITION_DURATION = 150
 

	
 
  Alert.prototype.close = function (e) {
 
    var $this    = $(this)
 
    var selector = $this.attr('data-target')
 

	
 
    if (!selector) {
 
      selector = $this.attr('href')
 
      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
 
    }
 

	
 
    var $parent = $(selector === '#' ? [] : selector)
 

	
 
    if (e) e.preventDefault()
 

	
 
    if (!$parent.length) {
 
      $parent = $this.closest('.alert')
 
    }
 

	
 
    $parent.trigger(e = $.Event('close.bs.alert'))
 

	
 
    if (e.isDefaultPrevented()) return
 

	
 
    $parent.removeClass('in')
 

	
 
    function removeElement() {
 
      // detach from parent, fire event then clean up data
 
      $parent.detach().trigger('closed.bs.alert').remove()
 
    }
 

	
 
    $.support.transition && $parent.hasClass('fade') ?
 
      $parent
 
        .one('bsTransitionEnd', removeElement)
 
        .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
 
      removeElement()
 
  }
 

	
 

	
 
  // ALERT PLUGIN DEFINITION
 
  // =======================
 

	
 
  function Plugin(option) {
 
    return this.each(function () {
 
      var $this = $(this)
 
      var data  = $this.data('bs.alert')
 

	
 
      if (!data) $this.data('bs.alert', (data = new Alert(this)))
 
      if (typeof option == 'string') data[option].call($this)
 
    })
 
  }
 

	
 
  var old = $.fn.alert
 

	
 
  $.fn.alert             = Plugin
 
  $.fn.alert.Constructor = Alert
 

	
 

	
 
  // ALERT NO CONFLICT
 
  // =================
 

	
 
  $.fn.alert.noConflict = function () {
 
    $.fn.alert = old
 
    return this
 
  }
 

	
 

	
 
  // ALERT DATA-API
 
  // ==============
 

	
 
  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
 

	
 
}(jQuery);
static/bootstrap/javascripts/bootstrap/button.js
Show inline comments
 
new file 100644
 
/* ========================================================================
 
 * Bootstrap: button.js v3.3.7
 
 * http://getbootstrap.com/javascript/#buttons
 
 * ========================================================================
 
 * Copyright 2011-2016 Twitter, Inc.
 
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 
 * ======================================================================== */
 

	
 

	
 
+function ($) {
 
  'use strict';
 

	
 
  // BUTTON PUBLIC CLASS DEFINITION
 
  // ==============================
 

	
 
  var Button = function (element, options) {
 
    this.$element  = $(element)
 
    this.options   = $.extend({}, Button.DEFAULTS, options)
 
    this.isLoading = false
 
  }
 

	
 
  Button.VERSION  = '3.3.7'
 

	
 
  Button.DEFAULTS = {
 
    loadingText: 'loading...'
 
  }
 

	
 
  Button.prototype.setState = function (state) {
 
    var d    = 'disabled'
 
    var $el  = this.$element
 
    var val  = $el.is('input') ? 'val' : 'html'
 
    var data = $el.data()
 

	
 
    state += 'Text'
 

	
 
    if (data.resetText == null) $el.data('resetText', $el[val]())
 

	
 
    // push to event loop to allow forms to submit
 
    setTimeout($.proxy(function () {
 
      $el[val](data[state] == null ? this.options[state] : data[state])
 

	
 
      if (state == 'loadingText') {
 
        this.isLoading = true
 
        $el.addClass(d).attr(d, d).prop(d, true)
 
      } else if (this.isLoading) {
 
        this.isLoading = false
 
        $el.removeClass(d).removeAttr(d).prop(d, false)
 
      }
 
    }, this), 0)
 
  }
 

	
 
  Button.prototype.toggle = function () {
 
    var changed = true
 
    var $parent = this.$element.closest('[data-toggle="buttons"]')
 

	
 
    if ($parent.length) {
 
      var $input = this.$element.find('input')
 
      if ($input.prop('type') == 'radio') {
 
        if ($input.prop('checked')) changed = false
 
        $parent.find('.active').removeClass('active')
 
        this.$element.addClass('active')
 
      } else if ($input.prop('type') == 'checkbox') {
 
        if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false
 
        this.$element.toggleClass('active')
 
      }
 
      $input.prop('checked', this.$element.hasClass('active'))
 
      if (changed) $input.trigger('change')
 
    } else {
 
      this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
 
      this.$element.toggleClass('active')
 
    }
 
  }
 

	
 

	
 
  // BUTTON PLUGIN DEFINITION
 
  // ========================
 

	
 
  function Plugin(option) {
 
    return this.each(function () {
 
      var $this   = $(this)
 
      var data    = $this.data('bs.button')
 
      var options = typeof option == 'object' && option
 

	
 
      if (!data) $this.data('bs.button', (data = new Button(this, options)))
 

	
 
      if (option == 'toggle') data.toggle()
 
      else if (option) data.setState(option)
 
    })
 
  }
 

	
 
  var old = $.fn.button
 

	
 
  $.fn.button             = Plugin
 
  $.fn.button.Constructor = Button
 

	
 

	
 
  // BUTTON NO CONFLICT
 
  // ==================
 

	
 
  $.fn.button.noConflict = function () {
 
    $.fn.button = old
 
    return this
 
  }
 

	
 

	
 
  // BUTTON DATA-API
 
  // ===============
 

	
 
  $(document)
 
    .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
 
      var $btn = $(e.target).closest('.btn')
 
      Plugin.call($btn, 'toggle')
 
      if (!($(e.target).is('input[type="radio"], input[type="checkbox"]'))) {
 
        // Prevent double click on radios, and the double selections (so cancellation) on checkboxes
 
        e.preventDefault()
 
        // The target component still receive the focus
 
        if ($btn.is('input,button')) $btn.trigger('focus')
 
        else $btn.find('input:visible,button:visible').first().trigger('focus')
 
      }
 
    })
 
    .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
 
      $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
 
    })
 

	
 
}(jQuery);
static/bootstrap/javascripts/bootstrap/carousel.js
Show inline comments
 
new file 100644
 
/* ========================================================================
 
 * Bootstrap: carousel.js v3.3.7
 
 * http://getbootstrap.com/javascript/#carousel
 
 * ========================================================================
 
 * Copyright 2011-2016 Twitter, Inc.
 
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 
 * ======================================================================== */
 

	
 

	
 
+function ($) {
 
  'use strict';
 

	
 
  // CAROUSEL CLASS DEFINITION
 
  // =========================
 

	
 
  var Carousel = function (element, options) {
 
    this.$element    = $(element)
 
    this.$indicators = this.$element.find('.carousel-indicators')
 
    this.options     = options
 
    this.paused      = null
 
    this.sliding     = null
 
    this.interval    = null
 
    this.$active     = null
 
    this.$items      = null
 

	
 
    this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))
 

	
 
    this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
 
      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
 
      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
 
  }
 

	
 
  Carousel.VERSION  = '3.3.7'
 

	
 
  Carousel.TRANSITION_DURATION = 600
 

	
 
  Carousel.DEFAULTS = {
 
    interval: 5000,
 
    pause: 'hover',
 
    wrap: true,
 
    keyboard: true
 
  }
 

	
 
  Carousel.prototype.keydown = function (e) {
 
    if (/input|textarea/i.test(e.target.tagName)) return
 
    switch (e.which) {
 
      case 37: this.prev(); break
 
      case 39: this.next(); break
 
      default: return
 
    }
 

	
 
    e.preventDefault()
 
  }
 

	
 
  Carousel.prototype.cycle = function (e) {
 
    e || (this.paused = false)
 

	
 
    this.interval && clearInterval(this.interval)
 

	
 
    this.options.interval
 
      && !this.paused
 
      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
 

	
 
    return this
 
  }
 

	
 
  Carousel.prototype.getItemIndex = function (item) {
 
    this.$items = item.parent().children('.item')
 
    return this.$items.index(item || this.$active)
 
  }
 

	
 
  Carousel.prototype.getItemForDirection = function (direction, active) {
 
    var activeIndex = this.getItemIndex(active)
 
    var willWrap = (direction == 'prev' && activeIndex === 0)
 
                || (direction == 'next' && activeIndex == (this.$items.length - 1))
 
    if (willWrap && !this.options.wrap) return active
 
    var delta = direction == 'prev' ? -1 : 1
 
    var itemIndex = (activeIndex + delta) % this.$items.length
 
    return this.$items.eq(itemIndex)
 
  }
 

	
 
  Carousel.prototype.to = function (pos) {
 
    var that        = this
 
    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
 

	
 
    if (pos > (this.$items.length - 1) || pos < 0) return
 

	
 
    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
 
    if (activeIndex == pos) return this.pause().cycle()
 

	
 
    return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))
 
  }
 

	
 
  Carousel.prototype.pause = function (e) {
 
    e || (this.paused = true)
 

	
 
    if (this.$element.find('.next, .prev').length && $.support.transition) {
 
      this.$element.trigger($.support.transition.end)
 
      this.cycle(true)
 
    }
 

	
 
    this.interval = clearInterval(this.interval)
 

	
 
    return this
 
  }
 

	
 
  Carousel.prototype.next = function () {
 
    if (this.sliding) return
 
    return this.slide('next')
 
  }
 

	
 
  Carousel.prototype.prev = function () {
 
    if (this.sliding) return
 
    return this.slide('prev')
 
  }
 

	
 
  Carousel.prototype.slide = function (type, next) {
 
    var $active   = this.$element.find('.item.active')
 
    var $next     = next || this.getItemForDirection(type, $active)
 
    var isCycling = this.interval
 
    var direction = type == 'next' ? 'left' : 'right'
 
    var that      = this
 

	
 
    if ($next.hasClass('active')) return (this.sliding = false)
 

	
 
    var relatedTarget = $next[0]
 
    var slideEvent = $.Event('slide.bs.carousel', {
 
      relatedTarget: relatedTarget,
 
      direction: direction
 
    })
 
    this.$element.trigger(slideEvent)
 
    if (slideEvent.isDefaultPrevented()) return
 

	
 
    this.sliding = true
 

	
 
    isCycling && this.pause()
 

	
 
    if (this.$indicators.length) {
 
      this.$indicators.find('.active').removeClass('active')
 
      var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
 
      $nextIndicator && $nextIndicator.addClass('active')
 
    }
 

	
 
    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
 
    if ($.support.transition && this.$element.hasClass('slide')) {
 
      $next.addClass(type)
 
      $next[0].offsetWidth // force reflow
 
      $active.addClass(direction)
 
      $next.addClass(direction)
 
      $active
 
        .one('bsTransitionEnd', function () {
 
          $next.removeClass([type, direction].join(' ')).addClass('active')
 
          $active.removeClass(['active', direction].join(' '))
 
          that.sliding = false
 
          setTimeout(function () {
 
            that.$element.trigger(slidEvent)
 
          }, 0)
 
        })
 
        .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
 
    } else {
 
      $active.removeClass('active')
 
      $next.addClass('active')
 
      this.sliding = false
 
      this.$element.trigger(slidEvent)
 
    }
 

	
 
    isCycling && this.cycle()
 

	
 
    return this
 
  }
 

	
 

	
 
  // CAROUSEL PLUGIN DEFINITION
 
  // ==========================
 

	
 
  function Plugin(option) {
 
    return this.each(function () {
 
      var $this   = $(this)
 
      var data    = $this.data('bs.carousel')
 
      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
 
      var action  = typeof option == 'string' ? option : options.slide
 

	
 
      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
 
      if (typeof option == 'number') data.to(option)
 
      else if (action) data[action]()
 
      else if (options.interval) data.pause().cycle()
 
    })
 
  }
 

	
 
  var old = $.fn.carousel
 

	
 
  $.fn.carousel             = Plugin
 
  $.fn.carousel.Constructor = Carousel
 

	
 

	
 
  // CAROUSEL NO CONFLICT
 
  // ====================
 

	
 
  $.fn.carousel.noConflict = function () {
 
    $.fn.carousel = old
 
    return this
 
  }
 

	
 

	
 
  // CAROUSEL DATA-API
 
  // =================
 

	
 
  var clickHandler = function (e) {
 
    var href
 
    var $this   = $(this)
 
    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
 
    if (!$target.hasClass('carousel')) return
 
    var options = $.extend({}, $target.data(), $this.data())
 
    var slideIndex = $this.attr('data-slide-to')
 
    if (slideIndex) options.interval = false
 

	
 
    Plugin.call($target, options)
 

	
 
    if (slideIndex) {
 
      $target.data('bs.carousel').to(slideIndex)
 
    }
 

	
 
    e.preventDefault()
 
  }
 

	
 
  $(document)
 
    .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
 
    .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)
 

	
 
  $(window).on('load', function () {
 
    $('[data-ride="carousel"]').each(function () {
 
      var $carousel = $(this)
 
      Plugin.call($carousel, $carousel.data())
 
    })
 
  })
 

	
 
}(jQuery);
static/bootstrap/javascripts/bootstrap/collapse.js
Show inline comments
 
new file 100644
 
/* ========================================================================
 
 * Bootstrap: collapse.js v3.3.7
 
 * http://getbootstrap.com/javascript/#collapse
 
 * ========================================================================
 
 * Copyright 2011-2016 Twitter, Inc.
 
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 
 * ======================================================================== */
 

	
 
/* jshint latedef: false */
 

	
 
+function ($) {
 
  'use strict';
 

	
 
  // COLLAPSE PUBLIC CLASS DEFINITION
 
  // ================================
 

	
 
  var Collapse = function (element, options) {
 
    this.$element      = $(element)
 
    this.options       = $.extend({}, Collapse.DEFAULTS, options)
 
    this.$trigger      = $('[data-toggle="collapse"][href="#' + element.id + '"],' +
 
                           '[data-toggle="collapse"][data-target="#' + element.id + '"]')
 
    this.transitioning = null
 

	
 
    if (this.options.parent) {
 
      this.$parent = this.getParent()
 
    } else {
 
      this.addAriaAndCollapsedClass(this.$element, this.$trigger)
 
    }
 

	
 
    if (this.options.toggle) this.toggle()
 
  }
 

	
 
  Collapse.VERSION  = '3.3.7'
 

	
 
  Collapse.TRANSITION_DURATION = 350
 

	
 
  Collapse.DEFAULTS = {
 
    toggle: true
 
  }
 

	
 
  Collapse.prototype.dimension = function () {
 
    var hasWidth = this.$element.hasClass('width')
 
    return hasWidth ? 'width' : 'height'
 
  }
 

	
 
  Collapse.prototype.show = function () {
 
    if (this.transitioning || this.$element.hasClass('in')) return
 

	
 
    var activesData
 
    var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')
 

	
 
    if (actives && actives.length) {
 
      activesData = actives.data('bs.collapse')
 
      if (activesData && activesData.transitioning) return
 
    }
 

	
 
    var startEvent = $.Event('show.bs.collapse')
 
    this.$element.trigger(startEvent)
 
    if (startEvent.isDefaultPrevented()) return
 

	
 
    if (actives && actives.length) {
 
      Plugin.call(actives, 'hide')
 
      activesData || actives.data('bs.collapse', null)
 
    }
 

	
 
    var dimension = this.dimension()
 

	
 
    this.$element
 
      .removeClass('collapse')
 
      .addClass('collapsing')[dimension](0)
 
      .attr('aria-expanded', true)
 

	
 
    this.$trigger
 
      .removeClass('collapsed')
 
      .attr('aria-expanded', true)
 

	
 
    this.transitioning = 1
 

	
 
    var complete = function () {
 
      this.$element
 
        .removeClass('collapsing')
 
        .addClass('collapse in')[dimension]('')
 
      this.transitioning = 0
 
      this.$element
 
        .trigger('shown.bs.collapse')
 
    }
 

	
 
    if (!$.support.transition) return complete.call(this)
 

	
 
    var scrollSize = $.camelCase(['scroll', dimension].join('-'))
 

	
 
    this.$element
 
      .one('bsTransitionEnd', $.proxy(complete, this))
 
      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
 
  }
 

	
 
  Collapse.prototype.hide = function () {
 
    if (this.transitioning || !this.$element.hasClass('in')) return
 

	
 
    var startEvent = $.Event('hide.bs.collapse')
 
    this.$element.trigger(startEvent)
 
    if (startEvent.isDefaultPrevented()) return
 

	
 
    var dimension = this.dimension()
 

	
 
    this.$element[dimension](this.$element[dimension]())[0].offsetHeight
 

	
 
    this.$element
 
      .addClass('collapsing')
 
      .removeClass('collapse in')
 
      .attr('aria-expanded', false)
 

	
 
    this.$trigger
 
      .addClass('collapsed')
 
      .attr('aria-expanded', false)
 

	
 
    this.transitioning = 1
 

	
 
    var complete = function () {
 
      this.transitioning = 0
 
      this.$element
 
        .removeClass('collapsing')
 
        .addClass('collapse')
 
        .trigger('hidden.bs.collapse')
 
    }
 

	
 
    if (!$.support.transition) return complete.call(this)
 

	
 
    this.$element
 
      [dimension](0)
 
      .one('bsTransitionEnd', $.proxy(complete, this))
 
      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
 
  }
 

	
 
  Collapse.prototype.toggle = function () {
 
    this[this.$element.hasClass('in') ? 'hide' : 'show']()
 
  }
 

	
 
  Collapse.prototype.getParent = function () {
 
    return $(this.options.parent)
 
      .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
 
      .each($.proxy(function (i, element) {
 
        var $element = $(element)
 
        this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
 
      }, this))
 
      .end()
 
  }
 

	
 
  Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
 
    var isOpen = $element.hasClass('in')
 

	
 
    $element.attr('aria-expanded', isOpen)
 
    $trigger
 
      .toggleClass('collapsed', !isOpen)
 
      .attr('aria-expanded', isOpen)
 
  }
 

	
 
  function getTargetFromTrigger($trigger) {
 
    var href
 
    var target = $trigger.attr('data-target')
 
      || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
 

	
 
    return $(target)
 
  }
 

	
 

	
 
  // COLLAPSE PLUGIN DEFINITION
 
  // ==========================
 

	
 
  function Plugin(option) {
 
    return this.each(function () {
 
      var $this   = $(this)
 
      var data    = $this.data('bs.collapse')
 
      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
 

	
 
      if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false
 
      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
 
      if (typeof option == 'string') data[option]()
 
    })
 
  }
 

	
 
  var old = $.fn.collapse
 

	
 
  $.fn.collapse             = Plugin
 
  $.fn.collapse.Constructor = Collapse
 

	
 

	
 
  // COLLAPSE NO CONFLICT
 
  // ====================
 

	
 
  $.fn.collapse.noConflict = function () {
 
    $.fn.collapse = old
 
    return this
 
  }
 

	
 

	
 
  // COLLAPSE DATA-API
 
  // =================
 

	
 
  $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
 
    var $this   = $(this)
 

	
 
    if (!$this.attr('data-target')) e.preventDefault()
 

	
 
    var $target = getTargetFromTrigger($this)
 
    var data    = $target.data('bs.collapse')
 
    var option  = data ? 'toggle' : $this.data()
 

	
 
    Plugin.call($target, option)
 
  })
 

	
 
}(jQuery);
static/bootstrap/javascripts/bootstrap/dropdown.js
Show inline comments
 
new file 100644
 
/* ========================================================================
 
 * Bootstrap: dropdown.js v3.3.7
 
 * http://getbootstrap.com/javascript/#dropdowns
 
 * ========================================================================
 
 * Copyright 2011-2016 Twitter, Inc.
 
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 
 * ======================================================================== */
 

	
 

	
 
+function ($) {
 
  'use strict';
 

	
 
  // DROPDOWN CLASS DEFINITION
 
  // =========================
 

	
 
  var backdrop = '.dropdown-backdrop'
 
  var toggle   = '[data-toggle="dropdown"]'
 
  var Dropdown = function (element) {
 
    $(element).on('click.bs.dropdown', this.toggle)
 
  }
 

	
 
  Dropdown.VERSION = '3.3.7'
 

	
 
  function getParent($this) {
 
    var selector = $this.attr('data-target')
 

	
 
    if (!selector) {
 
      selector = $this.attr('href')
 
      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
 
    }
 

	
 
    var $parent = selector && $(selector)
 

	
 
    return $parent && $parent.length ? $parent : $this.parent()
 
  }
 

	
 
  function clearMenus(e) {
 
    if (e && e.which === 3) return
 
    $(backdrop).remove()
 
    $(toggle).each(function () {
 
      var $this         = $(this)
 
      var $parent       = getParent($this)
 
      var relatedTarget = { relatedTarget: this }
 

	
 
      if (!$parent.hasClass('open')) return
 

	
 
      if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return
 

	
 
      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
 

	
 
      if (e.isDefaultPrevented()) return
 

	
 
      $this.attr('aria-expanded', 'false')
 
      $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))
 
    })
 
  }
 

	
 
  Dropdown.prototype.toggle = function (e) {
 
    var $this = $(this)
 

	
 
    if ($this.is('.disabled, :disabled')) return
 

	
 
    var $parent  = getParent($this)
 
    var isActive = $parent.hasClass('open')
 

	
 
    clearMenus()
 

	
 
    if (!isActive) {
 
      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
 
        // if mobile we use a backdrop because click events don't delegate
 
        $(document.createElement('div'))
 
          .addClass('dropdown-backdrop')
 
          .insertAfter($(this))
 
          .on('click', clearMenus)
 
      }
 

	
 
      var relatedTarget = { relatedTarget: this }
 
      $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
 

	
 
      if (e.isDefaultPrevented()) return
 

	
 
      $this
 
        .trigger('focus')
 
        .attr('aria-expanded', 'true')
 

	
 
      $parent
 
        .toggleClass('open')
 
        .trigger($.Event('shown.bs.dropdown', relatedTarget))
 
    }
 

	
 
    return false
 
  }
 

	
 
  Dropdown.prototype.keydown = function (e) {
 
    if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return
 

	
 
    var $this = $(this)
 

	
 
    e.preventDefault()
 
    e.stopPropagation()
 

	
 
    if ($this.is('.disabled, :disabled')) return
 

	
 
    var $parent  = getParent($this)
 
    var isActive = $parent.hasClass('open')
 

	
 
    if (!isActive && e.which != 27 || isActive && e.which == 27) {
 
      if (e.which == 27) $parent.find(toggle).trigger('focus')
 
      return $this.trigger('click')
 
    }
 

	
 
    var desc = ' li:not(.disabled):visible a'
 
    var $items = $parent.find('.dropdown-menu' + desc)
 

	
 
    if (!$items.length) return
 

	
 
    var index = $items.index(e.target)
 

	
 
    if (e.which == 38 && index > 0)                 index--         // up
 
    if (e.which == 40 && index < $items.length - 1) index++         // down
 
    if (!~index)                                    index = 0
 

	
 
    $items.eq(index).trigger('focus')
 
  }
 

	
 

	
 
  // DROPDOWN PLUGIN DEFINITION
 
  // ==========================
 

	
 
  function Plugin(option) {
 
    return this.each(function () {
 
      var $this = $(this)
 
      var data  = $this.data('bs.dropdown')
 

	
 
      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
 
      if (typeof option == 'string') data[option].call($this)
 
    })
 
  }
 

	
 
  var old = $.fn.dropdown
 

	
 
  $.fn.dropdown             = Plugin
 
  $.fn.dropdown.Constructor = Dropdown
 

	
 

	
 
  // DROPDOWN NO CONFLICT
 
  // ====================
 

	
 
  $.fn.dropdown.noConflict = function () {
 
    $.fn.dropdown = old
 
    return this
 
  }
 

	
 

	
 
  // APPLY TO STANDARD DROPDOWN ELEMENTS
 
  // ===================================
 

	
 
  $(document)
 
    .on('click.bs.dropdown.data-api', clearMenus)
 
    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
 
    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
 
    .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
 
    .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)
 

	
 
}(jQuery);
static/bootstrap/javascripts/bootstrap/modal.js
Show inline comments
 
new file 100644
 
/* ========================================================================
 
 * Bootstrap: modal.js v3.3.7
 
 * http://getbootstrap.com/javascript/#modals
 
 * ========================================================================
 
 * Copyright 2011-2016 Twitter, Inc.
 
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 
 * ======================================================================== */
 

	
 

	
 
+function ($) {
 
  'use strict';
 

	
 
  // MODAL CLASS DEFINITION
 
  // ======================
 

	
 
  var Modal = function (element, options) {
 
    this.options             = options
 
    this.$body               = $(document.body)
 
    this.$element            = $(element)
 
    this.$dialog             = this.$element.find('.modal-dialog')
 
    this.$backdrop           = null
 
    this.isShown             = null
 
    this.originalBodyPad     = null
 
    this.scrollbarWidth      = 0
 
    this.ignoreBackdropClick = false
 

	
 
    if (this.options.remote) {
 
      this.$element
 
        .find('.modal-content')
 
        .load(this.options.remote, $.proxy(function () {
 
          this.$element.trigger('loaded.bs.modal')
 
        }, this))
 
    }
 
  }
 

	
 
  Modal.VERSION  = '3.3.7'
 

	
 
  Modal.TRANSITION_DURATION = 300
 
  Modal.BACKDROP_TRANSITION_DURATION = 150
 

	
 
  Modal.DEFAULTS = {
 
    backdrop: true,
 
    keyboard: true,
 
    show: true
 
  }
 

	
 
  Modal.prototype.toggle = function (_relatedTarget) {
 
    return this.isShown ? this.hide() : this.show(_relatedTarget)
 
  }
 

	
 
  Modal.prototype.show = function (_relatedTarget) {
 
    var that = this
 
    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
 

	
 
    this.$element.trigger(e)
 

	
 
    if (this.isShown || e.isDefaultPrevented()) return
 

	
 
    this.isShown = true
 

	
 
    this.checkScrollbar()
 
    this.setScrollbar()
 
    this.$body.addClass('modal-open')
 

	
 
    this.escape()
 
    this.resize()
 

	
 
    this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
 

	
 
    this.$dialog.on('mousedown.dismiss.bs.modal', function () {
 
      that.$element.one('mouseup.dismiss.bs.modal', function (e) {
 
        if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
 
      })
 
    })
 

	
 
    this.backdrop(function () {
 
      var transition = $.support.transition && that.$element.hasClass('fade')
 

	
 
      if (!that.$element.parent().length) {
 
        that.$element.appendTo(that.$body) // don't move modals dom position
 
      }
 

	
 
      that.$element
 
        .show()
 
        .scrollTop(0)
 

	
 
      that.adjustDialog()
 

	
 
      if (transition) {
 
        that.$element[0].offsetWidth // force reflow
 
      }
 

	
 
      that.$element.addClass('in')
 

	
 
      that.enforceFocus()
 

	
 
      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
 

	
 
      transition ?
 
        that.$dialog // wait for modal to slide in
 
          .one('bsTransitionEnd', function () {
 
            that.$element.trigger('focus').trigger(e)
 
          })
 
          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
 
        that.$element.trigger('focus').trigger(e)
 
    })
 
  }
 

	
 
  Modal.prototype.hide = function (e) {
 
    if (e) e.preventDefault()
 

	
 
    e = $.Event('hide.bs.modal')
 

	
 
    this.$element.trigger(e)
 

	
 
    if (!this.isShown || e.isDefaultPrevented()) return
 

	
 
    this.isShown = false
 

	
 
    this.escape()
 
    this.resize()
 

	
 
    $(document).off('focusin.bs.modal')
 

	
 
    this.$element
 
      .removeClass('in')
 
      .off('click.dismiss.bs.modal')
 
      .off('mouseup.dismiss.bs.modal')
 

	
 
    this.$dialog.off('mousedown.dismiss.bs.modal')
 

	
 
    $.support.transition && this.$element.hasClass('fade') ?
 
      this.$element
 
        .one('bsTransitionEnd', $.proxy(this.hideModal, this))
 
        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
 
      this.hideModal()
 
  }
 

	
 
  Modal.prototype.enforceFocus = function () {
 
    $(document)
 
      .off('focusin.bs.modal') // guard against infinite focus loop
 
      .on('focusin.bs.modal', $.proxy(function (e) {
 
        if (document !== e.target &&
 
            this.$element[0] !== e.target &&
 
            !this.$element.has(e.target).length) {
 
          this.$element.trigger('focus')
 
        }
 
      }, this))
 
  }
 

	
 
  Modal.prototype.escape = function () {
 
    if (this.isShown && this.options.keyboard) {
 
      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
 
        e.which == 27 && this.hide()
 
      }, this))
 
    } else if (!this.isShown) {
 
      this.$element.off('keydown.dismiss.bs.modal')
 
    }
 
  }
 

	
 
  Modal.prototype.resize = function () {
 
    if (this.isShown) {
 
      $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
 
    } else {
 
      $(window).off('resize.bs.modal')
 
    }
 
  }
 

	
 
  Modal.prototype.hideModal = function () {
 
    var that = this
 
    this.$element.hide()
 
    this.backdrop(function () {
 
      that.$body.removeClass('modal-open')
 
      that.resetAdjustments()
 
      that.resetScrollbar()
 
      that.$element.trigger('hidden.bs.modal')
 
    })
 
  }
 

	
 
  Modal.prototype.removeBackdrop = function () {
 
    this.$backdrop && this.$backdrop.remove()
 
    this.$backdrop = null
 
  }
 

	
 
  Modal.prototype.backdrop = function (callback) {
 
    var that = this
 
    var animate = this.$element.hasClass('fade') ? 'fade' : ''
 

	
 
    if (this.isShown && this.options.backdrop) {
 
      var doAnimate = $.support.transition && animate
 

	
 
      this.$backdrop = $(document.createElement('div'))
 
        .addClass('modal-backdrop ' + animate)
 
        .appendTo(this.$body)
 

	
 
      this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
 
        if (this.ignoreBackdropClick) {
 
          this.ignoreBackdropClick = false
 
          return
 
        }
 
        if (e.target !== e.currentTarget) return
 
        this.options.backdrop == 'static'
 
          ? this.$element[0].focus()
 
          : this.hide()
 
      }, this))
 

	
 
      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
 

	
 
      this.$backdrop.addClass('in')
 

	
 
      if (!callback) return
 

	
 
      doAnimate ?
 
        this.$backdrop
 
          .one('bsTransitionEnd', callback)
 
          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
 
        callback()
 

	
 
    } else if (!this.isShown && this.$backdrop) {
 
      this.$backdrop.removeClass('in')
 

	
 
      var callbackRemove = function () {
 
        that.removeBackdrop()
 
        callback && callback()
 
      }
 
      $.support.transition && this.$element.hasClass('fade') ?
 
        this.$backdrop
 
          .one('bsTransitionEnd', callbackRemove)
 
          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
 
        callbackRemove()
 

	
 
    } else if (callback) {
 
      callback()
 
    }
 
  }
 

	
 
  // these following methods are used to handle overflowing modals
 

	
 
  Modal.prototype.handleUpdate = function () {
 
    this.adjustDialog()
 
  }
 

	
 
  Modal.prototype.adjustDialog = function () {
 
    var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
 

	
 
    this.$element.css({
 
      paddingLeft:  !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
 
      paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
 
    })
 
  }
 

	
 
  Modal.prototype.resetAdjustments = function () {
 
    this.$element.css({
 
      paddingLeft: '',
 
      paddingRight: ''
 
    })
 
  }
 

	
 
  Modal.prototype.checkScrollbar = function () {
 
    var fullWindowWidth = window.innerWidth
 
    if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
 
      var documentElementRect = document.documentElement.getBoundingClientRect()
 
      fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
 
    }
 
    this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
 
    this.scrollbarWidth = this.measureScrollbar()
 
  }
 

	
 
  Modal.prototype.setScrollbar = function () {
 
    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
 
    this.originalBodyPad = document.body.style.paddingRight || ''
 
    if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
 
  }
 

	
 
  Modal.prototype.resetScrollbar = function () {
 
    this.$body.css('padding-right', this.originalBodyPad)
 
  }
 

	
 
  Modal.prototype.measureScrollbar = function () { // thx walsh
 
    var scrollDiv = document.createElement('div')
 
    scrollDiv.className = 'modal-scrollbar-measure'
 
    this.$body.append(scrollDiv)
 
    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
 
    this.$body[0].removeChild(scrollDiv)
 
    return scrollbarWidth
 
  }
 

	
 

	
 
  // MODAL PLUGIN DEFINITION
 
  // =======================
 

	
 
  function Plugin(option, _relatedTarget) {
 
    return this.each(function () {
 
      var $this   = $(this)
 
      var data    = $this.data('bs.modal')
 
      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
 

	
 
      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
 
      if (typeof option == 'string') data[option](_relatedTarget)
 
      else if (options.show) data.show(_relatedTarget)
 
    })
 
  }
 

	
 
  var old = $.fn.modal
 

	
 
  $.fn.modal             = Plugin
 
  $.fn.modal.Constructor = Modal
 

	
 

	
 
  // MODAL NO CONFLICT
 
  // =================
 

	
 
  $.fn.modal.noConflict = function () {
 
    $.fn.modal = old
 
    return this
 
  }
 

	
 

	
 
  // MODAL DATA-API
 
  // ==============
 

	
 
  $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
 
    var $this   = $(this)
 
    var href    = $this.attr('href')
 
    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
 
    var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
 

	
 
    if ($this.is('a')) e.preventDefault()
 

	
 
    $target.one('show.bs.modal', function (showEvent) {
 
      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
 
      $target.one('hidden.bs.modal', function () {
 
        $this.is(':visible') && $this.trigger('focus')
 
      })
 
    })
 
    Plugin.call($target, option, this)
 
  })
 

	
 
}(jQuery);
static/bootstrap/javascripts/bootstrap/popover.js
Show inline comments
 
new file 100644
 
/* ========================================================================
 
 * Bootstrap: popover.js v3.3.7
 
 * http://getbootstrap.com/javascript/#popovers
 
 * ========================================================================
 
 * Copyright 2011-2016 Twitter, Inc.
 
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 
 * ======================================================================== */
 

	
 

	
 
+function ($) {
 
  'use strict';
 

	
 
  // POPOVER PUBLIC CLASS DEFINITION
 
  // ===============================
 

	
 
  var Popover = function (element, options) {
 
    this.init('popover', element, options)
 
  }
 

	
 
  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
 

	
 
  Popover.VERSION  = '3.3.7'
 

	
 
  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
 
    placement: 'right',
 
    trigger: 'click',
 
    content: '',
 
    template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
 
  })
 

	
 

	
 
  // NOTE: POPOVER EXTENDS tooltip.js
 
  // ================================
 

	
 
  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
 

	
 
  Popover.prototype.constructor = Popover
 

	
 
  Popover.prototype.getDefaults = function () {
 
    return Popover.DEFAULTS
 
  }
 

	
 
  Popover.prototype.setContent = function () {
 
    var $tip    = this.tip()
 
    var title   = this.getTitle()
 
    var content = this.getContent()
 

	
 
    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
 
    $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events
 
      this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
 
    ](content)
 

	
 
    $tip.removeClass('fade top bottom left right in')
 

	
 
    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
 
    // this manually by checking the contents.
 
    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
 
  }
 

	
 
  Popover.prototype.hasContent = function () {
 
    return this.getTitle() || this.getContent()
 
  }
 

	
 
  Popover.prototype.getContent = function () {
 
    var $e = this.$element
 
    var o  = this.options
 

	
 
    return $e.attr('data-content')
 
      || (typeof o.content == 'function' ?
 
            o.content.call($e[0]) :
 
            o.content)
 
  }
 

	
 
  Popover.prototype.arrow = function () {
 
    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
 
  }
 

	
 

	
 
  // POPOVER PLUGIN DEFINITION
 
  // =========================
 

	
 
  function Plugin(option) {
 
    return this.each(function () {
 
      var $this   = $(this)
 
      var data    = $this.data('bs.popover')
 
      var options = typeof option == 'object' && option
 

	
 
      if (!data && /destroy|hide/.test(option)) return
 
      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
 
      if (typeof option == 'string') data[option]()
 
    })
 
  }
 

	
 
  var old = $.fn.popover
 

	
 
  $.fn.popover             = Plugin
 
  $.fn.popover.Constructor = Popover
 

	
 

	
 
  // POPOVER NO CONFLICT
 
  // ===================
 

	
 
  $.fn.popover.noConflict = function () {
 
    $.fn.popover = old
 
    return this
 
  }
 

	
 
}(jQuery);
static/bootstrap/javascripts/bootstrap/scrollspy.js
Show inline comments
 
new file 100644
 
/* ========================================================================
 
 * Bootstrap: scrollspy.js v3.3.7
 
 * http://getbootstrap.com/javascript/#scrollspy
 
 * ========================================================================
 
 * Copyright 2011-2016 Twitter, Inc.
 
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 
 * ======================================================================== */
 

	
 

	
 
+function ($) {
 
  'use strict';
 

	
 
  // SCROLLSPY CLASS DEFINITION
 
  // ==========================
 

	
 
  function ScrollSpy(element, options) {
 
    this.$body          = $(document.body)
 
    this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
 
    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)
 
    this.selector       = (this.options.target || '') + ' .nav li > a'
 
    this.offsets        = []
 
    this.targets        = []
 
    this.activeTarget   = null
 
    this.scrollHeight   = 0
 

	
 
    this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
 
    this.refresh()
 
    this.process()
 
  }
 

	
 
  ScrollSpy.VERSION  = '3.3.7'
 

	
 
  ScrollSpy.DEFAULTS = {
 
    offset: 10
 
  }
 

	
 
  ScrollSpy.prototype.getScrollHeight = function () {
 
    return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
 
  }
 

	
 
  ScrollSpy.prototype.refresh = function () {
 
    var that          = this
 
    var offsetMethod  = 'offset'
 
    var offsetBase    = 0
 

	
 
    this.offsets      = []
 
    this.targets      = []
 
    this.scrollHeight = this.getScrollHeight()
 

	
 
    if (!$.isWindow(this.$scrollElement[0])) {
 
      offsetMethod = 'position'
 
      offsetBase   = this.$scrollElement.scrollTop()
 
    }
 

	
 
    this.$body
 
      .find(this.selector)
 
      .map(function () {
 
        var $el   = $(this)
 
        var href  = $el.data('target') || $el.attr('href')
 
        var $href = /^#./.test(href) && $(href)
 

	
 
        return ($href
 
          && $href.length
 
          && $href.is(':visible')
 
          && [[$href[offsetMethod]().top + offsetBase, href]]) || null
 
      })
 
      .sort(function (a, b) { return a[0] - b[0] })
 
      .each(function () {
 
        that.offsets.push(this[0])
 
        that.targets.push(this[1])
 
      })
 
  }
 

	
 
  ScrollSpy.prototype.process = function () {
 
    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset
 
    var scrollHeight = this.getScrollHeight()
 
    var maxScroll    = this.options.offset + scrollHeight - this.$scrollElement.height()
 
    var offsets      = this.offsets
 
    var targets      = this.targets
 
    var activeTarget = this.activeTarget
 
    var i
 

	
 
    if (this.scrollHeight != scrollHeight) {
 
      this.refresh()
 
    }
 

	
 
    if (scrollTop >= maxScroll) {
 
      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
 
    }
 

	
 
    if (activeTarget && scrollTop < offsets[0]) {
 
      this.activeTarget = null
 
      return this.clear()
 
    }
 

	
 
    for (i = offsets.length; i--;) {
 
      activeTarget != targets[i]
 
        && scrollTop >= offsets[i]
 
        && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])
 
        && this.activate(targets[i])
 
    }
 
  }
 

	
 
  ScrollSpy.prototype.activate = function (target) {
 
    this.activeTarget = target
 

	
 
    this.clear()
 

	
 
    var selector = this.selector +
 
      '[data-target="' + target + '"],' +
 
      this.selector + '[href="' + target + '"]'
 

	
 
    var active = $(selector)
 
      .parents('li')
 
      .addClass('active')
 

	
 
    if (active.parent('.dropdown-menu').length) {
 
      active = active
 
        .closest('li.dropdown')
 
        .addClass('active')
 
    }
 

	
 
    active.trigger('activate.bs.scrollspy')
 
  }
 

	
 
  ScrollSpy.prototype.clear = function () {
 
    $(this.selector)
 
      .parentsUntil(this.options.target, '.active')
 
      .removeClass('active')
 
  }
 

	
 

	
 
  // SCROLLSPY PLUGIN DEFINITION
 
  // ===========================
 

	
 
  function Plugin(option) {
 
    return this.each(function () {
 
      var $this   = $(this)
 
      var data    = $this.data('bs.scrollspy')
 
      var options = typeof option == 'object' && option
 

	
 
      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
 
      if (typeof option == 'string') data[option]()
 
    })
 
  }
 

	
 
  var old = $.fn.scrollspy
 

	
 
  $.fn.scrollspy             = Plugin
 
  $.fn.scrollspy.Constructor = ScrollSpy
 

	
 

	
 
  // SCROLLSPY NO CONFLICT
 
  // =====================
 

	
 
  $.fn.scrollspy.noConflict = function () {
 
    $.fn.scrollspy = old
 
    return this
 
  }
 

	
 

	
 
  // SCROLLSPY DATA-API
 
  // ==================
 

	
 
  $(window).on('load.bs.scrollspy.data-api', function () {
 
    $('[data-spy="scroll"]').each(function () {
 
      var $spy = $(this)
 
      Plugin.call($spy, $spy.data())
 
    })
 
  })
 

	
 
}(jQuery);
static/bootstrap/javascripts/bootstrap/tab.js
Show inline comments
 
new file 100644
 
/* ========================================================================
 
 * Bootstrap: tab.js v3.3.7
 
 * http://getbootstrap.com/javascript/#tabs
 
 * ========================================================================
 
 * Copyright 2011-2016 Twitter, Inc.
 
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 
 * ======================================================================== */
 

	
 

	
 
+function ($) {
 
  'use strict';
 

	
 
  // TAB CLASS DEFINITION
 
  // ====================
 

	
 
  var Tab = function (element) {
 
    // jscs:disable requireDollarBeforejQueryAssignment
 
    this.element = $(element)
 
    // jscs:enable requireDollarBeforejQueryAssignment
 
  }
 

	
 
  Tab.VERSION = '3.3.7'
 

	
 
  Tab.TRANSITION_DURATION = 150
 

	
 
  Tab.prototype.show = function () {
 
    var $this    = this.element
 
    var $ul      = $this.closest('ul:not(.dropdown-menu)')
 
    var selector = $this.data('target')
 

	
 
    if (!selector) {
 
      selector = $this.attr('href')
 
      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
 
    }
 

	
 
    if ($this.parent('li').hasClass('active')) return
 

	
 
    var $previous = $ul.find('.active:last a')
 
    var hideEvent = $.Event('hide.bs.tab', {
 
      relatedTarget: $this[0]
 
    })
 
    var showEvent = $.Event('show.bs.tab', {
 
      relatedTarget: $previous[0]
 
    })
 

	
 
    $previous.trigger(hideEvent)
 
    $this.trigger(showEvent)
 

	
 
    if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
 

	
 
    var $target = $(selector)
 

	
 
    this.activate($this.closest('li'), $ul)
 
    this.activate($target, $target.parent(), function () {
 
      $previous.trigger({
 
        type: 'hidden.bs.tab',
 
        relatedTarget: $this[0]
 
      })
 
      $this.trigger({
 
        type: 'shown.bs.tab',
 
        relatedTarget: $previous[0]
 
      })
 
    })
 
  }
 

	
 
  Tab.prototype.activate = function (element, container, callback) {
 
    var $active    = container.find('> .active')
 
    var transition = callback
 
      && $.support.transition
 
      && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)
 

	
 
    function next() {
 
      $active
 
        .removeClass('active')
 
        .find('> .dropdown-menu > .active')
 
          .removeClass('active')
 
        .end()
 
        .find('[data-toggle="tab"]')
 
          .attr('aria-expanded', false)
 

	
 
      element
 
        .addClass('active')
 
        .find('[data-toggle="tab"]')
 
          .attr('aria-expanded', true)
 

	
 
      if (transition) {
 
        element[0].offsetWidth // reflow for transition
 
        element.addClass('in')
 
      } else {
 
        element.removeClass('fade')
 
      }
 

	
 
      if (element.parent('.dropdown-menu').length) {
 
        element
 
          .closest('li.dropdown')
 
            .addClass('active')
 
          .end()
 
          .find('[data-toggle="tab"]')
 
            .attr('aria-expanded', true)
 
      }
 

	
 
      callback && callback()
 
    }
 

	
 
    $active.length && transition ?
 
      $active
 
        .one('bsTransitionEnd', next)
 
        .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
 
      next()
 

	
 
    $active.removeClass('in')
 
  }
 

	
 

	
 
  // TAB PLUGIN DEFINITION
 
  // =====================
 

	
 
  function Plugin(option) {
 
    return this.each(function () {
 
      var $this = $(this)
 
      var data  = $this.data('bs.tab')
 

	
 
      if (!data) $this.data('bs.tab', (data = new Tab(this)))
 
      if (typeof option == 'string') data[option]()
 
    })
 
  }
 

	
 
  var old = $.fn.tab
 

	
 
  $.fn.tab             = Plugin
 
  $.fn.tab.Constructor = Tab
 

	
 

	
 
  // TAB NO CONFLICT
 
  // ===============
 

	
 
  $.fn.tab.noConflict = function () {
 
    $.fn.tab = old
 
    return this
 
  }
 

	
 

	
 
  // TAB DATA-API
 
  // ============
 

	
 
  var clickHandler = function (e) {
 
    e.preventDefault()
 
    Plugin.call($(this), 'show')
 
  }
 

	
 
  $(document)
 
    .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
 
    .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)
 

	
 
}(jQuery);
static/bootstrap/javascripts/bootstrap/tooltip.js
Show inline comments
 
new file 100644
 
/* ========================================================================
 
 * Bootstrap: tooltip.js v3.3.7
 
 * http://getbootstrap.com/javascript/#tooltip
 
 * Inspired by the original jQuery.tipsy by Jason Frame
 
 * ========================================================================
 
 * Copyright 2011-2016 Twitter, Inc.
 
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 
 * ======================================================================== */
 

	
 

	
 
+function ($) {
 
  'use strict';
 

	
 
  // TOOLTIP PUBLIC CLASS DEFINITION
 
  // ===============================
 

	
 
  var Tooltip = function (element, options) {
 
    this.type       = null
 
    this.options    = null
 
    this.enabled    = null
 
    this.timeout    = null
 
    this.hoverState = null
 
    this.$element   = null
 
    this.inState    = null
 

	
 
    this.init('tooltip', element, options)
 
  }
 

	
 
  Tooltip.VERSION  = '3.3.7'
 

	
 
  Tooltip.TRANSITION_DURATION = 150
 

	
 
  Tooltip.DEFAULTS = {
 
    animation: true,
 
    placement: 'top',
 
    selector: false,
 
    template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
 
    trigger: 'hover focus',
 
    title: '',
 
    delay: 0,
 
    html: false,
 
    container: false,
 
    viewport: {
 
      selector: 'body',
 
      padding: 0
 
    }
 
  }
 

	
 
  Tooltip.prototype.init = function (type, element, options) {
 
    this.enabled   = true
 
    this.type      = type
 
    this.$element  = $(element)
 
    this.options   = this.getOptions(options)
 
    this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))
 
    this.inState   = { click: false, hover: false, focus: false }
 

	
 
    if (this.$element[0] instanceof document.constructor && !this.options.selector) {
 
      throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')
 
    }
 

	
 
    var triggers = this.options.trigger.split(' ')
 

	
 
    for (var i = triggers.length; i--;) {
 
      var trigger = triggers[i]
 

	
 
      if (trigger == 'click') {
 
        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
 
      } else if (trigger != 'manual') {
 
        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'
 
        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
 

	
 
        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
 
        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
 
      }
 
    }
 

	
 
    this.options.selector ?
 
      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
 
      this.fixTitle()
 
  }
 

	
 
  Tooltip.prototype.getDefaults = function () {
 
    return Tooltip.DEFAULTS
 
  }
 

	
 
  Tooltip.prototype.getOptions = function (options) {
 
    options = $.extend({}, this.getDefaults(), this.$element.data(), options)
 

	
 
    if (options.delay && typeof options.delay == 'number') {
 
      options.delay = {
 
        show: options.delay,
 
        hide: options.delay
 
      }
 
    }
 

	
 
    return options
 
  }
 

	
 
  Tooltip.prototype.getDelegateOptions = function () {
 
    var options  = {}
 
    var defaults = this.getDefaults()
 

	
 
    this._options && $.each(this._options, function (key, value) {
 
      if (defaults[key] != value) options[key] = value
 
    })
 

	
 
    return options
 
  }
 

	
 
  Tooltip.prototype.enter = function (obj) {
 
    var self = obj instanceof this.constructor ?
 
      obj : $(obj.currentTarget).data('bs.' + this.type)
 

	
 
    if (!self) {
 
      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
 
      $(obj.currentTarget).data('bs.' + this.type, self)
 
    }
 

	
 
    if (obj instanceof $.Event) {
 
      self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true
 
    }
 

	
 
    if (self.tip().hasClass('in') || self.hoverState == 'in') {
 
      self.hoverState = 'in'
 
      return
 
    }
 

	
 
    clearTimeout(self.timeout)
 

	
 
    self.hoverState = 'in'
 

	
 
    if (!self.options.delay || !self.options.delay.show) return self.show()
 

	
 
    self.timeout = setTimeout(function () {
 
      if (self.hoverState == 'in') self.show()
 
    }, self.options.delay.show)
 
  }
 

	
 
  Tooltip.prototype.isInStateTrue = function () {
 
    for (var key in this.inState) {
 
      if (this.inState[key]) return true
 
    }
 

	
 
    return false
 
  }
 

	
 
  Tooltip.prototype.leave = function (obj) {
 
    var self = obj instanceof this.constructor ?
 
      obj : $(obj.currentTarget).data('bs.' + this.type)
 

	
 
    if (!self) {
 
      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
 
      $(obj.currentTarget).data('bs.' + this.type, self)
 
    }
 

	
 
    if (obj instanceof $.Event) {
 
      self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false
 
    }
 

	
 
    if (self.isInStateTrue()) return
 

	
 
    clearTimeout(self.timeout)
 

	
 
    self.hoverState = 'out'
 

	
 
    if (!self.options.delay || !self.options.delay.hide) return self.hide()
 

	
 
    self.timeout = setTimeout(function () {
 
      if (self.hoverState == 'out') self.hide()
 
    }, self.options.delay.hide)
 
  }
 

	
 
  Tooltip.prototype.show = function () {
 
    var e = $.Event('show.bs.' + this.type)
 

	
 
    if (this.hasContent() && this.enabled) {
 
      this.$element.trigger(e)
 

	
 
      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
 
      if (e.isDefaultPrevented() || !inDom) return
 
      var that = this
 

	
 
      var $tip = this.tip()
 

	
 
      var tipId = this.getUID(this.type)
 

	
 
      this.setContent()
 
      $tip.attr('id', tipId)
 
      this.$element.attr('aria-describedby', tipId)
 

	
 
      if (this.options.animation) $tip.addClass('fade')
 

	
 
      var placement = typeof this.options.placement == 'function' ?
 
        this.options.placement.call(this, $tip[0], this.$element[0]) :
 
        this.options.placement
 

	
 
      var autoToken = /\s?auto?\s?/i
 
      var autoPlace = autoToken.test(placement)
 
      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
 

	
 
      $tip
 
        .detach()
 
        .css({ top: 0, left: 0, display: 'block' })
 
        .addClass(placement)
 
        .data('bs.' + this.type, this)
 

	
 
      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
 
      this.$element.trigger('inserted.bs.' + this.type)
 

	
 
      var pos          = this.getPosition()
 
      var actualWidth  = $tip[0].offsetWidth
 
      var actualHeight = $tip[0].offsetHeight
 

	
 
      if (autoPlace) {
 
        var orgPlacement = placement
 
        var viewportDim = this.getPosition(this.$viewport)
 

	
 
        placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top'    :
 
                    placement == 'top'    && pos.top    - actualHeight < viewportDim.top    ? 'bottom' :
 
                    placement == 'right'  && pos.right  + actualWidth  > viewportDim.width  ? 'left'   :
 
                    placement == 'left'   && pos.left   - actualWidth  < viewportDim.left   ? 'right'  :
 
                    placement
 

	
 
        $tip
 
          .removeClass(orgPlacement)
 
          .addClass(placement)
 
      }
 

	
 
      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
 

	
 
      this.applyPlacement(calculatedOffset, placement)
 

	
 
      var complete = function () {
 
        var prevHoverState = that.hoverState
 
        that.$element.trigger('shown.bs.' + that.type)
 
        that.hoverState = null
 

	
 
        if (prevHoverState == 'out') that.leave(that)
 
      }
 

	
 
      $.support.transition && this.$tip.hasClass('fade') ?
 
        $tip
 
          .one('bsTransitionEnd', complete)
 
          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
 
        complete()
 
    }
 
  }
 

	
 
  Tooltip.prototype.applyPlacement = function (offset, placement) {
 
    var $tip   = this.tip()
 
    var width  = $tip[0].offsetWidth
 
    var height = $tip[0].offsetHeight
 

	
 
    // manually read margins because getBoundingClientRect includes difference
 
    var marginTop = parseInt($tip.css('margin-top'), 10)
 
    var marginLeft = parseInt($tip.css('margin-left'), 10)
 

	
 
    // we must check for NaN for ie 8/9
 
    if (isNaN(marginTop))  marginTop  = 0
 
    if (isNaN(marginLeft)) marginLeft = 0
 

	
 
    offset.top  += marginTop
 
    offset.left += marginLeft
 

	
 
    // $.fn.offset doesn't round pixel values
 
    // so we use setOffset directly with our own function B-0
 
    $.offset.setOffset($tip[0], $.extend({
 
      using: function (props) {
 
        $tip.css({
 
          top: Math.round(props.top),
 
          left: Math.round(props.left)
 
        })
 
      }
 
    }, offset), 0)
 

	
 
    $tip.addClass('in')
 

	
 
    // check to see if placing tip in new offset caused the tip to resize itself
 
    var actualWidth  = $tip[0].offsetWidth
 
    var actualHeight = $tip[0].offsetHeight
 

	
 
    if (placement == 'top' && actualHeight != height) {
 
      offset.top = offset.top + height - actualHeight
 
    }
 

	
 
    var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
 

	
 
    if (delta.left) offset.left += delta.left
 
    else offset.top += delta.top
 

	
 
    var isVertical          = /top|bottom/.test(placement)
 
    var arrowDelta          = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
 
    var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'
 

	
 
    $tip.offset(offset)
 
    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
 
  }
 

	
 
  Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
 
    this.arrow()
 
      .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
 
      .css(isVertical ? 'top' : 'left', '')
 
  }
 

	
 
  Tooltip.prototype.setContent = function () {
 
    var $tip  = this.tip()
 
    var title = this.getTitle()
 

	
 
    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
 
    $tip.removeClass('fade in top bottom left right')
 
  }
 

	
 
  Tooltip.prototype.hide = function (callback) {
 
    var that = this
 
    var $tip = $(this.$tip)
 
    var e    = $.Event('hide.bs.' + this.type)
 

	
 
    function complete() {
 
      if (that.hoverState != 'in') $tip.detach()
 
      if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary.
 
        that.$element
 
          .removeAttr('aria-describedby')
 
          .trigger('hidden.bs.' + that.type)
 
      }
 
      callback && callback()
 
    }
 

	
 
    this.$element.trigger(e)
 

	
 
    if (e.isDefaultPrevented()) return
 

	
 
    $tip.removeClass('in')
 

	
 
    $.support.transition && $tip.hasClass('fade') ?
 
      $tip
 
        .one('bsTransitionEnd', complete)
 
        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
 
      complete()
 

	
 
    this.hoverState = null
 

	
 
    return this
 
  }
 

	
 
  Tooltip.prototype.fixTitle = function () {
 
    var $e = this.$element
 
    if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {
 
      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
 
    }
 
  }
 

	
 
  Tooltip.prototype.hasContent = function () {
 
    return this.getTitle()
 
  }
 

	
 
  Tooltip.prototype.getPosition = function ($element) {
 
    $element   = $element || this.$element
 

	
 
    var el     = $element[0]
 
    var isBody = el.tagName == 'BODY'
 

	
 
    var elRect    = el.getBoundingClientRect()
 
    if (elRect.width == null) {
 
      // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
 
      elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
 
    }
 
    var isSvg = window.SVGElement && el instanceof window.SVGElement
 
    // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3.
 
    // See https://github.com/twbs/bootstrap/issues/20280
 
    var elOffset  = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset())
 
    var scroll    = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
 
    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
 

	
 
    return $.extend({}, elRect, scroll, outerDims, elOffset)
 
  }
 

	
 
  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
 
    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2 } :
 
           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
 
           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
 
        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
 

	
 
  }
 

	
 
  Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
 
    var delta = { top: 0, left: 0 }
 
    if (!this.$viewport) return delta
 

	
 
    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
 
    var viewportDimensions = this.getPosition(this.$viewport)
 

	
 
    if (/right|left/.test(placement)) {
 
      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll
 
      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
 
      if (topEdgeOffset < viewportDimensions.top) { // top overflow
 
        delta.top = viewportDimensions.top - topEdgeOffset
 
      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
 
        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
 
      }
 
    } else {
 
      var leftEdgeOffset  = pos.left - viewportPadding
 
      var rightEdgeOffset = pos.left + viewportPadding + actualWidth
 
      if (leftEdgeOffset < viewportDimensions.left) { // left overflow
 
        delta.left = viewportDimensions.left - leftEdgeOffset
 
      } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow
 
        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
 
      }
 
    }
 

	
 
    return delta
 
  }
 

	
 
  Tooltip.prototype.getTitle = function () {
 
    var title
 
    var $e = this.$element
 
    var o  = this.options
 

	
 
    title = $e.attr('data-original-title')
 
      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
 

	
 
    return title
 
  }
 

	
 
  Tooltip.prototype.getUID = function (prefix) {
 
    do prefix += ~~(Math.random() * 1000000)
 
    while (document.getElementById(prefix))
 
    return prefix
 
  }
 

	
 
  Tooltip.prototype.tip = function () {
 
    if (!this.$tip) {
 
      this.$tip = $(this.options.template)
 
      if (this.$tip.length != 1) {
 
        throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')
 
      }
 
    }
 
    return this.$tip
 
  }
 

	
 
  Tooltip.prototype.arrow = function () {
 
    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
 
  }
 

	
 
  Tooltip.prototype.enable = function () {
 
    this.enabled = true
 
  }
 

	
 
  Tooltip.prototype.disable = function () {
 
    this.enabled = false
 
  }
 

	
 
  Tooltip.prototype.toggleEnabled = function () {
 
    this.enabled = !this.enabled
 
  }
 

	
 
  Tooltip.prototype.toggle = function (e) {
 
    var self = this
 
    if (e) {
 
      self = $(e.currentTarget).data('bs.' + this.type)
 
      if (!self) {
 
        self = new this.constructor(e.currentTarget, this.getDelegateOptions())
 
        $(e.currentTarget).data('bs.' + this.type, self)
 
      }
 
    }
 

	
 
    if (e) {
 
      self.inState.click = !self.inState.click
 
      if (self.isInStateTrue()) self.enter(self)
 
      else self.leave(self)
 
    } else {
 
      self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
 
    }
 
  }
 

	
 
  Tooltip.prototype.destroy = function () {
 
    var that = this
 
    clearTimeout(this.timeout)
 
    this.hide(function () {
 
      that.$element.off('.' + that.type).removeData('bs.' + that.type)
 
      if (that.$tip) {
 
        that.$tip.detach()
 
      }
 
      that.$tip = null
 
      that.$arrow = null
 
      that.$viewport = null
 
      that.$element = null
 
    })
 
  }
 

	
 

	
 
  // TOOLTIP PLUGIN DEFINITION
 
  // =========================
 

	
 
  function Plugin(option) {
 
    return this.each(function () {
 
      var $this   = $(this)
 
      var data    = $this.data('bs.tooltip')
 
      var options = typeof option == 'object' && option
 

	
 
      if (!data && /destroy|hide/.test(option)) return
 
      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
 
      if (typeof option == 'string') data[option]()
 
    })
 
  }
 

	
 
  var old = $.fn.tooltip
 

	
 
  $.fn.tooltip             = Plugin
 
  $.fn.tooltip.Constructor = Tooltip
 

	
 

	
 
  // TOOLTIP NO CONFLICT
 
  // ===================
 

	
 
  $.fn.tooltip.noConflict = function () {
 
    $.fn.tooltip = old
 
    return this
 
  }
 

	
 
}(jQuery);
static/bootstrap/javascripts/bootstrap/transition.js
Show inline comments
 
new file 100644
 
/* ========================================================================
 
 * Bootstrap: transition.js v3.3.7
 
 * http://getbootstrap.com/javascript/#transitions
 
 * ========================================================================
 
 * Copyright 2011-2016 Twitter, Inc.
 
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 
 * ======================================================================== */
 

	
 

	
 
+function ($) {
 
  'use strict';
 

	
 
  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
 
  // ============================================================
 

	
 
  function transitionEnd() {
 
    var el = document.createElement('bootstrap')
 

	
 
    var transEndEventNames = {
 
      WebkitTransition : 'webkitTransitionEnd',
 
      MozTransition    : 'transitionend',
 
      OTransition      : 'oTransitionEnd otransitionend',
 
      transition       : 'transitionend'
 
    }
 

	
 
    for (var name in transEndEventNames) {
 
      if (el.style[name] !== undefined) {
 
        return { end: transEndEventNames[name] }
 
      }
 
    }
 

	
 
    return false // explicit for ie8 (  ._.)
 
  }
 

	
 
  // http://blog.alexmaccaw.com/css-transitions
 
  $.fn.emulateTransitionEnd = function (duration) {
 
    var called = false
 
    var $el = this
 
    $(this).one('bsTransitionEnd', function () { called = true })
 
    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
 
    setTimeout(callback, duration)
 
    return this
 
  }
 

	
 
  $(function () {
 
    $.support.transition = transitionEnd()
 

	
 
    if (!$.support.transition) return
 

	
 
    $.event.special.bsTransitionEnd = {
 
      bindType: $.support.transition.end,
 
      delegateType: $.support.transition.end,
 
      handle: function (e) {
 
        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
 
      }
 
    }
 
  })
 

	
 
}(jQuery);
static/bootstrap/stylesheets/_bootstrap-compass.scss
Show inline comments
 
new file 100644
 
@function twbs-font-path($path) {
 
  @return font-url($path, true);
 
}
 

	
 
@function twbs-image-path($path) {
 
  @return image-url($path, true);
 
}
 

	
 
$bootstrap-sass-asset-helper: true;
static/bootstrap/stylesheets/_bootstrap-mincer.scss
Show inline comments
 
new file 100644
 
// Mincer asset helper functions
 
//
 
// This must be imported into a .css.ejs.scss file.
 
// Then, <% %>-interpolations will be parsed as strings by Sass, and evaluated by EJS after Sass compilation.
 

	
 

	
 
@function twbs-font-path($path) {
 
  // do something like following
 
  // from "path/to/font.ext#suffix" to "<%- asset_path(path/to/font.ext)) + #suffix %>"
 
  // from "path/to/font.ext?#suffix" to "<%- asset_path(path/to/font.ext)) + ?#suffix %>"
 
  // or from "path/to/font.ext" just "<%- asset_path(path/to/font.ext)) %>"
 
  @return "<%- asset_path("#{$path}".replace(/[#?].*$/, '')) + "#{$path}".replace(/(^[^#?]*)([#?]?.*$)/, '$2') %>";
 
}
 

	
 
@function twbs-image-path($file) {
 
  @return "<%- asset_path("#{$file}") %>";
 
}
 

	
 
$bootstrap-sass-asset-helper: true;
static/bootstrap/stylesheets/_bootstrap-sprockets.scss
Show inline comments
 
new file 100644
 
@function twbs-font-path($path) {
 
  @return font-path($path);
 
}
 

	
 
@function twbs-image-path($path) {
 
  @return image-path($path);
 
}
 

	
 
$bootstrap-sass-asset-helper: true;
static/bootstrap/stylesheets/_bootstrap.scss
Show inline comments
 
new file 100644
 
/*!
 
 * Bootstrap v3.3.7 (http://getbootstrap.com)
 
 * Copyright 2011-2016 Twitter, Inc.
 
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 
 */
 

	
 
// Core variables and mixins
 
@import "bootstrap/variables";
 
@import "bootstrap/mixins";
 

	
 
// Reset and dependencies
 
@import "bootstrap/normalize";
 
@import "bootstrap/print";
 
@import "bootstrap/glyphicons";
 

	
 
// Core CSS
 
@import "bootstrap/scaffolding";
 
@import "bootstrap/type";
 
@import "bootstrap/code";
 
@import "bootstrap/grid";
 
@import "bootstrap/tables";
 
@import "bootstrap/forms";
 
@import "bootstrap/buttons";
 

	
 
// Components
 
@import "bootstrap/component-animations";
 
@import "bootstrap/dropdowns";
 
@import "bootstrap/button-groups";
 
@import "bootstrap/input-groups";
 
@import "bootstrap/navs";
 
@import "bootstrap/navbar";
 
@import "bootstrap/breadcrumbs";
 
@import "bootstrap/pagination";
 
@import "bootstrap/pager";
 
@import "bootstrap/labels";
 
@import "bootstrap/badges";
 
@import "bootstrap/jumbotron";
 
@import "bootstrap/thumbnails";
 
@import "bootstrap/alerts";
 
@import "bootstrap/progress-bars";
 
@import "bootstrap/media";
 
@import "bootstrap/list-group";
 
@import "bootstrap/panels";
 
@import "bootstrap/responsive-embed";
 
@import "bootstrap/wells";
 
@import "bootstrap/close";
 

	
 
// Components w/ JavaScript
 
@import "bootstrap/modals";
 
@import "bootstrap/tooltip";
 
@import "bootstrap/popovers";
 
@import "bootstrap/carousel";
 

	
 
// Utility classes
 
@import "bootstrap/utilities";
 
@import "bootstrap/responsive-utilities";
static/bootstrap/stylesheets/bootstrap/_alerts.scss
Show inline comments
 
new file 100644
 
//
 
// Alerts
 
// --------------------------------------------------
 

	
 

	
 
// Base styles
 
// -------------------------
 

	
 
.alert {
 
  padding: $alert-padding;
 
  margin-bottom: $line-height-computed;
 
  border: 1px solid transparent;
 
  border-radius: $alert-border-radius;
 

	
 
  // Headings for larger alerts
 
  h4 {
 
    margin-top: 0;
 
    // Specified for the h4 to prevent conflicts of changing $headings-color
 
    color: inherit;
 
  }
 

	
 
  // Provide class for links that match alerts
 
  .alert-link {
 
    font-weight: $alert-link-font-weight;
 
  }
 

	
 
  // Improve alignment and spacing of inner content
 
  > p,
 
  > ul {
 
    margin-bottom: 0;
 
  }
 

	
 
  > p + p {
 
    margin-top: 5px;
 
  }
 
}
 

	
 
// Dismissible alerts
 
//
 
// Expand the right padding and account for the close button's positioning.
 

	
 
.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.
 
.alert-dismissible {
 
  padding-right: ($alert-padding + 20);
 

	
 
  // Adjust close link position
 
  .close {
 
    position: relative;
 
    top: -2px;
 
    right: -21px;
 
    color: inherit;
 
  }
 
}
 

	
 
// Alternate styles
 
//
 
// Generate contextual modifier classes for colorizing the alert.
 

	
 
.alert-success {
 
  @include alert-variant($alert-success-bg, $alert-success-border, $alert-success-text);
 
}
 

	
 
.alert-info {
 
  @include alert-variant($alert-info-bg, $alert-info-border, $alert-info-text);
 
}
 

	
 
.alert-warning {
 
  @include alert-variant($alert-warning-bg, $alert-warning-border, $alert-warning-text);
 
}
 

	
 
.alert-danger {
 
  @include alert-variant($alert-danger-bg, $alert-danger-border, $alert-danger-text);
 
}
static/bootstrap/stylesheets/bootstrap/_badges.scss
Show inline comments
 
new file 100644
 
//
 
// Badges
 
// --------------------------------------------------
 

	
 

	
 
// Base class
 
.badge {
 
  display: inline-block;
 
  min-width: 10px;
 
  padding: 3px 7px;
 
  font-size: $font-size-small;
 
  font-weight: $badge-font-weight;
 
  color: $badge-color;
 
  line-height: $badge-line-height;
 
  vertical-align: middle;
 
  white-space: nowrap;
 
  text-align: center;
 
  background-color: $badge-bg;
 
  border-radius: $badge-border-radius;
 

	
 
  // Empty badges collapse automatically (not available in IE8)
 
  &:empty {
 
    display: none;
 
  }
 

	
 
  // Quick fix for badges in buttons
 
  .btn & {
 
    position: relative;
 
    top: -1px;
 
  }
 

	
 
  .btn-xs &,
 
  .btn-group-xs > .btn & {
 
    top: 0;
 
    padding: 1px 5px;
 
  }
 

	
 
  // [converter] extracted a& to a.badge
 

	
 
  // Account for badges in navs
 
  .list-group-item.active > &,
 
  .nav-pills > .active > a > & {
 
    color: $badge-active-color;
 
    background-color: $badge-active-bg;
 
  }
 

	
 
  .list-group-item > & {
 
    float: right;
 
  }
 

	
 
  .list-group-item > & + & {
 
    margin-right: 5px;
 
  }
 

	
 
  .nav-pills > li > a > & {
 
    margin-left: 3px;
 
  }
 
}
 

	
 
// Hover state, but only for links
 
a.badge {
 
  &:hover,
 
  &:focus {
 
    color: $badge-link-hover-color;
 
    text-decoration: none;
 
    cursor: pointer;
 
  }
 
}
static/bootstrap/stylesheets/bootstrap/_breadcrumbs.scss
Show inline comments
 
new file 100644
 
//
 
// Breadcrumbs
 
// --------------------------------------------------
 

	
 

	
 
.breadcrumb {
 
  padding: $breadcrumb-padding-vertical $breadcrumb-padding-horizontal;
 
  margin-bottom: $line-height-computed;
 
  list-style: none;
 
  background-color: $breadcrumb-bg;
 
  border-radius: $border-radius-base;
 

	
 
  > li {
 
    display: inline-block;
 

	
 
    + li:before {
 
      // [converter] Workaround for https://github.com/sass/libsass/issues/1115
 
      $nbsp: "\00a0";
 
      content: "#{$breadcrumb-separator}#{$nbsp}"; // Unicode space added since inline-block means non-collapsing white-space
 
      padding: 0 5px;
 
      color: $breadcrumb-color;
 
    }
 
  }
 

	
 
  > .active {
 
    color: $breadcrumb-active-color;
 
  }
 
}
static/bootstrap/stylesheets/bootstrap/_button-groups.scss
Show inline comments
 
new file 100644
 
//
 
// Button groups
 
// --------------------------------------------------
 

	
 
// Make the div behave like a button
 
.btn-group,
 
.btn-group-vertical {
 
  position: relative;
 
  display: inline-block;
 
  vertical-align: middle; // match .btn alignment given font-size hack above
 
  > .btn {
 
    position: relative;
 
    float: left;
 
    // Bring the "active" button to the front
 
    &:hover,
 
    &:focus,
 
    &:active,
 
    &.active {
 
      z-index: 2;
 
    }
 
  }
 
}
 

	
 
// Prevent double borders when buttons are next to each other
 
.btn-group {
 
  .btn + .btn,
 
  .btn + .btn-group,
 
  .btn-group + .btn,
 
  .btn-group + .btn-group {
 
    margin-left: -1px;
 
  }
 
}
 

	
 
// Optional: Group multiple button groups together for a toolbar
 
.btn-toolbar {
 
  margin-left: -5px; // Offset the first child's margin
 
  @include clearfix;
 

	
 
  .btn,
 
  .btn-group,
 
  .input-group {
 
    float: left;
 
  }
 
  > .btn,
 
  > .btn-group,
 
  > .input-group {
 
    margin-left: 5px;
 
  }
 
}
 

	
 
.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
 
  border-radius: 0;
 
}
 

	
 
// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match
 
.btn-group > .btn:first-child {
 
  margin-left: 0;
 
  &:not(:last-child):not(.dropdown-toggle) {
 
    @include border-right-radius(0);
 
  }
 
}
 
// Need .dropdown-toggle since :last-child doesn't apply, given that a .dropdown-menu is used immediately after it
 
.btn-group > .btn:last-child:not(:first-child),
 
.btn-group > .dropdown-toggle:not(:first-child) {
 
  @include border-left-radius(0);
 
}
 

	
 
// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)
 
.btn-group > .btn-group {
 
  float: left;
 
}
 
.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
 
  border-radius: 0;
 
}
 
.btn-group > .btn-group:first-child:not(:last-child) {
 
  > .btn:last-child,
 
  > .dropdown-toggle {
 
    @include border-right-radius(0);
 
  }
 
}
 
.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {
 
  @include border-left-radius(0);
 
}
 

	
 
// On active and open, don't show outline
 
.btn-group .dropdown-toggle:active,
 
.btn-group.open .dropdown-toggle {
 
  outline: 0;
 
}
 

	
 

	
 
// Sizing
 
//
 
// Remix the default button sizing classes into new ones for easier manipulation.
 

	
 
.btn-group-xs > .btn { @extend .btn-xs; }
 
.btn-group-sm > .btn { @extend .btn-sm; }
 
.btn-group-lg > .btn { @extend .btn-lg; }
 

	
 

	
 
// Split button dropdowns
 
// ----------------------
 

	
 
// Give the line between buttons some depth
 
.btn-group > .btn + .dropdown-toggle {
 
  padding-left: 8px;
 
  padding-right: 8px;
 
}
 
.btn-group > .btn-lg + .dropdown-toggle {
 
  padding-left: 12px;
 
  padding-right: 12px;
 
}
 

	
 
// The clickable button for toggling the menu
 
// Remove the gradient and set the same inset shadow as the :active state
 
.btn-group.open .dropdown-toggle {
 
  @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
 

	
 
  // Show no shadow for `.btn-link` since it has no other button styles.
 
  &.btn-link {
 
    @include box-shadow(none);
 
  }
 
}
 

	
 

	
 
// Reposition the caret
 
.btn .caret {
 
  margin-left: 0;
 
}
 
// Carets in other button sizes
 
.btn-lg .caret {
 
  border-width: $caret-width-large $caret-width-large 0;
 
  border-bottom-width: 0;
 
}
 
// Upside down carets for .dropup
 
.dropup .btn-lg .caret {
 
  border-width: 0 $caret-width-large $caret-width-large;
 
}
 

	
 

	
 
// Vertical button groups
 
// ----------------------
 

	
 
.btn-group-vertical {
 
  > .btn,
 
  > .btn-group,
 
  > .btn-group > .btn {
 
    display: block;
 
    float: none;
 
    width: 100%;
 
    max-width: 100%;
 
  }
 

	
 
  // Clear floats so dropdown menus can be properly placed
 
  > .btn-group {
 
    @include clearfix;
 
    > .btn {
 
      float: none;
 
    }
 
  }
 

	
 
  > .btn + .btn,
 
  > .btn + .btn-group,
 
  > .btn-group + .btn,
 
  > .btn-group + .btn-group {
 
    margin-top: -1px;
 
    margin-left: 0;
 
  }
 
}
 

	
 
.btn-group-vertical > .btn {
 
  &:not(:first-child):not(:last-child) {
 
    border-radius: 0;
 
  }
 
  &:first-child:not(:last-child) {
 
    @include border-top-radius($btn-border-radius-base);
 
    @include border-bottom-radius(0);
 
  }
 
  &:last-child:not(:first-child) {
 
    @include border-top-radius(0);
 
    @include border-bottom-radius($btn-border-radius-base);
 
  }
 
}
 
.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
 
  border-radius: 0;
 
}
 
.btn-group-vertical > .btn-group:first-child:not(:last-child) {
 
  > .btn:last-child,
 
  > .dropdown-toggle {
 
    @include border-bottom-radius(0);
 
  }
 
}
 
.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
 
  @include border-top-radius(0);
 
}
 

	
 

	
 
// Justified button groups
 
// ----------------------
 

	
 
.btn-group-justified {
 
  display: table;
 
  width: 100%;
 
  table-layout: fixed;
 
  border-collapse: separate;
 
  > .btn,
 
  > .btn-group {
 
    float: none;
 
    display: table-cell;
 
    width: 1%;
 
  }
 
  > .btn-group .btn {
 
    width: 100%;
 
  }
 

	
 
  > .btn-group .dropdown-menu {
 
    left: auto;
 
  }
 
}
 

	
 

	
 
// Checkbox and radio options
 
//
 
// In order to support the browser's form validation feedback, powered by the
 
// `required` attribute, we have to "hide" the inputs via `clip`. We cannot use
 
// `display: none;` or `visibility: hidden;` as that also hides the popover.
 
// Simply visually hiding the inputs via `opacity` would leave them clickable in
 
// certain cases which is prevented by using `clip` and `pointer-events`.
 
// This way, we ensure a DOM element is visible to position the popover from.
 
//
 
// See https://github.com/twbs/bootstrap/pull/12794 and
 
// https://github.com/twbs/bootstrap/pull/14559 for more information.
 

	
 
[data-toggle="buttons"] {
 
  > .btn,
 
  > .btn-group > .btn {
 
    input[type="radio"],
 
    input[type="checkbox"] {
 
      position: absolute;
 
      clip: rect(0,0,0,0);
 
      pointer-events: none;
 
    }
 
  }
 
}
static/bootstrap/stylesheets/bootstrap/_buttons.scss
Show inline comments
 
new file 100644
 
//
 
// Buttons
 
// --------------------------------------------------
 

	
 

	
 
// Base styles
 
// --------------------------------------------------
 

	
 
.btn {
 
  display: inline-block;
 
  margin-bottom: 0; // For input.btn
 
  font-weight: $btn-font-weight;
 
  text-align: center;
 
  vertical-align: middle;
 
  touch-action: manipulation;
 
  cursor: pointer;
 
  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
 
  border: 1px solid transparent;
 
  white-space: nowrap;
 
  @include button-size($padding-base-vertical, $padding-base-horizontal, $font-size-base, $line-height-base, $btn-border-radius-base);
 
  @include user-select(none);
 

	
 
  &,
 
  &:active,
 
  &.active {
 
    &:focus,
 
    &.focus {
 
      @include tab-focus;
 
    }
 
  }
 

	
 
  &:hover,
 
  &:focus,
 
  &.focus {
 
    color: $btn-default-color;
 
    text-decoration: none;
 
  }
 

	
 
  &:active,
 
  &.active {
 
    outline: 0;
 
    background-image: none;
 
    @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
 
  }
 

	
 
  &.disabled,
 
  &[disabled],
 
  fieldset[disabled] & {
 
    cursor: $cursor-disabled;
 
    @include opacity(.65);
 
    @include box-shadow(none);
 
  }
 

	
 
  // [converter] extracted a& to a.btn
 
}
 

	
 
a.btn {
 
  &.disabled,
 
  fieldset[disabled] & {
 
    pointer-events: none; // Future-proof disabling of clicks on `<a>` elements
 
  }
 
}
 

	
 

	
 
// Alternate buttons
 
// --------------------------------------------------
 

	
 
.btn-default {
 
  @include button-variant($btn-default-color, $btn-default-bg, $btn-default-border);
 
}
 
.btn-primary {
 
  @include button-variant($btn-primary-color, $btn-primary-bg, $btn-primary-border);
 
}
 
// Success appears as green
 
.btn-success {
 
  @include button-variant($btn-success-color, $btn-success-bg, $btn-success-border);
 
}
 
// Info appears as blue-green
 
.btn-info {
 
  @include button-variant($btn-info-color, $btn-info-bg, $btn-info-border);
 
}
 
// Warning appears as orange
 
.btn-warning {
 
  @include button-variant($btn-warning-color, $btn-warning-bg, $btn-warning-border);
 
}
 
// Danger and error appear as red
 
.btn-danger {
 
  @include button-variant($btn-danger-color, $btn-danger-bg, $btn-danger-border);
 
}
 

	
 

	
 
// Link buttons
 
// -------------------------
 

	
 
// Make a button look and behave like a link
 
.btn-link {
 
  color: $link-color;
 
  font-weight: normal;
 
  border-radius: 0;
 

	
 
  &,
 
  &:active,
 
  &.active,
 
  &[disabled],
 
  fieldset[disabled] & {
 
    background-color: transparent;
 
    @include box-shadow(none);
 
  }
 
  &,
 
  &:hover,
 
  &:focus,
 
  &:active {
 
    border-color: transparent;
 
  }
 
  &:hover,
 
  &:focus {
 
    color: $link-hover-color;
 
    text-decoration: $link-hover-decoration;
 
    background-color: transparent;
 
  }
 
  &[disabled],
 
  fieldset[disabled] & {
 
    &:hover,
 
    &:focus {
 
      color: $btn-link-disabled-color;
 
      text-decoration: none;
 
    }
 
  }
 
}
 

	
 

	
 
// Button Sizes
 
// --------------------------------------------------
 

	
 
.btn-lg {
 
  // line-height: ensure even-numbered height of button next to large input
 
  @include button-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $btn-border-radius-large);
 
}
 
.btn-sm {
 
  // line-height: ensure proper height of button next to small input
 
  @include button-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $btn-border-radius-small);
 
}
 
.btn-xs {
 
  @include button-size($padding-xs-vertical, $padding-xs-horizontal, $font-size-small, $line-height-small, $btn-border-radius-small);
 
}
 

	
 

	
 
// Block button
 
// --------------------------------------------------
 

	
 
.btn-block {
 
  display: block;
 
  width: 100%;
 
}
 

	
 
// Vertically space out multiple block buttons
 
.btn-block + .btn-block {
 
  margin-top: 5px;
 
}
 

	
 
// Specificity overrides
 
input[type="submit"],
 
input[type="reset"],
 
input[type="button"] {
 
  &.btn-block {
 
    width: 100%;
 
  }
 
}
static/bootstrap/stylesheets/bootstrap/_carousel.scss
Show inline comments
 
new file 100644
 
//
 
// Carousel
 
// --------------------------------------------------
 

	
 

	
 
// Wrapper for the slide container and indicators
 
.carousel {
 
  position: relative;
 
}
 

	
 
.carousel-inner {
 
  position: relative;
 
  overflow: hidden;
 
  width: 100%;
 

	
 
  > .item {
 
    display: none;
 
    position: relative;
 
    @include transition(.6s ease-in-out left);
 

	
 
    // Account for jankitude on images
 
    > img,
 
    > a > img {
 
      @include img-responsive;
 
      line-height: 1;
 
    }
 

	
 
    // WebKit CSS3 transforms for supported devices
 
    @media all and (transform-3d), (-webkit-transform-3d) {
 
      @include transition-transform(0.6s ease-in-out);
 
      @include backface-visibility(hidden);
 
      @include perspective(1000px);
 

	
 
      &.next,
 
      &.active.right {
 
        @include translate3d(100%, 0, 0);
 
        left: 0;
 
      }
 
      &.prev,
 
      &.active.left {
 
        @include translate3d(-100%, 0, 0);
 
        left: 0;
 
      }
 
      &.next.left,
 
      &.prev.right,
 
      &.active {
 
        @include translate3d(0, 0, 0);
 
        left: 0;
 
      }
 
    }
 
  }
 

	
 
  > .active,
 
  > .next,
 
  > .prev {
 
    display: block;
 
  }
 

	
 
  > .active {
 
    left: 0;
 
  }
 

	
 
  > .next,
 
  > .prev {
 
    position: absolute;
 
    top: 0;
 
    width: 100%;
 
  }
 

	
 
  > .next {
 
    left: 100%;
 
  }
 
  > .prev {
 
    left: -100%;
 
  }
 
  > .next.left,
 
  > .prev.right {
 
    left: 0;
 
  }
 

	
 
  > .active.left {
 
    left: -100%;
 
  }
 
  > .active.right {
 
    left: 100%;
 
  }
 

	
 
}
 

	
 
// Left/right controls for nav
 
// ---------------------------
 

	
 
.carousel-control {
 
  position: absolute;
 
  top: 0;
 
  left: 0;
 
  bottom: 0;
 
  width: $carousel-control-width;
 
  @include opacity($carousel-control-opacity);
 
  font-size: $carousel-control-font-size;
 
  color: $carousel-control-color;
 
  text-align: center;
 
  text-shadow: $carousel-text-shadow;
 
  background-color: rgba(0, 0, 0, 0); // Fix IE9 click-thru bug
 
  // We can't have this transition here because WebKit cancels the carousel
 
  // animation if you trip this while in the middle of another animation.
 

	
 
  // Set gradients for backgrounds
 
  &.left {
 
    @include gradient-horizontal($start-color: rgba(0,0,0,.5), $end-color: rgba(0,0,0,.0001));
 
  }
 
  &.right {
 
    left: auto;
 
    right: 0;
 
    @include gradient-horizontal($start-color: rgba(0,0,0,.0001), $end-color: rgba(0,0,0,.5));
 
  }
 

	
 
  // Hover/focus state
 
  &:hover,
 
  &:focus {
 
    outline: 0;
 
    color: $carousel-control-color;
 
    text-decoration: none;
 
    @include opacity(.9);
 
  }
 

	
 
  // Toggles
 
  .icon-prev,
 
  .icon-next,
 
  .glyphicon-chevron-left,
 
  .glyphicon-chevron-right {
 
    position: absolute;
 
    top: 50%;
 
    margin-top: -10px;
 
    z-index: 5;
 
    display: inline-block;
 
  }
 
  .icon-prev,
 
  .glyphicon-chevron-left {
 
    left: 50%;
 
    margin-left: -10px;
 
  }
 
  .icon-next,
 
  .glyphicon-chevron-right {
 
    right: 50%;
 
    margin-right: -10px;
 
  }
 
  .icon-prev,
 
  .icon-next {
 
    width:  20px;
 
    height: 20px;
 
    line-height: 1;
 
    font-family: serif;
 
  }
 

	
 

	
 
  .icon-prev {
 
    &:before {
 
      content: '\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)
 
    }
 
  }
 
  .icon-next {
 
    &:before {
 
      content: '\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)
 
    }
 
  }
 
}
 

	
 
// Optional indicator pips
 
//
 
// Add an unordered list with the following class and add a list item for each
 
// slide your carousel holds.
 

	
 
.carousel-indicators {
 
  position: absolute;
 
  bottom: 10px;
 
  left: 50%;
 
  z-index: 15;
 
  width: 60%;
 
  margin-left: -30%;
 
  padding-left: 0;
 
  list-style: none;
 
  text-align: center;
 

	
 
  li {
 
    display: inline-block;
 
    width:  10px;
 
    height: 10px;
 
    margin: 1px;
 
    text-indent: -999px;
 
    border: 1px solid $carousel-indicator-border-color;
 
    border-radius: 10px;
 
    cursor: pointer;
 

	
 
    // IE8-9 hack for event handling
 
    //
 
    // Internet Explorer 8-9 does not support clicks on elements without a set
 
    // `background-color`. We cannot use `filter` since that's not viewed as a
 
    // background color by the browser. Thus, a hack is needed.
 
    // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer
 
    //
 
    // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we
 
    // set alpha transparency for the best results possible.
 
    background-color: #000 \9; // IE8
 
    background-color: rgba(0,0,0,0); // IE9
 
  }
 
  .active {
 
    margin: 0;
 
    width:  12px;
 
    height: 12px;
 
    background-color: $carousel-indicator-active-bg;
 
  }
 
}
 

	
 
// Optional captions
 
// -----------------------------
 
// Hidden by default for smaller viewports
 
.carousel-caption {
 
  position: absolute;
 
  left: 15%;
 
  right: 15%;
 
  bottom: 20px;
 
  z-index: 10;
 
  padding-top: 20px;
 
  padding-bottom: 20px;
 
  color: $carousel-caption-color;
 
  text-align: center;
 
  text-shadow: $carousel-text-shadow;
 
  & .btn {
 
    text-shadow: none; // No shadow for button elements in carousel-caption
 
  }
 
}
 

	
 

	
 
// Scale up controls for tablets and up
 
@media screen and (min-width: $screen-sm-min) {
 

	
 
  // Scale up the controls a smidge
 
  .carousel-control {
 
    .glyphicon-chevron-left,
 
    .glyphicon-chevron-right,
 
    .icon-prev,
 
    .icon-next {
 
      width: ($carousel-control-font-size * 1.5);
 
      height: ($carousel-control-font-size * 1.5);
 
      margin-top: ($carousel-control-font-size / -2);
 
      font-size: ($carousel-control-font-size * 1.5);
 
    }
 
    .glyphicon-chevron-left,
 
    .icon-prev {
 
      margin-left: ($carousel-control-font-size / -2);
 
    }
 
    .glyphicon-chevron-right,
 
    .icon-next {
 
      margin-right: ($carousel-control-font-size / -2);
 
    }
 
  }
 

	
 
  // Show and left align the captions
 
  .carousel-caption {
 
    left: 20%;
 
    right: 20%;
 
    padding-bottom: 30px;
 
  }
 

	
 
  // Move up the indicators
 
  .carousel-indicators {
 
    bottom: 20px;
 
  }
 
}
static/bootstrap/stylesheets/bootstrap/_close.scss
Show inline comments
 
new file 100644
 
//
 
// Close icons
 
// --------------------------------------------------
 

	
 

	
 
.close {
 
  float: right;
 
  font-size: ($font-size-base * 1.5);
 
  font-weight: $close-font-weight;
 
  line-height: 1;
 
  color: $close-color;
 
  text-shadow: $close-text-shadow;
 
  @include opacity(.2);
 

	
 
  &:hover,
 
  &:focus {
 
    color: $close-color;
 
    text-decoration: none;
 
    cursor: pointer;
 
    @include opacity(.5);
 
  }
 

	
 
  // [converter] extracted button& to button.close
 
}
 

	
 
// Additional properties for button version
 
// iOS requires the button element instead of an anchor tag.
 
// If you want the anchor version, it requires `href="#"`.
 
// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile
 
button.close {
 
  padding: 0;
 
  cursor: pointer;
 
  background: transparent;
 
  border: 0;
 
  -webkit-appearance: none;
 
}
static/bootstrap/stylesheets/bootstrap/_code.scss
Show inline comments
 
new file 100644
 
//
 
// Code (inline and block)
 
// --------------------------------------------------
 

	
 

	
 
// Inline and block code styles
 
code,
 
kbd,
 
pre,
 
samp {
 
  font-family: $font-family-monospace;
 
}
 

	
 
// Inline code
 
code {
 
  padding: 2px 4px;
 
  font-size: 90%;
 
  color: $code-color;
 
  background-color: $code-bg;
 
  border-radius: $border-radius-base;
 
}
 

	
 
// User input typically entered via keyboard
 
kbd {
 
  padding: 2px 4px;
 
  font-size: 90%;
 
  color: $kbd-color;
 
  background-color: $kbd-bg;
 
  border-radius: $border-radius-small;
 
  box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);
 

	
 
  kbd {
 
    padding: 0;
 
    font-size: 100%;
 
    font-weight: bold;
 
    box-shadow: none;
 
  }
 
}
 

	
 
// Blocks of code
 
pre {
 
  display: block;
 
  padding: (($line-height-computed - 1) / 2);
 
  margin: 0 0 ($line-height-computed / 2);
 
  font-size: ($font-size-base - 1); // 14px to 13px
 
  line-height: $line-height-base;
 
  word-break: break-all;
 
  word-wrap: break-word;
 
  color: $pre-color;
 
  background-color: $pre-bg;
 
  border: 1px solid $pre-border-color;
 
  border-radius: $border-radius-base;
 

	
 
  // Account for some code outputs that place code tags in pre tags
 
  code {
 
    padding: 0;
 
    font-size: inherit;
 
    color: inherit;
 
    white-space: pre-wrap;
 
    background-color: transparent;
 
    border-radius: 0;
 
  }
 
}
 

	
 
// Enable scrollable blocks of code
 
.pre-scrollable {
 
  max-height: $pre-scrollable-max-height;
 
  overflow-y: scroll;
 
}
static/bootstrap/stylesheets/bootstrap/_component-animations.scss
Show inline comments
 
new file 100644
 
//
 
// Component animations
 
// --------------------------------------------------
 

	
 
// Heads up!
 
//
 
// We don't use the `.opacity()` mixin here since it causes a bug with text
 
// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.
 

	
 
.fade {
 
  opacity: 0;
 
  @include transition(opacity .15s linear);
 
  &.in {
 
    opacity: 1;
 
  }
 
}
 

	
 
.collapse {
 
  display: none;
 

	
 
  &.in      { display: block; }
 
  // [converter] extracted tr&.in to tr.collapse.in
 
  // [converter] extracted tbody&.in to tbody.collapse.in
 
}
 

	
 
tr.collapse.in    { display: table-row; }
 

	
 
tbody.collapse.in { display: table-row-group; }
 

	
 
.collapsing {
 
  position: relative;
 
  height: 0;
 
  overflow: hidden;
 
  @include transition-property(height, visibility);
 
  @include transition-duration(.35s);
 
  @include transition-timing-function(ease);
 
}
static/bootstrap/stylesheets/bootstrap/_dropdowns.scss
Show inline comments
 
new file 100644
 
//
 
// Dropdown menus
 
// --------------------------------------------------
 

	
 

	
 
// Dropdown arrow/caret
 
.caret {
 
  display: inline-block;
 
  width: 0;
 
  height: 0;
 
  margin-left: 2px;
 
  vertical-align: middle;
 
  border-top:   $caret-width-base dashed;
 
  border-top:   $caret-width-base solid \9; // IE8
 
  border-right: $caret-width-base solid transparent;
 
  border-left:  $caret-width-base solid transparent;
 
}
 

	
 
// The dropdown wrapper (div)
 
.dropup,
 
.dropdown {
 
  position: relative;
 
}
 

	
 
// Prevent the focus on the dropdown toggle when closing dropdowns
 
.dropdown-toggle:focus {
 
  outline: 0;
 
}
 

	
 
// The dropdown menu (ul)
 
.dropdown-menu {
 
  position: absolute;
 
  top: 100%;
 
  left: 0;
 
  z-index: $zindex-dropdown;
 
  display: none; // none by default, but block on "open" of the menu
 
  float: left;
 
  min-width: 160px;
 
  padding: 5px 0;
 
  margin: 2px 0 0; // override default ul
 
  list-style: none;
 
  font-size: $font-size-base;
 
  text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)
 
  background-color: $dropdown-bg;
 
  border: 1px solid $dropdown-fallback-border; // IE8 fallback
 
  border: 1px solid $dropdown-border;
 
  border-radius: $border-radius-base;
 
  @include box-shadow(0 6px 12px rgba(0,0,0,.175));
 
  background-clip: padding-box;
 

	
 
  // Aligns the dropdown menu to right
 
  //
 
  // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`
 
  &.pull-right {
 
    right: 0;
 
    left: auto;
 
  }
 

	
 
  // Dividers (basically an hr) within the dropdown
 
  .divider {
 
    @include nav-divider($dropdown-divider-bg);
 
  }
 

	
 
  // Links within the dropdown menu
 
  > li > a {
 
    display: block;
 
    padding: 3px 20px;
 
    clear: both;
 
    font-weight: normal;
 
    line-height: $line-height-base;
 
    color: $dropdown-link-color;
 
    white-space: nowrap; // prevent links from randomly breaking onto new lines
 
  }
 
}
 

	
 
// Hover/Focus state
 
.dropdown-menu > li > a {
 
  &:hover,
 
  &:focus {
 
    text-decoration: none;
 
    color: $dropdown-link-hover-color;
 
    background-color: $dropdown-link-hover-bg;
 
  }
 
}
 

	
 
// Active state
 
.dropdown-menu > .active > a {
 
  &,
 
  &:hover,
 
  &:focus {
 
    color: $dropdown-link-active-color;
 
    text-decoration: none;
 
    outline: 0;
 
    background-color: $dropdown-link-active-bg;
 
  }
 
}
 

	
 
// Disabled state
 
//
 
// Gray out text and ensure the hover/focus state remains gray
 

	
 
.dropdown-menu > .disabled > a {
 
  &,
 
  &:hover,
 
  &:focus {
 
    color: $dropdown-link-disabled-color;
 
  }
 

	
 
  // Nuke hover/focus effects
 
  &:hover,
 
  &:focus {
 
    text-decoration: none;
 
    background-color: transparent;
 
    background-image: none; // Remove CSS gradient
 
    @include reset-filter;
 
    cursor: $cursor-disabled;
 
  }
 
}
 

	
 
// Open state for the dropdown
 
.open {
 
  // Show the menu
 
  > .dropdown-menu {
 
    display: block;
 
  }
 

	
 
  // Remove the outline when :focus is triggered
 
  > a {
 
    outline: 0;
 
  }
 
}
 

	
 
// Menu positioning
 
//
 
// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown
 
// menu with the parent.
 
.dropdown-menu-right {
 
  left: auto; // Reset the default from `.dropdown-menu`
 
  right: 0;
 
}
 
// With v3, we enabled auto-flipping if you have a dropdown within a right
 
// aligned nav component. To enable the undoing of that, we provide an override
 
// to restore the default dropdown menu alignment.
 
//
 
// This is only for left-aligning a dropdown menu within a `.navbar-right` or
 
// `.pull-right` nav component.
 
.dropdown-menu-left {
 
  left: 0;
 
  right: auto;
 
}
 

	
 
// Dropdown section headers
 
.dropdown-header {
 
  display: block;
 
  padding: 3px 20px;
 
  font-size: $font-size-small;
 
  line-height: $line-height-base;
 
  color: $dropdown-header-color;
 
  white-space: nowrap; // as with > li > a
 
}
 

	
 
// Backdrop to catch body clicks on mobile, etc.
 
.dropdown-backdrop {
 
  position: fixed;
 
  left: 0;
 
  right: 0;
 
  bottom: 0;
 
  top: 0;
 
  z-index: ($zindex-dropdown - 10);
 
}
 

	
 
// Right aligned dropdowns
 
.pull-right > .dropdown-menu {
 
  right: 0;
 
  left: auto;
 
}
 

	
 
// Allow for dropdowns to go bottom up (aka, dropup-menu)
 
//
 
// Just add .dropup after the standard .dropdown class and you're set, bro.
 
// TODO: abstract this so that the navbar fixed styles are not placed here?
 

	
 
.dropup,
 
.navbar-fixed-bottom .dropdown {
 
  // Reverse the caret
 
  .caret {
 
    border-top: 0;
 
    border-bottom: $caret-width-base dashed;
 
    border-bottom: $caret-width-base solid \9; // IE8
 
    content: "";
 
  }
 
  // Different positioning for bottom up menu
 
  .dropdown-menu {
 
    top: auto;
 
    bottom: 100%;
 
    margin-bottom: 2px;
 
  }
 
}
 

	
 

	
 
// Component alignment
 
//
 
// Reiterate per navbar.less and the modified component alignment there.
 

	
 
@media (min-width: $grid-float-breakpoint) {
 
  .navbar-right {
 
    .dropdown-menu {
 
      right: 0; left: auto;
 
    }
 
    // Necessary for overrides of the default right aligned menu.
 
    // Will remove come v4 in all likelihood.
 
    .dropdown-menu-left {
 
      left: 0; right: auto;
 
    }
 
  }
 
}
static/bootstrap/stylesheets/bootstrap/_forms.scss
Show inline comments
 
new file 100644
 
//
 
// Forms
 
// --------------------------------------------------
 

	
 

	
 
// Normalize non-controls
 
//
 
// Restyle and baseline non-control form elements.
 

	
 
fieldset {
 
  padding: 0;
 
  margin: 0;
 
  border: 0;
 
  // Chrome and Firefox set a `min-width: min-content;` on fieldsets,
 
  // so we reset that to ensure it behaves more like a standard block element.
 
  // See https://github.com/twbs/bootstrap/issues/12359.
 
  min-width: 0;
 
}
 

	
 
legend {
 
  display: block;
 
  width: 100%;
 
  padding: 0;
 
  margin-bottom: $line-height-computed;
 
  font-size: ($font-size-base * 1.5);
 
  line-height: inherit;
 
  color: $legend-color;
 
  border: 0;
 
  border-bottom: 1px solid $legend-border-color;
 
}
 

	
 
label {
 
  display: inline-block;
 
  max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)
 
  margin-bottom: 5px;
 
  font-weight: bold;
 
}
 

	
 

	
 
// Normalize form controls
 
//
 
// While most of our form styles require extra classes, some basic normalization
 
// is required to ensure optimum display with or without those classes to better
 
// address browser inconsistencies.
 

	
 
// Override content-box in Normalize (* isn't specific enough)
 
input[type="search"] {
 
  @include box-sizing(border-box);
 
}
 

	
 
// Position radios and checkboxes better
 
input[type="radio"],
 
input[type="checkbox"] {
 
  margin: 4px 0 0;
 
  margin-top: 1px \9; // IE8-9
 
  line-height: normal;
 
}
 

	
 
input[type="file"] {
 
  display: block;
 
}
 

	
 
// Make range inputs behave like textual form controls
 
input[type="range"] {
 
  display: block;
 
  width: 100%;
 
}
 

	
 
// Make multiple select elements height not fixed
 
select[multiple],
 
select[size] {
 
  height: auto;
 
}
 

	
 
// Focus for file, radio, and checkbox
 
input[type="file"]:focus,
 
input[type="radio"]:focus,
 
input[type="checkbox"]:focus {
 
  @include tab-focus;
 
}
 

	
 
// Adjust output element
 
output {
 
  display: block;
 
  padding-top: ($padding-base-vertical + 1);
 
  font-size: $font-size-base;
 
  line-height: $line-height-base;
 
  color: $input-color;
 
}
 

	
 

	
 
// Common form controls
 
//
 
// Shared size and type resets for form controls. Apply `.form-control` to any
 
// of the following form controls:
 
//
 
// select
 
// textarea
 
// input[type="text"]
 
// input[type="password"]
 
// input[type="datetime"]
 
// input[type="datetime-local"]
 
// input[type="date"]
 
// input[type="month"]
 
// input[type="time"]
 
// input[type="week"]
 
// input[type="number"]
 
// input[type="email"]
 
// input[type="url"]
 
// input[type="search"]
 
// input[type="tel"]
 
// input[type="color"]
 

	
 
.form-control {
 
  display: block;
 
  width: 100%;
 
  height: $input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)
 
  padding: $padding-base-vertical $padding-base-horizontal;
 
  font-size: $font-size-base;
 
  line-height: $line-height-base;
 
  color: $input-color;
 
  background-color: $input-bg;
 
  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
 
  border: 1px solid $input-border;
 
  border-radius: $input-border-radius; // Note: This has no effect on <select>s in some browsers, due to the limited stylability of <select>s in CSS.
 
  @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075));
 
  @include transition(border-color ease-in-out .15s, box-shadow ease-in-out .15s);
 

	
 
  // Customize the `:focus` state to imitate native WebKit styles.
 
  @include form-control-focus;
 

	
 
  // Placeholder
 
  @include placeholder;
 

	
 
  // Unstyle the caret on `<select>`s in IE10+.
 
  &::-ms-expand {
 
    border: 0;
 
    background-color: transparent;
 
  }
 

	
 
  // Disabled and read-only inputs
 
  //
 
  // HTML5 says that controls under a fieldset > legend:first-child won't be
 
  // disabled if the fieldset is disabled. Due to implementation difficulty, we
 
  // don't honor that edge case; we style them as disabled anyway.
 
  &[disabled],
 
  &[readonly],
 
  fieldset[disabled] & {
 
    background-color: $input-bg-disabled;
 
    opacity: 1; // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655
 
  }
 

	
 
  &[disabled],
 
  fieldset[disabled] & {
 
    cursor: $cursor-disabled;
 
  }
 

	
 
  // [converter] extracted textarea& to textarea.form-control
 
}
 

	
 
// Reset height for `textarea`s
 
textarea.form-control {
 
  height: auto;
 
}
 

	
 

	
 
// Search inputs in iOS
 
//
 
// This overrides the extra rounded corners on search inputs in iOS so that our
 
// `.form-control` class can properly style them. Note that this cannot simply
 
// be added to `.form-control` as it's not specific enough. For details, see
 
// https://github.com/twbs/bootstrap/issues/11586.
 

	
 
input[type="search"] {
 
  -webkit-appearance: none;
 
}
 

	
 

	
 
// Special styles for iOS temporal inputs
 
//
 
// In Mobile Safari, setting `display: block` on temporal inputs causes the
 
// text within the input to become vertically misaligned. As a workaround, we
 
// set a pixel line-height that matches the given height of the input, but only
 
// for Safari. See https://bugs.webkit.org/show_bug.cgi?id=139848
 
//
 
// Note that as of 9.3, iOS doesn't support `week`.
 

	
 
@media screen and (-webkit-min-device-pixel-ratio: 0) {
 
  input[type="date"],
 
  input[type="time"],
 
  input[type="datetime-local"],
 
  input[type="month"] {
 
    &.form-control {
 
      line-height: $input-height-base;
 
    }
 

	
 
    &.input-sm,
 
    .input-group-sm & {
 
      line-height: $input-height-small;
 
    }
 

	
 
    &.input-lg,
 
    .input-group-lg & {
 
      line-height: $input-height-large;
 
    }
 
  }
 
}
 

	
 

	
 
// Form groups
 
//
 
// Designed to help with the organization and spacing of vertical forms. For
 
// horizontal forms, use the predefined grid classes.
 

	
 
.form-group {
 
  margin-bottom: $form-group-margin-bottom;
 
}
 

	
 

	
 
// Checkboxes and radios
 
//
 
// Indent the labels to position radios/checkboxes as hanging controls.
 

	
 
.radio,
 
.checkbox {
 
  position: relative;
 
  display: block;
 
  margin-top: 10px;
 
  margin-bottom: 10px;
 

	
 
  label {
 
    min-height: $line-height-computed; // Ensure the input doesn't jump when there is no text
 
    padding-left: 20px;
 
    margin-bottom: 0;
 
    font-weight: normal;
 
    cursor: pointer;
 
  }
 
}
 
.radio input[type="radio"],
 
.radio-inline input[type="radio"],
 
.checkbox input[type="checkbox"],
 
.checkbox-inline input[type="checkbox"] {
 
  position: absolute;
 
  margin-left: -20px;
 
  margin-top: 4px \9;
 
}
 

	
 
.radio + .radio,
 
.checkbox + .checkbox {
 
  margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing
 
}
 

	
 
// Radios and checkboxes on same line
 
.radio-inline,
 
.checkbox-inline {
 
  position: relative;
 
  display: inline-block;
 
  padding-left: 20px;
 
  margin-bottom: 0;
 
  vertical-align: middle;
 
  font-weight: normal;
 
  cursor: pointer;
 
}
 
.radio-inline + .radio-inline,
 
.checkbox-inline + .checkbox-inline {
 
  margin-top: 0;
 
  margin-left: 10px; // space out consecutive inline controls
 
}
 

	
 
// Apply same disabled cursor tweak as for inputs
 
// Some special care is needed because <label>s don't inherit their parent's `cursor`.
 
//
 
// Note: Neither radios nor checkboxes can be readonly.
 
input[type="radio"],
 
input[type="checkbox"] {
 
  &[disabled],
 
  &.disabled,
 
  fieldset[disabled] & {
 
    cursor: $cursor-disabled;
 
  }
 
}
 
// These classes are used directly on <label>s
 
.radio-inline,
 
.checkbox-inline {
 
  &.disabled,
 
  fieldset[disabled] & {
 
    cursor: $cursor-disabled;
 
  }
 
}
 
// These classes are used on elements with <label> descendants
 
.radio,
 
.checkbox {
 
  &.disabled,
 
  fieldset[disabled] & {
 
    label {
 
      cursor: $cursor-disabled;
 
    }
 
  }
 
}
 

	
 

	
 
// Static form control text
 
//
 
// Apply class to a `p` element to make any string of text align with labels in
 
// a horizontal form layout.
 

	
 
.form-control-static {
 
  // Size it appropriately next to real form controls
 
  padding-top: ($padding-base-vertical + 1);
 
  padding-bottom: ($padding-base-vertical + 1);
 
  // Remove default margin from `p`
 
  margin-bottom: 0;
 
  min-height: ($line-height-computed + $font-size-base);
 

	
 
  &.input-lg,
 
  &.input-sm {
 
    padding-left: 0;
 
    padding-right: 0;
 
  }
 
}
 

	
 

	
 
// Form control sizing
 
//
 
// Build on `.form-control` with modifier classes to decrease or increase the
 
// height and font-size of form controls.
 
//
 
// The `.form-group-* form-control` variations are sadly duplicated to avoid the
 
// issue documented in https://github.com/twbs/bootstrap/issues/15074.
 

	
 
@include input-size('.input-sm', $input-height-small, $padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $input-border-radius-small);
 
.form-group-sm {
 
  .form-control {
 
    height: $input-height-small;
 
    padding: $padding-small-vertical $padding-small-horizontal;
 
    font-size: $font-size-small;
 
    line-height: $line-height-small;
 
    border-radius: $input-border-radius-small;
 
  }
 
  select.form-control {
 
    height: $input-height-small;
 
    line-height: $input-height-small;
 
  }
 
  textarea.form-control,
 
  select[multiple].form-control {
 
    height: auto;
 
  }
 
  .form-control-static {
 
    height: $input-height-small;
 
    min-height: ($line-height-computed + $font-size-small);
 
    padding: ($padding-small-vertical + 1) $padding-small-horizontal;
 
    font-size: $font-size-small;
 
    line-height: $line-height-small;
 
  }
 
}
 

	
 
@include input-size('.input-lg', $input-height-large, $padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $input-border-radius-large);
 
.form-group-lg {
 
  .form-control {
 
    height: $input-height-large;
 
    padding: $padding-large-vertical $padding-large-horizontal;
 
    font-size: $font-size-large;
 
    line-height: $line-height-large;
 
    border-radius: $input-border-radius-large;
 
  }
 
  select.form-control {
 
    height: $input-height-large;
 
    line-height: $input-height-large;
 
  }
 
  textarea.form-control,
 
  select[multiple].form-control {
 
    height: auto;
 
  }
 
  .form-control-static {
 
    height: $input-height-large;
 
    min-height: ($line-height-computed + $font-size-large);
 
    padding: ($padding-large-vertical + 1) $padding-large-horizontal;
 
    font-size: $font-size-large;
 
    line-height: $line-height-large;
 
  }
 
}
 

	
 

	
 
// Form control feedback states
 
//
 
// Apply contextual and semantic states to individual form controls.
 

	
 
.has-feedback {
 
  // Enable absolute positioning
 
  position: relative;
 

	
 
  // Ensure icons don't overlap text
 
  .form-control {
 
    padding-right: ($input-height-base * 1.25);
 
  }
 
}
 
// Feedback icon (requires .glyphicon classes)
 
.form-control-feedback {
 
  position: absolute;
 
  top: 0;
 
  right: 0;
 
  z-index: 2; // Ensure icon is above input groups
 
  display: block;
 
  width: $input-height-base;
 
  height: $input-height-base;
 
  line-height: $input-height-base;
 
  text-align: center;
 
  pointer-events: none;
 
}
 
.input-lg + .form-control-feedback,
 
.input-group-lg + .form-control-feedback,
 
.form-group-lg .form-control + .form-control-feedback {
 
  width: $input-height-large;
 
  height: $input-height-large;
 
  line-height: $input-height-large;
 
}
 
.input-sm + .form-control-feedback,
 
.input-group-sm + .form-control-feedback,
 
.form-group-sm .form-control + .form-control-feedback {
 
  width: $input-height-small;
 
  height: $input-height-small;
 
  line-height: $input-height-small;
 
}
 

	
 
// Feedback states
 
.has-success {
 
  @include form-control-validation($state-success-text, $state-success-text, $state-success-bg);
 
}
 
.has-warning {
 
  @include form-control-validation($state-warning-text, $state-warning-text, $state-warning-bg);
 
}
 
.has-error {
 
  @include form-control-validation($state-danger-text, $state-danger-text, $state-danger-bg);
 
}
 

	
 
// Reposition feedback icon if input has visible label above
 
.has-feedback label {
 

	
 
  & ~ .form-control-feedback {
 
    top: ($line-height-computed + 5); // Height of the `label` and its margin
 
  }
 
  &.sr-only ~ .form-control-feedback {
 
    top: 0;
 
  }
 
}
 

	
 

	
 
// Help text
 
//
 
// Apply to any element you wish to create light text for placement immediately
 
// below a form control. Use for general help, formatting, or instructional text.
 

	
 
.help-block {
 
  display: block; // account for any element using help-block
 
  margin-top: 5px;
 
  margin-bottom: 10px;
 
  color: lighten($text-color, 25%); // lighten the text some for contrast
 
}
 

	
 

	
 
// Inline forms
 
//
 
// Make forms appear inline(-block) by adding the `.form-inline` class. Inline
 
// forms begin stacked on extra small (mobile) devices and then go inline when
 
// viewports reach <768px.
 
//
 
// Requires wrapping inputs and labels with `.form-group` for proper display of
 
// default HTML form controls and our custom form controls (e.g., input groups).
 
//
 
// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.
 

	
 
// [converter] extracted from `.form-inline` for libsass compatibility
 
@mixin form-inline {
 

	
 
  // Kick in the inline
 
  @media (min-width: $screen-sm-min) {
 
    // Inline-block all the things for "inline"
 
    .form-group {
 
      display: inline-block;
 
      margin-bottom: 0;
 
      vertical-align: middle;
 
    }
 

	
 
    // In navbar-form, allow folks to *not* use `.form-group`
 
    .form-control {
 
      display: inline-block;
 
      width: auto; // Prevent labels from stacking above inputs in `.form-group`
 
      vertical-align: middle;
 
    }
 

	
 
    // Make static controls behave like regular ones
 
    .form-control-static {
 
      display: inline-block;
 
    }
 

	
 
    .input-group {
 
      display: inline-table;
 
      vertical-align: middle;
 

	
 
      .input-group-addon,
 
      .input-group-btn,
 
      .form-control {
 
        width: auto;
 
      }
 
    }
 

	
 
    // Input groups need that 100% width though
 
    .input-group > .form-control {
 
      width: 100%;
 
    }
 

	
 
    .control-label {
 
      margin-bottom: 0;
 
      vertical-align: middle;
 
    }
 

	
 
    // Remove default margin on radios/checkboxes that were used for stacking, and
 
    // then undo the floating of radios and checkboxes to match.
 
    .radio,
 
    .checkbox {
 
      display: inline-block;
 
      margin-top: 0;
 
      margin-bottom: 0;
 
      vertical-align: middle;
 

	
 
      label {
 
        padding-left: 0;
 
      }
 
    }
 
    .radio input[type="radio"],
 
    .checkbox input[type="checkbox"] {
 
      position: relative;
 
      margin-left: 0;
 
    }
 

	
 
    // Re-override the feedback icon.
 
    .has-feedback .form-control-feedback {
 
      top: 0;
 
    }
 
  }
 
}
 
// [converter] extracted as `@mixin form-inline` for libsass compatibility
 
.form-inline {
 
  @include form-inline;
 
}
 

	
 

	
 

	
 
// Horizontal forms
 
//
 
// Horizontal forms are built on grid classes and allow you to create forms with
 
// labels on the left and inputs on the right.
 

	
 
.form-horizontal {
 

	
 
  // Consistent vertical alignment of radios and checkboxes
 
  //
 
  // Labels also get some reset styles, but that is scoped to a media query below.
 
  .radio,
 
  .checkbox,
 
  .radio-inline,
 
  .checkbox-inline {
 
    margin-top: 0;
 
    margin-bottom: 0;
 
    padding-top: ($padding-base-vertical + 1); // Default padding plus a border
 
  }
 
  // Account for padding we're adding to ensure the alignment and of help text
 
  // and other content below items
 
  .radio,
 
  .checkbox {
 
    min-height: ($line-height-computed + ($padding-base-vertical + 1));
 
  }
 

	
 
  // Make form groups behave like rows
 
  .form-group {
 
    @include make-row;
 
  }
 

	
 
  // Reset spacing and right align labels, but scope to media queries so that
 
  // labels on narrow viewports stack the same as a default form example.
 
  @media (min-width: $screen-sm-min) {
 
    .control-label {
 
      text-align: right;
 
      margin-bottom: 0;
 
      padding-top: ($padding-base-vertical + 1); // Default padding plus a border
 
    }
 
  }
 

	
 
  // Validation states
 
  //
 
  // Reposition the icon because it's now within a grid column and columns have
 
  // `position: relative;` on them. Also accounts for the grid gutter padding.
 
  .has-feedback .form-control-feedback {
 
    right: floor(($grid-gutter-width / 2));
 
  }
 

	
 
  // Form group sizes
 
  //
 
  // Quick utility class for applying `.input-lg` and `.input-sm` styles to the
 
  // inputs and labels within a `.form-group`.
 
  .form-group-lg {
 
    @media (min-width: $screen-sm-min) {
 
      .control-label {
 
        padding-top: ($padding-large-vertical + 1);
 
        font-size: $font-size-large;
 
      }
 
    }
 
  }
 
  .form-group-sm {
 
    @media (min-width: $screen-sm-min) {
 
      .control-label {
 
        padding-top: ($padding-small-vertical + 1);
 
        font-size: $font-size-small;
 
      }
 
    }
 
  }
 
}
static/bootstrap/stylesheets/bootstrap/_glyphicons.scss
Show inline comments
 
new file 100644
 
//
 
// Glyphicons for Bootstrap
 
//
 
// Since icons are fonts, they can be placed anywhere text is placed and are
 
// thus automatically sized to match the surrounding child. To use, create an
 
// inline element with the appropriate classes, like so:
 
//
 
// <a href="#"><span class="glyphicon glyphicon-star"></span> Star</a>
 

	
 
@at-root {
 
  // Import the fonts
 
  @font-face {
 
    font-family: 'Glyphicons Halflings';
 
    src: url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.eot'), '#{$icon-font-path}#{$icon-font-name}.eot'));
 
    src: url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.eot?#iefix'), '#{$icon-font-path}#{$icon-font-name}.eot?#iefix')) format('embedded-opentype'),
 
         url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.woff2'), '#{$icon-font-path}#{$icon-font-name}.woff2')) format('woff2'),
 
         url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.woff'), '#{$icon-font-path}#{$icon-font-name}.woff')) format('woff'),
 
         url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.ttf'), '#{$icon-font-path}#{$icon-font-name}.ttf')) format('truetype'),
 
         url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.svg##{$icon-font-svg-id}'), '#{$icon-font-path}#{$icon-font-name}.svg##{$icon-font-svg-id}')) format('svg');
 
  }
 
}
 

	
 
// Catchall baseclass
 
.glyphicon {
 
  position: relative;
 
  top: 1px;
 
  display: inline-block;
 
  font-family: 'Glyphicons Halflings';
 
  font-style: normal;
 
  font-weight: normal;
 
  line-height: 1;
 
  -webkit-font-smoothing: antialiased;
 
  -moz-osx-font-smoothing: grayscale;
 
}
 

	
 
// Individual icons
 
.glyphicon-asterisk               { &:before { content: "\002a"; } }
 
.glyphicon-plus                   { &:before { content: "\002b"; } }
 
.glyphicon-euro,
 
.glyphicon-eur                    { &:before { content: "\20ac"; } }
 
.glyphicon-minus                  { &:before { content: "\2212"; } }
 
.glyphicon-cloud                  { &:before { content: "\2601"; } }
 
.glyphicon-envelope               { &:before { content: "\2709"; } }
 
.glyphicon-pencil                 { &:before { content: "\270f"; } }
 
.glyphicon-glass                  { &:before { content: "\e001"; } }
 
.glyphicon-music                  { &:before { content: "\e002"; } }
 
.glyphicon-search                 { &:before { content: "\e003"; } }
 
.glyphicon-heart                  { &:before { content: "\e005"; } }
 
.glyphicon-star                   { &:before { content: "\e006"; } }
 
.glyphicon-star-empty             { &:before { content: "\e007"; } }
 
.glyphicon-user                   { &:before { content: "\e008"; } }
 
.glyphicon-film                   { &:before { content: "\e009"; } }
 
.glyphicon-th-large               { &:before { content: "\e010"; } }
 
.glyphicon-th                     { &:before { content: "\e011"; } }
 
.glyphicon-th-list                { &:before { content: "\e012"; } }
 
.glyphicon-ok                     { &:before { content: "\e013"; } }
 
.glyphicon-remove                 { &:before { content: "\e014"; } }
 
.glyphicon-zoom-in                { &:before { content: "\e015"; } }
 
.glyphicon-zoom-out               { &:before { content: "\e016"; } }
 
.glyphicon-off                    { &:before { content: "\e017"; } }
 
.glyphicon-signal                 { &:before { content: "\e018"; } }
 
.glyphicon-cog                    { &:before { content: "\e019"; } }
 
.glyphicon-trash                  { &:before { content: "\e020"; } }
 
.glyphicon-home                   { &:before { content: "\e021"; } }
 
.glyphicon-file                   { &:before { content: "\e022"; } }
 
.glyphicon-time                   { &:before { content: "\e023"; } }
 
.glyphicon-road                   { &:before { content: "\e024"; } }
 
.glyphicon-download-alt           { &:before { content: "\e025"; } }
 
.glyphicon-download               { &:before { content: "\e026"; } }
 
.glyphicon-upload                 { &:before { content: "\e027"; } }
 
.glyphicon-inbox                  { &:before { content: "\e028"; } }
 
.glyphicon-play-circle            { &:before { content: "\e029"; } }
 
.glyphicon-repeat                 { &:before { content: "\e030"; } }
 
.glyphicon-refresh                { &:before { content: "\e031"; } }
 
.glyphicon-list-alt               { &:before { content: "\e032"; } }
 
.glyphicon-lock                   { &:before { content: "\e033"; } }
 
.glyphicon-flag                   { &:before { content: "\e034"; } }
 
.glyphicon-headphones             { &:before { content: "\e035"; } }
 
.glyphicon-volume-off             { &:before { content: "\e036"; } }
 
.glyphicon-volume-down            { &:before { content: "\e037"; } }
 
.glyphicon-volume-up              { &:before { content: "\e038"; } }
 
.glyphicon-qrcode                 { &:before { content: "\e039"; } }
 
.glyphicon-barcode                { &:before { content: "\e040"; } }
 
.glyphicon-tag                    { &:before { content: "\e041"; } }
 
.glyphicon-tags                   { &:before { content: "\e042"; } }
 
.glyphicon-book                   { &:before { content: "\e043"; } }
 
.glyphicon-bookmark               { &:before { content: "\e044"; } }
 
.glyphicon-print                  { &:before { content: "\e045"; } }
 
.glyphicon-camera                 { &:before { content: "\e046"; } }
 
.glyphicon-font                   { &:before { content: "\e047"; } }
 
.glyphicon-bold                   { &:before { content: "\e048"; } }
 
.glyphicon-italic                 { &:before { content: "\e049"; } }
 
.glyphicon-text-height            { &:before { content: "\e050"; } }
 
.glyphicon-text-width             { &:before { content: "\e051"; } }
 
.glyphicon-align-left             { &:before { content: "\e052"; } }
 
.glyphicon-align-center           { &:before { content: "\e053"; } }
 
.glyphicon-align-right            { &:before { content: "\e054"; } }
 
.glyphicon-align-justify          { &:before { content: "\e055"; } }
 
.glyphicon-list                   { &:before { content: "\e056"; } }
 
.glyphicon-indent-left            { &:before { content: "\e057"; } }
 
.glyphicon-indent-right           { &:before { content: "\e058"; } }
 
.glyphicon-facetime-video         { &:before { content: "\e059"; } }
 
.glyphicon-picture                { &:before { content: "\e060"; } }
 
.glyphicon-map-marker             { &:before { content: "\e062"; } }
 
.glyphicon-adjust                 { &:before { content: "\e063"; } }
 
.glyphicon-tint                   { &:before { content: "\e064"; } }
 
.glyphicon-edit                   { &:before { content: "\e065"; } }
 
.glyphicon-share                  { &:before { content: "\e066"; } }
 
.glyphicon-check                  { &:before { content: "\e067"; } }
 
.glyphicon-move                   { &:before { content: "\e068"; } }
 
.glyphicon-step-backward          { &:before { content: "\e069"; } }
 
.glyphicon-fast-backward          { &:before { content: "\e070"; } }
 
.glyphicon-backward               { &:before { content: "\e071"; } }
 
.glyphicon-play                   { &:before { content: "\e072"; } }
 
.glyphicon-pause                  { &:before { content: "\e073"; } }
 
.glyphicon-stop                   { &:before { content: "\e074"; } }
 
.glyphicon-forward                { &:before { content: "\e075"; } }
 
.glyphicon-fast-forward           { &:before { content: "\e076"; } }
 
.glyphicon-step-forward           { &:before { content: "\e077"; } }
 
.glyphicon-eject                  { &:before { content: "\e078"; } }
 
.glyphicon-chevron-left           { &:before { content: "\e079"; } }
 
.glyphicon-chevron-right          { &:before { content: "\e080"; } }
 
.glyphicon-plus-sign              { &:before { content: "\e081"; } }
 
.glyphicon-minus-sign             { &:before { content: "\e082"; } }
 
.glyphicon-remove-sign            { &:before { content: "\e083"; } }
 
.glyphicon-ok-sign                { &:before { content: "\e084"; } }
 
.glyphicon-question-sign          { &:before { content: "\e085"; } }
 
.glyphicon-info-sign              { &:before { content: "\e086"; } }
 
.glyphicon-screenshot             { &:before { content: "\e087"; } }
 
.glyphicon-remove-circle          { &:before { content: "\e088"; } }
 
.glyphicon-ok-circle              { &:before { content: "\e089"; } }
 
.glyphicon-ban-circle             { &:before { content: "\e090"; } }
 
.glyphicon-arrow-left             { &:before { content: "\e091"; } }
 
.glyphicon-arrow-right            { &:before { content: "\e092"; } }
 
.glyphicon-arrow-up               { &:before { content: "\e093"; } }
 
.glyphicon-arrow-down             { &:before { content: "\e094"; } }
 
.glyphicon-share-alt              { &:before { content: "\e095"; } }
 
.glyphicon-resize-full            { &:before { content: "\e096"; } }
 
.glyphicon-resize-small           { &:before { content: "\e097"; } }
 
.glyphicon-exclamation-sign       { &:before { content: "\e101"; } }
 
.glyphicon-gift                   { &:before { content: "\e102"; } }
 
.glyphicon-leaf                   { &:before { content: "\e103"; } }
 
.glyphicon-fire                   { &:before { content: "\e104"; } }
 
.glyphicon-eye-open               { &:before { content: "\e105"; } }
 
.glyphicon-eye-close              { &:before { content: "\e106"; } }
 
.glyphicon-warning-sign           { &:before { content: "\e107"; } }
 
.glyphicon-plane                  { &:before { content: "\e108"; } }
 
.glyphicon-calendar               { &:before { content: "\e109"; } }
 
.glyphicon-random                 { &:before { content: "\e110"; } }
 
.glyphicon-comment                { &:before { content: "\e111"; } }
 
.glyphicon-magnet                 { &:before { content: "\e112"; } }
 
.glyphicon-chevron-up             { &:before { content: "\e113"; } }
 
.glyphicon-chevron-down           { &:before { content: "\e114"; } }
 
.glyphicon-retweet                { &:before { content: "\e115"; } }
 
.glyphicon-shopping-cart          { &:before { content: "\e116"; } }
 
.glyphicon-folder-close           { &:before { content: "\e117"; } }
 
.glyphicon-folder-open            { &:before { content: "\e118"; } }
 
.glyphicon-resize-vertical        { &:before { content: "\e119"; } }
 
.glyphicon-resize-horizontal      { &:before { content: "\e120"; } }
 
.glyphicon-hdd                    { &:before { content: "\e121"; } }
 
.glyphicon-bullhorn               { &:before { content: "\e122"; } }
 
.glyphicon-bell                   { &:before { content: "\e123"; } }
 
.glyphicon-certificate            { &:before { content: "\e124"; } }
 
.glyphicon-thumbs-up              { &:before { content: "\e125"; } }
 
.glyphicon-thumbs-down            { &:before { content: "\e126"; } }
 
.glyphicon-hand-right             { &:before { content: "\e127"; } }
 
.glyphicon-hand-left              { &:before { content: "\e128"; } }
 
.glyphicon-hand-up                { &:before { content: "\e129"; } }
 
.glyphicon-hand-down              { &:before { content: "\e130"; } }
 
.glyphicon-circle-arrow-right     { &:before { content: "\e131"; } }
 
.glyphicon-circle-arrow-left      { &:before { content: "\e132"; } }
 
.glyphicon-circle-arrow-up        { &:before { content: "\e133"; } }
 
.glyphicon-circle-arrow-down      { &:before { content: "\e134"; } }
 
.glyphicon-globe                  { &:before { content: "\e135"; } }
 
.glyphicon-wrench                 { &:before { content: "\e136"; } }
 
.glyphicon-tasks                  { &:before { content: "\e137"; } }
 
.glyphicon-filter                 { &:before { content: "\e138"; } }
 
.glyphicon-briefcase              { &:before { content: "\e139"; } }
 
.glyphicon-fullscreen             { &:before { content: "\e140"; } }
 
.glyphicon-dashboard              { &:before { content: "\e141"; } }
 
.glyphicon-paperclip              { &:before { content: "\e142"; } }
 
.glyphicon-heart-empty            { &:before { content: "\e143"; } }
 
.glyphicon-link                   { &:before { content: "\e144"; } }
 
.glyphicon-phone                  { &:before { content: "\e145"; } }
 
.glyphicon-pushpin                { &:before { content: "\e146"; } }
 
.glyphicon-usd                    { &:before { content: "\e148"; } }
 
.glyphicon-gbp                    { &:before { content: "\e149"; } }
 
.glyphicon-sort                   { &:before { content: "\e150"; } }
 
.glyphicon-sort-by-alphabet       { &:before { content: "\e151"; } }
 
.glyphicon-sort-by-alphabet-alt   { &:before { content: "\e152"; } }
 
.glyphicon-sort-by-order          { &:before { content: "\e153"; } }
 
.glyphicon-sort-by-order-alt      { &:before { content: "\e154"; } }
 
.glyphicon-sort-by-attributes     { &:before { content: "\e155"; } }
 
.glyphicon-sort-by-attributes-alt { &:before { content: "\e156"; } }
 
.glyphicon-unchecked              { &:before { content: "\e157"; } }
 
.glyphicon-expand                 { &:before { content: "\e158"; } }
 
.glyphicon-collapse-down          { &:before { content: "\e159"; } }
 
.glyphicon-collapse-up            { &:before { content: "\e160"; } }
 
.glyphicon-log-in                 { &:before { content: "\e161"; } }
 
.glyphicon-flash                  { &:before { content: "\e162"; } }
 
.glyphicon-log-out                { &:before { content: "\e163"; } }
 
.glyphicon-new-window             { &:before { content: "\e164"; } }
 
.glyphicon-record                 { &:before { content: "\e165"; } }
 
.glyphicon-save                   { &:before { content: "\e166"; } }
 
.glyphicon-open                   { &:before { content: "\e167"; } }
 
.glyphicon-saved                  { &:before { content: "\e168"; } }
 
.glyphicon-import                 { &:before { content: "\e169"; } }
 
.glyphicon-export                 { &:before { content: "\e170"; } }
 
.glyphicon-send                   { &:before { content: "\e171"; } }
 
.glyphicon-floppy-disk            { &:before { content: "\e172"; } }
 
.glyphicon-floppy-saved           { &:before { content: "\e173"; } }
 
.glyphicon-floppy-remove          { &:before { content: "\e174"; } }
 
.glyphicon-floppy-save            { &:before { content: "\e175"; } }
 
.glyphicon-floppy-open            { &:before { content: "\e176"; } }
 
.glyphicon-credit-card            { &:before { content: "\e177"; } }
 
.glyphicon-transfer               { &:before { content: "\e178"; } }
 
.glyphicon-cutlery                { &:before { content: "\e179"; } }
 
.glyphicon-header                 { &:before { content: "\e180"; } }
 
.glyphicon-compressed             { &:before { content: "\e181"; } }
 
.glyphicon-earphone               { &:before { content: "\e182"; } }
 
.glyphicon-phone-alt              { &:before { content: "\e183"; } }
 
.glyphicon-tower                  { &:before { content: "\e184"; } }
 
.glyphicon-stats                  { &:before { content: "\e185"; } }
 
.glyphicon-sd-video               { &:before { content: "\e186"; } }
 
.glyphicon-hd-video               { &:before { content: "\e187"; } }
 
.glyphicon-subtitles              { &:before { content: "\e188"; } }
 
.glyphicon-sound-stereo           { &:before { content: "\e189"; } }
 
.glyphicon-sound-dolby            { &:before { content: "\e190"; } }
 
.glyphicon-sound-5-1              { &:before { content: "\e191"; } }
 
.glyphicon-sound-6-1              { &:before { content: "\e192"; } }
 
.glyphicon-sound-7-1              { &:before { content: "\e193"; } }
 
.glyphicon-copyright-mark         { &:before { content: "\e194"; } }
 
.glyphicon-registration-mark      { &:before { content: "\e195"; } }
 
.glyphicon-cloud-download         { &:before { content: "\e197"; } }
 
.glyphicon-cloud-upload           { &:before { content: "\e198"; } }
 
.glyphicon-tree-conifer           { &:before { content: "\e199"; } }
 
.glyphicon-tree-deciduous         { &:before { content: "\e200"; } }
 
.glyphicon-cd                     { &:before { content: "\e201"; } }
 
.glyphicon-save-file              { &:before { content: "\e202"; } }
 
.glyphicon-open-file              { &:before { content: "\e203"; } }
 
.glyphicon-level-up               { &:before { content: "\e204"; } }
 
.glyphicon-copy                   { &:before { content: "\e205"; } }
 
.glyphicon-paste                  { &:before { content: "\e206"; } }
 
// The following 2 Glyphicons are omitted for the time being because
 
// they currently use Unicode codepoints that are outside the
 
// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle
 
// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.
 
// Notably, the bug affects some older versions of the Android Browser.
 
// More info: https://github.com/twbs/bootstrap/issues/10106
 
// .glyphicon-door                   { &:before { content: "\1f6aa"; } }
 
// .glyphicon-key                    { &:before { content: "\1f511"; } }
 
.glyphicon-alert                  { &:before { content: "\e209"; } }
 
.glyphicon-equalizer              { &:before { content: "\e210"; } }
 
.glyphicon-king                   { &:before { content: "\e211"; } }
 
.glyphicon-queen                  { &:before { content: "\e212"; } }
 
.glyphicon-pawn                   { &:before { content: "\e213"; } }
 
.glyphicon-bishop                 { &:before { content: "\e214"; } }
 
.glyphicon-knight                 { &:before { content: "\e215"; } }
 
.glyphicon-baby-formula           { &:before { content: "\e216"; } }
 
.glyphicon-tent                   { &:before { content: "\26fa"; } }
 
.glyphicon-blackboard             { &:before { content: "\e218"; } }
 
.glyphicon-bed                    { &:before { content: "\e219"; } }
 
.glyphicon-apple                  { &:before { content: "\f8ff"; } }
 
.glyphicon-erase                  { &:before { content: "\e221"; } }
 
.glyphicon-hourglass              { &:before { content: "\231b"; } }
 
.glyphicon-lamp                   { &:before { content: "\e223"; } }
 
.glyphicon-duplicate              { &:before { content: "\e224"; } }
 
.glyphicon-piggy-bank             { &:before { content: "\e225"; } }
 
.glyphicon-scissors               { &:before { content: "\e226"; } }
 
.glyphicon-bitcoin                { &:before { content: "\e227"; } }
 
.glyphicon-btc                    { &:before { content: "\e227"; } }
 
.glyphicon-xbt                    { &:before { content: "\e227"; } }
 
.glyphicon-yen                    { &:before { content: "\00a5"; } }
 
.glyphicon-jpy                    { &:before { content: "\00a5"; } }
 
.glyphicon-ruble                  { &:before { content: "\20bd"; } }
 
.glyphicon-rub                    { &:before { content: "\20bd"; } }
 
.glyphicon-scale                  { &:before { content: "\e230"; } }
 
.glyphicon-ice-lolly              { &:before { content: "\e231"; } }
 
.glyphicon-ice-lolly-tasted       { &:before { content: "\e232"; } }
 
.glyphicon-education              { &:before { content: "\e233"; } }
 
.glyphicon-option-horizontal      { &:before { content: "\e234"; } }
 
.glyphicon-option-vertical        { &:before { content: "\e235"; } }
 
.glyphicon-menu-hamburger         { &:before { content: "\e236"; } }
 
.glyphicon-modal-window           { &:before { content: "\e237"; } }
 
.glyphicon-oil                    { &:before { content: "\e238"; } }
 
.glyphicon-grain                  { &:before { content: "\e239"; } }
 
.glyphicon-sunglasses             { &:before { content: "\e240"; } }
 
.glyphicon-text-size              { &:before { content: "\e241"; } }
 
.glyphicon-text-color             { &:before { content: "\e242"; } }
 
.glyphicon-text-background        { &:before { content: "\e243"; } }
 
.glyphicon-object-align-top       { &:before { content: "\e244"; } }
 
.glyphicon-object-align-bottom    { &:before { content: "\e245"; } }
 
.glyphicon-object-align-horizontal{ &:before { content: "\e246"; } }
 
.glyphicon-object-align-left      { &:before { content: "\e247"; } }
 
.glyphicon-object-align-vertical  { &:before { content: "\e248"; } }
 
.glyphicon-object-align-right     { &:before { content: "\e249"; } }
 
.glyphicon-triangle-right         { &:before { content: "\e250"; } }
 
.glyphicon-triangle-left          { &:before { content: "\e251"; } }
 
.glyphicon-triangle-bottom        { &:before { content: "\e252"; } }
 
.glyphicon-triangle-top           { &:before { content: "\e253"; } }
 
.glyphicon-console                { &:before { content: "\e254"; } }
 
.glyphicon-superscript            { &:before { content: "\e255"; } }
 
.glyphicon-subscript              { &:before { content: "\e256"; } }
 
.glyphicon-menu-left              { &:before { content: "\e257"; } }
 
.glyphicon-menu-right             { &:before { content: "\e258"; } }
 
.glyphicon-menu-down              { &:before { content: "\e259"; } }
 
.glyphicon-menu-up                { &:before { content: "\e260"; } }
static/bootstrap/stylesheets/bootstrap/_grid.scss
Show inline comments
 
new file 100644
 
//
 
// Grid system
 
// --------------------------------------------------
 

	
 

	
 
// Container widths
 
//
 
// Set the container width, and override it for fixed navbars in media queries.
 

	
 
.container {
 
  @include container-fixed;
 

	
 
  @media (min-width: $screen-sm-min) {
 
    width: $container-sm;
 
  }
 
  @media (min-width: $screen-md-min) {
 
    width: $container-md;
 
  }
 
  @media (min-width: $screen-lg-min) {
 
    width: $container-lg;
 
  }
 
}
 

	
 

	
 
// Fluid container
 
//
 
// Utilizes the mixin meant for fixed width containers, but without any defined
 
// width for fluid, full width layouts.
 

	
 
.container-fluid {
 
  @include container-fixed;
 
}
 

	
 

	
 
// Row
 
//
 
// Rows contain and clear the floats of your columns.
 

	
 
.row {
 
  @include make-row;
 
}
 

	
 

	
 
// Columns
 
//
 
// Common styles for small and large grid columns
 

	
 
@include make-grid-columns;
 

	
 

	
 
// Extra small grid
 
//
 
// Columns, offsets, pushes, and pulls for extra small devices like
 
// smartphones.
 

	
 
@include make-grid(xs);
 

	
 

	
 
// Small grid
 
//
 
// Columns, offsets, pushes, and pulls for the small device range, from phones
 
// to tablets.
 

	
 
@media (min-width: $screen-sm-min) {
 
  @include make-grid(sm);
 
}
 

	
 

	
 
// Medium grid
 
//
 
// Columns, offsets, pushes, and pulls for the desktop device range.
 

	
 
@media (min-width: $screen-md-min) {
 
  @include make-grid(md);
 
}
 

	
 

	
 
// Large grid
 
//
 
// Columns, offsets, pushes, and pulls for the large desktop device range.
 

	
 
@media (min-width: $screen-lg-min) {
 
  @include make-grid(lg);
 
}
static/bootstrap/stylesheets/bootstrap/_input-groups.scss
Show inline comments
 
new file 100644
 
//
 
// Input groups
 
// --------------------------------------------------
 

	
 
// Base styles
 
// -------------------------
 
.input-group {
 
  position: relative; // For dropdowns
 
  display: table;
 
  border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table
 

	
 
  // Undo padding and float of grid classes
 
  &[class*="col-"] {
 
    float: none;
 
    padding-left: 0;
 
    padding-right: 0;
 
  }
 

	
 
  .form-control {
 
    // Ensure that the input is always above the *appended* addon button for
 
    // proper border colors.
 
    position: relative;
 
    z-index: 2;
 

	
 
    // IE9 fubars the placeholder attribute in text inputs and the arrows on
 
    // select elements in input groups. To fix it, we float the input. Details:
 
    // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855
 
    float: left;
 

	
 
    width: 100%;
 
    margin-bottom: 0;
 

	
 
    &:focus {
 
      z-index: 3;
 
    }
 
  }
 
}
 

	
 
// Sizing options
 
//
 
// Remix the default form control sizing classes into new ones for easier
 
// manipulation.
 

	
 
.input-group-lg > .form-control,
 
.input-group-lg > .input-group-addon,
 
.input-group-lg > .input-group-btn > .btn {
 
  @extend .input-lg;
 
}
 
.input-group-sm > .form-control,
 
.input-group-sm > .input-group-addon,
 
.input-group-sm > .input-group-btn > .btn {
 
  @extend .input-sm;
 
}
 

	
 

	
 
// Display as table-cell
 
// -------------------------
 
.input-group-addon,
 
.input-group-btn,
 
.input-group .form-control {
 
  display: table-cell;
 

	
 
  &:not(:first-child):not(:last-child) {
 
    border-radius: 0;
 
  }
 
}
 
// Addon and addon wrapper for buttons
 
.input-group-addon,
 
.input-group-btn {
 
  width: 1%;
 
  white-space: nowrap;
 
  vertical-align: middle; // Match the inputs
 
}
 

	
 
// Text input groups
 
// -------------------------
 
.input-group-addon {
 
  padding: $padding-base-vertical $padding-base-horizontal;
 
  font-size: $font-size-base;
 
  font-weight: normal;
 
  line-height: 1;
 
  color: $input-color;
 
  text-align: center;
 
  background-color: $input-group-addon-bg;
 
  border: 1px solid $input-group-addon-border-color;
 
  border-radius: $input-border-radius;
 

	
 
  // Sizing
 
  &.input-sm {
 
    padding: $padding-small-vertical $padding-small-horizontal;
 
    font-size: $font-size-small;
 
    border-radius: $input-border-radius-small;
 
  }
 
  &.input-lg {
 
    padding: $padding-large-vertical $padding-large-horizontal;
 
    font-size: $font-size-large;
 
    border-radius: $input-border-radius-large;
 
  }
 

	
 
  // Nuke default margins from checkboxes and radios to vertically center within.
 
  input[type="radio"],
 
  input[type="checkbox"] {
 
    margin-top: 0;
 
  }
 
}
 

	
 
// Reset rounded corners
 
.input-group .form-control:first-child,
 
.input-group-addon:first-child,
 
.input-group-btn:first-child > .btn,
 
.input-group-btn:first-child > .btn-group > .btn,
 
.input-group-btn:first-child > .dropdown-toggle,
 
.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
 
.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
 
  @include border-right-radius(0);
 
}
 
.input-group-addon:first-child {
 
  border-right: 0;
 
}
 
.input-group .form-control:last-child,
 
.input-group-addon:last-child,
 
.input-group-btn:last-child > .btn,
 
.input-group-btn:last-child > .btn-group > .btn,
 
.input-group-btn:last-child > .dropdown-toggle,
 
.input-group-btn:first-child > .btn:not(:first-child),
 
.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
 
  @include border-left-radius(0);
 
}
 
.input-group-addon:last-child {
 
  border-left: 0;
 
}
 

	
 
// Button input groups
 
// -------------------------
 
.input-group-btn {
 
  position: relative;
 
  // Jankily prevent input button groups from wrapping with `white-space` and
 
  // `font-size` in combination with `inline-block` on buttons.
 
  font-size: 0;
 
  white-space: nowrap;
 

	
 
  // Negative margin for spacing, position for bringing hovered/focused/actived
 
  // element above the siblings.
 
  > .btn {
 
    position: relative;
 
    + .btn {
 
      margin-left: -1px;
 
    }
 
    // Bring the "active" button to the front
 
    &:hover,
 
    &:focus,
 
    &:active {
 
      z-index: 2;
 
    }
 
  }
 

	
 
  // Negative margin to only have a 1px border between the two
 
  &:first-child {
 
    > .btn,
 
    > .btn-group {
 
      margin-right: -1px;
 
    }
 
  }
 
  &:last-child {
 
    > .btn,
 
    > .btn-group {
 
      z-index: 2;
 
      margin-left: -1px;
 
    }
 
  }
 
}
static/bootstrap/stylesheets/bootstrap/_jumbotron.scss
Show inline comments
 
new file 100644
 
//
 
// Jumbotron
 
// --------------------------------------------------
 

	
 

	
 
.jumbotron {
 
  padding-top:    $jumbotron-padding;
 
  padding-bottom: $jumbotron-padding;
 
  margin-bottom: $jumbotron-padding;
 
  color: $jumbotron-color;
 
  background-color: $jumbotron-bg;
 

	
 
  h1,
 
  .h1 {
 
    color: $jumbotron-heading-color;
 
  }
 

	
 
  p {
 
    margin-bottom: ($jumbotron-padding / 2);
 
    font-size: $jumbotron-font-size;
 
    font-weight: 200;
 
  }
 

	
 
  > hr {
 
    border-top-color: darken($jumbotron-bg, 10%);
 
  }
 

	
 
  .container &,
 
  .container-fluid & {
 
    border-radius: $border-radius-large; // Only round corners at higher resolutions if contained in a container
 
    padding-left:  ($grid-gutter-width / 2);
 
    padding-right: ($grid-gutter-width / 2);
 
  }
 

	
 
  .container {
 
    max-width: 100%;
 
  }
 

	
 
  @media screen and (min-width: $screen-sm-min) {
 
    padding-top:    ($jumbotron-padding * 1.6);
 
    padding-bottom: ($jumbotron-padding * 1.6);
 

	
 
    .container &,
 
    .container-fluid & {
 
      padding-left:  ($jumbotron-padding * 2);
 
      padding-right: ($jumbotron-padding * 2);
 
    }
 

	
 
    h1,
 
    .h1 {
 
      font-size: $jumbotron-heading-font-size;
 
    }
 
  }
 
}
static/bootstrap/stylesheets/bootstrap/_labels.scss
Show inline comments
 
new file 100644
 
//
 
// Labels
 
// --------------------------------------------------
 

	
 
.label {
 
  display: inline;
 
  padding: .2em .6em .3em;
 
  font-size: 75%;
 
  font-weight: bold;
 
  line-height: 1;
 
  color: $label-color;
 
  text-align: center;
 
  white-space: nowrap;
 
  vertical-align: baseline;
 
  border-radius: .25em;
 

	
 
  // [converter] extracted a& to a.label
 

	
 
  // Empty labels collapse automatically (not available in IE8)
 
  &:empty {
 
    display: none;
 
  }
 

	
 
  // Quick fix for labels in buttons
 
  .btn & {
 
    position: relative;
 
    top: -1px;
 
  }
 
}
 

	
 
// Add hover effects, but only for links
 
a.label {
 
  &:hover,
 
  &:focus {
 
    color: $label-link-hover-color;
 
    text-decoration: none;
 
    cursor: pointer;
 
  }
 
}
 

	
 
// Colors
 
// Contextual variations (linked labels get darker on :hover)
 

	
 
.label-default {
 
  @include label-variant($label-default-bg);
 
}
 

	
 
.label-primary {
 
  @include label-variant($label-primary-bg);
 
}
 

	
 
.label-success {
 
  @include label-variant($label-success-bg);
 
}
 

	
 
.label-info {
 
  @include label-variant($label-info-bg);
 
}
 

	
 
.label-warning {
 
  @include label-variant($label-warning-bg);
 
}
 

	
 
.label-danger {
 
  @include label-variant($label-danger-bg);
 
}
static/bootstrap/stylesheets/bootstrap/_list-group.scss
Show inline comments
 
new file 100644
 
//
 
// List groups
 
// --------------------------------------------------
 

	
 

	
 
// Base class
 
//
 
// Easily usable on <ul>, <ol>, or <div>.
 

	
 
.list-group {
 
  // No need to set list-style: none; since .list-group-item is block level
 
  margin-bottom: 20px;
 
  padding-left: 0; // reset padding because ul and ol
 
}
 

	
 

	
 
// Individual list items
 
//
 
// Use on `li`s or `div`s within the `.list-group` parent.
 

	
 
.list-group-item {
 
  position: relative;
 
  display: block;
 
  padding: 10px 15px;
 
  // Place the border on the list items and negative margin up for better styling
 
  margin-bottom: -1px;
 
  background-color: $list-group-bg;
 
  border: 1px solid $list-group-border;
 

	
 
  // Round the first and last items
 
  &:first-child {
 
    @include border-top-radius($list-group-border-radius);
 
  }
 
  &:last-child {
 
    margin-bottom: 0;
 
    @include border-bottom-radius($list-group-border-radius);
 
  }
 
}
 

	
 

	
 
// Interactive list items
 
//
 
// Use anchor or button elements instead of `li`s or `div`s to create interactive items.
 
// Includes an extra `.active` modifier class for showing selected items.
 

	
 
a.list-group-item,
 
button.list-group-item {
 
  color: $list-group-link-color;
 

	
 
  .list-group-item-heading {
 
    color: $list-group-link-heading-color;
 
  }
 

	
 
  // Hover state
 
  &:hover,
 
  &:focus {
 
    text-decoration: none;
 
    color: $list-group-link-hover-color;
 
    background-color: $list-group-hover-bg;
 
  }
 
}
 

	
 
button.list-group-item {
 
  width: 100%;
 
  text-align: left;
 
}
 

	
 
.list-group-item {
 
  // Disabled state
 
  &.disabled,
 
  &.disabled:hover,
 
  &.disabled:focus {
 
    background-color: $list-group-disabled-bg;
 
    color: $list-group-disabled-color;
 
    cursor: $cursor-disabled;
 

	
 
    // Force color to inherit for custom content
 
    .list-group-item-heading {
 
      color: inherit;
 
    }
 
    .list-group-item-text {
 
      color: $list-group-disabled-text-color;
 
    }
 
  }
 

	
 
  // Active class on item itself, not parent
 
  &.active,
 
  &.active:hover,
 
  &.active:focus {
 
    z-index: 2; // Place active items above their siblings for proper border styling
 
    color: $list-group-active-color;
 
    background-color: $list-group-active-bg;
 
    border-color: $list-group-active-border;
 

	
 
    // Force color to inherit for custom content
 
    .list-group-item-heading,
 
    .list-group-item-heading > small,
 
    .list-group-item-heading > .small {
 
      color: inherit;
 
    }
 
    .list-group-item-text {
 
      color: $list-group-active-text-color;
 
    }
 
  }
 
}
 

	
 

	
 
// Contextual variants
 
//
 
// Add modifier classes to change text and background color on individual items.
 
// Organizationally, this must come after the `:hover` states.
 

	
 
@include list-group-item-variant(success, $state-success-bg, $state-success-text);
 
@include list-group-item-variant(info, $state-info-bg, $state-info-text);
 
@include list-group-item-variant(warning, $state-warning-bg, $state-warning-text);
 
@include list-group-item-variant(danger, $state-danger-bg, $state-danger-text);
 

	
 

	
 
// Custom content options
 
//
 
// Extra classes for creating well-formatted content within `.list-group-item`s.
 

	
 
.list-group-item-heading {
 
  margin-top: 0;
 
  margin-bottom: 5px;
 
}
 
.list-group-item-text {
 
  margin-bottom: 0;
 
  line-height: 1.3;
 
}
static/bootstrap/stylesheets/bootstrap/_media.scss
Show inline comments
 
new file 100644
 
.media {
 
  // Proper spacing between instances of .media
 
  margin-top: 15px;
 

	
 
  &:first-child {
 
    margin-top: 0;
 
  }
 
}
 

	
 
.media,
 
.media-body {
 
  zoom: 1;
 
  overflow: hidden;
 
}
 

	
 
.media-body {
 
  width: 10000px;
 
}
 

	
 
.media-object {
 
  display: block;
 

	
 
  // Fix collapse in webkit from max-width: 100% and display: table-cell.
 
  &.img-thumbnail {
 
    max-width: none;
 
  }
 
}
 

	
 
.media-right,
 
.media > .pull-right {
 
  padding-left: 10px;
 
}
 

	
 
.media-left,
 
.media > .pull-left {
 
  padding-right: 10px;
 
}
 

	
 
.media-left,
 
.media-right,
 
.media-body {
 
  display: table-cell;
 
  vertical-align: top;
 
}
 

	
 
.media-middle {
 
  vertical-align: middle;
 
}
 

	
 
.media-bottom {
 
  vertical-align: bottom;
 
}
 

	
 
// Reset margins on headings for tighter default spacing
 
.media-heading {
 
  margin-top: 0;
 
  margin-bottom: 5px;
 
}
 

	
 
// Media list variation
 
//
 
// Undo default ul/ol styles
 
.media-list {
 
  padding-left: 0;
 
  list-style: none;
 
}
static/bootstrap/stylesheets/bootstrap/_mixins.scss
Show inline comments
 
new file 100644
 
// Mixins
 
// --------------------------------------------------
 

	
 
// Utilities
 
@import "mixins/hide-text";
 
@import "mixins/opacity";
 
@import "mixins/image";
 
@import "mixins/labels";
 
@import "mixins/reset-filter";
 
@import "mixins/resize";
 
@import "mixins/responsive-visibility";
 
@import "mixins/size";
 
@import "mixins/tab-focus";
 
@import "mixins/reset-text";
 
@import "mixins/text-emphasis";
 
@import "mixins/text-overflow";
 
@import "mixins/vendor-prefixes";
 

	
 
// Components
 
@import "mixins/alerts";
 
@import "mixins/buttons";
 
@import "mixins/panels";
 
@import "mixins/pagination";
 
@import "mixins/list-group";
 
@import "mixins/nav-divider";
 
@import "mixins/forms";
 
@import "mixins/progress-bar";
 
@import "mixins/table-row";
 

	
 
// Skins
 
@import "mixins/background-variant";
 
@import "mixins/border-radius";
 
@import "mixins/gradients";
 

	
 
// Layout
 
@import "mixins/clearfix";
 
@import "mixins/center-block";
 
@import "mixins/nav-vertical-align";
 
@import "mixins/grid-framework";
 
@import "mixins/grid";
static/bootstrap/stylesheets/bootstrap/_modals.scss
Show inline comments
 
new file 100644
 
//
 
// Modals
 
// --------------------------------------------------
 

	
 
// .modal-open      - body class for killing the scroll
 
// .modal           - container to scroll within
 
// .modal-dialog    - positioning shell for the actual modal
 
// .modal-content   - actual modal w/ bg and corners and shit
 

	
 
// Kill the scroll on the body
 
.modal-open {
 
  overflow: hidden;
 
}
 

	
 
// Container that the modal scrolls within
 
.modal {
 
  display: none;
 
  overflow: hidden;
 
  position: fixed;
 
  top: 0;
 
  right: 0;
 
  bottom: 0;
 
  left: 0;
 
  z-index: $zindex-modal;
 
  -webkit-overflow-scrolling: touch;
 

	
 
  // Prevent Chrome on Windows from adding a focus outline. For details, see
 
  // https://github.com/twbs/bootstrap/pull/10951.
 
  outline: 0;
 

	
 
  // When fading in the modal, animate it to slide down
 
  &.fade .modal-dialog {
 
    @include translate(0, -25%);
 
    @include transition-transform(0.3s ease-out);
 
  }
 
  &.in .modal-dialog { @include translate(0, 0) }
 
}
 
.modal-open .modal {
 
  overflow-x: hidden;
 
  overflow-y: auto;
 
}
 

	
 
// Shell div to position the modal with bottom padding
 
.modal-dialog {
 
  position: relative;
 
  width: auto;
 
  margin: 10px;
 
}
 

	
 
// Actual modal
 
.modal-content {
 
  position: relative;
 
  background-color: $modal-content-bg;
 
  border: 1px solid $modal-content-fallback-border-color; //old browsers fallback (ie8 etc)
 
  border: 1px solid $modal-content-border-color;
 
  border-radius: $border-radius-large;
 
  @include box-shadow(0 3px 9px rgba(0,0,0,.5));
 
  background-clip: padding-box;
 
  // Remove focus outline from opened modal
 
  outline: 0;
 
}
 

	
 
// Modal background
 
.modal-backdrop {
 
  position: fixed;
 
  top: 0;
 
  right: 0;
 
  bottom: 0;
 
  left: 0;
 
  z-index: $zindex-modal-background;
 
  background-color: $modal-backdrop-bg;
 
  // Fade for backdrop
 
  &.fade { @include opacity(0); }
 
  &.in { @include opacity($modal-backdrop-opacity); }
 
}
 

	
 
// Modal header
 
// Top section of the modal w/ title and dismiss
 
.modal-header {
 
  padding: $modal-title-padding;
 
  border-bottom: 1px solid $modal-header-border-color;
 
  @include clearfix;
 
}
 
// Close icon
 
.modal-header .close {
 
  margin-top: -2px;
 
}
 

	
 
// Title text within header
 
.modal-title {
 
  margin: 0;
 
  line-height: $modal-title-line-height;
 
}
 

	
 
// Modal body
 
// Where all modal content resides (sibling of .modal-header and .modal-footer)
 
.modal-body {
 
  position: relative;
 
  padding: $modal-inner-padding;
 
}
 

	
 
// Footer (for actions)
 
.modal-footer {
 
  padding: $modal-inner-padding;
 
  text-align: right; // right align buttons
 
  border-top: 1px solid $modal-footer-border-color;
 
  @include clearfix; // clear it in case folks use .pull-* classes on buttons
 

	
 
  // Properly space out buttons
 
  .btn + .btn {
 
    margin-left: 5px;
 
    margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs
 
  }
 
  // but override that for button groups
 
  .btn-group .btn + .btn {
 
    margin-left: -1px;
 
  }
 
  // and override it for block buttons as well
 
  .btn-block + .btn-block {
 
    margin-left: 0;
 
  }
 
}
 

	
 
// Measure scrollbar width for padding body during modal show/hide
 
.modal-scrollbar-measure {
 
  position: absolute;
 
  top: -9999px;
 
  width: 50px;
 
  height: 50px;
 
  overflow: scroll;
 
}
 

	
 
// Scale up the modal
 
@media (min-width: $screen-sm-min) {
 
  // Automatically set modal's width for larger viewports
 
  .modal-dialog {
 
    width: $modal-md;
 
    margin: 30px auto;
 
  }
 
  .modal-content {
 
    @include box-shadow(0 5px 15px rgba(0,0,0,.5));
 
  }
 

	
 
  // Modal sizes
 
  .modal-sm { width: $modal-sm; }
 
}
 

	
 
@media (min-width: $screen-md-min) {
 
  .modal-lg { width: $modal-lg; }
 
}
static/bootstrap/stylesheets/bootstrap/_navbar.scss
Show inline comments
 
new file 100644
 
//
 
// Navbars
 
// --------------------------------------------------
 

	
 

	
 
// Wrapper and base class
 
//
 
// Provide a static navbar from which we expand to create full-width, fixed, and
 
// other navbar variations.
 

	
 
.navbar {
 
  position: relative;
 
  min-height: $navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)
 
  margin-bottom: $navbar-margin-bottom;
 
  border: 1px solid transparent;
 

	
 
  // Prevent floats from breaking the navbar
 
  @include clearfix;
 

	
 
  @media (min-width: $grid-float-breakpoint) {
 
    border-radius: $navbar-border-radius;
 
  }
 
}
 

	
 

	
 
// Navbar heading
 
//
 
// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy
 
// styling of responsive aspects.
 

	
 
.navbar-header {
 
  @include clearfix;
 

	
 
  @media (min-width: $grid-float-breakpoint) {
 
    float: left;
 
  }
 
}
 

	
 

	
 
// Navbar collapse (body)
 
//
 
// Group your navbar content into this for easy collapsing and expanding across
 
// various device sizes. By default, this content is collapsed when <768px, but
 
// will expand past that for a horizontal display.
 
//
 
// To start (on mobile devices) the navbar links, forms, and buttons are stacked
 
// vertically and include a `max-height` to overflow in case you have too much
 
// content for the user's viewport.
 

	
 
.navbar-collapse {
 
  overflow-x: visible;
 
  padding-right: $navbar-padding-horizontal;
 
  padding-left:  $navbar-padding-horizontal;
 
  border-top: 1px solid transparent;
 
  box-shadow: inset 0 1px 0 rgba(255,255,255,.1);
 
  @include clearfix;
 
  -webkit-overflow-scrolling: touch;
 

	
 
  &.in {
 
    overflow-y: auto;
 
  }
 

	
 
  @media (min-width: $grid-float-breakpoint) {
 
    width: auto;
 
    border-top: 0;
 
    box-shadow: none;
 

	
 
    &.collapse {
 
      display: block !important;
 
      height: auto !important;
 
      padding-bottom: 0; // Override default setting
 
      overflow: visible !important;
 
    }
 

	
 
    &.in {
 
      overflow-y: visible;
 
    }
 

	
 
    // Undo the collapse side padding for navbars with containers to ensure
 
    // alignment of right-aligned contents.
 
    .navbar-fixed-top &,
 
    .navbar-static-top &,
 
    .navbar-fixed-bottom & {
 
      padding-left: 0;
 
      padding-right: 0;
 
    }
 
  }
 
}
 

	
 
.navbar-fixed-top,
 
.navbar-fixed-bottom {
 
  .navbar-collapse {
 
    max-height: $navbar-collapse-max-height;
 

	
 
    @media (max-device-width: $screen-xs-min) and (orientation: landscape) {
 
      max-height: 200px;
 
    }
 
  }
 
}
 

	
 

	
 
// Both navbar header and collapse
 
//
 
// When a container is present, change the behavior of the header and collapse.
 

	
 
.container,
 
.container-fluid {
 
  > .navbar-header,
 
  > .navbar-collapse {
 
    margin-right: -$navbar-padding-horizontal;
 
    margin-left:  -$navbar-padding-horizontal;
 

	
 
    @media (min-width: $grid-float-breakpoint) {
 
      margin-right: 0;
 
      margin-left:  0;
 
    }
 
  }
 
}
 

	
 

	
 
//
 
// Navbar alignment options
 
//
 
// Display the navbar across the entirety of the page or fixed it to the top or
 
// bottom of the page.
 

	
 
// Static top (unfixed, but 100% wide) navbar
 
.navbar-static-top {
 
  z-index: $zindex-navbar;
 
  border-width: 0 0 1px;
 

	
 
  @media (min-width: $grid-float-breakpoint) {
 
    border-radius: 0;
 
  }
 
}
 

	
 
// Fix the top/bottom navbars when screen real estate supports it
 
.navbar-fixed-top,
 
.navbar-fixed-bottom {
 
  position: fixed;
 
  right: 0;
 
  left: 0;
 
  z-index: $zindex-navbar-fixed;
 

	
 
  // Undo the rounded corners
 
  @media (min-width: $grid-float-breakpoint) {
 
    border-radius: 0;
 
  }
 
}
 
.navbar-fixed-top {
 
  top: 0;
 
  border-width: 0 0 1px;
 
}
 
.navbar-fixed-bottom {
 
  bottom: 0;
 
  margin-bottom: 0; // override .navbar defaults
 
  border-width: 1px 0 0;
 
}
 

	
 

	
 
// Brand/project name
 

	
 
.navbar-brand {
 
  float: left;
 
  padding: $navbar-padding-vertical $navbar-padding-horizontal;
 
  font-size: $font-size-large;
 
  line-height: $line-height-computed;
 
  height: $navbar-height;
 

	
 
  &:hover,
 
  &:focus {
 
    text-decoration: none;
 
  }
 

	
 
  > img {
 
    display: block;
 
  }
 

	
 
  @media (min-width: $grid-float-breakpoint) {
 
    .navbar > .container &,
 
    .navbar > .container-fluid & {
 
      margin-left: -$navbar-padding-horizontal;
 
    }
 
  }
 
}
 

	
 

	
 
// Navbar toggle
 
//
 
// Custom button for toggling the `.navbar-collapse`, powered by the collapse
 
// JavaScript plugin.
 

	
 
.navbar-toggle {
 
  position: relative;
 
  float: right;
 
  margin-right: $navbar-padding-horizontal;
 
  padding: 9px 10px;
 
  @include navbar-vertical-align(34px);
 
  background-color: transparent;
 
  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
 
  border: 1px solid transparent;
 
  border-radius: $border-radius-base;
 

	
 
  // We remove the `outline` here, but later compensate by attaching `:hover`
 
  // styles to `:focus`.
 
  &:focus {
 
    outline: 0;
 
  }
 

	
 
  // Bars
 
  .icon-bar {
 
    display: block;
 
    width: 22px;
 
    height: 2px;
 
    border-radius: 1px;
 
  }
 
  .icon-bar + .icon-bar {
 
    margin-top: 4px;
 
  }
 

	
 
  @media (min-width: $grid-float-breakpoint) {
 
    display: none;
 
  }
 
}
 

	
 

	
 
// Navbar nav links
 
//
 
// Builds on top of the `.nav` components with its own modifier class to make
 
// the nav the full height of the horizontal nav (above 768px).
 

	
 
.navbar-nav {
 
  margin: ($navbar-padding-vertical / 2) (-$navbar-padding-horizontal);
 

	
 
  > li > a {
 
    padding-top:    10px;
 
    padding-bottom: 10px;
 
    line-height: $line-height-computed;
 
  }
 

	
 
  @media (max-width: $grid-float-breakpoint-max) {
 
    // Dropdowns get custom display when collapsed
 
    .open .dropdown-menu {
 
      position: static;
 
      float: none;
 
      width: auto;
 
      margin-top: 0;
 
      background-color: transparent;
 
      border: 0;
 
      box-shadow: none;
 
      > li > a,
 
      .dropdown-header {
 
        padding: 5px 15px 5px 25px;
 
      }
 
      > li > a {
 
        line-height: $line-height-computed;
 
        &:hover,
 
        &:focus {
 
          background-image: none;
 
        }
 
      }
 
    }
 
  }
 

	
 
  // Uncollapse the nav
 
  @media (min-width: $grid-float-breakpoint) {
 
    float: left;
 
    margin: 0;
 

	
 
    > li {
 
      float: left;
 
      > a {
 
        padding-top:    $navbar-padding-vertical;
 
        padding-bottom: $navbar-padding-vertical;
 
      }
 
    }
 
  }
 
}
 

	
 

	
 
// Navbar form
 
//
 
// Extension of the `.form-inline` with some extra flavor for optimum display in
 
// our navbars.
 

	
 
.navbar-form {
 
  margin-left: -$navbar-padding-horizontal;
 
  margin-right: -$navbar-padding-horizontal;
 
  padding: 10px $navbar-padding-horizontal;
 
  border-top: 1px solid transparent;
 
  border-bottom: 1px solid transparent;
 
  $shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
 
  @include box-shadow($shadow);
 

	
 
  // Mixin behavior for optimum display
 
  @include form-inline;
 

	
 
  .form-group {
 
    @media (max-width: $grid-float-breakpoint-max) {
 
      margin-bottom: 5px;
 

	
 
      &:last-child {
 
        margin-bottom: 0;
 
      }
 
    }
 
  }
 

	
 
  // Vertically center in expanded, horizontal navbar
 
  @include navbar-vertical-align($input-height-base);
 

	
 
  // Undo 100% width for pull classes
 
  @media (min-width: $grid-float-breakpoint) {
 
    width: auto;
 
    border: 0;
 
    margin-left: 0;
 
    margin-right: 0;
 
    padding-top: 0;
 
    padding-bottom: 0;
 
    @include box-shadow(none);
 
  }
 
}
 

	
 

	
 
// Dropdown menus
 

	
 
// Menu position and menu carets
 
.navbar-nav > li > .dropdown-menu {
 
  margin-top: 0;
 
  @include border-top-radius(0);
 
}
 
// Menu position and menu caret support for dropups via extra dropup class
 
.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
 
  margin-bottom: 0;
 
  @include border-top-radius($navbar-border-radius);
 
  @include border-bottom-radius(0);
 
}
 

	
 

	
 
// Buttons in navbars
 
//
 
// Vertically center a button within a navbar (when *not* in a form).
 

	
 
.navbar-btn {
 
  @include navbar-vertical-align($input-height-base);
 

	
 
  &.btn-sm {
 
    @include navbar-vertical-align($input-height-small);
 
  }
 
  &.btn-xs {
 
    @include navbar-vertical-align(22);
 
  }
 
}
 

	
 

	
 
// Text in navbars
 
//
 
// Add a class to make any element properly align itself vertically within the navbars.
 

	
 
.navbar-text {
 
  @include navbar-vertical-align($line-height-computed);
 

	
 
  @media (min-width: $grid-float-breakpoint) {
 
    float: left;
 
    margin-left: $navbar-padding-horizontal;
 
    margin-right: $navbar-padding-horizontal;
 
  }
 
}
 

	
 

	
 
// Component alignment
 
//
 
// Repurpose the pull utilities as their own navbar utilities to avoid specificity
 
// issues with parents and chaining. Only do this when the navbar is uncollapsed
 
// though so that navbar contents properly stack and align in mobile.
 
//
 
// Declared after the navbar components to ensure more specificity on the margins.
 

	
 
@media (min-width: $grid-float-breakpoint) {
 
  .navbar-left {
 
    float: left !important;
 
  }
 
  .navbar-right {
 
    float: right !important;
 
  margin-right: -$navbar-padding-horizontal;
 

	
 
    ~ .navbar-right {
 
      margin-right: 0;
 
    }
 
  }
 
}
 

	
 

	
 
// Alternate navbars
 
// --------------------------------------------------
 

	
 
// Default navbar
 
.navbar-default {
 
  background-color: $navbar-default-bg;
 
  border-color: $navbar-default-border;
 

	
 
  .navbar-brand {
 
    color: $navbar-default-brand-color;
 
    &:hover,
 
    &:focus {
 
      color: $navbar-default-brand-hover-color;
 
      background-color: $navbar-default-brand-hover-bg;
 
    }
 
  }
 

	
 
  .navbar-text {
 
    color: $navbar-default-color;
 
  }
 

	
 
  .navbar-nav {
 
    > li > a {
 
      color: $navbar-default-link-color;
 

	
 
      &:hover,
 
      &:focus {
 
        color: $navbar-default-link-hover-color;
 
        background-color: $navbar-default-link-hover-bg;
 
      }
 
    }
 
    > .active > a {
 
      &,
 
      &:hover,
 
      &:focus {
 
        color: $navbar-default-link-active-color;
 
        background-color: $navbar-default-link-active-bg;
 
      }
 
    }
 
    > .disabled > a {
 
      &,
 
      &:hover,
 
      &:focus {
 
        color: $navbar-default-link-disabled-color;
 
        background-color: $navbar-default-link-disabled-bg;
 
      }
 
    }
 
  }
 

	
 
  .navbar-toggle {
 
    border-color: $navbar-default-toggle-border-color;
 
    &:hover,
 
    &:focus {
 
      background-color: $navbar-default-toggle-hover-bg;
 
    }
 
    .icon-bar {
 
      background-color: $navbar-default-toggle-icon-bar-bg;
 
    }
 
  }
 

	
 
  .navbar-collapse,
 
  .navbar-form {
 
    border-color: $navbar-default-border;
 
  }
 

	
 
  // Dropdown menu items
 
  .navbar-nav {
 
    // Remove background color from open dropdown
 
    > .open > a {
 
      &,
 
      &:hover,
 
      &:focus {
 
        background-color: $navbar-default-link-active-bg;
 
        color: $navbar-default-link-active-color;
 
      }
 
    }
 

	
 
    @media (max-width: $grid-float-breakpoint-max) {
 
      // Dropdowns get custom display when collapsed
 
      .open .dropdown-menu {
 
        > li > a {
 
          color: $navbar-default-link-color;
 
          &:hover,
 
          &:focus {
 
            color: $navbar-default-link-hover-color;
 
            background-color: $navbar-default-link-hover-bg;
 
          }
 
        }
 
        > .active > a {
 
          &,
 
          &:hover,
 
          &:focus {
 
            color: $navbar-default-link-active-color;
 
            background-color: $navbar-default-link-active-bg;
 
          }
 
        }
 
        > .disabled > a {
 
          &,
 
          &:hover,
 
          &:focus {
 
            color: $navbar-default-link-disabled-color;
 
            background-color: $navbar-default-link-disabled-bg;
 
          }
 
        }
 
      }
 
    }
 
  }
 

	
 

	
 
  // Links in navbars
 
  //
 
  // Add a class to ensure links outside the navbar nav are colored correctly.
 

	
 
  .navbar-link {
 
    color: $navbar-default-link-color;
 
    &:hover {
 
      color: $navbar-default-link-hover-color;
 
    }
 
  }
 

	
 
  .btn-link {
 
    color: $navbar-default-link-color;
 
    &:hover,
 
    &:focus {
 
      color: $navbar-default-link-hover-color;
 
    }
 
    &[disabled],
 
    fieldset[disabled] & {
 
      &:hover,
 
      &:focus {
 
        color: $navbar-default-link-disabled-color;
 
      }
 
    }
 
  }
 
}
 

	
 
// Inverse navbar
 

	
 
.navbar-inverse {
 
  background-color: $navbar-inverse-bg;
 
  border-color: $navbar-inverse-border;
 

	
 
  .navbar-brand {
 
    color: $navbar-inverse-brand-color;
 
    &:hover,
 
    &:focus {
 
      color: $navbar-inverse-brand-hover-color;
 
      background-color: $navbar-inverse-brand-hover-bg;
 
    }
 
  }
 

	
 
  .navbar-text {
 
    color: $navbar-inverse-color;
 
  }
 

	
 
  .navbar-nav {
 
    > li > a {
 
      color: $navbar-inverse-link-color;
 

	
 
      &:hover,
 
      &:focus {
 
        color: $navbar-inverse-link-hover-color;
 
        background-color: $navbar-inverse-link-hover-bg;
 
      }
 
    }
 
    > .active > a {
 
      &,
 
      &:hover,
 
      &:focus {
 
        color: $navbar-inverse-link-active-color;
 
        background-color: $navbar-inverse-link-active-bg;
 
      }
 
    }
 
    > .disabled > a {
 
      &,
 
      &:hover,
 
      &:focus {
 
        color: $navbar-inverse-link-disabled-color;
 
        background-color: $navbar-inverse-link-disabled-bg;
 
      }
 
    }
 
  }
 

	
 
  // Darken the responsive nav toggle
 
  .navbar-toggle {
 
    border-color: $navbar-inverse-toggle-border-color;
 
    &:hover,
 
    &:focus {
 
      background-color: $navbar-inverse-toggle-hover-bg;
 
    }
 
    .icon-bar {
 
      background-color: $navbar-inverse-toggle-icon-bar-bg;
 
    }
 
  }
 

	
 
  .navbar-collapse,
 
  .navbar-form {
 
    border-color: darken($navbar-inverse-bg, 7%);
 
  }
 

	
 
  // Dropdowns
 
  .navbar-nav {
 
    > .open > a {
 
      &,
 
      &:hover,
 
      &:focus {
 
        background-color: $navbar-inverse-link-active-bg;
 
        color: $navbar-inverse-link-active-color;
 
      }
 
    }
 

	
 
    @media (max-width: $grid-float-breakpoint-max) {
 
      // Dropdowns get custom display
 
      .open .dropdown-menu {
 
        > .dropdown-header {
 
          border-color: $navbar-inverse-border;
 
        }
 
        .divider {
 
          background-color: $navbar-inverse-border;
 
        }
 
        > li > a {
 
          color: $navbar-inverse-link-color;
 
          &:hover,
 
          &:focus {
 
            color: $navbar-inverse-link-hover-color;
 
            background-color: $navbar-inverse-link-hover-bg;
 
          }
 
        }
 
        > .active > a {
 
          &,
 
          &:hover,
 
          &:focus {
 
            color: $navbar-inverse-link-active-color;
 
            background-color: $navbar-inverse-link-active-bg;
 
          }
 
        }
 
        > .disabled > a {
 
          &,
 
          &:hover,
 
          &:focus {
 
            color: $navbar-inverse-link-disabled-color;
 
            background-color: $navbar-inverse-link-disabled-bg;
 
          }
 
        }
 
      }
 
    }
 
  }
 

	
 
  .navbar-link {
 
    color: $navbar-inverse-link-color;
 
    &:hover {
 
      color: $navbar-inverse-link-hover-color;
 
    }
 
  }
 

	
 
  .btn-link {
 
    color: $navbar-inverse-link-color;
 
    &:hover,
 
    &:focus {
 
      color: $navbar-inverse-link-hover-color;
 
    }
 
    &[disabled],
 
    fieldset[disabled] & {
 
      &:hover,
 
      &:focus {
 
        color: $navbar-inverse-link-disabled-color;
 
      }
 
    }
 
  }
 
}
static/bootstrap/stylesheets/bootstrap/_navs.scss
Show inline comments
 
new file 100644
 
//
 
// Navs
 
// --------------------------------------------------
 

	
 

	
 
// Base class
 
// --------------------------------------------------
 

	
 
.nav {
 
  margin-bottom: 0;
 
  padding-left: 0; // Override default ul/ol
 
  list-style: none;
 
  @include clearfix;
 

	
 
  > li {
 
    position: relative;
 
    display: block;
 

	
 
    > a {
 
      position: relative;
 
      display: block;
 
      padding: $nav-link-padding;
 
      &:hover,
 
      &:focus {
 
        text-decoration: none;
 
        background-color: $nav-link-hover-bg;
 
      }
 
    }
 

	
 
    // Disabled state sets text to gray and nukes hover/tab effects
 
    &.disabled > a {
 
      color: $nav-disabled-link-color;
 

	
 
      &:hover,
 
      &:focus {
 
        color: $nav-disabled-link-hover-color;
 
        text-decoration: none;
 
        background-color: transparent;
 
        cursor: $cursor-disabled;
 
      }
 
    }
 
  }
 

	
 
  // Open dropdowns
 
  .open > a {
 
    &,
 
    &:hover,
 
    &:focus {
 
      background-color: $nav-link-hover-bg;
 
      border-color: $link-color;
 
    }
 
  }
 

	
 
  // Nav dividers (deprecated with v3.0.1)
 
  //
 
  // This should have been removed in v3 with the dropping of `.nav-list`, but
 
  // we missed it. We don't currently support this anywhere, but in the interest
 
  // of maintaining backward compatibility in case you use it, it's deprecated.
 
  .nav-divider {
 
    @include nav-divider;
 
  }
 

	
 
  // Prevent IE8 from misplacing imgs
 
  //
 
  // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989
 
  > li > a > img {
 
    max-width: none;
 
  }
 
}
 

	
 

	
 
// Tabs
 
// -------------------------
 

	
 
// Give the tabs something to sit on
 
.nav-tabs {
 
  border-bottom: 1px solid $nav-tabs-border-color;
 
  > li {
 
    float: left;
 
    // Make the list-items overlay the bottom border
 
    margin-bottom: -1px;
 

	
 
    // Actual tabs (as links)
 
    > a {
 
      margin-right: 2px;
 
      line-height: $line-height-base;
 
      border: 1px solid transparent;
 
      border-radius: $border-radius-base $border-radius-base 0 0;
 
      &:hover {
 
        border-color: $nav-tabs-link-hover-border-color $nav-tabs-link-hover-border-color $nav-tabs-border-color;
 
      }
 
    }
 

	
 
    // Active state, and its :hover to override normal :hover
 
    &.active > a {
 
      &,
 
      &:hover,
 
      &:focus {
 
        color: $nav-tabs-active-link-hover-color;
 
        background-color: $nav-tabs-active-link-hover-bg;
 
        border: 1px solid $nav-tabs-active-link-hover-border-color;
 
        border-bottom-color: transparent;
 
        cursor: default;
 
      }
 
    }
 
  }
 
  // pulling this in mainly for less shorthand
 
  &.nav-justified {
 
    @extend .nav-justified;
 
    @extend .nav-tabs-justified;
 
  }
 
}
 

	
 

	
 
// Pills
 
// -------------------------
 
.nav-pills {
 
  > li {
 
    float: left;
 

	
 
    // Links rendered as pills
 
    > a {
 
      border-radius: $nav-pills-border-radius;
 
    }
 
    + li {
 
      margin-left: 2px;
 
    }
 

	
 
    // Active state
 
    &.active > a {
 
      &,
 
      &:hover,
 
      &:focus {
 
        color: $nav-pills-active-link-hover-color;
 
        background-color: $nav-pills-active-link-hover-bg;
 
      }
 
    }
 
  }
 
}
 

	
 

	
 
// Stacked pills
 
.nav-stacked {
 
  > li {
 
    float: none;
 
    + li {
 
      margin-top: 2px;
 
      margin-left: 0; // no need for this gap between nav items
 
    }
 
  }
 
}
 

	
 

	
 
// Nav variations
 
// --------------------------------------------------
 

	
 
// Justified nav links
 
// -------------------------
 

	
 
.nav-justified {
 
  width: 100%;
 

	
 
  > li {
 
    float: none;
 
    > a {
 
      text-align: center;
 
      margin-bottom: 5px;
 
    }
 
  }
 

	
 
  > .dropdown .dropdown-menu {
 
    top: auto;
 
    left: auto;
 
  }
 

	
 
  @media (min-width: $screen-sm-min) {
 
    > li {
 
      display: table-cell;
 
      width: 1%;
 
      > a {
 
        margin-bottom: 0;
 
      }
 
    }
 
  }
 
}
 

	
 
// Move borders to anchors instead of bottom of list
 
//
 
// Mixin for adding on top the shared `.nav-justified` styles for our tabs
 
.nav-tabs-justified {
 
  border-bottom: 0;
 

	
 
  > li > a {
 
    // Override margin from .nav-tabs
 
    margin-right: 0;
 
    border-radius: $border-radius-base;
 
  }
 

	
 
  > .active > a,
 
  > .active > a:hover,
 
  > .active > a:focus {
 
    border: 1px solid $nav-tabs-justified-link-border-color;
 
  }
 

	
 
  @media (min-width: $screen-sm-min) {
 
    > li > a {
 
      border-bottom: 1px solid $nav-tabs-justified-link-border-color;
 
      border-radius: $border-radius-base $border-radius-base 0 0;
 
    }
 
    > .active > a,
 
    > .active > a:hover,
 
    > .active > a:focus {
 
      border-bottom-color: $nav-tabs-justified-active-link-border-color;
 
    }
 
  }
 
}
 

	
 

	
 
// Tabbable tabs
 
// -------------------------
 

	
 
// Hide tabbable panes to start, show them when `.active`
 
.tab-content {
 
  > .tab-pane {
 
    display: none;
 
  }
 
  > .active {
 
    display: block;
 
  }
 
}
 

	
 

	
 
// Dropdowns
 
// -------------------------
 

	
 
// Specific dropdowns
 
.nav-tabs .dropdown-menu {
 
  // make dropdown border overlap tab border
 
  margin-top: -1px;
 
  // Remove the top rounded corners here since there is a hard edge above the menu
 
  @include border-top-radius(0);
 
}
static/bootstrap/stylesheets/bootstrap/_normalize.scss
Show inline comments
 
new file 100644
 
/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
 

	
 
//
 
// 1. Set default font family to sans-serif.
 
// 2. Prevent iOS and IE text size adjust after device orientation change,
 
//    without disabling user zoom.
 
//
 

	
 
html {
 
  font-family: sans-serif; // 1
 
  -ms-text-size-adjust: 100%; // 2
 
  -webkit-text-size-adjust: 100%; // 2
 
}
 

	
 
//
 
// Remove default margin.
 
//
 

	
 
body {
 
  margin: 0;
 
}
 

	
 
// HTML5 display definitions
 
// ==========================================================================
 

	
 
//
 
// Correct `block` display not defined for any HTML5 element in IE 8/9.
 
// Correct `block` display not defined for `details` or `summary` in IE 10/11
 
// and Firefox.
 
// Correct `block` display not defined for `main` in IE 11.
 
//
 

	
 
article,
 
aside,
 
details,
 
figcaption,
 
figure,
 
footer,
 
header,
 
hgroup,
 
main,
 
menu,
 
nav,
 
section,
 
summary {
 
  display: block;
 
}
 

	
 
//
 
// 1. Correct `inline-block` display not defined in IE 8/9.
 
// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
 
//
 

	
 
audio,
 
canvas,
 
progress,
 
video {
 
  display: inline-block; // 1
 
  vertical-align: baseline; // 2
 
}
 

	
 
//
 
// Prevent modern browsers from displaying `audio` without controls.
 
// Remove excess height in iOS 5 devices.
 
//
 

	
 
audio:not([controls]) {
 
  display: none;
 
  height: 0;
 
}
 

	
 
//
 
// Address `[hidden]` styling not present in IE 8/9/10.
 
// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.
 
//
 

	
 
[hidden],
 
template {
 
  display: none;
 
}
 

	
 
// Links
 
// ==========================================================================
 

	
 
//
 
// Remove the gray background color from active links in IE 10.
 
//
 

	
 
a {
 
  background-color: transparent;
 
}
 

	
 
//
 
// Improve readability of focused elements when they are also in an
 
// active/hover state.
 
//
 

	
 
a:active,
 
a:hover {
 
  outline: 0;
 
}
 

	
 
// Text-level semantics
 
// ==========================================================================
 

	
 
//
 
// Address styling not present in IE 8/9/10/11, Safari, and Chrome.
 
//
 

	
 
abbr[title] {
 
  border-bottom: 1px dotted;
 
}
 

	
 
//
 
// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
 
//
 

	
 
b,
 
strong {
 
  font-weight: bold;
 
}
 

	
 
//
 
// Address styling not present in Safari and Chrome.
 
//
 

	
 
dfn {
 
  font-style: italic;
 
}
 

	
 
//
 
// Address variable `h1` font-size and margin within `section` and `article`
 
// contexts in Firefox 4+, Safari, and Chrome.
 
//
 

	
 
h1 {
 
  font-size: 2em;
 
  margin: 0.67em 0;
 
}
 

	
 
//
 
// Address styling not present in IE 8/9.
 
//
 

	
 
mark {
 
  background: #ff0;
 
  color: #000;
 
}
 

	
 
//
 
// Address inconsistent and variable font size in all browsers.
 
//
 

	
 
small {
 
  font-size: 80%;
 
}
 

	
 
//
 
// Prevent `sub` and `sup` affecting `line-height` in all browsers.
 
//
 

	
 
sub,
 
sup {
 
  font-size: 75%;
 
  line-height: 0;
 
  position: relative;
 
  vertical-align: baseline;
 
}
 

	
 
sup {
 
  top: -0.5em;
 
}
 

	
 
sub {
 
  bottom: -0.25em;
 
}
 

	
 
// Embedded content
 
// ==========================================================================
 

	
 
//
 
// Remove border when inside `a` element in IE 8/9/10.
 
//
 

	
 
img {
 
  border: 0;
 
}
 

	
 
//
 
// Correct overflow not hidden in IE 9/10/11.
 
//
 

	
 
svg:not(:root) {
 
  overflow: hidden;
 
}
 

	
 
// Grouping content
 
// ==========================================================================
 

	
 
//
 
// Address margin not present in IE 8/9 and Safari.
 
//
 

	
 
figure {
 
  margin: 1em 40px;
 
}
 

	
 
//
 
// Address differences between Firefox and other browsers.
 
//
 

	
 
hr {
 
  box-sizing: content-box;
 
  height: 0;
 
}
 

	
 
//
 
// Contain overflow in all browsers.
 
//
 

	
 
pre {
 
  overflow: auto;
 
}
 

	
 
//
 
// Address odd `em`-unit font size rendering in all browsers.
 
//
 

	
 
code,
 
kbd,
 
pre,
 
samp {
 
  font-family: monospace, monospace;
 
  font-size: 1em;
 
}
 

	
 
// Forms
 
// ==========================================================================
 

	
 
//
 
// Known limitation: by default, Chrome and Safari on OS X allow very limited
 
// styling of `select`, unless a `border` property is set.
 
//
 

	
 
//
 
// 1. Correct color not being inherited.
 
//    Known issue: affects color of disabled elements.
 
// 2. Correct font properties not being inherited.
 
// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
 
//
 

	
 
button,
 
input,
 
optgroup,
 
select,
 
textarea {
 
  color: inherit; // 1
 
  font: inherit; // 2
 
  margin: 0; // 3
 
}
 

	
 
//
 
// Address `overflow` set to `hidden` in IE 8/9/10/11.
 
//
 

	
 
button {
 
  overflow: visible;
 
}
 

	
 
//
 
// Address inconsistent `text-transform` inheritance for `button` and `select`.
 
// All other form control elements do not inherit `text-transform` values.
 
// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
 
// Correct `select` style inheritance in Firefox.
 
//
 

	
 
button,
 
select {
 
  text-transform: none;
 
}
 

	
 
//
 
// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
 
//    and `video` controls.
 
// 2. Correct inability to style clickable `input` types in iOS.
 
// 3. Improve usability and consistency of cursor style between image-type
 
//    `input` and others.
 
//
 

	
 
button,
 
html input[type="button"], // 1
 
input[type="reset"],
 
input[type="submit"] {
 
  -webkit-appearance: button; // 2
 
  cursor: pointer; // 3
 
}
 

	
 
//
 
// Re-set default cursor for disabled elements.
 
//
 

	
 
button[disabled],
 
html input[disabled] {
 
  cursor: default;
 
}
 

	
 
//
 
// Remove inner padding and border in Firefox 4+.
 
//
 

	
 
button::-moz-focus-inner,
 
input::-moz-focus-inner {
 
  border: 0;
 
  padding: 0;
 
}
 

	
 
//
 
// Address Firefox 4+ setting `line-height` on `input` using `!important` in
 
// the UA stylesheet.
 
//
 

	
 
input {
 
  line-height: normal;
 
}
 

	
 
//
 
// It's recommended that you don't attempt to style these elements.
 
// Firefox's implementation doesn't respect box-sizing, padding, or width.
 
//
 
// 1. Address box sizing set to `content-box` in IE 8/9/10.
 
// 2. Remove excess padding in IE 8/9/10.
 
//
 

	
 
input[type="checkbox"],
 
input[type="radio"] {
 
  box-sizing: border-box; // 1
 
  padding: 0; // 2
 
}
 

	
 
//
 
// Fix the cursor style for Chrome's increment/decrement buttons. For certain
 
// `font-size` values of the `input`, it causes the cursor style of the
 
// decrement button to change from `default` to `text`.
 
//
 

	
 
input[type="number"]::-webkit-inner-spin-button,
 
input[type="number"]::-webkit-outer-spin-button {
 
  height: auto;
 
}
 

	
 
//
 
// 1. Address `appearance` set to `searchfield` in Safari and Chrome.
 
// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.
 
//
 

	
 
input[type="search"] {
 
  -webkit-appearance: textfield; // 1
 
  box-sizing: content-box; //2
 
}
 

	
 
//
 
// Remove inner padding and search cancel button in Safari and Chrome on OS X.
 
// Safari (but not Chrome) clips the cancel button when the search input has
 
// padding (and `textfield` appearance).
 
//
 

	
 
input[type="search"]::-webkit-search-cancel-button,
 
input[type="search"]::-webkit-search-decoration {
 
  -webkit-appearance: none;
 
}
 

	
 
//
 
// Define consistent border, margin, and padding.
 
//
 

	
 
fieldset {
 
  border: 1px solid #c0c0c0;
 
  margin: 0 2px;
 
  padding: 0.35em 0.625em 0.75em;
 
}
 

	
 
//
 
// 1. Correct `color` not being inherited in IE 8/9/10/11.
 
// 2. Remove padding so people aren't caught out if they zero out fieldsets.
 
//
 

	
 
legend {
 
  border: 0; // 1
 
  padding: 0; // 2
 
}
 

	
 
//
 
// Remove default vertical scrollbar in IE 8/9/10/11.
 
//
 

	
 
textarea {
 
  overflow: auto;
 
}
 

	
 
//
 
// Don't inherit the `font-weight` (applied by a rule above).
 
// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
 
//
 

	
 
optgroup {
 
  font-weight: bold;
 
}
 

	
 
// Tables
 
// ==========================================================================
 

	
 
//
 
// Remove most spacing between table cells.
 
//
 

	
 
table {
 
  border-collapse: collapse;
 
  border-spacing: 0;
 
}
 

	
 
td,
 
th {
 
  padding: 0;
 
}
static/bootstrap/stylesheets/bootstrap/_pager.scss
Show inline comments
 
new file 100644
 
//
 
// Pager pagination
 
// --------------------------------------------------
 

	
 

	
 
.pager {
 
  padding-left: 0;
 
  margin: $line-height-computed 0;
 
  list-style: none;
 
  text-align: center;
 
  @include clearfix;
 
  li {
 
    display: inline;
 
    > a,
 
    > span {
 
      display: inline-block;
 
      padding: 5px 14px;
 
      background-color: $pager-bg;
 
      border: 1px solid $pager-border;
 
      border-radius: $pager-border-radius;
 
    }
 

	
 
    > a:hover,
 
    > a:focus {
 
      text-decoration: none;
 
      background-color: $pager-hover-bg;
 
    }
 
  }
 

	
 
  .next {
 
    > a,
 
    > span {
 
      float: right;
 
    }
 
  }
 

	
 
  .previous {
 
    > a,
 
    > span {
 
      float: left;
 
    }
 
  }
 

	
 
  .disabled {
 
    > a,
 
    > a:hover,
 
    > a:focus,
 
    > span {
 
      color: $pager-disabled-color;
 
      background-color: $pager-bg;
 
      cursor: $cursor-disabled;
 
    }
 
  }
 
}
static/bootstrap/stylesheets/bootstrap/_pagination.scss
Show inline comments
 
new file 100644
 
//
 
// Pagination (multiple pages)
 
// --------------------------------------------------
 
.pagination {
 
  display: inline-block;
 
  padding-left: 0;
 
  margin: $line-height-computed 0;
 
  border-radius: $border-radius-base;
 

	
 
  > li {
 
    display: inline; // Remove list-style and block-level defaults
 
    > a,
 
    > span {
 
      position: relative;
 
      float: left; // Collapse white-space
 
      padding: $padding-base-vertical $padding-base-horizontal;
 
      line-height: $line-height-base;
 
      text-decoration: none;
 
      color: $pagination-color;
 
      background-color: $pagination-bg;
 
      border: 1px solid $pagination-border;
 
      margin-left: -1px;
 
    }
 
    &:first-child {
 
      > a,
 
      > span {
 
        margin-left: 0;
 
        @include border-left-radius($border-radius-base);
 
      }
 
    }
 
    &:last-child {
 
      > a,
 
      > span {
 
        @include border-right-radius($border-radius-base);
 
      }
 
    }
 
  }
 

	
 
  > li > a,
 
  > li > span {
 
    &:hover,
 
    &:focus {
 
      z-index: 2;
 
      color: $pagination-hover-color;
 
      background-color: $pagination-hover-bg;
 
      border-color: $pagination-hover-border;
 
    }
 
  }
 

	
 
  > .active > a,
 
  > .active > span {
 
    &,
 
    &:hover,
 
    &:focus {
 
      z-index: 3;
 
      color: $pagination-active-color;
 
      background-color: $pagination-active-bg;
 
      border-color: $pagination-active-border;
 
      cursor: default;
 
    }
 
  }
 

	
 
  > .disabled {
 
    > span,
 
    > span:hover,
 
    > span:focus,
 
    > a,
 
    > a:hover,
 
    > a:focus {
 
      color: $pagination-disabled-color;
 
      background-color: $pagination-disabled-bg;
 
      border-color: $pagination-disabled-border;
 
      cursor: $cursor-disabled;
 
    }
 
  }
 
}
 

	
 
// Sizing
 
// --------------------------------------------------
 

	
 
// Large
 
.pagination-lg {
 
  @include pagination-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $border-radius-large);
 
}
 

	
 
// Small
 
.pagination-sm {
 
  @include pagination-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $border-radius-small);
 
}
static/bootstrap/stylesheets/bootstrap/_panels.scss
Show inline comments
 
new file 100644
 
//
 
// Panels
 
// --------------------------------------------------
 

	
 
<